编写Slurm脚本
#!/bin/bash
#SBATCH -J test # 作业名是 test
#SBATCH -p cpu # 提交到 cpu 分区
#SBATCH -N 1 # 使用一个节点
#SBATCH --cpus-per-task=1 # 每个进程占用一个 cpu 核心
#SBATCH -t 5:00 # 任务最大运行时间是 5 分钟
#SBATCH -o test.out # 将屏幕的输出结果保存到当前文件夹的 test.out
./hello # 执行我的 ./hello 程序
这段脚本告诉工作站运行任务的详细设定:它被提交到 cpu 分区当中,申请 1 个节点的 1 个 核心,限制任务最大运行时间是五分钟,将标准输出和标准错误放在 test.out 中。
主题内容为执行当前目录下的hello程序。
分区(Partition)
分区可以看作是一系列节点的集合。不同的节点的特性和硬件属性不同,设置分区可以帮助用户更好确定节点的特点,从而可以选择合适的节点进行运算。
QoS (Quality of Service)
QoS表示服务质量,它更多刻画了作业的属性,而不是节点的属性。不同任务特性不同,制定QoS可以使得资源更好分配。
提交/取消任务
提交任务之前,可以使用sinfo查看可用资源情况。
state中的idle表示空闲状态,任务可以提交。
使用sbatch和scancel命令进行任务的提交和取消。
sbatch run.slurm
scancel JOBID
任务追踪
squeue命令来查看所有已经提交和正在运行的作业。
Slurm 提供了丰富的追踪任务命令。例如scontrol, sacct。
对于正在运行或者排队的任务,可以使用
scontrol show job JOBID
作业完成后,需要使用sacct命令查看历史作业。默认情况下,用户只能查看属于自己的历史作业。直接使用sacct命令会输出从当天 00:00:00 起到现在的全部作业。
如果使用了
sacct -s MMDD
则会输出从MM月DD日起的所有历史作业。默认情况下会输出作业ID,作业名,分区,账户,分配的CPU,任务结束状态,返回码(ExitCode)。
更新任务
有时候,如果很早提交了任务,但是任务开始前却发现作业的属性写错了(例如提交错了分区,忘记申请GPU个数)。此时取消重新排队很不换算。如果此时作业恰好没有在运行,我们可以通过scontrol命令来修改作业属性
scontrol update jobid=JOBID ...
可以修改的属性很多,在输入完 JOBID 后空一格并敲两下 键。
[liuhy@admin ~]$ scontrol update jobid=938 <TAB><TAB>
account=<account> mintmpdisknode=<megabytes> reqnodelist=<nodes>
conn-type=<type> name> reqsockets=<count>
contiguous=<yes|no> name=<name> reqthreads=<count>
dependency=<dependency_list> nice[=delta] requeue=<0|1>
eligibletime=yyyy-mm-dd nodelist=<nodes> reservationname=<name>
excnodelist=<nodes> numcpus=<min_count[-max_count] rotate=<yes|no>
features=<features> numnodes=<min_count[-max_count]> shared=<yes|no>
geometry=<geo> numtasks=<count> starttime=yyyy-mm-dd
gres=<list> or switches=<count>[@<max-time-to-wait>]
licenses=<name> partition=<name> timelimit=[d-]h:m:s
mincpusnode=<count> priority=<number> userid=<UID
minmemorycpu=<megabytes> qos=<name> wckey=<key>
minmemorynode=<megabytes> reqcores=<count>
例如,更改当前的分区到 gpu,并且申请 1 块卡,可以输入
scontrol update jobid=938 partition=gpu gres=gpu:1
注意变更的时候仍然不能超过系统规定的上限。变更成功后,作业的优先级可能需要重新 来计算。
当任务已经开始运行时,一般不可以再变更申请资源,分区等参数。特别地,如果发现 自己低估了任务运行时间,用户不能使用 scontrol 命令延长任务最大时间。但是可以 根据需求减少任务的最大时间。若确实有延长任务时间的急切需求请联系管理员。
PBS作业调度系统于SLURM调度系统比较。
配置服务器运行环境
查看当前所载入的所有module,可以使用下面的命令:
module list
想要查看服务器中所有可用的module,可以使用如下的命令。
module avail
执行完毕后,可以从系统所有module中选出需要的环境进行添加。添加某些软件时需要制定版本。例如
module add gcc/4.8.5
如果不写版本号,则服务器会添加后面标注有(default)的项。
要把某个模块从系统环境中删掉,则需要使用
module remove < module name >
如果要删除全部的模块,可以直接使用
module purge
有的时候,模块之间会有所冲突,你无法在同一时间同时加载两个模块。例如同一软件的不同版本,或者是接口相同的不同软件。当你载入其中一个后,再载入另一个就会出错。
slurm脚本中使用module
module 命令仅作用在当前节点上,如果使用 SLURM 脚本提交任务,那么实际运行任务的 节点和当前节点是不同的,因此方便的做法是将 module 命令一并写在 SLURM 脚本中。
#!/bin/bash
#SBATCH -J test
#SBATCH -p cpu
#SBATCH -t 5:00
module add gcc/4.8.5
module add anaconda/3
# do your computation jobs...
参考
http://bicmr.pku.edu.cn/~wenzw/pages/slurm.html