提交批处理作业-sbatch(推荐)
简介
用户使用sbatch命令提交作业脚本,其基本格式为sbatch jobfile。jobfile为作业脚本文件。在批处理作业脚本中,脚本第一行以"#!"字符开头,并指定脚本文件的解释程序,如sh,bash。接下来写作业使用到的调度系统参数,以 #SBATCH 开头,最后写作业运行的程序命令。
用户可使用sbatch命令提交用户作业脚本。示例如下:
sbatch xxx.sbatch
作业提交脚本格式编写如下,作业控制指令以"#SBATCH"开头,其他注释以"#"开头。例如wrf测试脚本run.sbatch如下:
#!/bin/bash
#SBATCH -J wrf
#SBATCH --comment=WRF
#SBATCH -n 128
#SBATCH --ntasks-per-node=128
#SBATCH -p hfactest
#SBATCH -o %j.out
#SBATCH -e %j.err
mpirun -np 128./wrf.exe
sbatch常用选项
作业控制参数如下:
选项 | 含义 | 类型 | 示例 |
---|---|---|---|
-J, --job-name=<jobname> | 作业名称,使用squeue看到的作业名 | 字符串 |
-J wrf 表示作业名称为"wrf" |
-n, --ntasks=<number> | 作业申请的总task任务数 | 数值 | -n 240 表示作业申请240个task任务 |
-N, --nodes=<minnodes[-maxnodes]> | 作业申请的节点数 | 数值 | -N 10 表示作业申请10个计算节点 |
-p, --partition=<partition_names> | 指定作业提交的队列 | 字符串 | -p hfactest 表示将作业提交到 hfactest 队列 |
--ntasks-per-node=<ntasks> | 指定每个节点运行task任务数 | 数值 | --ntasks-per-node=32 表示每个节点运行32个任务(进程) |
-c, --cpus-per-task=<ncpus> | 指定单个任务需要的处理器数目 | 数值 | --cpus-per-task=1 表示每个任务占用1个处理器核(默认值为1) |
-t, --time=<time> | 指定作业的执行时间,若超过该时间,作业将会被kill掉 | 数值 | -t 30 表示作业的执行时间不超过30分钟;-t 1-23:00:00 表示作业执行时间不超过47个小时 |
-o, --output=<filename pattern> | 指定作业标准输出文件的名称,不能使用shell环境变量 | 字符串 | -o %j 表示使用作业号作为作业标准输出文件的名称,%j 表示作业号 |
-e, --error=<filename pattern> | 指定作业标准错误输出文件的名称,不能使用shell环境变量 | 字符串 | -e %j 表示使用作业号作为作业标准错误输出文件的名称 |
-w, --nodelist=<node name list> | 指定作业分配到特定计算节点 | 字符串 | -w t0100,t0101 表示使用t0100 t0101等2个节点 |
-x, --exclude=<node name list> | 指定作业不分配到特定的计算节点 | 字符串 | -x t0100,t0101 表示不使用t0100 t0101等2个节点 |
--exclusive | 指定作业独占计算节点 | 无 | #sbatch --exclusive |
--mem=<size[units]> | 指定作业在每个节点使用的内存限制 | 字符串 | --mem=2G 限定作业在每个节点最多占用2G的最大内存 |
--mem-per-cpu=<size[units]> | 限定每个进程占用的内存数 | 字符串 | --mem-per-cpu=512M 限定作业每个进程占用512M的最大内存 |
-d, --dependency=<dependency_list> | 作业依赖关系设置 | 字符串 | -d after:123 表示本作业须待作业123开始以后再执行 |
--gres=<list> | 指定每个节点使用通用资源名称及数量 | 字符串 | --gres=加速卡:2 表示本作业使用加速卡,且每个节点使用2卡 |
使用示例
串行作业示例
#!/bin/bash
#SBATCH -J TestSerial
#SBATCH -p hfactest
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -o %j.out
#SBATCH -e %j.err
echo "SLURM_JOB_PARTITION=$SLURM_JOB_PARTITION"
echo "SLURM_JOB_NODELIST=$SLURM_JOB_NODELIST"
srun ./calc_serial # 也可以直接运行软件: ./calc_serial
mpi作业示例
OpenMPI支持多种方式与作业调度集成,其中最推荐的方式是使用srun直接启动任务。
在作业脚本中使用srun:
#!/bin/bash
#SBATCH -J MPI
#SBATCH -N 2
#SBATCH -p hfactest
#SBATCH -t 00:10:00
#SBATCH --mem-per-cpu=3G
#SBATCH --ntasks-per-node=32
#SBATCH -o %j
module load compiler/devtoolset/7.3.1
module load compiler/rocm/3.3
module load mpi/hpcx/2.4.1/gcc-7.3.1
# 4x32, about 60 sec
export LOOPMAX=1000000
CORELOOP=$(expr $LOOPMAX / 128)
echo "CORELOOP=$CORELOOP"
export LOOPMAX=$(expr $SLURM_NTASKS \* $CORELOOP )
echo "LOOPMAX=$LOOPMAX"
export MPITYPE=pmix_v3 ##MPITYPE可以用srun --mpi=list 进行查看
echo "use srun, loop=$LOOPMAX"
srun --mpi=$MPITYPE ./open_fire_v5 $LOOPMAX
作业环境变量
提交作业后,作业管理软件会产生一些环境变量,可以在作业脚本中使用。列举如下:
名称 | 含义 | 类型 | 示例 |
---|---|---|---|
SLURM_JOB_ID | 作业id,即作业调度系统为作业分配的作业号 | 数值 |
hostfile=" ma.$SLURM_JOB_ID" 使用 $SLURM_JOB_ID 定义 machinefile,指定mpi节点文件 |
SLURM_JOB_NAME | 作业名称,即-J 选项指定的名称 | 字符串 | mkdir ${SLURM_JOB_NAME} 根据作业名称创建临时工作目录 |
SLURM_JOB_NUM_NODES | 作业分配到的节点总数 | 数值 | echo $SLURM_JOB_NUM_NODES |
SLURM_JOB_NODELIST | 作业被分配到的节点列表 | 字符串 | echo $SLURM_JOB_NODELIST |
SLURM_JOB_PARTITION | 作业被分配到的队列名 | 字符串 | echo $SLURM_JOB_NODELIST |
更完整的输入和输出环境变量可通过sbatch帮助手册查询。