Slurm Job
草稿: 本文因某种原因尚未公开。
专栏文章
Slurm Job 介绍
作业
SLURM 系统有三种作业模式:
- 交互模式,srun 命令
- 批处理模式,sbatch 命令
- 命令行模式,salloc 命令
作业的状态:
$ scontrol show job <id>
JobId=<id> JobName=<job-name>
UserId=abc(10001) GroupId=abc(10001) MCS_label=N/A
Priority=1068 Nice=0 Account=abc QOS=normal
JobState=COMPLETED Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
RunTime=00:02:04 TimeLimit=02:00:00 TimeMin=N/A
SubmitTime=2021-08-15T11:15:18 EligibleTime=2021-08-15T11:15:18
AccrueTime=2021-08-15T11:15:18
StartTime=2021-08-15T11:15:18 EndTime=2021-08-15T11:17:22 Deadline=N/A
PreemptEligibleTime=2021-08-15T11:15:18 PreemptTime=None
SuspendTime=None SecsPreSuspend=0 LastSchedEval=2021-08-15T11:15:18
Partition=default AllocNode:Sid=c1:214936
ReqNodeList=(null) ExcNodeList=(null)
NodeList=c1
BatchHost=c1
NumNodes=1 NumCPUs=2 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=2,mem=200M,node=1,billing=2s
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
MinCPUsNode=1 MinMemoryCPU=100M MinTmpDiskNode=0
Features=(null) DelayBoot=00:00:00
OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
Command=sleep 100
WorkDir=/home/abc
StdErr=/home/abc/<job-id>.out
StdIn=/dev/null
StdOut=/home/abc/<job-id>.out
Power=
MailUser=abc MailType=INVALID_DEPEND,BEGIN,END,FAIL,REQUEUE,STAGE_OUT
NtasksPerTRES:0参数说明:
- JobId:作业号
- JobName:作业名
- UserId:用户名(用户 ID)
- GroupId:用户组(组 ID)
- MCS_label:
- Priority:优先级,越大越优先,如果为 0 则表示被管理员挂起,不允许运行
- Nice:Nice 值,越小越优先,-20 到 19
- Account:记账用户名
- QOS:作业的服务质量
- JobState:作业状态
- PENDING/PD:排队中
- PREEMPTED/PR:抢占
- RUNNING/R:运行中
- CANCELLED/CA:已取消
- CONFIGURING/CF:配置中
- COMPLETING/CG:完成中
- COMPLETED/CD:已完成
- FAILED/F:已失败
- SUSPENDED/S:挂起
- TIMEOUT/TO:超时
- NODE FAILURE/NF:节点失效
- SPECIAL EXIT STATE/SE:特殊退出状态
- Reason:原因
- Dependency:依赖关系
- Requeue:节点失效时,是否重排队,0 为否,1 为是
- Restarts:作业已被重启的次数计数
- BatchFlag:是否为批处理作业,0 为否,1 为是
- Reboot:节点空闲时是否重启节点,0 为否,1 为是
- ExitCode:作业退出代码
- RunTime:已运行时间
- TimeLimit:作业允许的最大运行时间上限
- TimeMin:最小时间
- SubmitTime:提交时间
- EligibleTime:获得认可时间
- StartTime:开始运行时间
- EndTime:预计结束时间
- Deadline:截止时间
- PreemptTime:先占时间
- SuspendTime:挂起时间
- SecsPreSuspend:0
- Partition:对列名
- AllocNode:Sid:分配的节点:系统 ID 号
- ReqNodeList:需要的节点列表,格式类似 node[1-10,11,13-28]
- ExcNodeList:排除的节点列表,格式类似 node[1-10,11,13-28]
- NodeList:实际运行节点列表,格式类似 node[1-10,11,13-28]
- BatchHost:批处理节点名
- NumNodes:节点数,
RUNNING时为分配的作业,PENDING时为-N numnodes|[min nodes]-[max nodes] - NumCPUs:CPU 核数
- NumTasks:任务数
- CPUs/Task:CPU 核数/任务数
- ReqB:S:C:T:所需的主板数:每主板 CPU 颗数:每颗 CPU 核数:每颗 CPU 核的线程数,- <baseboard_count>:<socket_per_baseboard_count>:<core_per_socket_count>:<thread_per_core_- count>
- TRES:显示分配给作业的可被追踪的资源
- Socks/Node:每节点 CPU 颗数
- NtasksPerN:B:S:C:每主板数:每主板 CPU 颗数:每颗 CPU 的核数:每颗 CPU 核的线程数启动的作业数,- <tasks_per_node>:<tasks_per_baseboard>:<tasks_per_socket>:<tasks_per_core>
- CoreSpec:各节点系统预留的 CPU 核数,如未包含,则显示*
- MinCPUsNode:每节点最小 CPU 核数
- MinMemoryNode:每节点最小内存大小,0 表示未限制
- MinTmpDiskNode:每节点最小临时存盘硬盘大小,0 表示未限制
- Features:特性
- Gres:通用资源
- Reservation:预留资源
- OverSubscribe:是否允许与其它作业共享资源,OK 允许,NO 不允许
- Contiguous:是否要求分配连续节点,0 为否,1 为是
- Licenses:软件授权
- Network:网络
- Command:作业命令
- WorkDir:工作目录
- StdErr:标准出错输出文件
- StdIn:标准输入文件
- StdOut:标准输出文件
job priority
作业的优先级为整数,取值范围为 0 ~ 4294967295。数值越大,作业在队列中的位置就越高,调度作业的时间也就越早。
Job Exit Codes
命令行模式
$ salloc -N 2 -n 4 -p test-job-partition -t 100 /bin/bash
$ salloc -n 1 -N 1 -p test-job-partition参数说明:
- -N 节点数
- -n 进程数
交互模式
$ srun hostname
$ srun -N 1 -l hostname
$ srun -N 1 -n 2 -l uptime
$ srun -n 4 ./a.out
>- 查看支持的 MPI(Message Passing Interface)
$ srun --mpi=list
srun: MPI types are...
srun: pmix
srun: pmi2
srun: pmix_v2
srun: none
srun: openmpi- 示例
$ srun --mpi=pmix -n2 -N2 -l uptime
0: 15:17:14 up 21 days, 21:12, 1 user, load average: 0.00, 0.01, 0.13
1: 15:17:14 up 21 days, 6:21, 0 users, load average: 0.06, 0.03, 0.05
$ srun --mpi=openmpi -n2 -N2 -l uptime
0: 15:17:22 up 21 days, 21:12, 1 user, load average: 0.00, 0.01, 0.13
1: 15:17:22 up 21 days, 6:22, 0 users, load average: 0.06, 0.03, 0.05批处理模式
- test-job.sh
#!/bin/env bash
# file: test-job.sh
# set the number of nodes
#SBATCH --nodes=2
# set the number of tasks (processes) per node
#SBATCH --ntasks-per-node=4
# set partition
#SBATCH --partition=test-job-partition
# set max wallclock time
#SBATCH --time=2:00:00
# set name of job
#SBATCH --job-name=test-job
# set batch script's standard output, %j is job id
#SBATCH --output=test-job-%j.out
# set batch script's error output, %j is job id
#SBATCH -e job.%j.err
# mail alert at start, end and abortion of execution
#SBATCH --mail-type=ALL
# send mail to this address
#SBATCH --mail-user=user@mail.com
# run the application
srun ./a.out --input /mnt/nas/a.txt# 提交批处理作业
$ sbatch test-job.sh示例
- job.sh
#!/bin/bash
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 1
#SBATCH --job-name test-1
#SBATCH --nodes 1
#SBATCH --partition normal
#SBATCH --chdir ~/test-1/
#SBATCH --time 72:00:00
#SBATCH -e ~/test-1/%j.err
#SBATCH -o ~/test-1/%j.out
mpirun -genv I_MPI_FABRICS ofi gmx_mpi mdrun -ntomp 1 -nsteps 1000 -pin on -s ./topol_pme.tpr
srun hostname; srun echo Hello World- 提交作业
sbatch job.shsbatch创建job id为10621062.batch记录批处理脚本所需的资源,情况如下:
$ sacct -j 1062
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1062 test-1 normal root 1 RUNNING 0:0
1062.batch batch root 1 RUNNING 0:01062.0\1062.1\1062.23 个步骤- 任务结束后情况
$ sacct -j 1062
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1062 test-1 normal root 1 COMPLETED 0:0
1062.batch batch root 1 COMPLETED 0:0
1062.0 hydra_bst+ root 1 COMPLETED 0:0
1062.1 hostname root 1 COMPLETED 0:0
1062.2 echo root 1 COMPLETED 0:0
$ sacct -j 1062 -p
JobID|JobName|Partition|Account|AllocCPUS|State|ExitCode|
1062|test-1|normal|root|1|COMPLETED|0:0|
1062.batch|batch||root|1|COMPLETED|0:0|
1062.0|hydra_bstrap_proxy||root|1|COMPLETED|0:0|
1062.1|hostname||root|1|COMPLETED|0:0|
1062.2|echo||root|1|COMPLETED|0:0|1066.batch列展示资源使用情况
$ sstat -a -p -j 1066 -o avecpu,avecpufreq,avediskread,avediskwrite,jobid
AveCPU|AveCPUFreq|AveDiskRead|AveDiskWrite|JobID|
00:00.000|650M|16691684|89905|1066.batch|
00:27.000|80.48M|9783205|1141904|1066.0|参数
适用于 srun、sbatch、salloc
- -A
# 指定计费账户 - –begin # 指定作业开始时间
- -c, –cpus-per-task=NCPUs # 指定每个进程使用核数,不指定默认为 1
- -e, –error=error_filename # 指定错误文件输出
- -D, –chdir # 指定脚本/命令的工作目录
- –get-user-env # 获取当前的环境变量
- –gres=
- # 使用 gpu 这类资源,如申请两块 gpu 则 –gres=gpu:2
- -J, –job-name=JOBNAME # 指定作业名称
- –mail-type=END/FAIL/ALL # 邮件提醒,可选:END,FAIL,ALL
- –mail-user=mail_address # 通知邮箱地址
- -n, –ntasks=NTASKs # 指定总进程数;默认情况下一个任务一个核心,–cpus-per-task 参数可以修改该默认值
- –ntasks-per-node=N # 指定每个节点进程数/核数,
--ntasks参数的优先级高于该参数,使用-n参数后变为每个节点最多运行的进程数 - -N, –nodes=N # 指定节点数量
- -o, –output=out_filename # 指定输出文件输出
- -p, –partition=debug # 指定分区
- -q, –qos=
# 指定 QOSs - -t, –time=dd-hh:mm:ss # 作业最大运行时间
- -w, –nodelist=node[1,2] # 指定作业只能在这些节点上运行(节点不可用则等待),不可与避免节点冲突
- -x, –exclude=node[3,5-6] # 指定避免使用节点,不可与优先节点冲突
- –mem-per-cpu=MB # 指定计算 cpu 最大占用内存大小
作业阵列
工作 ID 和环境变量
- SLURM_ARRAY_JOB_ID 将设置为数组的第一个作业 ID,
%A - SLURM_ARRAY_TASK_ID 将设置为作业数组索引值,
%a - SLURM_ARRAY_TASK_COUNT 将设置为作业数组中的任务数
- SLURM_ARRAY_TASK_MAX 将设置为最高作业数组索引值
- SLURM_ARRAY_TASK_MIN 将设置为最低作业数组索引值
文件名
%A表示 SLURM_ARRAY_JOB_ID%a表示 SLURM_ARRAY_TASK_ID%j表示作业分配 ID(Job Allocation ID,当前作业或子作业的 ID)
Slurm 支持的最大 MaxArraySize 为 4000001
sbatch
srun -p gpu -w c4 --gres=gpu:2 abc.sh- 工作依赖,复杂 job 构造
sbatch my.job
# Wait for specific job array elements
sbatch --depend=after:123_4 my.job
sbatch --depend=afterok:123_4:123_8 my.job2
# Wait for entire job array to complete
sbatch --depend=afterany:123 my.job
# Wait for corresponding job array elements
sbatch --depend=aftercorr:123 my.job
# Wait for entire job array to complete successfully
sbatch --depend=afterok:123 my.job
# Wait for entire job array to complete and at least one task fails
sbatch --depend=afternotok:123 my.job- afterok 作业阵列中的所有任务成功完成
- afternotok 作业阵列中的所有任务完成,存在没有成功的作业
- afterany 作业阵列中所有任务后完成
- aftercorr 作业阵列相应的任务 ID 已成功完成(运行完成为零的退出代码)
作业 demo
- demo-1
$ pdsh -w c1 chmod u+s /bin/ping
$ cat run.sh
ping -c 2 172.20.0.1
$ srun -N 1 -l bash /home/test/run.sh
$ srun -N 1 -n 2 -l bash /home/test/run.sh- demo-2
test.slurm:
#!/bin/bash
#SBATCH -J slurmtest
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -N 1
#SBATCH --exclusive
#SBATCH -p X86
for x in {0..10}; do
echo "This is a slurmtest for `arch`!"
sleep 5
done提交作业:
sbatch test.slurmlua - job submit 插件
https://github.com/SchedMD/slurm/blob/master/contribs/lua
- slurm.conf 中配置:
JobSubmitPlugins=lua- 新增配置文件:
/etc/slurm/job_submit.lua:
disableAccountsFile = "/public/disableAccount/disableAccounts"
function slurm_job_submit(job_desc, part_list, submit_uid)
local usedAccount = ""
if (job_desc.account == null) then
usedAccount = job_desc.default_account
else
usedAccount = job_desc.account
end
slurm.log_info("Account used is %s", usedAccount)
if (checkValueInFile(disableAccountsFile, usedAccount) == 1) then
slurm.log_info("The usedAccount is disabled!")
return 1
end
end
function slurm_job_modify(job_desc, job_rec, part_list, modify_uid)
return slurm.SUCCESS
end
--所有job信息的特殊处理 值为空时赋值nil(comment,partition可能为空);值为65534,4294967294时赋值为-1(num_tasks等默认值)--
function getValue(value, name)
if (value == null) then
slurm.log_info("check value null")
value = "nil"
elseif (value == 65534 or value == 4294967294) then
if ("cpus_per_task" == name) then
value = 1
else
value = -1
end
end
return value
end
--检查文件中是否有该value值
function checkValueInFile(filename, value)
local result = 0
local y = 1
local file = io.open(filename, "r");
if (file == nil) then
slurm.log_info("%s not exist!", disableAccountsFile)
return 0
end
for line in file:lines() do
if (line == tostring(value)) then
result = result + 1
end
y = y + 1
end
file:close()
if (result == 0) then
return 0
else
return 1
end
end
slurm.log_info("initialized")
return slurm.SUCCESS-
禁用的 account 文件:
/public/disableAccount/disableAccounts,每行一个 account -
然后重启
slurmctd:
systemctl stop slurmctld
systemctl start slurmctldFAQ
salloc: error: Job submit/allocate failed: Invalid account or account/partition combination specified
问题:
[abc@sms1 ~]$ salloc -N 1 -c 1 -p normal
salloc: error: Job submit/allocate failed: Invalid account or account/partition combination specified
[xiexianbin@sms1 ~]$ salloc -N 1 -c 1 -p normal
salloc: Pending job allocation 3
salloc: job 3 queued and waiting for resources
salloc: job 3 has been allocated resources
salloc: Granted job allocation 3
[xiexianbin@sms1 ~]$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
normal* up infinite 1 mix c1用户没有 partition 的权限或用户指定错误。
- 上一页: Slurm sreport 命令
- 下一页: Slurm 开发
专栏文章
- Slurm 开发
- Slurm rpmbuild
- Slurm 相关术语
- Slurm QoS 使用
- Slurm Job(当前)
- Slurm Partition 使用
- Slurm REST API 使用
- Slurm scontrol 命令
- Slurm sacct/sacctmgr 命令
- Slurm 命令使用说明
- Slurm sreport 命令
- Slurm FaQ
- Slurm 安装部署
最近更新
最新评论