工作负载管理#
简介#
工作负载管理是在系统上提交和控制工作。Slurm 是使用的工作负载管理系统。Slurm 是一个用于 Linux 集群的开源作业调度系统,最常用于 HPC 应用程序。本指南涵盖了在 DGX SuperPOD 上作为用户开始使用 Slurm 的一些基础知识,包括如何使用 Slurm 命令,例如 sinfo、srun、sbatch、squeue 和 scancel。
工作负载管理系统的基本流程是用户向队列提交作业。作业是要执行的工作集合。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
其他资源#
其他资源包括