Slurm Job

发布时间: 更新时间: 总字数:3265 阅读时间:7m 作者:IP:上海 网址
专栏文章
  1. Slurm 开发
  2. Slurm rpmbuild
  3. Slurm 相关术语
  4. Slurm QoS 使用
  5. Slurm Job(当前)
  6. Slurm Partition 使用
  7. Slurm REST API 使用
  8. Slurm scontrol 命令
  9. Slurm sacct/sacctmgr 命令
  10. Slurm 命令使用说明
  11. Slurm sreport 命令
  12. Slurm FaQ
  13. Slurm 安装部署

Slurm Job 介绍

作业

SLURM 系统有三种作业模式:

  • 交互模式,srun 命令
  • 批处理模式,sbatch 命令
  • 命令行模式,salloc 命令

作业的状态:

Slurm job status1

Slurm job status2

bash
$ 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

命令行模式

bash
$ salloc -N 2 -n 4 -p test-job-partition -t 100 /bin/bash
$ salloc -n 1 -N 1 -p test-job-partition

参数说明:

  • -N 节点数
  • -n 进程数

交互模式

bash
$ srun hostname
$ srun -N 1 -l hostname
$ srun -N 1 -n 2 -l uptime
$ srun -n 4 ./a.out
>
  • 查看支持的 MPI(Message Passing Interface)
bash
$ srun --mpi=list
srun: MPI types are...
srun: pmix
srun: pmi2
srun: pmix_v2
srun: none
srun: openmpi
  • 示例
bash
$ 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
bash
#!/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
bash
# 提交批处理作业
$ sbatch test-job.sh

示例

  • job.sh
bash
#!/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
  • 提交作业
text
sbatch job.sh
  • sbatch 创建 job id 为 1062
  • 1062.batch 记录批处理脚本所需的资源,情况如下:
bash
$ 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:0
  • 1062.0\1062.1\1062.2 3 个步骤
  • 任务结束后情况
bash
$ 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 列展示资源使用情况
bash
$ 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

text
srun -p gpu -w c4 --gres=gpu:2 abc.sh
  • 工作依赖,复杂 job 构造
text
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
bash
$ 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:

bash
#!/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

提交作业:

text
sbatch test.slurm

lua - job submit 插件

https://github.com/SchedMD/slurm/blob/master/contribs/lua

  • slurm.conf 中配置:
text
JobSubmitPlugins=lua
  • 新增配置文件:/etc/slurm/job_submit.lua:
text
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:

bash
systemctl stop slurmctld
systemctl start slurmctld

FAQ

salloc: error: Job submit/allocate failed: Invalid account or account/partition combination specified

问题:

bash
[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 的权限或用户指定错误。