本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon 中使用拓扑感知调度 SageMaker HyperPod
数据传输效率是高性能计算 (HPC) 和机器学习工作负载的关键因素。 UltraServers 与 Amazon 一起使用时 SageMaker HyperPod, SageMaker HyperPod 会自动将拓扑标签应用于您的资源。拓扑感知调度可以考虑实例拓扑(资源在实例中的连接方式)和网络拓扑(实例之间的连接方式),从而帮助分配资源以最大限度地减少数据传输开销。有关实例拓扑的更多信息,请参阅 Amazon EC2 实例拓扑。
拓扑感知调度适用于 Slurm 和 Amazon EKS 上的两个集群。有关拓扑如何与 Slurm 配合使用的一般信息,请参阅 Slurm 文档中的拓扑指南
在 Amazon 中 SageMaker HyperPod,数据传输管理费用通常来自三个主要来源:
-
GPU-to-GPU 数据传输: NVLink 和 NVLink 交换机等现代技术允许在 GPUs 不涉及其他计算资源的情况下进行高吞吐量数据传输。这非常高效,但通常仅限于单个实例。
-
GPU-to-CPU 数据传输:非统一内存访问 (NUMA) 系统在单个主板上有多条系统总线。在像 p5.48xlarge 这样的典型 EC2 实例架构中,有两条不同的系统总线,每条总线都有一个 CPU 和 4。 GPUs为了获得最佳性能,加载或读取数据的进程 to/from GPUs 应在与 GPU 连接到同一系统总线的 CPU 上执行。
-
实例之间的网络通信:实例通过一系列网络交换机传输数据。最短路径通常对应于最低延迟。
UltraServer 建筑
SageMaker HyperPod 支持使用 p6e-gb200.36xlarge 实例的 UltraServer 架构。最多 UltraServer 包含 18 个 p6e-gb200.36xlarge 实例,每个实例上有 4 个实例。 GPUs 所有节点 GPUs 之间都通过 NVLink 交换机互连, GPUs 无需使用网络接口即可在任意两个节点之间进行数据传输。
与单个实例相比,该架构可显著提高性能。为了有效利用此架构,应将任务从单个节点提交到计算节点 UltraServer。
EKS 拓扑标签
根据 EC2 实例拓扑,使用以下标签 HyperPod 自动标记您的节点:
-
topology.kubernetes.io/region-节点所在的。 AWS 区域
-
topology.kubernetes.io/zone-节点所在的可用区。
-
topology.k8s.aws/ network-node-layer- NetworkNodes 描述了实例的网络节点集。在每个网络节点集中,网络节点按从上到下的分层顺序列出。连接到实例的网络节点是列表中的最后一个网络节点。最多有四个网络节点层,每个节点都有一个标签。可用图层有
topology.k8s.aws/network-node-layer-1
、topology.k8s.aws/network-node-layer-2
、topology.k8s.aws/network-node-layer-3
。 -
topology.k8s.aws/ultraserver-id-用于标记 Ultraserver 中属于同一域的每个实例的标识符。 NVLink 要了解有关 UltraServers 与一起使用的更多信息 SageMaker HyperPod,请参阅 UltraServers 在 Amazon 中使用 SageMaker HyperPod。
使用这些标签,您可以在 HyperPod 任务管理中使用拓扑感知调度来应用拓扑标签和注释来优化工作负载的训练效率。有关更多信息,请参阅 在 Amazon 任务管理中使用拓扑感知调度 SageMaker HyperPod 。
Slurm 网络拓扑插件
Slurm 提供了用于网络拓扑感知的内置插件。 UltraServer 中的架构 SageMaker HyperPod 支持区块插件。
使用 topology/block 插件
NVIDIA 开发了一个 topology/block 插件,该插件可提供跨节点块的分层调度,具有以下特征:
区块是一个连续的节点范围
方块不能相互重叠
在使用下一个区块之前,区块中的所有节点都将分配给一个作业
规划区块大小是配置的最小区块大小
每更高的方块等级大小就是比前一个方块等级的二乘方
此插件根据定义的网络拓扑来分配节点。
配置
要使用插件配置拓扑感知调度, topology/block
-
SageMaker HyperPod 自动配置 topology/block 插件。如果要配置插件,请在 Slurm 配置目录的 topology.conf 文件中指定以下内容:
BlockName=us1 Nodes=ultraserver1-[0-17] BlockName=us2 Nodes=ultraserver2-[0-17] BlockSizes=18
-
确保您的
slurm.conf
包含:TopologyPlugin=topology/block
使用量
提交作业时,您可以将以下附加参数与sbatch
和srun
命令一起使用:
--segment=N
:指定要组合在一起的节点数。区段的大小必须小于或等于计划区块的大小。--exclusive=topo
: 要求不要在同一个区块上安置其他工作。这对于基准测试和性能敏感型应用程序非常有用。
以下是您在考虑分配区块时可以考虑的示例场景。
在空系统上分配一整块节点
sbatch -N18
在空系统上分配两个节点块
sbatch -N36
在一个区块上分配 18 个节点 + 在另一个区块上分配 6 个节点
sbatch -N24
在一个区块上分配 12 个节点,在另一个区块上分配 12 个节点
sbatch -N24 —segment=12
使用 —exclusive=topo,必须将作业放在没有其他任务的区块上
sbatch -N12 —exclusive=topo
UltraServer 拓扑最佳实践
为了获得最佳性能,请使用以下 UltraServer 架构实现最佳性能 SageMaker HyperPod:
-
设置适当的区块大小:配置
BlockSizes=18
(如果有一个备用节点,则为 17)以匹配 UltraServer 架构。 -
使用分段以提高可用性:使用
--segment=16
--segment=8
、或--segment=9
与srun
和sbatch
命令一起使用,以提高作业调度的灵活性。 -
考虑任务规模和细分市场规模:
如果是
BlockSizes=18
,则最多具有 18 个实例的作业将始终在单个实例上运行 UltraServer。如果是
BlockSizes=16
,实例少于 16 的作业将始终在单个实例上运行 UltraServer,而具有 18 个实例的作业可能在一两个实例上运行 UltraServers。
在考虑分段时,请考虑以下几点
使用
--segment=1
,每个实例都可以在单独的服务器上运行 UltraServer。使用
-N 18 --segment 9
,9 个节点将放置在一个节点上 UltraServer,另外9个节点可以放置在同一个或另一个节点上 UltraServer。使用
-N 24 --segment 8
,作业可以在 2 或 3 上运行 UltraServers,每 8 个节点放在同一台服务器上。
SageMaker HyperPod 拓扑感知调度的局限性
该topology/block
插件在异构集群(具有不同实例类型的集群)方面存在局限性:
Slurm 只能调度方块中列出的节点
每个区块必须至少有
BlockSizes[0]
节点
对于异构集群,请考虑以下替代方案:
请勿在异构集群中使用区块插件。相反,应将 UltraServer 节点隔离在不同的分区中。
UltraServers 仅在同一 VPC 中创建单独的集群,然后使用 Slurm 的多集群设置。