工作负载管理#

简介#

工作负载管理是在系统上提交和控制工作。Slurm 是使用的工作负载管理系统。Slurm 是一个用于 Linux 集群的开源作业调度系统,最常用于 HPC 应用程序。本指南涵盖了在 DGX SuperPOD 上作为用户开始使用 Slurm 的一些基础知识,包括如何使用 Slurm 命令,例如 sinfosrunsbatchsqueuescancel

工作负载管理系统的基本流程是用户向队列提交作业。作业是要执行的工作集合。Shell 脚本是最常见的,因为一个作业通常由许多不同的命令组成。

系统将获取所有已提交但尚未运行的作业,查看系统状态,然后将这些作业映射到可用资源。此工作流程使用户能够在大型组内管理其工作,系统确定作业的最佳排序方式,以实现系统利用率最大化(或系统管理员可以配置的其他指标)。

查看系统状态#

要查看集群中的所有节点及其当前状态,请 ssh 连接到您集群的 Slurm 登录节点并运行 sinfo 命令

1sinfo
2PARTITION   AVAIL           TIMELIMIT       NODES           STATE           NODELIST
3batch*              up              infinite        9               idle            dgx[1-9]

此示例中有九个可用节点,全部处于空闲状态。如果节点繁忙,则当节点正在使用时,其状态将从 idle 更改为 alloc

1sinfo
2PARTITION   AVAIL           TIMELIMIT       NODES           STATE           NODELIST
3batch*              up              infinite        1               alloc           dgx1
4batch*              up              infinite        8               idle            dgx[2-9]

运行作业#

在 Slurm 下运行作业有三种方法。作业可以使用 sbatch 运行,其中工作在系统中排队,控制权返回到提示符。第二种方法是使用 srun,它将在系统上运行作业,并且命令将阻塞,等待运行,然后运行完成。第三种方法是提交交互式作业,其中使用 srun 创建作业,但会提供 shell 访问权限。

使用 sbatch 运行作业#

虽然 srun 命令会阻止终端中的任何其他执行,但可以运行 sbatch 以在集群中资源可用时将作业排队以供执行。此外,批处理作业将使多个作业能够排队并在节点可用时运行。因此,最佳实践是将所有必须运行的内容封装到一个脚本中,然后使用 sbatch 执行。

1cat script.sh
2#!/bin/bash
3/bin/hostname sleep 30
1sbatch script.sh
22322
1squeue
2JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
32322 batch script.sh user R 0:00 1 dgx1
1ls
2slurm-2322.out
1cat slurm-2322.out
2dgx1

使用 srun 运行作业#

要运行作业,请使用 srun 命令

1srun hostname
2dgx1

这指示 Slurm 查找第一个可用节点并在其上运行 hostname。它在我们的命令提示符中返回了结果。使用 srun 运行运行 python 脚本或容器的不同命令同样容易。

有时需要在多个系统上运行

1srun --ntasks 2 -l hostname
2dgx1
3dgx2
4NVIDIA DGX SuperPOD User Guide DU-10264-001 V3 | 6

使用 srun 运行交互式作业#

在开发和实验时,运行交互式作业很有帮助,它会请求资源并提供命令提示符作为其界面

1srun --pty /bin/bash
2dgx1:~$ hostname
3dgx1
4dgx1:~$ exit

在交互模式期间,资源将被保留供使用,直到提示符退出。命令可以连续运行。

在开始使用 srun 的交互式会话之前,使用诸如 tmux 或 screen 之类的工具在登录节点上创建会话可能会有所帮助。这将防止用户在发生网络中断或终端关闭时丢失交互式作业。

注意

本地管理策略可能会限制或阻止交互式作业。向本地系统管理员询问有关运行交互式作业的具体信息。

提交作业时指定资源#

使用 srun 或 sbatch 提交作业时,请请求作业所需的特定资源。分配全部基于任务。任务是执行单元。多个 GPU、CPU 或其他资源可以与一个任务关联。一个任务不能跨越节点。单个任务或多个任务可以分配给一个节点。如表 2 所示,可以通过几种不同的方式请求资源。

表 2. 指定 sbatch 和 srun 选项的方法

sbatch/srun 选项

描述

-N, –nodes=

指定要请求的节点总数

-n, –ntasks=

指定要请求的任务总数

–ntasks-per-node=

指定每个节点的任务数

-G, –gpus=

为作业分配的 GPU 总数

–gpus-per-task=

每个任务的 GPU 数量

–gpus-per-node=

每个节点要分配的 GPU 数量

–exclusive

保证节点不在作业之间共享

虽然有很多选项组合,但以下是一些提交作业的常用方法

  • 请求两个任务

    srun -n 2 <cmd>
    
  • 请求两个节点,每个节点八个任务,每个任务一个 GPU

    sbatch -N 2 –-ntasks-per-node=8 –-gpus-per-task=1 <cmd>
    
  • 请求 16 个节点,每个节点八个 GPU

    sbatch -N 16 –-gpus-per-node=8 –-exclusive <cmd>
    

监控作业#

要查看集群中正在运行哪些作业,请使用 squeue 命令

1squeue -a -l
2Tue Nov 17 19:08:18 2020
3JOBID PARTITION NAME USER STATE TIME TIME_LIMIT NODES NODELIST(REASON)
49      batch    bash user01 RUNNING 5:43 UNLIMITED 1 dgx1
510     batch    Bash user02 RUNNING 6:33 UNLIMITED 2 dgx[2-3]

要仅查看特定用户 USERNAME 的正在运行的作业

squeue -l -u USERNAME

squeue 命令有许多不同的可用选项。有关更多详细信息,请参见主页。

取消作业#

要取消作业,请使用 scancel 命令

scancel JOBID

其他资源#

其他资源包括