“ 大家好哇!前面我们对slurm作业调度系统进行了一个简单的介绍【科研利器】slurm作业调度系统(一),今天我们继续对如何用slurm提交批处理任务以及使用 sinfo、squeue、scontrol命令查询作业信息进行具体的介绍。”
1
查看可用资源
咱们在提交任务之前,务必先检查一下超算上可用的节点信息,比如计算资源是否充足、节点是否正在运行作业等。
在其默认的输出中,partition 表示分区名、avail 表示分区状态(up 可用,down 不可用),timelimit 表示分区可供最大运行时长,nodes 表示节点数,state 表示节点运行状态,nodelist 表示分区包含的节点列表。
其中我们需要关注的主要是 state 和 partition ,若 state 中显示 idle 表示节点处于空闲状态,可接收新的作业;显示 allocated 表示节点已经分配了一个或者多个作业且所有核心用满,在作业释放前不能再被分配作业;显示 mix 状态为使用部分核心,仍可以被分配作业;显示 drain 状态表示对应节点已经下线;显示 drng 表示已下线但仍有作业在运行。我们一般会选择将作业提交到 state=idle 所对应的分区(partition),这样可以减少排队时间。
(base) [xiazh@login ~]$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
CPU-Large* up 20-00:00:0 3 mix cnode[220,231,236]
CPU-Large* up 20-00:00:0 5 alloc cnode[164-169]
CPU-Small up 15-00:00:0 2 mix cnode[220,231]
以下是 sinfo 命令的常用参数,借助这些参数可以帮我们更准确地掌握想知道的信息。如只想查看上面 CPU-Large 分区的信息,可以用 sinfo -p CPU-Large。
--help # 显示sinfo命令的使用帮助信息;
-d # 查看集群中没有响应的节点;
-i <seconds> # 每隔相应的秒数,对输出的分区节点信息进行刷新
-n <name_list> # 显示指定节点的信息,如果指定多个节点的话用逗号隔开;
-N # 按每个节点一行的格式来显示信息;
-p # <partition> 显示指定分区的信息,如果指定多个分区的话用逗号隔开;
-r # 只显示响应的节点;
-R # 显示节点不正常工作的原因;
2
编写slurm脚本
在slurm作业调度系统下,主要支持两种作业形式:提交交互式任务和提交批处理任务。在这里我们先介绍如何编写批处理任务的脚本,交互式任务后面再介绍。slurm 脚本可以在本地编写后上传,也可以直接在超算上编辑。一个 slurm脚本可设置很多内容,比如作业要提交到的分区、运行的最大时长等。以下给出一个常用的模板:
#!/bin/bash
#SBATCH -J test # 作业名为 test
#SBATCH -o test.out # 屏幕上的输出文件重定向到 test.out
#SBATCH -e test.error # 指定作业标准错误输出文件的名称为test.error
#SBATCH -p gpu # 作业提交的分区为 gpu
#SBATCH --qos=debug # 作业使用的 QoS 为 debug
#SBATCH -N 1 # 作业申请 1 个节点
#SBATCH -n 1 #作业申请1个进程
#SBATCH --ntasks-per-node=1 # 单节点启动的进程数为 1
#SBATCH --cpus-per-task=4 # 单任务使用的 CPU 核心数为 4
#SBATCH -t 1:00:00 # 任务运行的最长时间为 1 小时
#SBATCH --gres=gpu:1 # 单个节点使用 1 块 GPU 卡
#SBATCh -w cnode220 # 指定运行作业的节点是 cnode220,若不填写系统自动分配节点
#SBATCh -x cnode221 # 指定不使用cnode221节点运行作业
#SBATCh –-exclusive #指定作业独占计算节点
# 设置运行环境
module add anaconda/3-5.0.0.1 # 添加 anaconda/3-5.0.0.1 模块
# 输入要执行的命令,例如 python test.py 等
python test.py # 执行命令
其中,第一行是固定的,表示使用 /bin/bash 来执行脚本。实际在每个节点上分配的 CPU 数量由 --ntasks-per-node 和 --cpus-per-task 参数共同决定,等于两者乘积之和。任务最长时间的设置格式是 DD-HH:MM:SS,例如一天又15小时写作 1-15:00:00。 以上的所有 #SBATCH 属性均可以不设置,当缺少某属性时,系统将使用默认值。在这里说一句题外话,请大家在使用时估计自己任务的开销,适量申请计算资源,避免造成资源的浪费,毕竟这都是花钱买来的!
3
提交任务
将slurm脚本编写完毕并上传超算后(或直接在超算编辑),进入 slurm脚本的目录,使用如下命令完成脚本(test.slurm)的提交。
sbatch test.slurm
4
查看任务状态
作业提交完毕后,可使用 squeue 命令查看任务状态。
(base)[xiazh@login]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
55 cpu test xiazh PD 0:00 1 (PartitionTimeLimit)
54 cpu test xiazh R 0:15 1 cnode220
其中JOBID表示任务ID 编号,PARTITION表示作业所在队列(分区),NAME表示任务名称,USER为用户,ST为作业状态,TIME 为已运行时间,NODES 表示占用节点数,NODELIST(REASON)为任务运行的节点列表或者原因说明。另外,状态列中R-Runing(正在运行),PD-PenDing(资源不足,排队中),CG-COMPLETING(作业正在完成中),CA-CANCELLED(作业被人为取消),CD-COMPLETED(作业运行完成),F-FAILED作业运行失败,NF-NODE_FAIL节点问题导致作业运行失败,PR作业被抢占,S作业被挂起,TO作业超时被杀。除此之外,使用 squeue 配合不同参数可以过滤显示的内容,以便能看到你感兴趣的结果。某些参数可以相互组合。
squeue -l: 以长列表显示更多信息。
squeue -u username: 仅显示属于用户 username 的任务。
squeue -t state: 仅显示处于 state 状态的任务。
squeue -n job_name:仅显示名称为job_name的作业
squeue -p partition :仅显示partition分区的任务。
squeue -jobs job_id :仅显示作业id为job_id的作业
顺便介绍一下如何删除任务以及查询任务的详细信息,其显示的内容可以参考squeue。
(1)删除任务(注意:用户只能删除自己的作业,不能删除别人的作业):
scancel jobid: 删除 jobid 的作业。
scancel -u username: 删除 username 的全部作业。
scancel -s state: 删除处于 state 状态的作业。
scancel -p partition :仅显示partition分区的任务。
(2)查看任务详细信息:
scontrol show partition partition_name :详细显示partition_name分区的信息
scontrol show node node_name :详细显示node_name节点信息
scontrol show job job_id :详细显示job_id作业的信息
当你已经学会了以上全部内容的时候,恭喜你!你已经基本掌握了slurm作业调度系统了。
参考资料:
[1]http://hpc.pku.edu.cn/_book/guide/slurm/sinfo.html
[2]中科大超算用户手册