SageMaker HyperPod 生命週期組態最佳作 - Amazon SageMaker

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

SageMaker HyperPod 生命週期組態最佳作

SageMaker HyperPod 永遠提供 up-and-running 運算叢集,這些叢集可高度自訂,因為您可以撰寫生命週期指令碼來說明 SageMaker HyperPod 如何設定叢集資源。下列主題是準備生命週期指令碼以使用開放原始碼工作負載管理員工具設定 SageMaker HyperPod 叢集的最佳作法。

準備生命週期腳本以設置 Slurm SageMaker HyperPod

下列主題討論如何準備生命週期指令碼,以便在上設定 Slurm。 SageMaker HyperPod

高階概觀

下列程序是佈建 HyperPod叢集並使用 Slurm 進行設定的主要流程。這些步驟按照自下而上方法的順序排列。

  1. 規劃如何在叢集上建立 Slurm 節點 HyperPod 。例如,如果您想要設定兩個 Slurm 節點,則需要在叢集中設定兩個執行個體群組。 HyperPod

  2. 準備一個provisioning_parameters.json文件,這是一個佈建 Slurm 節點的組態表單 HyperPod. provisioning_parameters.json應該包含要在叢集上佈建的 HyperPod Slurm 節點配置資訊。這應該反映了步驟 1 中 Slurm 節點的設計。

  3. 準備一組生命週期指令碼,以設定 Slurm on HyperPod 以安裝軟體套件,並針對您的使用案例在叢集中設定環境。您應該構建生命週期腳本以在中央 Python 腳本(lifecycle_script.py)中按順序集體運行,並編寫一個入口點 shell 腳本(on_create.sh)來運行 Python 腳本。入口點 shell 腳本是您稍後在步驟 5 中需要提供給 HyperPod 群集創建請求的內容。

    此外,請注意,您應該撰寫指令碼,以期resource_config.json望叢集建立期 HyperPod間會產生這些指令碼。 resource_config.json包含 HyperPod叢集資源資訊,例如 IP 位址、執行個體類型和 ARN,並且是設定 Slurm 所需的資訊。

  4. 將先前步驟中的所有檔案收集到資料夾中。

    └── lifecycle_files // your local folder ├── provisioning_parameters.json ├── on_create.sh ├── lifecycle_script.py └── ... // more setup scrips to be fed into lifecycle_script.py
  5. 將所有檔案上傳到 S3 儲存貯體。複製並保留 S3 儲存貯體路徑。請注意,您應該從開頭建立 S3 儲存貯體路徑,sagemaker-因為您需要選擇適用於的 IAM 角色 SageMaker HyperPod附加的連接 AmazonSageMakerClusterInstanceRolePolicy,該路徑只允許以前綴開頭的 S3 儲存貯體路徑sagemaker-。下列命令是將所有檔案上傳至 S3 儲存貯體的範例命令。

    aws s3 cp --recursive ./lifecycle_files s3://sagemaker-hyperpod-lifecycle/src
  6. 準備 HyperPod 叢集建立要求。

    • 選項 1:如果您使用 AWS CLI,請按照中的指示以 JSON 格式寫入叢集建立請求 (create_cluster.json) 建立新叢集

    • 選項 2:如果您使用 SageMaker 控制台 UI,請按照中的說明在 HyperPod 控制台 UI 中填寫創建叢集請求表單建立 SageMaker HyperPod 叢集

    在這個階段,請確定您在步驟 1 和 2 中規劃的相同結構中建立執行個體群組。此外,請務必從請求表單中的步驟 5 指定 S3 儲存貯體。

  7. 提交叢集建立要求。 HyperPod 根據要求佈建叢集,然後在 HyperPod 叢集執行個體中建立resource_config.json檔案,並在執行生命週期指令碼的叢集上設定 Slurm。

下一節將逐步引導您詳細說明如何組織設定檔和生命週期指令碼,以便在 HyperPod 叢集建立期間正常運作。

從提供的基礎生命週期指令碼開始 HyperPod

本節將引導您完成以上而下方式設置 Slurm on HyperPod 的基本流程的每個組成部分。它從準備 HyperPod 叢集建立要求以執行 CreateCluster API 開始,並深入了解階層式結構,直到生命週期指令碼。使用 Awsome 分散式訓練 GitHub 儲存庫中提供的範例生命週期指令碼。執行下列命令來複製儲存庫。

git clone https://github.com/aws-samples/awsome-distributed-training/

在 SageMaker HyperPod上設定 Slurm 叢集的基本生命週期指令碼,請參閱。1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config

cd awsome-distributed-training/1.architectures/5.sagemaker_hyperpods/LifecycleScripts/base-config

下列流程圖顯示應如何設計基礎生命週期指令碼的詳細概觀。圖表下方的描述和程序指南說明了它們在 HyperPod CreateCluster API 調用期間的工作方式。

圖: HyperPod 叢集建立和生命週期指令碼結構的詳細流程圖。(1)虛線箭頭指向框被「調用到」的位置,並顯示配置文件和生命週期腳本準備的流程。它從準備provisioning_parameters.json和生命週期腳本開始。然後編碼這些按順序lifecycle_script.py進行集體執行。腳本的執行由 on_create.sh shell lifecycle_script.py 腳本完成,該腳本將在 HyperPod 實例終端中運行。(2) 實心箭頭顯示主 HyperPod 群集創建流程以及如何「調用到」或「提交到」框。 on_create.sh是叢集建立要求的必要項目,無論是在create_cluster.json主控台 UI 中的 [建立叢集要求] 表單。提交要求後,根據要求和生命週期指令碼中的指定組態資訊 HyperPod 執行 CreateCluster API。(3) 虛線箭頭表示在叢集資源佈建期間,resource_config.json在叢集執行個體中建立 HyperPod 平台。 resource_config.json包含 HyperPod 叢集資源資訊,例如叢集 ARN、執行個體類型和 IP 位址。請務必注意,您應該準備生命週期指令碼,以便在叢集建立期間預期該resource_config.json檔案。如需詳細資訊,請參閱下面的程序指南。

下列程序指南說明 HyperPod 叢集建立期間發生的情況,以及如何設計基礎生命週期指令碼。

  1. create_cluster.json— 若要提交 HyperPod 叢集建立要求,您可以準備 JSON 格式的CreateCluster要求檔案。在這個最佳做法範例中,我們假設要求檔案已命名create_cluster.json。寫入create_cluster.json以佈建具有執行個體群組的 HyperPod 叢集。最佳做法是新增與您計劃在叢集上設定的 Slurm 節點數目相同的執行個體群組數目 HyperPod。請務必為要指派給您打算設定的 Slurm 節點的執行個體群組提供獨特的名稱。

    此外,您還需要指定 S3 儲存貯體路徑,將整組組態檔案和生命週期指令碼存放到CreateCluster申請表單InstanceGroups.LifeCycleConfig.SourceS3Uri中的欄位名稱,並指定入口點 shell 指令碼的檔案名稱 (假設已命名為on_create.sh) 至。InstanceGroups.LifeCycleConfig.OnCreate

    注意

    如果您在 HyperPod 主控台 UI 中使用 [建立叢集提交表單],則主控台會代表您管理填寫和提交CreateCluster要求,並在後端執行 CreateCluster API。在這種情況下,您不需要建立create_cluster.json;相反地,請務必在 [建立叢集提交] 表單中指定正確的叢集配置資訊。

  2. on_create.sh— 對於每個執行個體群組,您必須提供入口點 shell 指令碼、執行命令on_create.sh、執行指令碼以安裝軟體套件,以及使用 Slurm 設定 HyperPod 叢集環境。您需要準備的兩件事是設置 Slurm 和一組 HyperPod 用於安裝軟件包的生命週期腳本provisioning_parameters.json所必需的。您應該撰寫此指令碼來尋找並執行下列檔案,如範例指令碼所示on_create.sh

    注意

    請務必將整組生命週期指令碼上傳到您在中指定的 S3 位置create_cluster.json。您還應該將您的位置放provisioning_parameters.json在同一位置。

    1. provisioning_parameters.json— 這是一個佈建 Slurm 節點的組態表單 HyperPod. 指on_create.sh令碼會尋找此 JSON 檔案,並定義環境變數,以識別其路徑。透過這個 JSON 檔案,您可以設定 Slurm 節點和儲存選項,例如 Amazon FSx for Lustre 用於 Slurm 進行通訊。在中provisioning_parameters.json,請確定您使用您在中指定的名稱將 HyperPod 叢集執行個體群組指派create_cluster.json給 Slurm 節點,根據您計劃的設定方式適當地指派叢集執行個體群組。

      下圖顯示了兩個 JSON 配置文件的示例,create_cluster.jsonprovisioning_parameters.json應該如何編寫以將 HyperPod 實例組分配給 Slurm 節點。在此示例中,我們假設設置三個 Slurm 節點的情況:控制器(管理)節點,登錄節點(可選)和計算(Worker)節點。

      提示

      為了協助您驗證這兩個 JSON 檔案, HyperPod 服務團隊會提供驗證指令碼validate-config.py。如需進一步了解,請參閱在上建立 Slurm 叢集之前,先驗證 JSON 組態檔 HyperPod

      圖: HyperPod叢集建立與 Slurm 組態之create_cluster.jsonprovisiong_params.json的直接比較。中的執行個體群組數目create_cluster.json應與您要設定為 Slurm 節點的節點數目相符。在圖中的範例中,將在三個執行個體群組的 HyperPod 叢集上設定三個 Slurm 節點。您應該相應地指定執行個體群組名稱,將 HyperPod 叢集執行個體群組指派給 Slurm 節點。
    2. resource_config.json— 在叢集建立期間,會寫入lifecycle_script.py指令碼以期待resource_config.json檔案來源 HyperPod。此檔案包含叢集的相關資訊,例如執行個體類型和 IP 位址。

      當您執行 CreateCluster API 時, HyperPod 會/opt/ml/config/resource_config.json根據檔案建立資源配置create_cluster.json檔案。檔案路徑會儲存到名為的環境變數中SAGEMAKER_RESOURCE_CONFIG_PATH

      重要

      resource_config.json文件由 HyperPod 平台自動生成,您不需要創建它。下面的代碼是為了顯示一個例子,resource_config.json這些示例將根據上一步create_cluster.json中的集群創建,並幫助您了解後端resource_config.json會發生什麼以及自動生成的外觀。

      { "ClusterConfig": { "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde01234yz", "ClusterName": "your-hyperpod-cluster" }, "InstanceGroups": [ { "Name": "controller-machine", "InstanceType": "ml.c5.xlarge", "Instances": [ { "InstanceName": "controller-machine-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] }, { "Name": "login-group", "InstanceType": "ml.m5.xlarge", "Instances": [ { "InstanceName": "login-group-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] }, { "Name": "compute-nodes", "InstanceType": "ml.trn1.32xlarge", "Instances": [ { "InstanceName": "compute-nodes-1", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-2", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-3", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" }, { "InstanceName": "compute-nodes-4", "AgentIpAddress": "111.222.333.444", "CustomerIpAddress": "111.222.333.444", "InstanceId": "i-12345abcedfg67890" } ] } ] }
    3. lifecycle_script.py— 這是主要的 Python 指令碼,可在佈建時共同執行 HyperPod 叢集上設定 Slurm 的生命週期指令碼。此指令碼會resource_config.json從中provisioning_parameters.json指定或識別的路徑進行讀取on_create.sh,將相關資訊傳遞至每個生命週期指令碼,然後依序執行生命週期指令碼。

      生命週期指令碼是一組指令碼,您可以完全靈活地自訂以安裝軟體套件,並在叢集建立期間設定必要或自訂組態,例如設定 Slurm、建立使用者、安裝 Conda 或 Docker。範例指令碼已準備好在儲存庫中執行其他基lifecycle_script.py本生命週期指令碼,例如啟動 Slurm 參數 (start_slurm.sh)、掛載 Amazon FSx for Lustre (mount_fsx.sh),以及設定 MariaDB 會計 () 和 RDS 會計 ()。setup_mariadb_accounting.shsetup_rds_accounting.sh您還可以添加更多腳本,將它們打包在同一目錄下,並添加代碼行以lifecycle_script.py便 HyperPod 運行腳本。如需有關基礎生命週期指令碼的詳細資訊,另請參閱 Awsome 分散式訓練 GitHub 存放庫中的 3.1 生命週期指令碼

      除了預設設定之外,utils資料夾下還有更多用於安裝下列軟體的腳本。該lifecycle_script.py文件已準備好包含用於運行安裝腳本的代碼行,因此請參閱以下項目以搜索這些行並取消註釋以激活它們。

      1. 下面的代碼行是用於安裝碼恩魯特和 Pyxis。需要這些套件才能在 Slurm 叢集上執行 Docker 容器。

        若要啟用此安裝步驟,請在config.py檔案True中將enable_docker_enroot_pyxis參數設定為。

        # Install Docker/Enroot/Pyxis if Config.enable_docker_enroot_pyxis: ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_enroot_pyxis.sh").run(node_type)
      2. 您可以將 HyperPod 叢集與適用於 Prometheus 和 Amazon 受管的 Grafana 管理服務整合,以將叢集和 HyperPod叢集節點的相關指標匯出到 Amazon 受管 Grafana 儀表板。若要匯出指標並使用 Slurm 儀表板NVIDIA DCGM 匯出程式儀表板和 Amazon 受管 Grafana 上的 EFA 指標儀表板,您需要為 Prometheus、NVIDIA DCGM 匯出程式和 EFA 節點匯出程式安裝 Slurm 匯出程式。如需在 Amazon 受管 Grafana 工作區上安裝匯出程式套件和使用 Grafana 儀表板的詳細資訊,請參閱。監控 SageMaker HyperPod 叢集資源

        若要啟用此安裝步驟,請在config.py檔案True中將enable_observability參數設定為。

        # Install metric exporting software and Prometheus for observability if Config.enable_observability: if node_type == SlurmNodeType.COMPUTE_NODE: ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_dcgm_exporter.sh").run() ExecuteBashScript("./utils/install_efa_node_exporter.sh").run() if node_type == SlurmNodeType.HEAD_NODE: wait_for_scontrol() ExecuteBashScript("./utils/install_docker.sh").run() ExecuteBashScript("./utils/install_slurm_exporter.sh").run() ExecuteBashScript("./utils/install_prometheus.sh").run()
  3. 請務必將步驟 2 的所有組態檔案和設定指令碼上傳至您在步驟 1 CreateCluster 請求中提供的 S3 儲存貯體。例如,假設您create_cluster.json具有以下內容。

    "LifeCycleConfig": { "SourceS3URI": "s3://sagemaker-hyperpod-lifecycle/src", "OnCreate": "on_create.sh" }

    然後,您"s3://sagemaker-hyperpod-lifecycle/src"應該包含on_create.shlifecycle_script.pyprovisioning_parameters.json、和所有其他設置腳本。假設您已經準備好了本地文件夾中的文件,如下所示。

    └── lifecycle_files // your local folder ├── provisioning_parameters.json ├── on_create.sh ├── lifecycle_script.py └── ... // more setup scrips to be fed into lifecycle_script.py

    若要上傳檔案,請使用 S3 指令,如下所示。

    aws s3 cp --recursive ./lifecycle_scripts s3://sagemaker-hyperpod-lifecycle/src

Slurm 配置文件中 HyperPod 管理哪些特定配置

當您在/opt/slurm/etc/上建立 Slurm 叢集時 HyperPod, HyperPod 代理程式會設定slurm.confgres.conf檔案,以根據叢集建立要求和生命週期指令碼管理 Slurm HyperPod 叢集。下列清單顯示 HyperPod 代理程式處理和覆寫的特定參數。

重要

強烈建議您不要變更由管理的這些參數 HyperPod。

  • 在中 slurm.conf, HyperPod 設定下列基本參數:ClusterNameSlurmctldHostPartitionName、和NodeName

    此外,若要啟用此自動恢復功能, HyperPod 需要如下所示設定TaskPluginSchedulerParameters參數。 HyperPod 代理程式預設會使用必要值來設定這兩個參數。

    TaskPlugin=task/none SchedulerParameters=permit_job_expansion
  • 在中 gres.confNodeName針對 GPU 節點進行 HyperPod 管理。

將亞馬遜 FSx 安裝到您的叢集 HyperPod

若要將 Amazon FSx for Lustre 共用檔案系統掛載到您的 HyperPod 叢集,請設定下列項目。

  1. 使用您的 Amazon VPC。

    1. 若要在 VPC 內進行通訊的 HyperPod 叢集執行個體,請確定您已將其附加(選用) 搭配 Amazon Virtual Private Cloud 使 SageMaker HyperPod 用的其他許可到的 IAM 角色。 SageMaker HyperPod

    2. 在中create_cluster.json,包含下列 VPC 資訊。

      "VpcConfig": { "SecurityGroupIds": [ "string" ], "Subnets": [ "string" ] }

      如需有關設定 Amazon VPC 的更多提示,請參閱(可選) SageMaker HyperPod 使用您的 Amazon VPC 進行設置

  2. 若要完成 Slurm 與 Amazon FSx for Lustre 的設定,請在中指定 Amazon FSx DNS 名稱和 Amazon FSx 掛載名稱,provisioning_parameters.json如本節中的圖所示。從提供的基礎生命週期指令碼開始 HyperPod您可以從帳戶中的亞馬遜 FSx 主控台找到 Amazon FSx 資訊,或執行下列命令。 AWS CLI aws fsx describe-file-systems

    "fsx_dns_name": "fs-12345678a90b01cde.fsx.us-west-2.amazonaws.com", "fsx_mountname": "1abcdefg"

在上建立 Slurm 叢集之前,先驗證 JSON 組態檔 HyperPod

若要在提交叢集建立要求之前驗證 JSON 組態檔,請使用組態驗證指令碼validate-config.py。此指令碼會剖析和比較您的 HyperPod 叢集組態 JSON 檔案和 Slurm 組態 JSON 檔案,並識別兩個檔案之間以及 Amazon EC2、Amazon VPC 和 Amazon FSx 資源之間是否有任何資源設定錯誤。例如,若要驗證從提供的基礎生命週期指令碼開始 HyperPod區段中的create_cluster.jsonprovisioning_parameters.json檔案,請執行驗證指令碼,如下所示。

python3 validate-config.py --cluster-config create_cluster.json --provisioning-parameters provisioning_parameters.json

以下是成功驗證的範例輸出。

✔️ Validated instance group name worker-group-1 is correct ... ✔️ Validated subnet subnet-012345abcdef67890 ... ✔️ Validated security group sg-012345abcdef67890 ingress rules ... ✔️ Validated security group sg-012345abcdef67890 egress rules ... ✔️ Validated FSx Lustre DNS name fs-012345abcdef67890.fsx.us-east-1.amazonaws.com ✔️ Validated FSx Lustre mount name abcdefgh ✅ Cluster Validation succeeded

在 Slurm 叢集上執行生產工作負載之前先驗證執行階段 HyperPod

若要在 Slurm 叢集上執行任何生產工作負載之前檢查執行階段 HyperPod,請使用執行階段驗證指令碼。hyperpod-precheck.py此指令碼會檢查 Slurm 叢集是否已安裝所有執行 Docker 的套件、叢集是否已正確掛載 FSx for Lustre 檔案系統) 和共用檔案系統的使用者目錄,以及 Slurm deamon 是否在所有計算節點上執行。

若要一次在多個節點上執行指令碼,請srun在 8 個節點的 Slurm 叢集上執行指令碼的下列範例命令中使用。

# The following command runs on 8 nodes srun -N 8 python3 hyperpod-precheck.py
注意

若要深入瞭解驗證指令碼,例如指令碼提供的執行階段驗證函數,以及解決未通過驗證問題的指導方針,請參閱在 Awsome 分散式訓練 GitHub 存放庫中執行工作負載之前執行階段驗證

在叢集節點上互動式開發生命週期指令碼

本節說明如何在不重複建立和刪除 HyperPod 叢集的情況下,以互動方式開發生命週期指令碼。

  1. 使用基礎生命週期指令碼建立 HyperPod 叢集。

  2. 登入叢集節點。

  3. 透過在節點上重複編輯並執行指令碼 (configure_xyz.sh) 來開發指令碼 ()。

    1. HyperPod 以 root 使用者身分執行生命週期指令碼,因此建議您在configure_xyz.sh開發時以 root 使用者身分執行,以確保在執行時,在相同的條件下測試指令碼 HyperPod。

  4. lifecycle_script.py通過添加類似以下內容的代碼行來將腳本集成到中。

    ExecuteBashScript("./utils/configure_xyz.sh").run()
  5. 將更新的生命週期指令碼上傳到您最初用於上傳基本生命週期指令碼的 S3 儲存貯體。

  6. lifecycle_script.py透過建立新 HyperPod 叢集來測試的整合版本。

使用新的或更新的生命週期指令碼更新叢集

有三種更新 HyperPod 軟件的方法。

  • 修補 HyperPod 軟體的 UpdateClusterSoftware API 會在整個執行個體群組上重新執行生命週期指令碼。

  • UpdateClusterAPI 只會針對新的執行個體群組執行生命週期指令碼。

  • 您也可以直接在執行個體中 HyperPod執行生命週期指令碼。

考量事項

使用時請考慮以下幾點 SageMaker HyperPod。

  • HyperPod 在叢集的每個執行個體SageMaker HyperPod DLAMI上執行,並且 AMI 已預先安裝軟體套件,以符合它們與功能之間的相容性。 HyperPod請注意,如果您重新安裝任何預先安裝的套件,您必須負責安裝相容的套件,並注意某些 HyperPod 功能可能無法如預期般運作。