超级计算机 任务提交,超算任务提交系统slurm用法

Abstract: 介绍了Slurm系统的基础用法,列举了一些样例。介绍了sbatch,srun, salloc, squeue常见命令的用法

1. Slurm简介与基础命令

现在的科研任务大部分是运行在超算上面的,本地的小机器大部分时间只是起到了一个文本编辑器的作用。一般超算上会有很多个节点,也会有很多个用户提交的很多任务。 这时候我们提交任务就不再是跟本地一样run或者F5一下就开始运行了的,我们需要先申请资源,等待超算的批准,然后超算才会将我们的任务分配到指定的节点上运行,这个系统就是SLURM。Slurm系统包含常见的两个提交任务的命令sbatch, srun;查看任务信息的命令,squeue,sinfo; 以及开辟资源的salloc和查看历史的sacct。

1.1. 提交任务

向slurm系统提交任务,需要包含两个信息:一个是需要的计算资源,包括计算时间,节点数等;第二个是在这个计算资源下需要运行的指令,包括载入环境与运行程序两部分。sbatch与srun两个指令在这两个方面用法不同,但是对应资源的关键词都是一致的,大部分情况下只需要熟悉一个指令就可以了。

1.1.1. sbatch

sbatch的用法是sbatch xx.txt。其中你的任务信息就包含在xx.txt这个以ASCII码编码的文件中。文件基本形式是:

其中#sbatch后面跟的信息就是计算资源、任务命名分区以及输入输出所对应的文件。这里需要注意的是sbatch提交任务之后是不会将程序的输出与报错信息直接print出来,而是接管程序的系统输出与报错到指定文件中。但是对文件的读写内容是正常进行的,因为超算系统的文件系统一般是一个整体,如果有高IO的内容就需要将文件存放在相应的区域内。sbatch提交任务之后,超算的操作系统记录这一个任务,会根据优先级给任务排队,在合适的时间运行。用户此时可以断开终端或运行其他任务。

1.1.2. srun

srun是直接以命令而非脚本的形式申请资源并运行任务,基本用法是 srun -o1 xx1 --option2 xx2 ./hello_world。srun会实时输出你的程序的运行结果,用户可以中途直接终止程序。但是一旦远程连接端口终端,任务就会停止。sbatch与srun提交任务给超算的操作系统,不存在哪一个指令可以插队的情况。

1.1.3. 常用options与释义

options

释义

–batch=?

指定任务所在分区,有的超算会设置batch与debug两个分区,debug分区基本不用排队,但是任务运行时间有限制

-N, –nodes=?

申请的节点个数。一般的超算系统上每个节点会有1个cpu:每个CPU的典型配置是32个核(或者理解为物理线程,不同架构的超算会有差异),其中每16个核是在同一个pie上的,不同pie上的核的通讯时间会更大,但是要远远小于不同节点之间的通讯时间

-n, –ntasks=?

将核心程序复制多少份,相当于并行计算中最顶层的并行数。如果任务是mpi的方式运行,这个参数将转化为mpi里面的ntasks; 如果是其他的方式并行,程序内部可以调出任务号,从而执行不同的任务,比如printenv SLURM_PROCID就可以调出相应的任务id

-c, –cpus-per-task=?

与上面的-n配合执行,指定每个任务有多少个核来运行(并不是一个大的cpu, 而是核数),实际对应着mpi里面的OMP_NUM_THREADS,次级并行参数

–mem=?

每个节点预先分配的内存大小,可以使用GB,MB, KB三个单位

–gres=name:type:num

可以根据超算配置申请相应的资源,需要超算支持。比如申请两个型号为kepler的GPU与两个型号为v100的GPU,就是--gres=gpu:kepler:2,gpu:v100:2

-t, –time=xx:xx:xx

程序运行的最大时间,超过这个时间超算会随时停止你的任务,对应的单位是 时:分:秒

-e, –error=file_name

file_name可以使用模板。 比如常见的单任务脚本输出设置为xxx_%J_xxx.txt,其中%J会被任务序号代替

-o, –output=file_name

同上

–exclusive

是否允许同一个节点上允许其他人的程序运行,防止资源共享后运行速度慢的问题,但是一般不被推荐使用

-C, –constraint=”?”

对申请的节点信息的限制,一般是用来限制cpu的型号,防止编译好的程序被用在错误的架构上,比如--constraint="AMD" 就限定只能运行在AMD cpu的节点上,不要分配Intel的cpu(AMD, YES!)

更多的用法请参考slurm的说明文档,或者使用 sbatch --help调出来。也可以使用一个脚本生成器, IBEX Jobscript generator。下面是我的一个程序脚本:

1.2. 查看任务

查看任务的运行状态,可以使用squeue命令进行。查看特定用户的可以使用-u your_name,也可以与grep配合使用,检索特定的关键词。如果向实时更新,可以与watch命令配合,watch -n ?? squeue -u your_name,就会进入一个实时更新画面,频率是??s.

如果想查看超算上资源使用问题,可以使用sinfo命令查看,查看空闲资源,可以使用sinfo | grep idle查看空闲节点。

1.3. 其他

如果想申请一个实时的交互资源,可以使用salloc命令,其关键词是与srun的选项是相同的,只是不需要指定运行什么程序。比如下面的指令,你就已经申请到了一个节点,运行时间是10分钟,在这个平台上,你可以实时运行指令,与本地运行相同。但是相比于sbatch,srun命令,可能存在一些性能损失.

你可能感兴趣的:(超级计算机,任务提交)