

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

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

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

拓扑感知安排同时适用于 Slurm 和 Amazon EKS 上的集群。有关拓扑如何与 Slurm 配合使用的一般信息，请参阅 [Slurm 文档中的拓扑指南](https://slurm.schedmd.com/topology.html)。

在 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 建筑
<a name="sagemaker-hyperpod-topology-ultraserver-architecture"></a>

SageMaker HyperPod 支持使用 p6e-gb200.36xlarge 实例的 UltraServer 架构。最多 UltraServer 包含 18 个 p6e-gb200.36xlarge 实例，每个实例上有 4 个实例。 GPUs 所有节点 GPUs 之间都通过 NVLink 交换机互连， GPUs 无需使用网络接口即可在任意两个节点之间进行数据传输。

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

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

根据 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](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 提供了用于网络拓扑感知的内置插件。 UltraServer 中的架构 SageMaker HyperPod 支持区块插件。

### 使用 topology/block 插件
<a name="w2aac13c35c39c15b5"></a>

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

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

#### 配置
<a name="w2aac13c35c39c15b5b9"></a>

要使用插件配置拓扑感知调度， 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
  ```

#### 用法
<a name="w2aac13c35c39c15b5c11"></a>

提交作业时，您可以将以下附加参数与 `sbatch` 和 `srun` 命令结合使用：
+ `--segment=N`：指定要组合在一起的节点数。分段的大小必须小于或等于规划区块大小。
+ `--exclusive=topo`：请求不要将其他作业部署在同一区块上。这在基准测试和性能敏感型应用中非常有用。

以下是您在考虑分配区块时可以考量的示例场景。

**在空系统中分配一整个节点区块**

```
sbatch -N18
```

**在空系统中分配两个节点区块**

```
sbatch -N36
```

**在一个区块上分配 18 个节点 \$1 在另一个区块上分配 6 个节点**

```
sbatch -N24
```

**在一个区块上分配 12 个节点 \$1 在另一个区块上分配 12 个节点**

```
sbatch -N24 —segment=12
```

**使用 —exclusive=topo 时，必须将作业放置在无其他作业的区块上**

```
sbatch -N12 —exclusive=topo
```

## 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 的多集群设置。