管理 Slurm#

简介#

工作负载管理是在系统上提交和控制工作。Slurm 是 DGX SuperPOD 上使用的工作负载管理系统。它是一个用于 Linux 集群的开源作业调度系统,最常用于高性能计算 (HPC) 应用程序。本节将介绍作为 DGX SuperPOD 用户开始使用 Slurm 的一些基础知识。有关 Slurm 使用的更多高级信息,请参阅 Slurm 文档

工作负载管理系统的基本流程是用户向队列提交作业。作业是要执行的工作的集合。提交的内容是一个命令,可以由 shell 脚本或二进制文件定义。Shell 脚本是最常见的,因为一个作业通常由许多不同的命令组成。

系统将获取所有已提交但尚未运行的作业,查看系统状态,然后将这些作业映射到可用资源。此工作流程允许用户管理大型组中的工作,系统将找到最佳方式来排序作业,以最大化系统利用率或系统管理员可以配置的其他指标。

关键 Slurm 术语在表 10中详细说明。

表 10. Slurm 关键术语

术语

定义

作业 (job)

可以在集群上调度的最小工作单元。每个作业请求特定数量的计算节点,并且在达到请求的节点数后可以由 Slurm 启动。

批处理作业 (batch job)

使用作业脚本提交到集群,作业脚本是可执行文件,例如 bash 脚本。Slurm 将等待请求数量的节点可用,然后将这些节点分配给作业,并在组中的第一个节点上运行脚本。然后,脚本中的命令负责在分配中的节点上运行用户工作负载。可以使用 sbatch 命令提交批处理作业。当使用 sbatch 提交作业时,命令将立即返回并将作业放入队列中。

交互式作业 (interactive job)

提交到集群并请求伪终端,以便用户可以交互式地在集群上工作,而无需编写脚本。可以使用带有 –pty 标志的 srun 命令提交交互式作业。当您以交互方式提交作业时,srun 命令将阻塞,直到请求的节点可用,然后为用户提供交互式终端。

Slurm 控制器 (Slurm controller)

该服务器负责跟踪集群中的所有服务器、接受作业提交以及在集群上调度工作。控制器运行 slurmctld 守护程序以管理集群上的工作,并运行 slurmdbd 守护程序以跟踪作业记帐数据库。

计算节点 (compute node)

计算节点(或简称节点)是集群中运行作业的单个服务器。例如,单个 DGX A100 系统就是一个 Slurm 节点。每个节点都运行一个 slurmd 守护程序,用于管理在该节点上运行的作业。

登录节点 (login node)

常规用户通过 SSH 登录以向集群提交工作的服务器。登录节点不运行 slurmd 或 slurmctld 守护程序,但安装了 Slurm 工具,以便用户可以查询作业信息和提交工作。

分区 (partition)

Slurm 中计算节点的逻辑组。每个计算节点可以属于多个分区。作业被提交以在特定分区中运行,并将使用该组中的节点。

队列 (queue)

当前正在运行或正在等待分配节点以运行的作业列表。如果在提交作业时资源可用,它将立即运行。如果没有足够的资源来运行作业,它将被放入队列中并等待直到资源可用。

检查节点状态#

使用 sinfo 命令检查集群上所有节点的状态。

 1dgxa100@pg-login-mgmt001:~$ sinfo
 2PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
 3debug        up 1-00:00:00      1 drain* dgx049
 4debug        up 1-00:00:00      1  drain dgx017
 5debug        up 1-00:00:00      4  alloc dgx[070,081,090,097]
 6batch*       up 1-00:00:00     96  alloc dgx[001-012,018-048,050-069,091,098-129]
 7batch*       up 1-00:00:00     38   idle dgx[013-016,071-080,082-089,092-096,130-140]
 8su01         up 1-00:00:00     15  alloc dgx[001-012,018-020]
 9su01         up 1-00:00:00      4   idle dgx[013-016]
10su02         up 1-00:00:00     20  alloc dgx[021-040]
11su03         up 1-00:00:00     19  alloc dgx[041-048,050-060]
12su04         up 1-00:00:00      9  alloc dgx[061-069]
13su04         up 1-00:00:00     10   idle dgx[071-080]
14su05         up 1-00:00:00      4  alloc dgx[091,098-100]
15su05         up 1-00:00:00     13   idle dgx[082-089,092-096]
16su06         up 1-00:00:00     20  alloc dgx[101-120]
17su07         up 1-00:00:00      9  alloc dgx[121-129]
18su07         up 1-00:00:00     11   idle dgx[130-140]

sinfo 列出集群中的所有分区,然后按状态对每个节点列表进行分组。状态说明在表 11中。

表 11. sinfo 状态说明

状态

描述

idle (空闲)

节点在线,当前未运行作业,并且可用于运行作业

alloc (已分配)

节点在线并已分配给正在运行的作业

drain (排空)

节点在线,但已被标记为“排空”,以防止作业在它们上面运行。这可能是因为它们未通过健康检查,或者因为管理员手动将它们标记为排空,以便管理员可以进行维护。

drng (正在排空)

节点正在“排空”:它们已被标记为排空,但仍有作业在它们上面运行。当该作业完成时,将不会有更多作业在它们上面运行。

down (宕机)

节点未在线,并且 Slurm 无法联系它们

boot (启动中)

节点正在被 Slurm 重新启动

可以使用 -p option 将 sinfo 限制为仅显示有关特定分区的信息

1dgxa100@pg-login-mgmt001:~$ sinfo -p batch
2PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
3batch*       up 1-00:00:00     32  alloc dgx[098-129]
4batch*       up 1-00:00:00    102   idle dgx[001-016,018-048,050-069,071-080,082-089,091-096,130-140]

它还可以仅显示宕机或排空的节点,并通过使用 -R option 显示它们处于该状态的原因

1dgxa100@pg-login-mgmt001:~$ sinfo -R
2REASON               USER      TIMESTAMP           NODELIST
3crashing on boot     root      2020-12-04T10:33:15 dgx049
4NHC: check_hw_ib:  N root      2020-12-04T10:32:42 dgx017

sinfo -R 命令仅显示失败原因的几个字符。要查看有关原因的更详细信息,请运行以下命令

1dgxa100@pg-login-mgmt001:~$ scontrol show node dgx017 | grep Reason
2   Reason=NHC: check_hw_ib:  No IB port mlx5_4:1 is ACTIVE (LinkUp 40 Gb/sec). [root@2020-12-04T10:32:42]

显示详细节点信息#

有关 Slurm 节点的详细信息通过使用 scontrol 命令显示

 1dgxa100@pg-login-mgmt001:~$ scontrol show node dgx017
 2NodeName=dgx017 Arch=x86_64 CoresPerSocket=64
 3   CPUAlloc=0 CPUTot=256 CPULoad=1.78
 4   AvailableFeatures=(null)
 5   ActiveFeatures=(null)
 6   Gres=gpu:8(S:0-1)
 7   NodeAddr=dgx017 NodeHostName=dgx017 Version=20.02.4
 8   OS=Linux 5.4.0-54-generic #60-Ubuntu SMP Fri Nov 6 10:37:59 UTC 2020
 9   RealMemory=1031000 AllocMem=0 FreeMem=1017487 Sockets=2 Boards=1
10   State=DOWN+DRAIN ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A
11   Partitions=debug
12   BootTime=2020-12-05T19:26:50 SlurmdStartTime=2020-12-05T19:30:32
13   CfgTRES=cpu=256,mem=1031000M,billing=256
14   AllocTRES=
15   CapWatts=n/a
16   CurrentWatts=0 AveWatts=0
17   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s
18   Reason=NHC: check_hw_ib:  No IB port mlx5_4:1 is ACTIVE (LinkUp 40 Gb/sec). [root@2020-12-04T10:32:42]

排空节点#

排空节点将阻止任何进一步的作业在节点上运行。如果节点不健康或需要不运行作业的维护工作,则应排空节点。

节点可以由 Slurm;NHC;或管理员手动排空。

手动排空节点

1[headnode01->device]% use dgx-001
2[headnode01->device[dgx-001]]% drain
3Engine            Node             Status           Reason
4----------------  ---------------- ---------------- --------------------
5slurm-dgxsuperpod dgx-001                Drained          Drained by CMDaemon

取消排空您想要再次在其上运行作业的节点

1[headnode01->device[dgx-001]]% undrain
2Engine            Node             Status           Reason
3----------------  ---------------- ---------------- ----------------
4slurm-dgxsuperpod dgx-001

更新 Slurm 配置#

Slurm 使用 cm-wlm-setup 进行配置。这将在/cm/shared/apps/slurm/var/etc/slum中设置 slurm.conf 文件。该文件共享到集群中的每个节点,并且在每个节点上都具有相同的内容。

slurm.conf 的大多数选项都不在本文档的范围之内。要阅读有关配置 Slurm 的可用选项,请参阅 slurm.conf 文档

注意

由于 Slurm 由 BCM 管理,因此手动对此文件所做的任何更改都将被覆盖。应使用基本视图或 cmsh 进行更改。

Slurm Prolog 和 Epilog#

工作负载管理器在作业执行之前运行 prolog 脚本,并在作业执行之后运行 epilog 脚本。这些脚本的用途可以包括

  • 在提交可能使用节点的作业执行之前,检查节点是否已准备就绪。

  • 以某种方式准备节点以管理作业执行。

  • 在作业执行结束后清理资源。

尽管有全局 prolog 和 epilog 脚本,但应避免编辑它们。无法使用基本视图或 cmsh 设置脚本。相反,脚本必须由管理员放置在软件映像中,并从映像更新相关节点。

Prolog 和 Epilog 脚本的详细信息#

即使不建议这样做,但一些管理员可能仍然希望直接链接和编辑脚本以满足自己的需求,而不是通过基本视图或 cmsh 前端。以下是有关 prolog 脚本如何工作的更详细说明。

当使用 cm-wlm-setup 或基本视图设置向导配置 Slurm 时,它被配置为运行位于/cm/local/apps/cmd/scripts/prolog中的通用 prolog 和位于/cm/local/apps/cmd/scripts/epilog中的通用 epilog。通用 prolog 和 epilog 脚本在特殊目录中为特定的工作负载管理器调用一系列脚本。

目录的路径格式为

  • /cm/local/apps/slurm/var/prologs/

  • /cm/local/apps/slurm/var/epilogs/

在这些目录中,脚本以具有与之关联的后缀和前缀的名称存储,这使得它们以特殊方式运行,如下所示

  • prolog/epilog 目录中使用的后缀

    • -prejob 脚本在所有作业之前运行。

    • -cmjob 脚本在云中运行的作业之前运行。

  • prolog/epilog 目录中使用的前缀:00- 到 99-。

数字前缀确定脚本执行的顺序,数字较低的脚本较早运行。因此,脚本名称可能如下所示

  • 01-prolog-prejob

  • 10-prolog-cmjob

prolog/epilog 脚本的返回值具有以下含义

  • 0:运行目录中的下一个脚本。

  • 非零返回值:不从 prolog/epilog 目录执行进一步的脚本。

通常,prolog/epilog 目录中的脚本不是真正的脚本,而是一个符号链接,该符号链接指向位于不同目录中的真实文件。然后,通用脚本能够处理对符号链接的期望。符号链接的名称和目标文件通常暗示脚本预期执行的操作。

例如,如果在 cm wlm 设置配置期间将任何健康检查标记为作为 prejob 检查运行,则每个 PBS 工作负载管理器变体都在 prolog 目录/cm/local/apps/<workload manager>/var/prologs/中使用符号链接 01-prolog-prejob。符号链接链接到的脚本是 /cm/local/apps/cmd/scripts/prolog-prejob

在这种情况下,脚本预计在作业之前运行。

1[root©headnode apps]# pwd
2/cm/local/apps
3[root©headnode apps]# ls -l *pbs*/var/prologs/ openpbs/var/prologs/:
4total  0
5lrwxrwxrwx 1 root root ... 01-prolog-prejob -> /cm/local/apps/cmd/scripts/prolog-prejob
6pbspro/var/prologs/:
7total  0
8lrwxrwxrwx 1 root root ... 01-prolog-prejob -> /cm/local/apps/cmd/scripts/prolog-prejob

Epilog 脚本(在作业运行后运行)的位置是 /cm/local/apps/<workload manager>/var/epilogs/。Epilog 脚本名称遵循与 prolog 脚本名称相同的执行顺序模式。

01-prolog-prejob 符号链接由集群管理器在每个计算节点上创建和删除,其中在工作负载管理器实体中启用了 prejob。每个此类实体都提供一个“启用 Prejob”参数,该参数会影响符号链接的存在

1[head->wlm[openpbs]]% get enableprejob yes
2[head->wlm[openpbs]]%

当至少选择一个健康检查作为 prejob 检查时,cm-wlm-setup 会将此参数设置为 yes。如果在执行 cm wlm 设置之前将任何健康检查配置为 prejob 检查,并且管理员对该健康检查进行了复选标记,则 prejob 被视为已启用。

Prolog 和 Epilog 脚本的工作负载管理器配置#

集群管理器在工作负载管理器设置期间使用 cm-wlm-setup 配置通用 prolog 和 epilog。管理员可以通过在工作负载管理器的配置中使用适当的参数,通过在本地 prolog 和 epilog 目录中创建符号链接来配置 prolog 和 epilog。

默认情况下,通用 prolog 和 epilog 配置为在 Slurm 的作业计算节点上运行(每个作业每个节点运行一次)。

可以使用 cmsh 或基本视图配置以下 prolog 和 epilog 参数

  • Prolog Slurmctld:在授予新作业分配之前要执行的程序的完全限定路径。该程序在分配了 slurm 服务器角色的同一节点上执行。该路径对应于 slurm.conf 中的 PrologSlurmctld 参数。

  • Epilog Slurmctld:在作业分配终止时要执行的程序的完全限定路径。该程序在分配了 slurm 服务器角色的同一节点上执行。与 slurm.conf 中的 EpilogSlurmctld 参数相对应。

  • Prolog: the fully 要在作业计算节点上执行的程序的完全限定路径,在授予新作业或步骤分配之前。该程序对应于 Prolog 参数,默认情况下指向通用 prolog。如果 Prolog 标志参数包含标志 Alloc(默认值),则此 prolog 在作业的每个节点上运行,否则仅在作业的第一个节点上执行。

  • Epilog: the fully 在作业分配释放时要在作业计算节点上执行的程序的完全限定路径。

列出队列中的 Slurm 作业#

当前在集群上运行或在队列中等待运行的作业可以使用 squeue 命令显示

1dgxa100@pg-login-mgmt001:~$ squeue
2             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
3             25668     debug submit_h  dgxa100 PD       0:00      1 (Priority)
4             25669     debug submit_h  dgxa100 PD       0:00      1 (Priority)
5             25670     debug submit_h  dgxa100 PD       0:00      1 (Priority)
6             25592     debug submit_h  dgxa100  R       1:13      1 dgx081
7             25593     debug submit_h  dgxa100  R       1:13      1 dgx090
8             25594     debug submit_h  dgxa100  R       1:13      1 dgx097

squeue 输出的第五列是作业状态(标题中的 ST)

  • 正在运行的作业将显示为 R 状态。最后一列将列出作业正在运行的节点。

  • 等待运行的作业将显示为 PD 状态,表示待处理。最后一列将显示作业尚未运行的原因。这可能是某些原因,例如 Resources(如果没有足够的节点可用)或 Priority(如果作业正在等待队列中优先级更高的另一个作业)。

有关可用作业状态以及过滤输出的方法的信息,请参阅 squeue 文档

取消 Slurm 作业#

使用 scancel 命令取消 Slurm 作业。

1$ scancel <job-id>

如果取消正在运行的作业,Slurm 将向作业中的所有进程发送 SIGTERM 信号。如果作业进程在一定秒数(默认情况下为 30 秒,使用 KillWait 配置)内未结束,则 Slurm 将发送 SIGKILL 信号。

如果取消待处理的作业,Slurm 将仅将其从队列中删除。

管理作业上的参数#

每个作业都有几个与其关联的配置参数,例如时间限制或它正在运行的分区。可以使用以下命令查看这些参数

 1dgxa100@pg-login-mgmt001:~$ scontrol show job 25632
 2    JobId=25632 JobName=submit_hpl_cuda11.0.sh
 3    UserId=dgxa100(13338) GroupId=dgxa100(13338) MCS_label=N/A
 4    Priority=44385 Nice=0 Account=compute-account QOS=normal
 5    JobState=PENDING Reason=Priority Dependency=(null)
 6    Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
 7    RunTime=00:00:00 TimeLimit=02:00:00 TimeMin=N/A
 8    SubmitTime=2020-12-06T06:36:59 EligibleTime=2020-12-06T06:36:59
 9    AccrueTime=2020-12-06T06:36:59
10    StartTime=2020-12-06T22:04:00 EndTime=2020-12-07T00:04:00 Deadline=N/A
11    SuspendTime=None SecsPreSuspend=0 LastSchedEval=2020-12-06T08:04:40
12    Partition=debug AllocNode:Sid=pg-login-mgmt001:1107071
13    ReqNodeList=dgx081 ExcNodeList=(null)
14    NodeList=(null) SchedNodeList=dgx081
15    NumNodes=1-1 NumCPUs=8 NumTasks=8 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
16    TRES=cpu=8,node=1,billing=8
17    Socks/Node=* NtasksPerN:B:S:C=8:0:*:1 CoreSpec=*
18    MinCPUsNode=8 MinMemoryCPU=0 MinTmpDiskNode=0
19    Features=(null) DelayBoot=00:00:00
20    OverSubscribe=NO Contiguous=0 Licenses=(null) Network=(null)
21    Command=/mnt/test/deepops/workloads/burn-in/submit_hpl_cuda11.0.sh
22    WorkDir=/mnt/test/deepops/workloads/burn-in
23    StdErr=/mnt/test/deepops/workloads/burn-in/results/1node_dgxa100_20201206063703/1node_dgxa100_20201206063703-25632.out
24    StdIn=/dev/null
25    StdOut=/mnt/test/deepops/workloads/burn-in/results/1node_dgxa100_20201206063703/1node_dgxa100_20201206063703-25632.out
26    Power=
27    TresPerNode=gpu:8
28    MailUser=(null) MailType=NONE

其中一些参数可以动态更新。例如,要延长可能无法在允许的时间内完成的作业的时间限制,请使用 scontrol update 命令

1dgxa100@pg-login-mgmt001:~$ scontrol update job id=25632 timelimit=02:10:00

有关查看或修改 Slurm 配置的更多信息,请参阅 scontrol 文档

其他资源#

Slurm 提供了许多高级功能,可以提供对作业调度、系统使用、用户和组帐户以及系统使用公平性的更精细控制。有关更多信息,请参阅以下链接