SLurm使用参考¶
分区(Partition)详解¶
什么是分区,为什么要指定
不同的节点的特性和硬件属性不同,设置分区可以帮助用户更好确定节点的特点,进而 选择最适合自己的节点进行运算。此外,如果集群中部分机器是私有的,那么设置分区可以使得只有部分用户能在这个分区提交作业。总的来说,分区(Partition)可看做 一系列节点的集合。
目前我们只有两个分区
QoS(Quality of Service)详解¶
什么是 QoS,为什么要指定
和分区不同,QoS 表示服务质量,它更多刻画了作业的属性而非节点的属性。不同任务 的特性不同,指定 QoS 可以使得资源更好分配。例如,用户若只是想简单调试自己的 程序,而非大规模地运行,那么这样的作业的特点是“短时间”,“用户对结果的需求 很迫切”。为这样的作业设计 QoS 是非常有必要的。
目前我们设计了种 QoS,用户可根据需求自行选择。若不加指定,normal 为所有用户 的默认 QoS。
追踪作业¶
Slurm提供了丰富的追踪任务的命令,例如 scontrol,sacct 等。这些 命令有助于查看正在运行或已完成的任务状态。当用户认为任务异常时,可使用这些 工具来追踪任务的信息。
对于正在运行或排队的任务,可以使用以下命令查看,其中 JOBID 是正在运行的作业 ID。
# 查看USERNAME下处于排队中的作业,可查询到 JOBID
squeue -u USERNAME
# 通过JOB ID 追踪具体的作业
scontrol show job JOBID
同时也可以通过sacct查看历史作业。默认情况下,用户仅能查看从当天 00:00:00 起到现在的、自己的历史作业。
sacct
# 输出从 MM 月 DD 日起的所有历史作业。
sacct -S MMDD
# sacct默认情况会输出作业 ID,作业名,分区,账户,分配的 CPU,任务结束状态,返回码。
# 我们还可以使用 --format 参数来指定到底要输出那些指标。
sacct --format=jobid,user,alloccpu,allocgres,state%15,exitcode
更新作业¶
有时我们很早就提交了任务,但是在任务开始前却发现作业的属性写错了(例如提交错 了分区,忘记申请 GPU 个数),取消了重新排队似乎很不划算。如果作业恰好没在运行 我们是可以通过 scontrol 命令来修改作业的属性。
由于可修改的属性非常多,我们可以借助 SLURM 自动补全功能来查看可修改的内容,这只需要我们在输入完 JOBID 后空一格并敲两下" <TAB> "键。
scontrol update jobid=938 <TAB><TAB>
scontrol update jobid=938 partition=gpu gres=gpu:1
当任务已经开始运行时,一般不可以再变更申请资源,分区等参数。特别地,如果发现 自己低估了任务运行时间,用户不能使用 scontrol 命令延长任务最大时间。但是可以根据需求减少任务的最大时间。若确实有延长任务时间的急切需求请联系管理员。
批量提交作业¶
如果我们需要运行一组作业,这些作业所需的资源和内容非常相似,只是一些参数 不相同。这个时候借助 Job Array 就可以很方便地批量提交这些作业。Job Array 中的 每一个作业在调度时视为独立的作业,仍然受到队列以及服务器的资源限制。 在 SLURM 脚本中使用 #SBATCH -a range 即可指定 Job Array 的数字范围,其中的 range 参数需要是连续或不连续的整数。下面几种指定方式都是合法的。
# 作业编号范围是 0 到 9,均含边界
SBATCH -a 0-9
# 作业编号是 0,2,4
SBATCH -a 0,2,4
# 同上,作业编号为 0,2,4,这个写法的意义相当于 MATLAB 中 的 0:2:5,即间隔变成 2
SBATCH -a 0-5:2
# 混合指定也是可以的
SBATCH -a 0-9,20,40
SLURM_ARRAY_JOB_ID 作业数组中第一个作业的 ID。
SLURM_ARRAY_TASK_ID 该作业在数组中的索引。
SLURM_ARRAY_TASK_COUNT 作业数组中作业总数。
SLURM_ARRAY_TASK_MAX 作业数组中最后一个作业的索引。
SLURM_ARRAY_TASK_MIN 作业数组中第一个作业的做引。
对于每个数组内的作业,它的默认输出文件的命名方式为 slurm-JOBID_TASKID.out。
批量提交作业的例子¶
下面是一个很小的 SLURM 脚本例子,它使用 Job Array 来返回一些预设数组中的不同元素。 在实际应用中,这些不同的字符串或许就是程序所需输入的文件名。当然你也可以使用一个脚本来包装你的程序,然后在这个脚本中获取这个环境变量。
array.slurm
#!/bin/bash
#SBATCH -J array
#SBATCH -p cpu
#SBATCH -N 1
#SBATCH --cpus-per-task=1
#SBATCH -t 5:00
#SBATCH -a 0-2
input=(foo bar baz)
echo "This is job #${SLURM_ARRAY_JOB_ID}, with parameter ${input[$SLURM_ARRAY_TASK_ID]}"
echo "There are ${SLURM_ARRAY_TASK_COUNT} task(s) in the array."
echo " Max index is ${SLURM_ARRAY_TASK_MAX}"
echo " Min index is ${SLURM_ARRAY_TASK_MIN}"
sleep 5
提交以上脚本并使用 squeue 命令查看可以看到下面的结果:
[wlzx_xy@admin playground]$ sbatch array.slurm
Submitted batch job 50
[wlzx_xy@admin playground]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
50_0 cpu array wlzx_xy R 0:01 1 comput1
50_1 cpu array wlzx_xy R 0:01 1 comput1
50_2 cpu array wlzx_xy R 0:01 1 comput1
slurm-50_1.out
This is job #50, with parameter bar
There are 3 task(s) in the array.
Max index is 2
Min index is 0
# 取消 50 号作业数组 TASK_ID 为 1 和 2 的作业。
scancel 50_[1-2]
# 取消 50 号作业数组 TASK_ID 为 0 和 2 的作业。
scancel 50_0 50_2
# 取消 50 号作业数组的全部作业。
scancel 50
致 PBS 用户¶
考虑到某一些用户已经习惯了 PBS 作业调度系统,这里整理了 PBS 和 SLURM 使用的 对应关系。