本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從 HyperPod 提供的基本生命週期指令碼開始
本節會逐步解說在 HyperPod 上設定 Slurm 的基本流程的每個元件,採用由上而下的方法。從準備 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
為集合執行。lifecycle_script.py
指令碼的執行是由 on_create.sh
shell 指令碼完成,該指令碼將在 HyperPod 執行個體終端機中執行。(2) 實心箭頭會顯示主要 HyperPod 叢集建立流程,以及方塊如何「稱為」或「提交」。叢集建立請求on_create.sh
需要,無論是在 create_cluster.json
中或在主控台 UI 中建立叢集請求表單。在您提交請求後,HyperPod 會根據請求和生命週期指令碼中指定的組態資訊執行 CreateCluster
API。(3) 虛線箭頭表示 HyperPod 平台會在叢集資源佈建期間於叢集執行個體resource_config.json
中建立。 resource_config.json
包含 HyperPod 叢集資源資訊,例如叢集 ARN、執行個體類型和 IP 地址。請務必注意,您應該準備生命週期指令碼,以在叢集建立期間預期resource_config.json
檔案。如需詳細資訊,請參閱下列程序指南。
下列程序指南說明 HyperPod 叢集建立期間會發生的情況,以及基本生命週期指令碼的設計方式。
-
create_cluster.json
– 若要提交 HyperPod 叢集建立請求,請以 JSON 格式準備CreateCluster
請求檔案。在此最佳實務範例中,我們假設請求檔案名為create_cluster.json
。寫入create_cluster.json
以使用執行個體群組佈建 HyperPod 叢集。最佳實務是新增與您計劃在 HyperPod 叢集上設定的 Slurm 節點數量相同的執行個體群組數量。請確定您為要指派給您計劃設定之 Slurm 節點的執行個體群組提供獨特的名稱。此外,您需要指定 S3 儲存貯體路徑,將整組組態檔案和生命週期指令碼存放到
CreateCluster
請求表單InstanceGroups.LifeCycleConfig.SourceS3Uri
中的欄位名稱,並將進入點 shell 指令碼的檔案名稱 (假設名為on_create.sh
) 指定至InstanceGroups.LifeCycleConfig.OnCreate
。注意
如果您在 HyperPod 主控台 UI 中使用建立叢集提交表單,主控台會管理代您填寫和提交
CreateCluster
請求,並在後端執行CreateCluster
API。在此情況下,您不需要建立create_cluster.json
;而是請確定您已將正確的叢集組態資訊指定至建立叢集提交表單。 -
on_create.sh
– 對於每個執行個體群組,您需要提供進入點 shell 指令碼on_create.sh
,以執行命令、執行指令碼以安裝軟體套件,以及使用 Slurm 設定 HyperPod 叢集環境。provisioning_parameters.json
HyperPod 需要您準備的兩件事來設定 Slurm,以及一組安裝軟體套件的生命週期指令碼。應編寫此指令碼以尋找和執行下列檔案,如 的範例指令碼所示on_create.sh
。 注意
請務必將整組生命週期指令碼上傳至您在 中指定的 S3 位置
create_cluster.json
。您也應該provisioning_parameters.json
將 放在相同的位置。-
provisioning_parameters.json
– 這是 在 HyperPod 上佈建 Slurm 節點的組態表單。on_create.sh
指令碼會尋找此 JSON 檔案,並定義環境變數來識別路徑。透過此 JSON 檔案,您可以設定 Slurm 節點和儲存選項,例如 Amazon FSx for Lustre for Slurm,以便與之通訊。在 中provisioning_parameters.json
,請確定您使用在 中指定的名稱,根據您計劃設定它們的方式create_cluster.json
,將 HyperPod 叢集執行個體群組適當地指派給 Slurm 節點。下圖顯示如何
provisioning_parameters.json
寫入兩個 JSON 組態檔案create_cluster.json
和 以將 HyperPod 執行個體群組指派給 Slurm 節點的範例。在此範例中,我們假設設定三個 Slurm 節點:控制器 (管理) 節點、登入節點 (此為選用) 和運算 (工作者) 節點。提示
為了協助您驗證這兩個 JSON 檔案,HyperPod 服務團隊提供驗證指令碼
validate-config.py
。如需進一步了解,請參閱 在 HyperPod 上建立 Slurm 叢集之前,請先驗證 JSON 組態檔案。 圖:
create_cluster.json
HyperPod 叢集建立和 Slurm 組態provisiong_params.json
的 之間的直接比較。中的執行個體群組數量create_cluster.json
應與您要設定為 Slurm 節點的節點數量相符。若為圖中的範例,則會在三個執行個體群組的 HyperPod 叢集上設定三個 Slurm 節點。您應該透過相應地指定執行個體群組名稱,將 HyperPod 叢集執行個體群組指派給 Slurm 節點。 -
resource_config.json
– 在叢集建立期間,lifecycle_script.py
指令碼會寫入,以預期來自 HyperPodresource_config.json
的檔案。此檔案包含叢集的相關資訊,例如執行個體類型和 IP 地址。當您執行
CreateCluster
API 時,HyperPod/opt/ml/config/resource_config.json
會根據檔案在 建立資源組態create_cluster.json
檔案。檔案路徑會儲存至名為 的環境變數SAGEMAKER_RESOURCE_CONFIG_PATH
。重要
檔案由 HyperPod 平台自動產生,您不需要建立該
resource_config.json
檔案。下列程式碼是根據上一個步驟create_cluster.json
中的叢集建立來顯示resource_config.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" } ] } ] }
-
lifecycle_script.py
– 這是主要 Python 指令碼,會在佈建時,共同在 HyperPod 叢集上執行生命週期指令碼設定 Slurm。此指令碼會讀取provisioning_parameters.json
resource_config.json
中指定或識別的路徑on_create.sh
,將相關資訊傳遞給每個生命週期指令碼,然後依序執行生命週期指令碼。生命週期指令碼是一組指令碼,您可以完全靈活地自訂來安裝軟體套件,並在叢集建立期間設定必要的或自訂組態,例如設定 Slurm、建立使用者、安裝 Conda 或 Docker。範例
lifecycle_script.py
指令碼已準備好在 儲存庫中執行其他基本生命週期指令碼,例如啟動 Slurm Deamons () start_slurm.sh
、掛載 Amazon FSx for Lustre ( mount_fsx.sh
),以及設定 MariaDB 會計 ( setup_mariadb_accounting.sh
) 和 RDS 會計 () setup_rds_accounting.sh
。您也可以新增更多指令碼、封裝在相同目錄下,並將程式碼列新增至 lifecycle_script.py
,讓 HyperPod 執行指令碼。如需基本生命週期指令碼的詳細資訊,請參閱 Awsome 分散式訓練 GitHub 儲存庫中的 3.1 生命週期指令碼。注意
HyperPod 會在叢集的每個執行個體SageMaker HyperPod DLAMI上執行,而 AMI 已預先安裝符合其與 HyperPod 功能之間的相容性的軟體套件。請注意,如果您重新安裝任何預先安裝的套件,您必須負責安裝相容的套件,並注意某些 HyperPod 功能可能無法如預期般運作。
除了預設設定之外,
utils
資料夾下還提供更多用於安裝下列軟體的指令碼。 lifecycle_script.py
檔案已準備包含程式碼行來執行安裝指令碼,因此請參閱下列項目以搜尋這些行並取消註解以啟用它們。-
下列程式碼行適用於安裝 Docker
、Enroot 和 Pyxis 。在 Slurm 叢集上執行 Docker 容器需要這些套件。 若要啟用此安裝步驟,請在
True
config.py
檔案中將 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)
-
您可以將 HyperPod 叢集與 Amazon Managed Service for Prometheus 和 Amazon Managed Grafana 整合,將 HyperPod 叢集和叢集節點的指標匯出至 Amazon Managed Grafana 儀表板。若要匯出指標並使用 Amazon Managed Grafana 上的 Slurm 儀表板
、NVIDIA DCGM Exporter 儀表板 和 EFA 指標儀表板 ,您需要安裝適用於 Prometheus 的 Slurm Exporter 、NVIDIA DCGM Exporter 和 EFA 節點匯出器 。如需在 Amazon Managed Grafana 工作區上安裝匯出工具套件和使用 Grafana 儀表板的詳細資訊,請參閱 SageMaker HyperPod 叢集資源監控。 若要啟用此安裝步驟,請在
config.py
檔案中將 enable_observability
參數設定為True
。# 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()
-
-
-
請確定您從步驟 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.sh
、provisioning_parameters.json
、lifecycle_script.py
和所有其他設定指令碼。假設您已準備本機資料夾中的檔案,如下所示。└── 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