

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

# 安裝訓練運算子
<a name="sagemaker-eks-operator-install"></a>

請參閱下列各節，了解如何安裝訓練運算子。

## 先決條件
<a name="sagemaker-eks-operator-prerequisites"></a>

 在使用 HyperPod 訓練運算子之前，您必須先完成下列先決條件：
+  [ 使用 Amazon EKS 協同運作建立 HyperPod 叢集](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks-operate-console-ui-create-cluster.html)。
+ 在您的 HyperPod 叢集上安裝最新的 AMI。如需詳細資訊，請參閱[適用於 Amazon EKS 的 SageMaker HyperPod AMI 版本](sagemaker-hyperpod-release-ami-eks.md)。
+ [已安裝 cert-manager](https://cert-manager.io/docs/installation/)
+  [ 使用主控台設定 EKS Pod 身分識別代理程式](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html)。如果您想要使用 AWS CLI，請使用下列命令：

  ```
  aws eks create-addon \ 
   --cluster-name {{my-eks-cluster}} \
   --addon-name eks-pod-identity-agent \
   --region {{AWS 區域}}
  ```
+ （選用） 如果您在私有 VPC 中執行 HyperPod 叢集節點，則必須為 Amazon SageMaker AI API (`com.amazonaws.{{aws-region}}.sagemaker.api`) 和 Amazon EKS Auth 服務 (com.amazonaws.{{aws-region}}.eks-auth) 設定 PrivateLinks VPC 端點。您還必須確保叢集節點執行的子網路位於安全群組中，允許流量透過 VPC 端點路由，以便與 SageMaker AI 和 Amazon EKS 通訊。如果未正確設定這些項目，附加元件安裝可能會失敗。若要進一步了解如何設定 VPC 端點，請參閱[建立 VPC 端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

## 安裝訓練運算子
<a name="sagemaker-eks-operator-install-operator"></a>

 您現在可以透過 SageMaker AI 主控台、Amazon EKS 主控台或使用 AWS CLI 安裝 HyperPod 訓練運算子。這些主控台方法提供簡化的體驗，協助您安裝運算子。 AWS CLI 提供程式設計方法，可讓您自訂更多安裝。

在兩個主控台體驗之間，SageMaker AI 提供一鍵式安裝、建立 IAM 執行角色、建立 Pod 身分識別關聯，以及安裝運算子。Amazon EKS 主控台安裝與其類似，但此方法不會自動建立 IAM 執行角色。在此過程中，您可以選擇使用主控台預先填入的資訊建立新的 IAM 執行角色。根據預設，這些建立的角色只能存取您要在其中安裝運算子的目前叢集。除非您編輯角色的許可以包含其他叢集，否則如果您移除並重新安裝運算子，則必須建立新的角色。

------
#### [ SageMaker AI console (recommended) ]

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

1. 前往叢集的詳細資訊頁面。

1. 在**儀表板**索引標籤上，找到名為 **Amazon SageMaker HyperPod 訓練運算子**的附加元件，然後選擇**安裝**。在安裝過程中，SageMaker AI 會建立一個許可類似 [AmazonSageMakerHyperPodTrainingOperatorAccess ](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSageMakerHyperPodTrainingOperatorAccess.html)受管政策的 IAM 執行角色，並在 Amazon EKS 叢集與新執行角色之間建立 Pod 身分識別關聯。

------
#### [ Amazon EKS console ]

**注意**  
如果您透過 Amazon EKS 叢集安裝附加元件，請先確定您已使用金鑰/值對 `SageMaker:true` 標記 HyperPod 叢集。否則，安裝將會失敗。

1. 在以下網址開啟 Amazon EKS 主控台：[https://console.aws.amazon.com/eks/home\#/clusters](https://console.aws.amazon.com/eks/home#/clusters)。

1. 前往您的 EKS 叢集、選擇**附加元件**，然後選擇**取得更多附加元件**。

1. 選擇 Amazon SageMaker HyperPod 訓練運算子，然後選擇**下一步**。

1. 在**版本**下，主控台預設為最新版本，我們建議您使用該版本。

1. 在**附加元件存取**下，選擇要與訓練運算子附加元件搭配使用的 Pod 身分識別 IAM 角色。如果您還沒有一個角色，請選擇**建立建議的角色**來建立角色。

1. 在此角色建立程序進行期間，IAM 主控台會預先填入所有必要資訊，例如使用案例、[AmazonSageMakerHyperPodTrainingOperatorAccess ](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSageMakerHyperPodTrainingOperatorAccess.html)受管政策和其他必要的許可、角色名稱，以及描述。當您完成這些步驟時，請檢閱資訊，然後選擇**建立角色**。

1. 在 EKS 主控台中，檢閱附加元件的設定，然後選擇**建立**。

------
#### [ CLI ]

1. 確定 HyperPod 叢集的 IAM 執行角色具有信任關係，允許 EKS Pod 身分識別擔任該角色，或使用下列信任政策[建立新的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。或者，您可以使用 Amazon EKS 主控台來安裝附加元件，這會建立建議的角色。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
         "Effect": "Allow",
         "Principal": {
           "Service": "pods.eks.amazonaws.com"
         },
         "Action": [
           "sts:AssumeRole",
           "sts:TagSession",
           "eks-auth:AssumeRoleForPodIdentity"
         ]
       }
     ]
   }
   ```

------

1.  將 [AmazonSageMakerHyperPodTrainingOperatorAccess 受管政策](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonSageMakerHyperPodTrainingOperatorAccess.html)連接至您建立的角色。

1.  [ 然後在您的 EKS 叢集、IAM 角色和新的 IAM 角色之間建立 Pod 身分識別關聯](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)。

   ```
   aws eks create-pod-identity-association \
   --cluster-name {{my-eks-cluster}} \
   --role-arn {{ARN of your execution role}} \
   --namespace aws-hyperpod \
   --service-account hp-training-operator-controller-manager \
   --region {{AWS 區域}}
   ```

1.  完成程序後，您可以使用 ListPodIdentityAssociations 操作來查看您建立的關聯。以下是其可能的範例回應：

   ```
   aws eks list-pod-identity-associations --cluster-name my-eks-cluster
   {
       "associations": [{
           "clusterName": "{{my-eks-cluster}}",
           "namespace": "aws-hyperpod",
           "serviceAccount": "hp-training-operator-controller-manager",
           "associationArn": "arn:aws:eks:us-east-2:123456789012:podidentityassociation/my-hyperpod-cluster/a-1a2b3c4d5e6f7g8h9",
           "associationId": "{{a-1a2b3c4d5e6f7g8h9}}"
       }]
   }
   ```

1. 若要安裝訓練運算子，請使用 `create-addon` 操作。`--addon-version` 為選用參數。如果您未提供一個，則預設為最新版本。若要取得可能的版本，請使用 [DescribeAddonVersions](https://docs.aws.amazon.com/eks/latest/APIReference/API_DescribeAddonVersions.html) 操作。

   ```
   aws eks create-addon \
     --cluster-name my-eks-cluster \
     --addon-name amazon-sagemaker-hyperpod-training-operator \
     --resolve-conflicts OVERWRITE
   ```

------

如果您已在 HyperPod 叢集上安裝訓練運算子，您可以將 EKS 附加元件更新為您想要的版本。如果您想要使用[無檢查點訓練](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-eks-checkpointless.html)或[彈性訓練](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-eks-elastic-training.html)，請考慮下列事項：
+ 無檢查點訓練和彈性訓練都需要 EKS 附加元件位於 1.2.0 版或更新版本。
+ Amazon SageMaker HyperPod 訓練運算子會維持任何 EKS 附加元件版本的回溯相容性，因此您可以從任何附加元件版本升級至 1.2.0 或更新版本。
+ 如果您從 1.2.0 版或更高版本降級為較低版本，您必須先刪除現有的任務，才能降級，並在降級完成後重新提交任務。

------
#### [ Amazon EKS Console ]

1. 在以下網址開啟 Amazon EKS 主控台：[https://console.aws.amazon.com/eks/home\#/clusters](https://console.aws.amazon.com/eks/home#/clusters)。

1. 前往您的 EKS 叢集，然後選擇**附加元件**。然後，選擇 Amazon SageMaker HyperPod 訓練運算子附加元件，然後選擇**編輯**。

1. 在**版本**功能表中，選擇您想要的附加元件版本，然後選擇**儲存變更**。

------
#### [ CLI ]

1. 首先取得叢集的 附加元件支援版本清單。

   ```
   aws eks describe-addon-versions \
     --kubernetes-version $(aws eks describe-cluster --name {{my-eks-cluster}} --query 'cluster.version' --output text) \
     --addon-name amazon-sagemaker-hyperpod-training-operator \
     --query 'addons[0].addonVersions[].addonVersion' \
     --output table
   ```

1. 然後將附加元件更新為您想要的版本。

   ```
   aws eks update-addon \
     --cluster-name my-eks-cluster \
     --addon-name amazon-sagemaker-hyperpod-training-operator \
     --addon-version target-version
     --resolve-conflicts OVERWRITE
   ```

------

 訓練運算子隨附多個選項，其中包含可能適合您使用案例的預設值。我們建議您在變更訓練運算子之前，先使用預設值來嘗試訓練運算子。下表描述所有參數，以及您可能想要設定每個參數時的範例。


| 參數 | 描述 | 預設 | 
| --- | --- | --- | 
| hpTrainingControllerManager.manager.resources.requests.cpu | 要為控制器配置多少處理器 | 1 | 
| hpTrainingControllerManager.manager.resources.requests.memory | 要配置給控制器多少記憶體 | 2Gi | 
| hpTrainingControllerManager.manager.resources.limits.cpu | 控制器的 CPU 限制 | 2 | 
| hpTrainingControllerManager.manager.resources.limits.memory | 控制器的記憶體限制 | 4Gi | 
| hpTrainingControllerManager.nodeSelector | 控制器 Pod 的節點選擇器 | 預設行為是選取標籤為 sagemaker.amazonaws.com/compute-type: "HyperPod" 的節點 | 

## HyperPod 彈性代理程式
<a name="sagemaker-eks-operator-elastic-agent"></a>

HyperPod 彈性代理程式是 [PyTorch 的 ElasticAgent](https://docs.pytorch.org/docs/stable/elastic/agent.html) 延伸模組。它在每個容器上協調訓練工作者的生命週期，並與 HyperPod 訓練運算子通訊。若要使用 HyperPod 訓練運算子，您必須先將 HyperPod 彈性代理程式安裝至訓練映像，才能使用運算子提交和執行任務。以下是安裝彈性代理程式並使用 `hyperpodrun` 來建立任務啟動器的 docker 檔案。

**注意**  
[ 無檢查點訓練](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-eks-checkpointless.html)和[彈性訓練](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-eks-elastic-training.html)都需要您使用 HyperPod 彈性代理程式 1.1.0 版或更新版本。

```
RUN pip install hyperpod-elastic-agent

ENTRYPOINT ["entrypoint.sh"]
# entrypoint.sh
...
hyperpodrun --nnodes={{node_count}} --nproc-per-node={{proc_count}} \
            --rdzv-backend hyperpod \ # Optional
            --inprocess-restart \ # Optional (in-process fault recovery with checkpointless training)
            ... # Other torchrun args
            # pre-traing arg_group
            --pre-train-script pre.sh --pre-train-args "pre_1 pre_2 pre_3" \
            # post-train arg_group
            --post-train-script post.sh --post-train-args "post_1 post_2 post_3" \
            {{training.py}} --script-args
```

您現在可以使用 `kubectl` 提交任務。

### HyperPod 彈性代理程式引數
<a name="sagemaker-eks-operator-elastic-agent-args"></a>

 HyperPod 彈性代理程式支援所有原始引數，並新增一些額外的引數。以下是 HyperPod 彈性代理程式中可用的所有引數。如需 PyTorch Elastic 代理程式的詳細資訊，請參閱其[官方文件](https://docs.pytorch.org/docs/stable/elastic/agent.html)。


| 引數 | Description | 預設值 | 
| --- | --- | --- | 
| --shutdown-signal | 要傳送給工作者進行關機的訊號 (SIGTERM 或 SIGKILL) | "SIGKILL" | 
| --shutdown-timeout | 關閉訊號和 SIGKILL 訊號之間的逾時，以秒為單位 | 15 | 
| --server-host | 代理程式伺服器位址 | "0.0.0.0" | 
| --server-port | 代理程式伺服器連接埠 | 8080 | 
| --server-log-level | 代理程式伺服器日誌層級 | "info" | 
| --server-shutdown-timeout | 伺服器關機逾時，以秒為單位 | 300 | 
| --pre-train-script | 預先訓練指令碼的路徑 | 無 | 
| --pre-train-args | 預先訓練指令碼的引數 | 無 | 
| --post-train-script | 訓練後指令碼的路徑 | 無 | 
| --post-train-args | 訓練後指令碼的引數 | 無 | 
| --inprocess-restart | 指定是否使用 inprocess\_restart 功能的旗標 | FALSE | 
| --inprocess-timeout | 代理程式在觸發程序層級重新啟動之前等待工作者到達同步障礙的時間，以秒為單位。 | 無 | 

## 任務治理 (選用)
<a name="sagemaker-eks-operator-task-governance"></a>

訓練運算子已與 [HyperPod 任務治理](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-hyperpod-eks-operate-console-ui-governance)整合，此任務治理是強大的管理系統，旨在簡化資源配置，並確保 Amazon EKS 叢集可跨團隊和專案有效利用運算資源。若要設定 HyperPod 任務治理，請參閱 [SageMaker HyperPod 任務治理的設定](sagemaker-hyperpod-eks-operate-console-ui-governance-setup.md)。

**注意**  
安裝 HyperPod 任務治理附加元件時，您必須使用版本 v1.3.0-eksbuild.1 或更新版本。

提交任務時，請確定您包含 `hyperpod-ns-{{team-name}}-localqueue` 和 `{{priority-class}}-name-priority` 的佇列名稱和優先順序類別標籤。例如，如果您使用的是 Kueue，您的標籤會變成以下內容：
+ kueue.x-k8s.io/queue-name: hyperpod-ns-{{team-name}}-localqueue
+ kueue.x-k8s.io/priority-class: {{priority-class}}-name-priority

以下為組態檔案具體形式的範例：

```
apiVersion: sagemaker.amazonaws.com/v1
kind: HyperPodPytorchJob
metadata:
  name: hp-task-governance-sample
  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:
  nprocPerNode: "1"
  runPolicy:
    cleanPodPolicy: "None"
  replicaSpecs: 
    - name: pods
      replicas: 4
      spares: 2
      template:
        spec:
          containers:
            - name: ptjob
              image: XXXX
              imagePullPolicy: Always
              ports:
                - containerPort: 8080
              resources:
                requests:
                  cpu: "2"
```

然後使用下列 kubectl 命令來套用 YAML 檔案。

```
kubectl apply -f task-governance-job.yaml
```

## Kueue (選用)
<a name="sagemaker-eks-operator-kueue"></a>

雖然您可以直接執行任務，但您的組織也可以將訓練運算子與 Kueue 整合，以配置資源和排程任務。請遵循下列步驟，將 Kueue 安裝到您的 HyperPod 叢集。

1. 遵循[官方 Kueue 文件](https://kueue.sigs.k8s.io/docs/installation/#install-a-custom-configured-released-version)中的安裝指南。當您到達設定 `controller_manager_config.yaml` 的步驟時，請新增下列組態：

   ```
   externalFrameworks:
   - "HyperPodPytorchJob.v1.sagemaker.amazonaws.com"
   ```

1. 遵循官方安裝指南中的其餘步驟。完成安裝 Kueue 後，您可以使用 `kubectl apply -f sample-queues.yaml` 命令建立一些範例佇列。使用下列 YAML 檔案。

   ```
   apiVersion: kueue.x-k8s.io/v1beta1
   kind: ClusterQueue
   metadata:
     name: cluster-queue
   spec:
     namespaceSelector: {}
     preemption:
       withinClusterQueue: LowerPriority
     resourceGroups:
     - coveredResources:
       - cpu
       - nvidia.com/gpu
       - pods
       flavors:
       - name: default-flavor
         resources:
         - name: cpu
           nominalQuota: 16
         - name: nvidia.com/gpu
           nominalQuota: 16
         - name: pods
           nominalQuota: 16
   ---
   apiVersion: kueue.x-k8s.io/v1beta1
   kind: LocalQueue
   metadata:
     name: user-queue
     namespace: default
   spec:
     clusterQueue: cluster-queue
   ---
   apiVersion: kueue.x-k8s.io/v1beta1
   kind: ResourceFlavor
   metadata:
     name: default-flavor
   ---
   apiVersion: kueue.x-k8s.io/v1beta1
   description: High priority
   kind: WorkloadPriorityClass
   metadata:
     name: high-priority-class
   value: 1000
   ---
   apiVersion: kueue.x-k8s.io/v1beta1
   description: Low Priority
   kind: WorkloadPriorityClass
   metadata:
     name: low-priority-class
   value: 500
   ```