

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

# 在 Amazon SageMaker HyperPod 任務治理中使用拓撲感知排程
<a name="sagemaker-hyperpod-eks-operate-console-ui-governance-tasks-scheduling"></a>

Amazon SageMaker HyperPod 任務治理中的拓撲感知排程會根據 Amazon EC2 執行個體的實體網路拓撲放置 Pod，以最佳化分散式機器學習工作負載的訓練效率。透過考慮 AWS 基礎設施的階層式結構，包括可用區域、網路區塊和實體機架，拓撲感知排程可確保將需要頻繁通訊的 Pod 排程在接近的位置，以將網路延遲降至最低。這種智慧型配置對於涉及密集 Pod 對 Pod 通訊的大型機器學習訓練任務特別有益，從而減少訓練時間並提高整個叢集的資源使用率。

**注意**  
若要使用拓撲感知排程，請確定您的 HyperPod 任務治理版本為 v1.2.2-eksbuild.1 或更高版本。

拓撲感知排程支援下列執行個體類型：
+ ml.p3dn.24xlarge
+ ml.p4d.24xlarge
+ mlp4d.24xlarge
+ ml.p5.48xlarge
+ ml.p5e.48xlarge
+ ml.p5en.48xlarge
+ ml.p6e-gb200.36xlarge
+ ml.p6-b300.48xlarge
+ ml.trn1.2xlarge
+ ml.trn1.32xlarge
+ ml.trn1n.32xlarge
+ ml.trn2.48xlarge
+ ml.trn2u.48xlarge

拓撲感知排程會與您現有的 HyperPod 工作流程整合，同時透過 kubectl YAML 檔案和 HyperPod CLI 提供靈活的拓撲善好設定。HyperPod 任務治理會自動使用拓撲標籤設定叢集節點，並使用 HyperPod 任務治理政策和資源借用機制，確保拓撲感知排程不會中斷您目前的操作程序。透過對偏好和必要拓撲規格的內建支援，您可以微調工作負載置放，以符合您的特定效能要求，同時在無法滿足拓撲限制條件時，保持回到標準排程的彈性。

透過利用 HyperPod 中的拓撲感知標籤，您可以透過考慮實體網路基礎設施的智慧型 Pod 置放來增強其機器學習工作負載。HyperPod 任務治理會根據階層式資料中心拓撲自動最佳化 Pod 排程，這會直接轉譯為降低網路延遲並改善分散式 ML 任務的訓練效能。這種拓撲感知對於大規模機器學習工作負載特別有價值，因為它透過策略方式將相關的 Pod 放在更接近網路階層的位置，將通訊負荷降至最低。結果是 Pod 之間最佳化的通訊網路延遲、更有效率的資源使用率，以及運算密集型 AI/ML 應用程式更好的整體效能，全都實現，而您不需要手動管理複雜的網路拓撲組態。

以下是 HyperPod 任務治理可在其中排程 Pod 之可用拓撲網路層的標籤：
+ 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

若要使用拓撲感知排程，請在您的 YAML 檔案中包含下列標籤：
+ kueue.x-k8s.io/podset-required-topology - 表示此任務必須具有所需的 Pod，且節點中的所有 Pod 必須排程在相同的拓撲層內。
+ kueue.x-k8s.io/podset-preferred-topology - 表示此任務必須具有 Pod，但偏好在相同的拓撲層內排程 Pod，但並非必要。HyperPod 任務治理會先嘗試在某層內排程 Pod，然後再嘗試下一個拓撲層。

如果資源未共用相同的拓撲標籤，任務將被暫停。任務將在等待清單中。一旦 Kueue 看到有足夠的資源，就會認可並執行任務。

下列範例示範如何在您的 YAML 檔案中使用標籤：

```
apiVersion: batch/v1
kind: Job
metadata:
  name: test-tas-job
  namespace: hyperpod-ns-{{team-name}}
  labels:
    kueue.x-k8s.io/queue-name: hyperpod-ns-{{team-name}}-localqueue
    kueue.x-k8s.io/priority-class: {{PRIORITY_CLASS}}-priority
spec:
  parallelism: 10
  completions: 10
  suspend: true
  template:
    metadata:
      labels:
        kueue.x-k8s.io/queue-name: hyperpod-ns-{{team-name}}-localqueue
      annotations:
        kueue.x-k8s.io/podset-required-topology: "topology.k8s.aws/network-node-layer-3"
        or
        kueue.x-k8s.io/podset-preferred-topology: "topology.k8s.aws/network-node-layer-3"
    spec:
      nodeSelector:
        topology.k8s.aws/network-node-layer-3: {{TOPOLOGY_LABEL_VALUE}}
      containers:
        - name: dummy-job
          image: gcr.io/k8s-staging-perf-tests/sleep:v0.1.0
          args: ["3600s"]
          resources:
            requests:
              cpu: "100"
      restartPolicy: Never
```

下表說明您可以在 kubectl YAML 檔案中使用的新參數。


| 參數 | 說明 | 
| --- | --- | 
| kueue.x-k8s.io/queue-name | 要用來執行任務的佇列名稱。此 queue-name 的格式必須為 hyperpod-ns-{{team-name}}-localqueue。 | 
| kueue.x-k8s.io/priority-class | 可讓您指定 Pod 排程的優先順序。此規格為選用的。 | 
| 註釋 | 包含您連接至任務的拓撲註釋。可用的拓撲為 kueue.x-k8s.io/podset-required-topology 和 kueue.x-k8s.io/podset-preferred-topology。您可以使用註釋或 nodeSelector，但不能同時使用這兩者。 | 
| nodeSelector | 指定代表 Amazon EC2 執行個體置放層的網路層。使用此欄位或註釋，但不能同時使用這兩者。在 YAML 檔案中，您也可以使用 nodeSelector 參數來選擇 Pod 的確切層。若要取得標籤的值，請使用 [DescribeInstanceTopology](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTopology.html) API 操作。 | 

您也可以使用 HyperPod CLI 來執行任務，並使用拓撲感知排程。如需 HyperPod CLI 的詳細資訊，請參閱 [SageMaker HyperPod CLI 命令](sagemaker-hyperpod-eks-hyperpod-cli-reference.md)。

```
hyp create hyp-pytorch-job \                                            
  --version 1.1 \
  --job-name sample-pytorch-job \
  --image 123456789012.dkr.ecr.us-west-2.amazonaws.com/ptjob:latest \
  --pull-policy "Always" \
  --tasks-per-node 1 \
  --max-retry 1 \
  --priority high-priority \
  --namespace hyperpod-ns-{{team-name}} \
  --queue-name hyperpod-ns-{{team-name}}-localqueue \
  --preferred-topology-label topology.k8s.aws/network-node-layer-1
```

以下是範例組態檔案，您可以用來搭配拓撲標籤執行 PytorchJob。如果您想要執行 MPI 和 Tensorflow 任務，該檔案大致類似。如果您想要改為執行這些任務，請記得相應地變更組態檔案，例如使用正確的映像而非 PyTorchJob。如果您正在執行 PyTorchJob，則可以將不同的拓撲指派給主節點和工作節點。PyTorchJob 一律有一個主節點，因此我們建議您改用拓撲來支援工作者 Pod。

```
apiVersion: kubeflow.org/v1
kind: PyTorchJob
metadata:
  annotations: {}
  labels:
    kueue.x-k8s.io/queue-name: hyperpod-ns-{{team-name}}-localqueue
  name: tas-test-pytorch-job
  namespace: hyperpod-ns-team-name
spec:
  pytorchReplicaSpecs:
    Master:
      replicas: 1
      restartPolicy: OnFailure
      template:
        metadata:
          labels:
            kueue.x-k8s.io/queue-name: hyperpod-ns-{{team-name}}-localqueue
        spec:
          containers:
          - command:
            - python3
            - /opt/pytorch-mnist/mnist.py
            - --epochs=1
            image: docker.io/kubeflowkatib/pytorch-mnist:v1beta1-45c5727
            imagePullPolicy: Always
            name: pytorch
    Worker:
      replicas: 10
      restartPolicy: OnFailure
      template:
        metadata:
          # annotations:
            # kueue.x-k8s.io/podset-required-topology: "topology.k8s.aws/network-node-layer-3"
          labels:
            kueue.x-k8s.io/queue-name: hyperpod-ns-{{team-name}}-localqueue
        spec:
          containers:
          - command:
            - python3
            - /opt/pytorch-mnist/mnist.py
            - --epochs=1
            image: docker.io/kubeflowkatib/pytorch-mnist:v1beta1-45c5727
            imagePullPolicy: Always
            name: pytorch
            resources:
              limits:
                cpu: 1
              requests:
                memory: 200Mi
                cpu: 1
          #nodeSelector:
          #  topology.k8s.aws/network-node-layer-3: xxxxxxxxxxx
```

若要查看叢集的拓撲，請使用 [DescribeInstanceTopology](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTopology.html) API 操作。根據預設，拓撲會隱藏在 AWS 管理主控台 和 Amazon SageMaker Studio 中。請遵循下列步驟，在您使用的介面中查看它們。

**SageMaker Studio**

1. 在 SageMaker Studio 中，導覽至您的叢集。

1. 在任務檢視中，選擇名稱欄中的選項功能表，然後選擇**管理資料欄**。

1. 選取**請求的拓撲**和**拓撲限制條件**來新增資料欄，以查看 Kubernetes Pod 清單中的拓撲資訊。

**AWS 管理主控台**

1. 開啟 Amazon SageMaker AI 主控台，網址為 [https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在 **HyperPod 叢集**下，選擇**叢集管理**。

1. 選擇**任務**索引標籤，然後選擇齒輪圖示。

1. 在執行個體屬性下，切換**請求的拓撲**和**拓撲限制條件**。

1. 選擇**確認**以查看資料表中的拓撲資訊。