Slurm使用说明¶
Slurm简介¶
Slurm(Simple Linux Utility for Resource Management)是一种可扩展的工作负载管理器,是一个广泛使用的开源作业调度系统,专为Linux集群设计。
在部署了slurm的系统上,slurm daemons, slurm commands, 和API functions均可通过帮助选择查看。
命令选择-help
也能够提供一个简洁的功能选项总结。需要注意的是,命令选项都区分大小写。
常用命令¶
命令 | 说明 |
---|---|
sbatch | 向 SLURM 提交批处理脚本 |
srun | 用于提交执行任务或实时启动作业步骤 |
squeue | 列出当前正在运行或在队列中的所有作业 |
scancel | 取消提交的工作 |
sinfo | 检查所有分区中节点的可用性 |
scontrol | 查看特定节点的配置或有关作业的信息 |
sacct | 显示所有作业的数据 |
salloc | 预留交互节点 |
sinfo 查看集群状态¶
Slurm | 功能 |
---|---|
sinfo -N | 查看节点级信息 |
sinfo -N --states=idle | 查看可用节点信息 |
sinfo --partition=cpu | 查看队列信息 |
sinfo --help | 查看所有选项 |
sinfo 举例¶
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpu up 7-00:00:0 656 idle cas[001-656]
dgx2 up 7-00:00:0 8 idle vol[01-08]
节点状态¶
状态码 | 节点状态 |
---|---|
idle | 节点可用 |
drain | 节点故障 |
alloc | 节点在用 |
down | 节点下线 |
mix | 节点部分占用,但仍有剩余资源 |
squeue 查看作业信息¶
squeue可用于检查作业状态。用户可以在作业执行期间通过SSH登录到计算节点。
命令 | 功能 |
---|---|
squeue | 查看所有USER_LIST的作业 |
squeue -j jobid | 查看作业信息 |
squeue -l | 查看细节信息 |
squeue -n HOST | 查看特定节点作业信息 |
squeue --state=R | 查看特定状态的作业 |
squeue --help | 查看所有的选项 |
squeue 举例¶
默认情况下,squeue只会展示在排队或在运行的作业。
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
18046 dgx2 ZXLing eenl R 1:35:53 1 vol04
17796 dgx2 python eexdl R 3-00:22:04 1 vol02
显示您自己账户下的作业:
$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
17923 dgx2 bash hpcwj R 1-12:59:05 1 vol05
-l 选项可以显示更细节的信息。
$ squeue -l
JOBID PARTITION NAME USER STATE TIME TIME_LIMI NODES NODELIST(REASON)
17923 dgx2 bash hpcwj RUNNING 1-13:00:53 30-00:00:00 1 vol05
作业状态¶
状态码 | 节点状态 |
---|---|
R | Running,正在运行 |
PD | Pending,正在排队 |
CG | 即将完成 |
CD | 已完成 |
sbatch 作业提交¶
准备作业脚本然后通过sbatch提交是 Slurm 的最常见用法。
为了将作业脚本提交给作业系统,使用如下方法把作业提交给Slurm
$ sbatch jobscript.slurm
sbatch 参数¶
sbatch具有丰富的参数,但请注意本平台不支持指定作业占用内存大小。
sbatch参数 | 含义 |
---|---|
-n [count] | 总进程数 |
--ntasks-per-node=[count] | 每台节点上的进程数 |
-p [partition] | 作业队列 |
--job-name=[name] | 作业名 |
--output=[file_name] | 标准输出文件 |
--error=[file_name] | 标准错误文件 |
--time=[dd-hh:mm :ss] | 作业最大运行时长 |
--exclusive | 独占节点 |
--mail-type=[type] | 通知类型,可选 all, fail, end,分别对应全通知、故障通知、结束通知 |
--mail-user=[mail_address] | 通知邮箱 |
--nodelist=[nodes] | 偏好的作业节点 |
--exclude=[nodes] | 避免的作业节点 |
--depend=[state:job_id] | 作业依赖 |
--array=[array_spec] | 序列作业 |
sbatch 举例1¶
这是一个名为cpu.slurm的作业脚本,该脚本向cpu队列申请1个节点40核,并在作业完成时通知。在此作业中执行的命令是/bin/hostname。输出将实时更新到文件[jobid] .out和[jobid] .err。
#!/bin/bash
#SBATCH --job-name=hostname
#SBATCH --partition=cpu
#SBATCH -N 1
#SBATCH --mail-type=end
#SBATCH --mail-user=YOU@EMAIL.COM
#SBATCH --output=%j.out
#SBATCH --error=%j.err
/bin/hostname
用以下方式提交作业:
sbatch cpu.slurm
sbatch 举例2¶
这里展示一个更复杂的作业要求,其中将启动80个节点,每台节点40个进程。
#!/bin/bash
#SBATCH --job-name=LINPACK
#SBATCH --partition=cpu
#SBATCH -n 80
#SBATCH --ntasks-per-node=40
#SBATCH --mail-type=end
#SBATCH --mail-user=YOU@EMAIL.COM
#SBATCH --output=%j.out
#SBATCH --error=%j.err
sleep 500;
sbatch 举例3¶
以下作业请求4张GPU卡,其中1个CPU进程管理1张GPU卡。
#!/bin/bash
#SBATCH --job-name=GPU_HPL
#SBATCH --partition=dgx2
#SBATCH -n 4
#SBATCH --ntasks-per-node=4
#SBATCH --gres=gpu:4
#SBATCH --mail-type=end
#SBATCH --mail-user=YOU@MAIL.COM
#SBATCH --output=%j.out
#SBATCH --error=%j.err
sbatch 举例4¶
以下作业启动一个3任务序列(从0到2),每个任务需要1个CPU内核。关于集群上的Python,您可以查阅我们的Python文档。
#!/bin/bash
#SBATCH --job-name=python_array
#SBATCH --mail-user=YOU@MAIL.COM
#SBATCH --mail-type=ALL
#SBATCH --ntasks=1
#SBATCH --time=00:30:00
#SBATCH --array=0-2
#SBATCH --output=python_array_%A_%a.out
#SBATCH --output=python_array_%A_%a.err
module load miniconda2/4.6.14-gcc-4.8.5
source activate YOUR_ENV_NAME
echo "SLURM_JOBID: " $SLURM_JOBID
echo "SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID
echo "SLURM_ARRAY_JOB_ID: " $SLURM_ARRAY_JOB_ID
python < vec_${SLURM_ARRAY_TASK_ID}.py
sbatch 举例5¶
以下作业启动一个3任务序列(从0到2),每个任务需要1个CPU内核。关于集群上的Python,您可以查阅我们的Python文档。
#!/bin/bash %指定运行shell
#提交单个作业
#SBATCH --job-name=JOBNAME %指定作业名称
#SBATCH --partition=debug %指定分区
#SBATCH --nodes=2 %指定节点数量
#SBATCH --cpus-per-task=1 %指定每个进程使用核数,不指定默认为1
#SBATCH -n 32 %指定总进程数;不使用cpus-per-task,可理解为进程数即为核数
#SBATCH --ntasks-per-node=16 %指定每个节点进程数/核数,使用-n参数(优先级更高),变为每个节点最多运行的任务数
#SBATCH --nodelist=node[3,4] %指定优先使用节点
#SBATCH --exclude=node[1,5-6] %指定避免使用节点
#SBATCH --time=dd-hh:mm:ss %作业最大运行时长,参考格式填写
#SBATCH --output=file_name %指定输出文件输出
#SBATCH --error=file_name %指定错误文件输出
#SBATCH --mail-type=ALL %邮件提醒,可选:END,FAIL,ALL
#SBATCH --mail-user=address %通知邮箱地址
source /public/home/user/.bashrc #导入环境变量文件,也可以使用平台预支的module环境
mpirun -n 32 ./iPic3D ./inputfiles/test.inp #运行命令
srun 和 salloc 交互式作业¶
srun可以启动交互式作业。该操作将阻塞,直到完成或终止。例如,在计算主机上运行hostname。
$ srun -N 1 -n 4 -p cpu hostname
cas006
srun -p cpu -n 4 --pty /bin/bash
salloc -N 1 -n 4 -p cpu
ssh casxxx
scontrol 查看和修改作业参数¶
命令 | 功能 |
---|---|
scontrol show job JOB_ID | 查看排队或正在运行的作业的信息 |
scontrol hold JOB_ID | 暂停JOB_ID,可使排队中尚未运行的作业暂停被分配运行,被挂起的作业将不被执行 |
scontrol release JOB_ID | 恢复JOB_ID,取消挂起 |
scontrol update dependency=JOB_ID | 添加作业依赖性 ,以便仅在JOB_ID完成后才开始作业 |
scontrol 举例1:更新作业分区¶
在任务开始前却发现作业的属性写错了(例如提交错了分区,修改名字),取消了重新排队似乎很不划算。如果作业恰好 没在运行,于是我们可以通过 scontrol 命令来更新作业的属性。
scontrol update jobid=JOBID Partition=新的分区名
sacct 查看作业记录¶
命令 | 功能 |
---|---|
sacct -l | 查看详细的帐户作业信息 |
sacct --states=R | 查看具有特定状态的作业的帐号作业信息 |
sacct -S YYYY-MM-DD | 在指定时间后选择处于任意状态的作业 |
sacct --format=“LAYOUT” | 使用给定的LAYOUT自定义sacct输出 |
sacct --help | 查看所有选项 |
默认情况下,sacct显示过去 24小时 的帐号作业信息。
$ sacct
# 查看更多的信息:
$ sacct --format=jobid,jobname,account,partition,ntasks,alloccpus,elapsed,state,exitcode -j 3224
# 查看平均作业内存消耗和最大内存消耗:
$ sacct --format="JobId,AveRSS,MaxRSS" -P -j xxx
Slurm环境变量¶
Slurm | 功能 |
---|---|
$SLURM_JOB_ID | 作业ID |
$SLURM_JOB_NAME | 作业名 |
$SLURM_JOB_PARTITION | 队列的名称 |
$SLURM_NTASKS | 进程总数 |
$SLURM_NTASKS_PER_NODE | 每个节点请求的任务数 |
$SLURM_JOB_NUM_NODES | 节点数 |
$SLURM_JOB_NODELIST | 节点列表 |
$SLURM_LOCALID | 作业中流程的节点本地任务ID |
$SLURM_ARRAY_TASK_ID | 作业序列中的任务ID |
$SLURM_SUBMIT_DIR | 工作目录 |
$SLURM_SUBMIT_HOST | 提交作业的主机名 |
References
1. 作业调度系统 · 北京大学高性能计算使用指南
2. Slurm 作业调度系统 — 上海交大超算平台用户手册 文档
3. SLURM使用基础教程 - 曙光先进计算
4. Slurm User Guide for Great Lakes | ITS Advanced Research Computing