资源管理

DGX 客户常问的一个问题是,如何在用户之间有效地共享 DGX 系统,而不会出现任何意外问题或数据交换。对此的通用说法是资源管理;工具称为资源管理器。它们也可以称为调度器或作业调度器。这些术语通常可以互换使用。

DGX 系统上的所有内容都可以视为资源。这包括内存、CPU、GPU,甚至存储。用户向资源管理器提交包含其要求的请求,如果资源可用且未被使用,则资源管理器会将资源分配给用户。否则,资源管理器会将请求放入队列中,等待资源变为可用状态。当资源可用时,资源管理器会将资源分配给用户请求。此请求称为“作业”。

资源管理器提供对作业执行操作的功能,例如启动、取消或监控作业。它管理单个资源集群的作业队列,每个作业使用计算资源的一个子集。它还监控资源配置和运行状况,并将作业启动到单个 FIFO 队列。

作业调度器将多个资源管理器绑定到一个集成域中,从而管理域中所有计算机上的作业。它实施策略机制以实现资源的高效利用、管理软件许可证以及收集和报告资源使用情况统计信息。

一些最初作为资源管理器的工具已经发展到包含作业调度器功能,这使得这两个术语在很大程度上可以互换使用。

资源管理器和作业调度器已经存在很长时间,并在 HPC 领域得到广泛使用。本节末尾将包含有关如何运行 SLURMUniva Grid EngineIBM Spectrum LSFAltair PBS Pro 等解决方案的示例。如果您以前没有使用过这些工具,则应首先进行一些简单的实验,以了解它们的工作原理。例如,使用单台服务器并安装该软件,然后尝试使用服务器上的内核运行一些简单的作业。根据需要扩展并向集群添加更多节点。

以下小节讨论如何在 DGX 系统上安装和使用作业调度器。对于 DGX 系统,NVIDIA 支持通过使用 DeepOps 部署 Slurm 或 Kubernetes 资源管理器。DeepOps 是 Ansible 脚本的模块化集合,可自动部署 Kubernetes、Slurm 或两者的混合组合,以及监控服务和其他辅助功能,以帮助管理系统。

注意: DGX 系统未预装作业调度器,尽管 NPN(NVIDIA 合作伙伴网络)合作伙伴可能会选择安装作业调度器作为更大型部署服务的一部分。NVIDIA 支持可能会要求禁用或删除作业调度器软件以进行调试。他们还可能要求安装出厂映像。如果未进行这些更改,NVIDIA 支持将无法继续进行调试过程。

示例:SLURM

Slurm 是一种批处理调度器,常用于 HPC 环境中,但它安装简单且配置灵活,因此在各个领域都得到了广泛采用。以下是安装 SLURM 的建议方法。

在 DGX-2、DGX-1 或 DGX Station 上安装和配置 Slurm 后,下一步是计划如何使用 DGX 系统。第一个也是最简单的配置是假设用户获得对整个节点的独占访问权。在这种情况下,用户将获得整个 DGX 系统,即访问所有 GPU 和 CPU 内核。在第一个用户使用资源时,其他用户无法使用这些资源。

第二种方法是将 GPU 作为可消耗的资源。然后,用户将请求他们需要的 GPU 数量,对于 DGX-1 为 1 到 8 个,对于 DGX-2 为 1 到 16 个。

在较高层面上,配置 SLURM 与 GPU 和 DGX 系统有两种基本选择。第一种是使用所谓的独占模式访问,第二种是允许独立于其他 GPU 调度每个 GPU。

使用独占节点访问的简单 GPU 调度

如果对允许每个计算节点同时运行多个作业不感兴趣,则 Slurm 可能不需要知道系统中的 GPU,并且可以大大简化配置。

在不使用 GRES(通用资源调度)的情况下调度 GPU 的一种方法是为 GPU 的逻辑组创建分区或队列。例如,将具有 V100 GPU 的节点分组到 V100 分区中将产生如下结果
$ sinfo -s
PARTITION AVAIL  TIMELIMIT   NODES(A/I/O/T)  NODELIST
v100     up   infinite         4/9/3/16  node[212-213,215-218,220-229]
通过 SLURM 配置文件 slurm.conf 的相应分区配置将如下所示
NodeName=node[212-213,215-218,220-229]
PartitionName=v100 Default=NO DefaultTime=01:00:00 State=UP Nodes=node[212-213,215-218,220-229]

如果用户从 v100 分区请求节点,则他们将有权访问该节点中的所有资源,而其他用户则无法访问。这就是所谓的独占访问

如果担心共享资源可能会导致节点上的性能问题,或者担心节点资源过载,则此方法可能是有利的。例如,在 DGX-1 的情况下,如果多个用户可能会使 8TB NFS 读取缓存不堪重负,则应考虑独占模式。或者,如果担心用户可能会使用所有物理内存,从而导致页面交换并相应降低性能,则独占模式可能很有用。

在每 GPU 级别调度资源

使用 SLURM 的第二种选择是将 GPU 视为可消耗的资源,并允许用户以整数单位(即 1、2、3 等)请求它们。可以将 SLURM 设置为感知 GPU 作为可消耗的资源,以允许作业请求任意数量的 GPU。此功能需要首先启用作业记帐;有关更多信息,请参阅 记帐和资源限制。下面是一个非常快速的概述。

SLURM 配置文件 slurm.conf 需要设置参数以启用 cgroups 以进行资源管理和 GPU 资源调度。以下是一个示例
# General
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup

# Scheduling
SelectType=select/cons_res
SelectTypeParameters=CR_Core_Memory

# Logging and Accounting
AccountingStorageTRES=gres/gpu
DebugFlags=CPU_Bind,gres                # show detailed information in Slurm logs about GPU binding and affinity
JobAcctGatherType=jobacct_gather/cgroup
slurm.conf 中的分区信息定义了每个资源的可用 GPU。这是一个示例
# Partitions
GresTypes=gpu
NodeName=slurm-node-0[0-1] Gres=gpu:2 CPUs=10 Sockets=1 CoresPerSocket=10 ThreadsPerCore=1 RealMemory=30000 State=UNKNOWN
PartitionName=compute Nodes=ALL Default=YES MaxTime=48:00:00 DefaultTime=04:00:00 MaxNodes=2 State=UP DefMemPerCPU=3000
资源管理的强制执行方式是通过 cgroupscgroups 配置需要一个单独的配置文件 cgroup.conf,例如以下内容
CgroupAutomount=yes 
CgroupReleaseAgentDir="/etc/slurm/cgroup" 

ConstrainCores=yes 
ConstrainDevices=yes
ConstrainRAMSpace=yes
#TaskAffinity=yes
要调度 GPU 资源,需要一个配置文件来定义可用的 GPU 及其 CPU 亲和性。以下是一个示例配置文件 gres.conf
Name=gpu File=/dev/nvidia0 CPUs=0-4
Name=gpu File=/dev/nvidia1 CPUs=5-9
要运行利用 GPU 资源的作业,需要将 --gres 标志与 srun 命令一起使用。例如,要运行需要单个 GPU 的作业,可以使用以下 srun 命令。
$ srun --gres=gpu:1 nvidia-smi

您可能还希望限制共享节点上的内存使用量,以避免用户导致与其他用户或系统进程进行交换。一种方便的方法是使用内存 cgroups

使用内存 cgroups 可用于将作业限制为分配的内存资源,这需要设置内核参数。在 Ubuntu 系统上,可以通过文件 /etc/default/grub 进行配置。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

示例:Altair PBS Pro

请访问以下站点以获取技术白皮书的链接:Altair PBS Professional 在 NVIDIA DGX 系统上的支持