安裝訓練運算子 - Amazon SageMaker AI

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

安裝訓練運算子

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

先決條件

在使用 HyperPod 訓練運算子之前,您必須先完成下列先決條件:

安裝訓練運算子

您現在可以透過 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/

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

  3. 儀表板索引標籤上,找到名為 Amazon SageMaker HyperPod 訓練運算子的附加元件,然後選擇安裝。在安裝過程中,SageMaker AI 會建立一個許可類似 AmazonSageMakerHyperPodTrainingOperatorAccess 受管政策的 IAM 執行角色,並在 Amazon EKS 叢集與新執行角色之間建立 Pod 身分識別關聯。

Amazon EKS console
注意

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

  1. 在以下網址開啟 Amazon EKS 主控台:https://console.aws.amazon.com/eks/home#/clusters

  2. 前往您的 EKS 叢集、選擇附加元件,然後選擇取得更多附加元件

  3. 選擇 Amazon SageMaker HyperPod 訓練運算子,然後選擇下一步

  4. 版本下,主控台預設為最新版本,我們建議您使用該版本。

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

  6. 在此角色建立程序進行期間,IAM 主控台會預先填入所有必要資訊,例如使用案例、AmazonSageMakerHyperPodTrainingOperatorAccess 受管政策和其他必要的許可、角色名稱,以及描述。當您完成這些步驟時,請檢閱資訊,然後選擇建立角色

  7. 在 EKS 主控台中,檢閱附加元件的設定,然後選擇建立

CLI
  1. 確定 HyperPod 叢集的 IAM 執行角色具有信任關係,允許 EKS Pod 身分識別擔任該角色,或使用下列信任政策建立新的 IAM 角色。或者,您可以使用 Amazon EKS 主控台來安裝附加元件,這會建立建議的角色。

    JSON
    JSON
    { "Version":"2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession", "eks-auth:AssumeRoleForPodIdentity" ] } ] }
  2. AmazonSageMakerHyperPodTrainingOperatorAccess 受管政策連接至您建立的角色。

  3. 然後在您的 EKS 叢集、IAM 角色和新的 IAM 角色之間建立 Pod 身分識別關聯

    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 區域
  4. 完成程序後,您可以使用 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" }] }
  5. 若要安裝訓練運算子,請使用 create-addon 操作。--addon-version 為選用參數。如果您未提供一個,則預設為最新版本。若要取得可能的版本,請使用 DescribeAddonVersions 操作。

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

如果您已在 HyperPod 叢集上安裝訓練運算子,您可以將 EKS 附加元件更新為您想要的版本。如果您想要使用無檢查點訓練彈性訓練,請考慮下列事項:

  • 無檢查點訓練和彈性訓練都需要 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

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

  3. 版本功能表中,選擇您想要的附加元件版本,然後選擇儲存變更

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
  2. 然後將附加元件更新為您想要的版本。

    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 彈性代理程式

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

注意

無檢查點訓練彈性訓練都需要您使用 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 彈性代理程式引數

HyperPod 彈性代理程式支援所有原始引數,並新增一些額外的引數。以下是 HyperPod 彈性代理程式中可用的所有引數。如需 PyTorch Elastic 代理程式的詳細資訊,請參閱其官方文件

引數 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 代理程式在觸發程序層級重新啟動之前等待工作者到達同步障礙的時間,以秒為單位。

任務治理 (選用)

訓練運算子已與 HyperPod 任務治理整合,此任務治理是強大的管理系統,旨在簡化資源配置,並確保 Amazon EKS 叢集可跨團隊和專案有效利用運算資源。若要設定 HyperPod 任務治理,請參閱 SageMaker HyperPod 任務治理的設定

注意

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

提交任務時,請確定您包含 hyperpod-ns-team-name-localqueuepriority-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 (選用)

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

  1. 遵循官方 Kueue 文件中的安裝指南。當您到達設定 controller_manager_config.yaml 的步驟時,請新增下列組態:

    externalFrameworks: - "HyperPodPytorchJob.v1.sagemaker.amazonaws.com"
  2. 遵循官方安裝指南中的其餘步驟。完成安裝 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