

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon SageMaker HyperPod 中使用拓撲感知排程
<a name="sagemaker-hyperpod-topology"></a>

資料傳輸效率是高效能運算 (HPC) 和機器學習工作負載的關鍵因素。搭配 Amazon SageMaker HyperPod 使用 UltraServers 時，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 對 GPU 資料傳輸**：NVLink 和 NVLink 交換器等現代技術允許 GPU 之間進行高輸送量資料傳輸，而無需涉及其他運算資源。這極其有效率，但通常僅限於單一執行個體。
+ **GPU 對 CPU資料傳輸**：非統一記憶體存取 (NUMA) 系統在單一主機板上具有多個系統匯流排。在一般 EC2 執行個體架構中，例如 p5.48xlarge，有兩個不同的系統匯流排，每個都有一個 CPU 和 4 個 GPU。為了獲得最佳效能，將資料載入 GPU 或從 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 會自動以下列標籤標記您的節點：
+ **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，請參閱[在 Amazon SageMaker HyperPod 中使用 UltraServer](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)。

### 使用拓撲/樹狀目錄外掛程式
<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
```

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

SageMaker HyperPod 會根據 Amazon EC2 提供的資訊自動設定`topology/tree`外掛程式。如需 Amazon EC2 拓撲的詳細資訊，請參閱 [Amazon 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
```

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

設定`topology/tree`外掛程式時，Slurm 會嘗試配置彼此靠近的機器。您可以將`--switch`命令列參數傳遞至 `sbatch`或 ，強制 Slurm 在單一交換器上配置機器`srun`：

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

### 使用拓撲/區塊外掛程式
<a name="sagemaker-hyperpod-topology-block"></a>

NVIDIA 開發了一個`topology/block`外掛程式，可在具有下列特性的節點區塊間提供階層排程：
+ 區塊是節點的連續範圍
+ 區塊不能彼此重疊
+ 在使用下一個區塊之前，區塊中的所有節點都會配置給任務
+ 規劃區塊大小是設定的最小區塊大小
+ 每個較高的區塊層級大小都是前一個區塊層級的二次冪

此外掛程式會根據定義的網路拓撲來配置節點。

封鎖拓撲模型統一、高頻寬的通訊網域，其中所有 GPUs 都參與具有接近均勻延遲的單一高速網域。區塊拓撲會將所有節點視為單一整合通訊單元的一部分。SageMaker HyperPod 中的 UltraServer 架構支援區塊外掛程式。

區塊拓撲用於 `ml.p6e-gb200.NVL72`和 等執行個體類型`ml.p6e-gb300.NVL72`。

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

#### Usage
<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.conf`檔案：
+ **向上擴展**：新節點會新增至叢集。
+ **縮減規模**：節點會從叢集中移除。
+ **節點取代**：取代故障或運作狀態不佳的節點，或使用 [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>

為了在 SageMaker HyperPod 中使用 UltraServer 架構獲得最佳效能：
+ **設定適當的區塊大小**：設定 `BlockSizes=18` (或如果一個節點是備用節點，則為 17) 以符合 UltraServer 架構。
+ **使用區段以獲得更好的可用性**：使用 `--segment=16`、`--segment=8` 或 `--segment=9` 搭配 `srun` 和 `sbatch` 命令來改善任務排程彈性。
+ **考慮任務大小和區段大小**：
  + 如果 `BlockSizes=18`，具有最多 18 個執行個體的任務一律會在單一 UltraServer 上執行。
  + 如果 `BlockSizes=16`，具有少於 16 個執行個體的任務一律會在單一 UltraServer 上執行，而具有 18 個執行個體的任務可能會在一或兩個 UltraServer 上執行。

思考分段時，請考慮下列事項
+ 使用 `--segment=1`，每個執行個體都可以在個別的 UltraServer 上執行。
+ 使用 `-N 18 --segment 9` 時，一個 UltraServer 將放置 9 個節點，而另外 9 個節點可以放置到相同或另一個 UltraServer。
+ 使用 `-N 24 --segment 8`，任務可以在 2 或 3 個 UltraServer 上執行，其中每 8 個節點都會放在同一部伺服器上。

## SageMaker HyperPod 拓撲感知排程中的限制
<a name="sagemaker-hyperpod-topology-limitations"></a>

`topology/block` 外掛程式對異質叢集 (具有不同執行個體類型的叢集) 有限制：
+ 只有區塊中列出的節點可由 Slurm 排程
+ 每個區塊必須至少具有 `BlockSizes[0]` 個節點

對於異質叢集，請考慮以下替代方案：
+ 請勿將使用區塊外掛程式搭配異質叢集。反之，請在不同的分割區中隔離 UltraServer 節點。
+ 僅在相同的 VPC 中使用 UltraServer 建立個別叢集，並使用 Slurm 的多叢集設定。