slurm的内置环境变量
# slurm的内置环境变量
# 常用内置变量
通过slurm
作业调度系统提交的任务,会分配一个jobid
号,与这个任务相关的SLURM环境变量,可以通过以SLURM_*
开头的一些内置变量进行查看和使用。
常用内置变量如下:
变量名 | 含义 | 备注 |
---|---|---|
SLURM_JOB_NAME | 任务名 | 默认为提交时的脚本名, 可以用-J 参数进行设置 |
SLURM_NNODES | 分配的节点数 | 常用,与-N 参数含义相同 |
SLURM_JOBID | 分配的任务编号 | |
SLURM_NTASKS | 分配的task数 | |
SLURM_TASKS_PER_NODE | 每个节点分配的task数 | |
SLURM_JOB_ID | 分配的任务编号 | |
SLURM_SUBMIT_DIR | 提交作业时的工作目录 | |
SLURM_NPROCS | 加载的进程数 | 常用,与-n 参数含义相同 |
SLURM_CPUS_ON_NODE | 节点的CPU核心数 | |
SLURM_JOB_NODELIST | 任务的节点列表 | 常用,使用yhq 命令查询到的节点列表 |
SLURM_JOB_CPUS_PER_NODE | 每个节点的CPU核心数 | |
SLURM_SUBMIT_HOST | 提交任务的节点名 | 通常为某个登录节点,如ln2 |
SLURM_JOB_NUM_NODES | 节点的任务数量 |
我们可以尝试编写一个脚本文件slurm-env.sh
来测试一下看看:
#!/bin/bash
echo $SLURM_JOB_NAME
echo $SLURM_NNODES
echo $SLURM_JOBID
echo $SLURM_NTASKS
echo $SLURM_TASKS_PER_NODE
echo $SLURM_JOB_ID
echo $SLURM_SUBMIT_DIR
echo $SLURM_NPROCS
echo $SLURM_CPUS_ON_NODE
echo $SLURM_JOB_NODELIST
echo $SLURM_JOB_CPUS_PER_NODE
echo $SLURM_SUBMIT_HOST
echo $SLURM_JOB_NUM_NODES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
然后使用 yhbatch
命令提交任务:
yhbatch -N 2 -n 4 -p debug slurm-env.sh
1
然后检查 slurm-jobid.out 文件,应该与下方内容相似:
SLURM_JOB_NAME=slurm-env.sh
SLURM_NNODES=2
SLURM_JOBID=17603587
SLURM_NTASKS=4
SLURM_TASKS_PER_NODE=2(x2)
SLURM_JOB_ID=17603587
SLURM_SUBMIT_DIR=/vol-th/home/zhenggang/workdir/slurm
SLURM_NPROCS=4
SLURM_CPUS_ON_NODE=12
SLURM_JOB_NODELIST=cn[13-14]
SLURM_JOB_CPUS_PER_NODE=12(x2)
SLURM_SUBMIT_HOST=ln3
SLURM_JOB_NUM_NODES=2
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
这样,我们就可以在任务脚本中直接使用这些内置变量进行相关操作了。
# 使用yhcontrol获得节点列表
默认使用yhrun
命令运行程序时,用户并不需要关心所使用的节点编号。
当用户需要节点编号,或者使用如mpirun
等命令需要配置如hostfile
文件时,可以在编写的脚本中,使用相关命令生成节点编号文件,进而使用。举例如下:
# get hostname list
yhcontrol show hostname $SLURM_NODELIST | sort > SLURM_NODEFILE
# run job
mpirun -np $SLURM_NPROCS -machinefile SLURM_NODEFILE $EXEC
1
2
3
4
2
3
4
说明:
- 第一行:
yhcontrol show hostnames $SLURM_NODELIST
是将SLURM_NODELIST
变量中的节点名展开显示,sort
命令是进行排序,> SLURM_NODEFILE
用于定向输出到 SLURM_NODEFILE 文件中 - 第二行:
mpirun
命令运行,使用-np $SLURM_NPROCS
个进程,指明-machinefile SLURM_NODEFILE
文件为节点信息文件
这样就可以自动获得节点编号配置文件,并设置给mpirun
命令使用了。
警告
我们发现:SLURM_NODELIST 变量在 csh
环境下未定义,因此下面给出另一种方法,适用于各种 shell 环境
# 使用yhrun获得节点列表
有用户反映,在csh
下,yhcontrol
命令无法正确获得节点列表,我们可以使用yhrun
命令获得。
例如:
# get hostname list
yhrun -N $SLURM_NNODES -n $SLURM_NNODES hostname | sort > SLURM_NODEFILE
# run job
mpirun -np $SLURM_NPROCS -machinefile SLURM_NODEFILE $EXEC
1
2
3
4
2
3
4
说明:
- 第一行:使用
yhrun
命令并行执行hostname
命令,会显示各个节点的主机名,进行排序后,定向输出到 SLURM_NODEFILE 文件中即可 - 第二行:与
yhcontrol
方法相同(见上一节)