串行作业示例
#!/bin/bash
#SBATCH –J TestSerial
#SBATCH -p normal
#SBATCH -N 1
#SBATCH –n 1
#SBATCH -o log/%j.loop
#SBATCH -e log/%j.loop
echo "SLURM_JOB_PARTITION=$SLURM_JOB_PARTITION"
echo "SLURM_JOB_NODELIST=$SLURM_JOB_NODELIST"
srun ./calc_serial 1000000
mpi作业示例
在HPC上运行任务的主要方法是通过sbatch命令提交一个脚本.
sbatch < xxx.sbatch
作业提交脚本格式编写如下,作业控制指令以"#SBATCH"开头,其他注释以"#"开头。例如测试脚本run.sbatch如下:
#!/bin/bash
#SBATCH -J LShape_adapted-4
#SBATCH -p normal
#SBATCH --ntasks-per-node=8
#SBATCH -w comput7,comput12
###SBATCH -N 2
###SBATCH -n 16 ###selection —N -n run slowly
#SBATCH -o %j_out_16-2.log
#SBATCH -e %j_err.log
#SBATCH -t 1-00:00
JOBID=$SLURM_JOB_ID ### slurm2pbs
NP=$SLURM_NPROCS ### slurm2pbs
### Write basic job infomations
echo -e "The start time is: `date +"%Y-%m-%d %H:%M:%S"` \n"
echo -e "My job ID is: $JOBID \n"
echo -e "The total cores is: $NP \n"
echo -e "The hosts is: \n"
echo "SLURM_JOB_NODELIST=${SLURM_JOB_NODELIST}"
echo "SLURM_JOB_NUM_NODES=${SLURM_JOB_NUM_NODES}"
echo "SLURM_JOB_PARTITION=${SLURM_JOB_PARTITION}"
echo "SLURM_NODELIST=${SLURM_NODELIST}"
echo -e "\n"
### Run APP
# MARK_CMD #Don't delete this line!!!
#!/bin/bash
## job script created by Gridview Jobmanager.
module purge
module load mpich4.1
module load gcc-12
scontrol show hostname > runfile
echo The start time is: `date +"%Y-%m-%d %H:%M:%S"`
mpirun -np $NP -machinefile runfile ./LShape_adapted.exe
# MARK_BASH #Don't delete this line!!!
echo The end time is: `date +"%Y-%m-%d %H:%M:%S"`
sbatch常用选项
作业控制参数如下:
选项 | 含义 | 类型 | 示例 |
---|---|---|---|
-J | 作业名称,使用squeue看到的作业名 | 字符串 | -J wrf;表示作业名称为"wrf" |
-n | 作业申请的总cpu核心数 | 数值 | -n 240;表示作业申请240个cpu核心 |
-N | 作业申请的节点数 | 数值 | -N 10 表示作业申请10个计算节点 |
-p | 指定作业提交的队列 | 字符串 | -p silicon表示将作业提交到silicon队列 |
--ntasks-per-node | 指定每个节点运行进程数 | 数值 | --ntasks-per-node=32表示每个节点运行32个进程(任务) |
--cpus-per-task= |
指定任务需要的处理器数目 | 数值 | --cpus-per-task=1 表示每个任务占用1个处理器核 |
-t | 指定作业的执行时间,若超过该时间,作业将会被杀死 | 数值 | -t 30 表示作业的执行时间不超过30分钟 |
-o | 指定作业标准输出文件的名称,不能使用shell环境变量 | 字符串 | -o %j,表示使用作业号作为作业标准输出文件的名称,%J表示作业号 |
-e | 指定作业标准错误输出文件的名称,不能使用shell环境变量 | 字符串 | -e %j,表示使用作业号作为作业标准错误输出文件的名称 |
-w, --nodelist=hosts... | 指定分配特定的计算节点 | 字符串 | -w t0100,t0101 表示使用t0100 t0101等2个节点 |
-x, --exclude=hosts... | 指定不分配特定的阶段节点 | 字符串 | -x t0100,t0101 表示不使用t0100 t0101等2个节点 |
--exclusive | 指定作业独占计算节点 | 字符串 | sbatch –exclusivetest.job |
--mem=<size[units]> | 指定作业在每个节点使用的内存限制。 | 数字 | --mem=2G 限定作业在每个节点最多占用2G的最大内存。 |
--mem-per-cpu=<size[units]> | 限定每个进程占用的内存数。 | 数字 | --mem-per-cpu=512M 限定作业每个进程占用的最大内存。 |
-d, --dependency= |
作业依赖关系设置 | 字符串 | -d after:123 表示本作业须待作业123开始以后再执行 |
--gres= |
指定每个节点使用通用资源名称及数量 | 字符串 | --gres=加速卡:2 表示本作业使用加速卡,且每个节点使用2卡 |
监控任务进度
我们通常使用squeue和sacct来监控在SLURM中的作业活动。squeue是最重要、最准确的监控工具,因为它可以直接查询SLURM控制器。sacct也可以报告之前完成的任务,但是因为它是通过查询SLURM database获取信息,因此有时候sacct查到的信息和squeue查到的信息会有一点区别。
运行在不附带arguments的情况下运行squeue会显示所有当前正在运行的任务。当使用 squeue -u yourUserName的时候,会只显示你提交的任务。
squeue -u yourUserName
或者是查询一个特定任务:
squeue -j JobID
如果在squeue最后加上了-l选项(意思是long output),那么系统还会返回任务的运行状态。
我们可以通过saact查询特定任务的细节:
sacct -j JobID
取消任务
取消任务的方法是输入scancel加上任务的ID:
scancel JobID
我们可以通过squeue -u命令查询到我们需要的任务的ID。
作业环境变量
提交作业后,作业管理软件会产生一些环境变量,可以在作业脚本中使用。列举如下:
名称 | 含义 | 类型 | 示例 |
---|---|---|---|
SLURM_JOB_ID | 作业id,即作业调度系统为作业分配的作业号,可用于bjobs等命令 | 数值 | 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 |
reference
最后一次更新于2023-04-15
0 条评论