用户指南:用SLURM运行计算任务 - lyulyul/shine-cluster GitHub Wiki
提交GPU任务时,请使用--nice,参见下面的示例。请不要提交过多任务,阻塞他人。If you have any concerns, let me know。
基本检测
登录aha
ashlyn@aha:~$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
speedy* up 6:00:00 2 idle eureka,tatooine
normal up 4-00:00:00 2 idle eureka,tatooine
# 目前有两个分区, 默认为speedy, 任务运行时间最长为6小时,normal分区的最长运行时间为4天。
# 更多时候,你会看到STATE=mix,mix表示该节点正在执行任务,且有能力接受更多任务。
ashlyn@aha:~$ srun hostname
eureka
# 说明hostname程序在eureka执行。你也可以尝试srun df -h等其他命令。
配置运行环境
我们在登录节点登录,但在计算节点计算,登陆节点的环境不会自动复制到计算节点。当提交计算任务时,我们可能需要配置运行环境。
注:sit默认使用1个CPU、0个GPU。sit -g默认使用2个CPU、1个GPU。若要使用更多资源,请参考.bash_aliases和Slurm官方文档。
# 先看一下slurm队列情况
ashlyn@aha:~$ squeueF
# 开启交互性bash
# 你若没有sit,请检查 https://github.com/gqqnbig/shine-cluster/blob/530501d3fe0dfe10db129076c886736f4fdb7e27/login/etc/skel/.bash_aliases
ashlyn@aha:~$ sit
# slurm自动选了一个计算节点,发现hostname已经不一样了。
ashlyn@eureka:~$ hostname
eureka
# conda没有自动启动。运行下面的命令启动conda
ashlyn@eureka:~$ source /opt/anaconda3/bin/activate
(base) ashlyn@eureka:~$
如果想要conda自动启动,请把source /opt/anaconda3/bin/activate
添加到~/.bashrc
或~/.zshrc
。
注意conda的package cache和envs directories,它们都指向~/shared/.conda
。~/shared
是集群共享目录,比较大。
安装Pytorch
下面在计算节点上配置pytorch运行环境,并运行。
conda create --name torch
conda activate torch
conda install -c pytorch -c conda-forge pytorch=1.8 python=3.7
你当然也可以指定其他的pytorch和python版本,但如果在安装时,发现cudatoolkit版本为10,就可以提早退出了,因为必然出错。
出错效果如图,发现pytorch.py输出CUDA版本为10,和conda报告的相符。接着程序便卡住了。按ctrl-z可以把它放入后台,等6小时后slurm会结束它。
以下是错误写法:
conda create --name torch python=3.7
conda activate torch
conda install -c pytorch pytorch=1.8
把python版本和pytorch一起指定,使conda更好地确定CUDA版本,不容易装错。
# 如果你没有slurm-examples或没有pytorch.py,或pytorch.py缺少输出,请检查 https://github.com/gqqnbig/shine-cluster/tree/migrate/slurm-examples
$ cd ~/shared/slurm-examples/
$ ./pytorch.py
Python version is 3.7.10 | packaged by conda-forge | (default, Feb 19 2021, 16:07:37)
[GCC 9.3.0].
pytorch version is 1.8.1.
CUDA version is 11.1.
Number of physical GPUs: 1
tensor([0.8444, 0.9193, 0.8549, 0.5437], device='cuda:0')
安装Tensorflow
截至2021年4月,anaconda上的所有tensorflow版本都不能解析到cudatoolkit 11。另见Install Tensorflow-gpu 2.4.0 with Cuda 11.0 and CuDnn 8 Using Anaconda。
不用Tatooine
为减少折腾,如果你在tatooine,建议你退出,sit -g -w eureka
进入到eureka计算节点。然后用常规方式安装tensorflow。
在Tatooine上运行Tensorflow的出错消息是:tensorflow.python.framework.errors_impl.InternalError: CUDA runtime implicit initialization on GPU:0 failed. Status: device kernel image is invalid
。
https://www.reddit.com/r/tensorflow/comments/jbp2sh/tensorflow_with_rtx_3080_extremely_slow/
在Tatooine上试试看
这种方法混用conda和pip,不一定可以成功。如果成功了请把好消息告诉我。
先用conda安装python
conda install python=3.7
再用pip安装tensorflow
pip install tensorflow-gpu==2.3
运行一个长期后台作业
sbatch
命令接受一个参数,该参数是一个用任意脚本语言编写的程序的文件名。请自行咨询slurm文档查看更准确和规范的描述。
该脚本可以用任意语言,包括bash、zsh、python、perl、awk等等。本文仅演示用bash语言编写sbatch脚本。
为方便辨识,sbatch脚本一般以.slurm结尾,但这不是必须的。
~/shared/slurm-examples/tf.slurm
是一个示例文件。你如果用vim编写.slurm文件,vim会提示代码写错的地方。
第一行是shebang,指定了该脚本语言需要用bash解释运行。
#SBATCH
开头的一系列指令是sbatch的参数。本文不列出所有sbatch参数或一个参数的所有用法,读者需阅读slurm文档。
对于python任务,.slurm文件一般需要source /opt/anaconda3/bin/activate
和conda activate
,最后一行一般是运行想要的python程序。
./tf.py
一般来说相当于python tf.py
。
一般在AHA节点提交作业。如果你通过sit或srun命令以交互方式进入了一个计算节点,然后提交后台作业,你相当于先提交了一个交互作业,在交互作业里面分支了一个后台作业,后台作业因此从属于交互作业。交互作业的运行时限为6小时,也容易受网络波动而断开。一旦交互作业断开,其拥有的(运行时限更长的)后台作业也会停止。
进入后台作业
用sbatch提交作业后,一般只能通过其output文件查看结果。如果想要查看其运行时的状态,可以用srun --jobid=
。
# 提交slurm作业后,记住作业id。
qiqig@aha:~$ sbatch ~/shine-cluster/slurm-examples/job.slurm
Submitted batch job 483
# 如果作业进入了running state,则你可以用以下命令进入作业环境
qiqig@aha:~$ srun --jobid=483 --pty $SHELL
# 这里验证了当前机器为eureka
qiqig@eureka:~$ hostname
eureka
# 你可以使用htop、nvidia-smi等所有命令。
qiqig@eureka:~$ htop
注意,进入后台作业会占用该作业本身申请的CPU。例如一个作业通过sbatch申请了2个CPU来运行,原来它会利用2个CPU,但你用srun进入该作业,则你会夺走一个CPU,作业本身就只能用1个CPU了。