本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Slurm 持續佈建增強型叢集操作
使用 Slurm 協同運作建立的 Amazon SageMaker HyperPod 叢集現在支援持續佈建,這項功能可在執行大規模 AI/ML 工作負載時提供更大的彈性和效率。持續佈建可讓您快速開始訓練、無縫擴展、在不中斷操作的情況下執行維護,以及具有叢集操作的精細可見性。
注意
連續佈建可作為使用 Slurm 協同運作建立之 HyperPod 叢集的選用組態。
運作方式
持續佈建系統引入了所需狀態架構,取代了傳統的all-or-nothing擴展模型。在先前的模型中,如果任何執行個體群組無法完全佈建,整個叢集建立或更新操作會失敗並復原。透過持續佈建,系統會接受部分容量,並繼續以非同步方式佈建剩餘的執行個體。
持續佈建系統:
-
接受請求:記錄每個執行個體群組的目標執行個體計數。
-
啟動佈建:開始平行啟動所有執行個體群組的執行個體。
-
先佈建優先順序節點:在成功佈建至少一個控制器節點 (以及一個登入節點,如果已指定登入執行個體群組)
InService之後,叢集會轉換為 。 -
追蹤進度:監控每個執行個體啟動嘗試並記錄狀態。
-
處理失敗:以非同步方式自動重試工作者節點的失敗啟動。
持續佈建預設為停用。若要使用此功能,請在CreateCluster請求Continuous中NodeProvisioningMode將 設定為 。
啟用持續佈建後,您可以同時啟動多個擴展操作,而無需等待先前的操作完成。這可讓您同時擴展相同叢集中的不同執行個體群組,並將多個擴展請求提交至相同的執行個體群組。
優先順序型佈建
Slurm 叢集需要控制器節點可運作,工作者節點才能註冊和接受任務。持續佈建會透過優先順序型佈建自動處理此問題:
-
首先佈建控制器執行個體群組。
-
一旦一個控制器節點正常運作,登入節點和工作者節點就會開始平行佈建。
-
當一個控制器節點啟動且一個登入節點啟動
InService時 (如果指定登入執行個體群組),叢集會轉換為 。如果未指定登入執行個體群組,叢集會在佈建控制器節點InService後立即轉換為 。 -
由於容量限制而無法立即佈建的工作者節點會進入非同步重試迴圈,並在 Slurm 叢集可用時自動將其新增至 Slurm 叢集。
控制器故障處理
在叢集建立期間,如果控制器節點無法佈建,則行為取決於錯誤是可重試還是不可重試。
可重試的錯誤 (例如運作狀態不佳的執行個體或暫時性故障):
-
HyperPod 會持續取代執行個體並重試佈建,直到控制器出現為止。
-
已佈建的工作者和登入節點仍然可用,但在控制器運作狀態良好
InService之前,叢集不會轉換為 。
無法重試的錯誤 (例如,控制器執行個體類型或生命週期指令碼失敗沒有可用的容量):
-
叢集會標示為
Failed。 -
您會收到失敗原因的通知,且必須採取修正動作,例如選擇不同的執行個體類型、修正生命週期指令碼,或在不同的可用區域中重試。
先決條件
持續佈建需要透過每個執行個體群組SlurmConfig欄位中的 API 承載提供 Slurm 佈建參數 (節點類型、分割區名稱)。在 Amazon S3 中依賴舊版provisioning_parameters.json檔案的叢集與連續佈建不相容。
注意
Slurm 叢集上的連續佈建目前不支援下列功能:透過 API 型 Slurm 拓撲的多前端節點組態,以及 SlurmConfigStrategy。持續佈建僅以合併模式運作以進行slurm.conf管理。
用量計量
具有持續佈建的 HyperPod 叢集會使用執行個體層級計量,以提供反映實際資源用量的準確計費。這種計量方法與傳統的叢集層級計費不同,因為其獨立追蹤每個執行個體。
執行個體層級計費
透過持續佈建,計費會在個別執行個體層級開始和停止,而不是等待叢集層級狀態變更。此方法提供下列優勢:
-
精確的計費準確性:計費開始於生命週期指令碼執行開始時。如果生命週期指令碼失敗,將會重試執行個體佈建,並在生命週期指令碼執行時間期間向您收取費用。
-
獨立計量:每個執行個體的計費生命週期都會個別管理,防止串聯計費錯誤。
-
即時計費更新:計費會在執行個體開始執行其生命週期組態指令碼時開始,並在執行個體進入終止狀態時停止。
計費生命週期
HyperPod 叢集中的每個執行個體都遵循此計費生命週期:
-
帳單開始:當執行個體成功啟動並開始執行其生命週期組態指令碼時。
-
計費繼續:執行個體的整個操作生命週期。
-
計費停止:當執行個體進入終止狀態時,無論終止原因為何。
注意
對於無法啟動的執行個體,計費不會開始。如果執行個體啟動由於容量不足或其他問題而失敗,則不會向您收取該失敗嘗試的費用。計費是在執行個體層級計算的,而且成本是在叢集的 Amazon Resource Name (ARN) 下彙總和報告。
建立已啟用持續佈建的叢集
注意
準備生命週期組態指令碼,並將其上傳至執行角色可存取的 Amazon S3 儲存貯體。如需詳細資訊,請參閱SageMaker HyperPod Slurm 叢集操作。
準備 JSON 格式的 CreateCluster API 請求檔案。將 NodeProvisioningMode設定為 ,Continuous並在每個執行個體群組的 SlurmConfig 欄位中提供 Slurm 拓撲資訊。
// create_cluster.json { "ClusterName": "my-training-cluster", "NodeProvisioningMode": "Continuous", "Orchestrator": { "Slurm": {} }, "InstanceGroups": [ { "InstanceGroupName": "controller-group", "InstanceType": "ml.m5.xlarge", "InstanceCount": 1, "LifeCycleConfig": { "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster", "SlurmConfig": { "NodeType": "Controller" } }, { "InstanceGroupName": "login-group", "InstanceType": "ml.m5.xlarge", "InstanceCount": 1, "LifeCycleConfig": { "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster", "SlurmConfig": { "NodeType": "Login" } }, { "InstanceGroupName": "worker-gpu-a", "InstanceType": "ml.p5.48xlarge", "InstanceCount": 16, "LifeCycleConfig": { "SourceS3Uri": "s3://amzn-s3-demo-bucket/lifecycle-scripts/src/", "OnCreate": "on_create.sh" }, "ExecutionRole": "arn:aws:iam::111122223333:role/iam-role-for-cluster", "SlurmConfig": { "NodeType": "Compute", "PartitionNames": ["gpu-training"] } } ], "VpcConfig": { "SecurityGroupIds": ["sg-12345678"], "Subnets": ["subnet-12345678"] } }
執行 create-cluster命令以提交請求。
aws sagemaker create-cluster \ --cli-input-json file://complete/path/to/create_cluster.json
這會傳回新叢集的 ARN。
{ "ClusterArn": "arn:aws:sagemaker:us-west-2:111122223333:cluster/abcde12345" }
Slurm 組態管理
持續佈建僅以合併模式運作,以進行slurm.conf分割區管理。在合併模式中,HyperPod 會附加套用其分割區組態變更到您在 中修改的任何內容slurm.conf。HyperPod 只會更新 的分割區相關區段 slurm.conf(例如分割區名稱和節點名稱項目);不會修改其他 Slurm 組態參數。這表示:
-
slurm.conf系統會保留您對 的手動編輯。 -
修改與 HyperPod 的預期狀態之間不會自動偵測偏離或解決衝突。
連續佈建不支援 SlurmConfigStrategy 參數 (Managed、Merge、Overwrite)。傳遞任何SlurmConfigStrategy值會導致 API 錯誤。
最小容量需求 (MinCount)
MinCount 功能可讓您指定執行個體群組轉換為 InService 狀態之前,必須成功佈建的執行個體數量下限。此功能可更好地控制擴展操作,並有助於防止部分佈建的執行個體群組無法有效地用於訓練工作負載的情況。
重要
MinCount 並非最低容量的永久保證。它只會確保執行個體群組第一次變成 時,可用的指定執行個體數量下限InService。低於 MinCount 的短暫下降可能會在正常操作期間發生,例如運作狀態不佳的執行個體替換或維護活動。
MinCount 的運作方式
當您建立或更新已啟用 MinCount 的執行個體群組時,會發生下列行為:
-
新的執行個體群組:執行個體群組會保持
Creating狀態,直到至少成功佈建並就緒 MinCount 執行個體為止。一旦達到此閾值,執行個體群組就會轉換為InService。 -
現有執行個體群組:在現有執行個體群組上更新 MinCount 時,狀態會變更為 ,
Updating直到滿足新的 MinCount 需求為止。 -
持續擴展:如果 TargetCount 大於 MinCount,則持續擴展系統會繼續嘗試啟動其他執行個體,直到達到 TargetCount。
-
逾時和轉返:如果無法在 3 小時內滿足 MinCount,系統會自動將執行個體群組轉返至其最後已知的良好狀態。如需轉返行為的詳細資訊,請參閱自動轉返行為。
MinCount 操作期間的執行個體群組狀態
已設定 MinCount 的執行個體群組會顯示下列狀態行為:
- 正在建立
-
對於 CurrentCount < MinCount 的新執行個體群組。執行個體群組會保持此狀態,直到滿足最低容量需求為止。
- 更新中
-
針對修改 MinCount 且 CurrentCount < MinCount 的現有執行個體群組。執行個體群組會保持此狀態,直到滿足新的最小容量需求為止。
- InService
-
當 MinCount ≤ CurrentCount ≤ TargetCount 時。執行個體群組已準備好可供使用,且所有變更操作都會解除封鎖。
在 Creating或 Updating 狀態期間,適用下列限制:
-
變更
BatchAddClusterNodes、BatchDeleteClusterNodes或 等操作UpdateClusterSoftware會遭到封鎖 -
您仍然可以修改 MinCount 和 TargetCount 值來更正組態錯誤
-
一律允許刪除叢集和執行個體群組
自動轉返行為
如果執行個體群組無法在 3 小時內達到其 MinCount,系統會自動啟動轉返,以防止無限期等待:
-
新的執行個體群組:MinCount 和 TargetCount 重設為 (0, 0)
-
現有執行個體群組:從上次
InService狀態將 MinCount 和 TargetCount 還原至其值 -
終止的執行個體選擇:如果執行個體需要在復原期間終止,系統會先選取運作狀態不佳的執行個體,然後選取最近佈建的執行個體。
-
狀態轉換:執行個體群組會在復原啟動後立即轉換為
InService狀態,允許持續擴展系統根據復原設定管理容量
每次更新 MinCount 時,3 小時逾時都會重設。例如,如果您多次更新 MinCount,逾時期間會從最近的更新開始。
MinCount 事件
系統會發出特定事件,協助您追蹤 MinCount 操作:
-
達到容量下限:當執行個體群組成功達到其 MinCount 並轉換為
InService -
已啟動轉返:當 3 小時逾時過期且自動轉返開始時發出
您可以使用 ListClusterEvents 監控這些事件,以追蹤 MinCount 操作的進度。
API 用量
MinCount 是在執行個體群組組態中使用 MinInstanceCount 參數指定:
aws sagemaker create-cluster \ --cluster-name $HP_CLUSTER_NAME \ --instance-groups '[ { "InstanceGroupName": "controller-machine", "InstanceType": "ml.c5.xlarge", "InstanceCount": 1, "SlurmConfig": {"NodeType": "Controller"}, "LifeCycleConfig": { "SourceS3Uri": "s3://'$BUCKET_NAME'", "OnCreate": "on_create.sh" }, "ExecutionRole": "'$EXECUTION_ROLE'", "ThreadsPerCore": 2 }, { "InstanceGroupName": "my-login-group", "InstanceType": "ml.c5.xlarge", "InstanceCount": 1, "SlurmConfig": {"NodeType": "Login"}, "LifeCycleConfig": { "SourceS3Uri": "s3://'$BUCKET_NAME'", "OnCreate": "on_create.sh" }, "ExecutionRole": "'$EXECUTION_ROLE'", "ThreadsPerCore": 1 }, { "InstanceGroupName": "worker-group-1", "InstanceType": "ml.c5.xlarge", "MinInstanceCount": 1, "InstanceCount": 2, "SlurmConfig": { "NodeType": "Compute", "PartitionNames": ["p1"] }, "LifeCycleConfig": { "SourceS3Uri": "s3://'$BUCKET_NAME'", "OnCreate": "on_create.sh" }, "ExecutionRole": "'$EXECUTION_ROLE'", "ThreadsPerCore": 1 } ]' \ --vpc-config '{ "SecurityGroupIds": ["'$SECURITY_GROUP'"], "Subnets": ["'$SUBNET'"] }' \ --node-provisioning-mode Continuous
MinCount 用量的主要考量事項:
-
MinInstanceCount必須在 CreateCluster 或 UpdateCluster 請求中指定之執行個體群組的 0 和InstanceCount(包含) 值之間 -
MinInstanceCount設定為 0 (預設) 可保留標準持續擴展行為 -
在叢集建立期間,控制器和登入InstanceGroup
MinInstanceCount的預設值設為 1 -
設定
MinInstanceCount等於InstanceCount可提供全有或全無擴展行為 all-or-nothing -
MinCount 僅適用於將
NodeProvisioningMode設為 的叢集Continuous