资源管理
DGX 客户常问的一个问题是,如何在用户之间有效地共享 DGX 系统,而不会出现任何意外问题或数据交换。对此的通用说法是资源管理;工具称为资源管理器。它们也可以称为调度器或作业调度器。这些术语通常可以互换使用。
DGX 系统上的所有内容都可以视为资源。这包括内存、CPU、GPU,甚至存储。用户向资源管理器提交包含其要求的请求,如果资源可用且未被使用,则资源管理器会将资源分配给用户。否则,资源管理器会将请求放入队列中,等待资源变为可用状态。当资源可用时,资源管理器会将资源分配给用户请求。此请求称为“作业”。
资源管理器提供对作业执行操作的功能,例如启动、取消或监控作业。它管理单个资源集群的作业队列,每个作业使用计算资源的一个子集。它还监控资源配置和运行状况,并将作业启动到单个 FIFO 队列。
作业调度器将多个资源管理器绑定到一个集成域中,从而管理域中所有计算机上的作业。它实施策略机制以实现资源的高效利用、管理软件许可证以及收集和报告资源使用情况统计信息。
一些最初作为资源管理器的工具已经发展到包含作业调度器功能,这使得这两个术语在很大程度上可以互换使用。
资源管理器和作业调度器已经存在很长时间,并在 HPC 领域得到广泛使用。本节末尾将包含有关如何运行 SLURM、Univa Grid Engine、IBM Spectrum LSF 和 Altair PBS Pro 等解决方案的示例。如果您以前没有使用过这些工具,则应首先进行一些简单的实验,以了解它们的工作原理。例如,使用单台服务器并安装该软件,然后尝试使用服务器上的内核运行一些简单的作业。根据需要扩展并向集群添加更多节点。
以下小节讨论如何在 DGX 系统上安装和使用作业调度器。对于 DGX 系统,NVIDIA 支持通过使用 DeepOps 部署 Slurm 或 Kubernetes 资源管理器。DeepOps 是 Ansible 脚本的模块化集合,可自动部署 Kubernetes、Slurm 或两者的混合组合,以及监控服务和其他辅助功能,以帮助管理系统。
示例:SLURM
Slurm 是一种批处理调度器,常用于 HPC 环境中,但它安装简单且配置灵活,因此在各个领域都得到了广泛采用。以下是安装 SLURM 的建议方法。
- 使用 Bright Cluster Manager
另请参阅 Bright Cluster Manager 9.1 管理员手册,第 7.5 节“配置和运行各个工作负载管理器”。
- 使用 DeepOps
DeepOps 是 Ansible 脚本的模块化集合,可自动跨 Kubernetes、Slurm 或两者的混合组合进行部署。要使用 DeepOps 安装 Slurm,请按照Slurm 部署指南中的步骤进行操作。
另请参阅技术博客 在 DGX 上部署富集群 API 以实现多用户共享
- 使用 SLURM 原生 GPU 支持
SLURM 在 > v19.05 版本中具有原生 GPU 支持,可以通过遵循 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,并且可以大大简化配置。
$ 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]
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。此功能需要首先启用作业记帐;有关更多信息,请参阅 记帐和资源限制。下面是一个非常快速的概述。
# 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
# 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
CgroupAutomount=yes CgroupReleaseAgentDir="/etc/slurm/cgroup" ConstrainCores=yes ConstrainDevices=yes ConstrainRAMSpace=yes #TaskAffinity=yes
Name=gpu File=/dev/nvidia0 CPUs=0-4 Name=gpu File=/dev/nvidia1 CPUs=5-9
$ srun --gres=gpu:1 nvidia-smi
您可能还希望限制共享节点上的内存使用量,以避免用户导致与其他用户或系统进程进行交换。一种方便的方法是使用内存 cgroups。
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"