

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon 中使用拓扑感知调度 SageMaker HyperPod
<a name="sagemaker-hyperpod-topology"></a>

数据传输效率是高性能计算（HPC）和机器学习工作负载中的关键因素。 UltraServers 与 Amazon 一起使用时 SageMaker HyperPod， SageMaker HyperPod 会自动将拓扑标签应用于您的资源。 Topology-aware 通过考虑实例拓扑（资源在实例中的连接方式）和网络拓扑（实例之间的连接方式），调度有助于分配资源以最大限度地减少数据传输开销。有关实例拓扑的更多信息，请参阅 [Amazon EC2 实例拓扑](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-topology.html)。

Topology-aware 调度适用于 Slurm 和 Amazon EKS 上的两个集群。有关拓扑如何与 Slurm 配合使用的一般信息，请参阅 [Slurm 文档中的拓扑指南](https://slurm.schedmd.com/topology.html)。

在 Amazon 中 SageMaker HyperPod，数据传输管理费用通常来自三个主要来源：
+ **GPU-to-GPU 数据传输**：NVLink 和 NVLink 交换机等现代技术允许在 GPU 之间进行高吞吐量数据传输，而无需涉及其他计算资源。此方案效率极高，但通常仅限于单个实例内使用。
+ **GPU-to-CPU 数据传输**： Non-uniform 存储器访问 (NUMA) 系统在单个主板上有多条系统总线。在 p5.48xlarge 这类典型的 EC2 实例架构中，有两条不同的系统总线，每条总线均对应一个 CPU 和 4 个 GPU。为了获得最佳性能，加载或读取数据 to/from GPU 的进程应在与 GPU 连接到同一系统总线的 CPU 上执行。
+ **实例间的网络通信**：实例通过一系列网络交换机传输数据。最短路径通常对应于最低延迟。

## UltraServer 建筑
<a name="sagemaker-hyperpod-topology-ultraserver-architecture"></a>

SageMaker HyperPod 支持使用 p6e-gb200.36xlarge 实例的 UltraServer 架构。最多 UltraServer 包含 18 个 p6e-gb200.36xlarge 实例，每个实例上有 4 个 GPU。所有节点中的所有 GPU 均通过 NVLink 交换机实现互联，从而支持任意两个 GPU 之间的数据传输，而无需借助网络接口。

与单个实例相比，该架构可显著提升性能。为了有效利用此架构，应将任务从单个节点提交到计算节点 UltraServer。

## EKS 拓扑标签
<a name="sagemaker-hyperpod-topology-eks-scheduling"></a>

根据 EC2 实例拓扑，使用以下标签 HyperPod 自动标记您的节点：
+ t@@ **opology.kubernetes。 io/region**- AWS 区域 节点所在的。
+ t@@ **opology.kubernetes。 io/zone**-节点所在的可用区。
+ t@@ **opology.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`。
+ t@@ **opology.k8s。 aws/ultraserver-id**-标识符，用于标记 Ultraserver 中属于同一 NVLink 域的每个实例。要了解有关 UltraServers 与一起使用的更多信息 SageMaker HyperPod，请参阅[UltraServers 在 Amazon 中使用 SageMaker HyperPod](sagemaker-hyperpod-ultraserver.md)。

使用这些标签，您可以在 HyperPod 任务管理中使用拓扑感知调度来应用拓扑标签和注释来优化工作负载的训练效率。有关更多信息，请参阅 [在 Amazon 任务管理中使用拓扑感知调度 SageMaker HyperPod](sagemaker-hyperpod-eks-operate-console-ui-governance-tasks-scheduling.md)。

## Slurm 网络拓扑插件
<a name="sagemaker-hyperpod-topology-slurm-plugins"></a>

Slurm 提供了用于网络拓扑感知的内置插件。 SageMaker HyperPod 根据集群中的实例类型自动选择和配置相应的拓扑插件。

### 自动拓扑选择
<a name="sagemaker-hyperpod-topology-auto-selection"></a>

创建 HyperPod Slurm 集群时，系统会检查所有实例组及其关联的实例类型，识别每种实例类型的 GPU 通信特征，并使用相应的拓扑插件配置 Slurm。此过程自动运行，不需要任何配置。

HyperPod 通过动态生成的`topology.conf`文件管理拓扑。随着集群通过扩展操作或节点更换而演变， HyperPod 不断调整拓扑配置以反映当前的集群状态。有关更多信息，请参阅 [动态拓扑更新](#sagemaker-hyperpod-topology-dynamic-updates)。

### 使用 topology/tree 插件
<a name="sagemaker-hyperpod-topology-tree"></a>

该`topology/tree`插件对具有多个带宽层的分层通信结构进行建模。树形拓扑使Slurm能够以最大限度地减少跨层通信并最大限度地提高位置性的方式放置作业。

树形拓扑用于具有分层互连的实例类型，其中分布式训练工作负载受益于位置感知放置。这包括实例类型`ml.p5.48xlarge`，例如`ml.p5e.48xlarge`、和`ml.p5en.48xlarge`。

SageMaker HyperPod 当您的集群使用这些实例类型时，会自动配置`topology/tree`插件。生成的会将节点`topology.conf`映射到反映硬件通信层级的交换机层次结构中。

确保您的 `slurm.conf` 包含：

```
TopologyPlugin=topology/tree
```

#### 配置
<a name="sagemaker-hyperpod-topology-tree-config"></a>

SageMaker HyperPod 根据 Amazon EC2 提供的信息自动配置`topology/tree`插件。有关 Amazon EC2 拓扑的更多详细信息，请参阅[亚马逊 EC2 实例拓扑](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-topology.html)。

使用该`topology/tree`插件时，Slurm `topology.conf` 如下所示：

```
SwitchName=nn-6fe9d8a965d34d181 Switches=nn-0b53107754517bf0e

SwitchName=nn-0b53107754517bf0e Switches=nn-424c855d4ad825aa4,nn-95acd7c656329fc30

SwitchName=nn-424c855d4ad825aa4 Nodes=ip-10-1-111-198
SwitchName=nn-95acd7c656329fc30 Nodes=ip-10-1-53-231
```

#### 用法
<a name="sagemaker-hyperpod-topology-tree-usage"></a>

配置`topology/tree`插件后，Slurm 会尝试分配彼此靠近的计算机。你可以通过将`--switch`命令行参数传递给或来强制 Slurm 在单个交换机上分配计算机：`sbatch``srun`

```
sbatch --switch=1 ....
```

### 使用 topology/block 插件
<a name="sagemaker-hyperpod-topology-block"></a>

NVIDIA 开发了一个`topology/block`插件，该插件可提供跨节点块的分层调度，具有以下特征：
+ 区块是一组连续节点
+ 区块不能相互重叠
+ 在使用下一个区块之前，会先将一个区块内的所有节点分配给一个作业
+ 规划区块大小是配置的最小区块大小
+ 每个更高层级的区块大小都是前一层级区块大小的 2 的幂次方

此插件会根据定义的网络拓扑来分配节点。

区块拓扑建模统一的高带宽通信域，其中所有 GPU 都参与单个高速域，延迟近乎均匀。区块拓扑将所有节点视为单个内聚通信单元的一部分。 UltraServer 中的架构 SageMaker HyperPod 支持区块插件。

块拓扑用于实例类型，例如`ml.p6e-gb200.NVL72`和`ml.p6e-gb300.NVL72`。

#### 配置
<a name="sagemaker-hyperpod-topology-block-config"></a>

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
```

#### 用法
<a name="sagemaker-hyperpod-topology-block-usage"></a>

提交作业时，您可以将以下附加参数与 `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
```

### 混合实例类型的集群的拓扑选择
<a name="sagemaker-hyperpod-topology-mixed-instances"></a>

HyperPod 目前使用 Slurm 24.11，它仅支持每个集群的单一拓扑配置。这意味着不支持按分区选择拓扑，多个拓扑模型不能在单个集群中共存，并且所有节点都必须符合单个拓扑定义。

当您的集群包含多个实例类型时，请 HyperPod 选择与所有实例类型兼容的拓扑。下表显示了如何 HyperPod 解析具有混合实例类型的集群的拓扑示例。


| 实例组 | 实例类型 | 首选拓扑 | 
| --- | --- | --- | 
| IG-1 | ml.p5.48xlarge | 树 | 
| IG-2 | ml.p6e-gb300.nvl72 | 数据块 | 

在此示例中，块拓扑最适合 ml.p6e-gb300.nvl72，但树形拓扑与 ml.p5.48xlarge 和 ml.p6e-gb300.nvl72 兼容。 HyperPod 选择树拓扑作为集群范围的拓扑，以确保所有节点都能正确参与调度，并且不会排除或歪曲任何实例类型。

**重要**  
对于拓扑感知调度对性能至关重要的工作负载，我们建议为每种实例类型创建单独的集群，而不是将不同的实例类型组合到一个集群中。这可确保每个集群都使用其硬件的最佳拓扑，从而提供最佳的工作负载性能。例如，与其将 ml.p5.48xlarge 和 ml.p6e-gb300.nvl72 实例组合到一个集群中（选择树形拓扑作为兼容折衷方案），不如为每种实例类型创建一个专用集群，以便每种实例类型都使用其理想的拓扑模型。

### 禁用或更改拓扑插件
<a name="sagemaker-hyperpod-topology-disable-change"></a>

创建 Slurm 集群时， HyperPod 会自动选择最佳拓扑插件。要手动更改拓扑插件，请更新控制器节点`slurm.conf`上的`TopologyPlugin`值。

示例：

```
# Set this value to disable topology plugin
TopologyPlugin=topology/flat
```

### 动态拓扑更新
<a name="sagemaker-hyperpod-topology-dynamic-updates"></a>

Topology-aware 随着集群的变化，调度会持续保持拓扑的正确性。发生以下任一事件时，系统会自动重新计算拓扑并重新生成`topology.conf`文件：
+ **Scale-up**：新节点已添加到群集。
+ **Scale-down**：已从集群中移除节点。
+ **节点更换：替换**故障或不健康的节点，或者使用 [BatchReplaceClusterNodes](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_BatchReplaceClusterNodes.html)API 手动替换节点。

更新拓扑后，新的节点会被合并到正确的拓扑结构中，删除的节点会被修剪，Slurm 配置也会在不需要手动干预的情况下更新。这样可以确保拓扑始终反映集群的实际状态。

**注意**  
高级用户可以通过登录 Slurm 控制器节点并手动修改`slurm.conf`和来覆盖拓扑行为。`topology.conf`但是， HyperPod 在后续集群更新期间，包括扩展操作、节点更换和其他集群生命周期事件，可能会覆盖手动更改。如果您手动修改这些文件，请在任何群集更新后验证您的更改。

## UltraServer 拓扑最佳实践
<a name="sagemaker-hyperpod-topology-best-practices"></a>

为了获得最佳性能，请使用以下 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 拓扑感知调度的局限性
<a name="sagemaker-hyperpod-topology-limitations"></a>

`topology/block` 插件在异构集群（包含不同实例类型的集群）中存在局限性：
+ Slurm 只能调度区块中列出的节点
+ 每个区块必须至少具有 `BlockSizes[0]` 节点

对于异构集群，请考虑以下替代方案：
+ 不要在异构集群中使用区块插件。相反，应将 UltraServer 节点隔离在不同的分区中。
+  UltraServers 仅在同一 VPC 中创建单独的集群，然后使用 Slurm 的多集群设置。