用户指南:用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,就可以提早退出了,因为必然出错。

putty_e3NMfjAPn6

出错效果如图,发现pytorch.py输出CUDA版本为10,和conda报告的相符。接着程序便卡住了。按ctrl-z可以把它放入后台,等6小时后slurm会结束它。

putty_HJAnuLyjq0

以下是错误写法:

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文档查看更准确和规范的描述。

该脚本可以用任意语言,包括bashzsh、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/activateconda 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了。

其他的参考源

DvA 深度学习课程-集群使用说明