本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
SageMaker HyperPod 叢集彈性
SageMaker HyperPod 提供下列叢集彈性功能。
叢集運作狀態檢查
本節說明一組運作狀態檢查, SageMaker HyperPod 用於定期監控叢集執行個體運作狀態,以解決加速器 (GPU 和 Trainium 核心) 和聯網 () 等裝置的問題EFA。
類別 | 公用程式名稱 | 執行個體類型相容性 | 描述 |
---|---|---|---|
加速器 | DCGM 政策 | GPU | 叢集中的每個執行個體都會持續監控所有相關政策GPU,包括使用 NVIDIA 的DCGM |
加速器 | NVIDIA SMI | GPU | nvidia-sminvidia-smi ,以判斷執行個體的運作狀態。 |
加速器 | Neuron sysfs | 訓練館 | 對於 Trainium 驅動的執行個體,Neuron 裝置的運作狀態取決於從 Neuron sysfs |
網路 | EFA | GPU 和 Trainium | 為了協助診斷 Elastic Fabric Adaptor (EFA) 裝置,EFA運作狀態檢查程式會使用執行個體內所有可用的EFA卡片執行一系列連線測試。 |
壓力 | DCGM 診斷層級 |
GPU | DCGM 診斷層級 |
壓力 | CPU 壓力 | GPU 和 Trainium | CPU 運作狀態是使用 Linux 壓力 |
自動繼續
本節說明如何使用 SageMaker HyperPod 自動恢復功能執行訓練任務,該功能提供零接觸彈性基礎設施,以便在超過 16 個節點的叢集發生硬體故障時,自動從上次儲存的檢查點復原訓練任務。
使用自動恢復功能,如果任務因硬體故障或訓練之間有任何暫時性問題而失敗, SageMaker HyperPod 則自動恢復會啟動節點取代工作流程,並在取代故障節點後重新啟動任務。
注意
當一般資源 (GRES)
搭配 Slurm 使用 SageMaker HyperPod 自動恢復功能
當您搭配 Slurm 使用 SageMaker HyperPod 自動恢復時,您應該在透過使用 或 salloc
取得的獨家配置內執行任務sbatch
。在任何情況下,您需要修改進入點指令碼,以確保在繼續任務時,所有設定步驟都以單一srun
命令執行。透過入門指令碼,在已取代的節點上設定環境必須與任務步驟在停止之前執行的環境一致,這一點很重要。下列程序說明如何準備入門指令碼,以保持環境一致性,並以單一srun
命令執行。
提示
如果您使用 sbatch
,您可以建立個別的指令碼來設定環境並使用單一srun
命令,以保持批次指令碼的簡單性。
-
使用下列程式碼範例建立指令碼,並將其儲存為
train_auto_resume.sh
。此指令碼部署訓練環境設定,假設先前沒有對取代的節點進行手動組態。這可確保環境不受節點影響,因此當節點被取代時,在繼續任務之前,會在節點上佈建相同的環境。注意
下列程式碼範例示範如何探索與任務相關聯的 Slurm 節點清單。請勿使用 Slurm 提供
$SLURM_JOB_NODELIST
的環境變數,因為其值可能會在 SageMaker HyperPod 自動恢復任務後過期。下列程式碼範例示範如何定義新NODE_LIST
變數以取代SLURM_JOB_NODELIST
,然後從NODE_LIST
變數設定MASTER_NODE
和MASTER_ADDR
變數。#!/bin/bash # Filename: train_auto_resume.sh # Sample containerized script to launch a training job with a single srun which can be auto-resumed. # Place your training environment setup here. # Example: Install conda, docker, activate virtual env, etc. # Get the list of nodes for a given job NODE_LIST=$(scontrol show jobid=$SLURM_JOBID | \ # Show details of the SLURM job awk -F= '/NodeList=/{print $2}' | \ # Extract NodeList field grep -v Exc) # Exclude nodes marked as excluded # Determine the master node from the node list MASTER_NODE=$(scontrol show hostname $NODE_LIST | \ # Convert node list to hostnames head -n 1) # Select the first hostname as master node # Get the master node address MASTER_ADDR=$(scontrol show node=$MASTER_NODE | \ # Show node information awk -F= '/NodeAddr=/{print $2}' | \ # Extract NodeAddr awk '{print $1}') # Print the first part of NodeAddr # Torchrun command to launch the training job torchrun_cmd="torchrun --nnodes=$SLURM_NNODES \ --nproc_per_node=1 \ --node_rank=$SLURM_NODE \ --master-addr=$MASTER_ADDR \ --master_port=
1234
\<your_training_script.py>
" # Execute the torchrun command in the 'pytorch' Conda environment, # streaming output live /opt/conda/bin/conda run --live-stream -n pytorch $torchrun_cmd提示
您可以使用上述指令碼新增更多命令,以安裝任務的任何其他相依性。不過,我們建議您將相依性安裝指令碼保留在叢集建立期間使用的一組生命週期指令碼。如果您使用託管在共用目錄上的虛擬環境,您也可以使用此指令碼來啟用虛擬環境。
-
透過新增旗標
--auto-resume=1
以啟動已啟用 SageMaker HyperPod 自動恢復的任務,指出在硬體故障時應自動重試srun
命令。注意
如果您已使用
sbatch
或 設定資源配置salloc
,則可以在配置中執行多個srun
命令。發生故障時, SageMaker HyperPod自動恢復功能只會在具有旗標 的srun
命令的目前任務步驟中運作 --auto-resume=1
。換句話說,在srun
命令中啟用自動恢復不適用於資源配置工作階段中啟動的其他srun
命令。以下是
auto-resume
啟用 的srun
命令範例。使用 sbatch
由於設定環境的大多數邏輯已在 中
train_auto_resume.sh
,批次指令碼應簡單且類似於下列程式碼範例。假設下列批次指令碼儲存為batch.sh
。#!/bin/bash #SBATCH --nodes 2 #SBATCH --exclusive srun --auto-resume=1
train_auto_resume.sh
使用以下命令執行先前的批次指令碼。
sbatch
batch.sh
使用 salloc
首先取得獨家配置,然後使用
--auto-resume
旗標和 進入點指令碼執行srun
命令。salloc -N 2 --exclusive srun --auto-resume=1
train_auto_resume.sh
如何取代未由 自動恢復的故障節點 HyperPod
HyperPod 自動恢復功能會監控 Slurm 節點的狀態是否變成 fail
或 down
。您可以執行 來檢查 Slurm 節點的狀態sinfo
。
如果您有節點卡住問題,但未由 HyperPod 自動恢復功能修正,建議您執行下列命令,將節點的狀態變更為 fail
。
scontrol update node=
<ip-ipv4>
state=fail
reason="Action:Replace"
在上述命令範例中,
使用您要取代之故障執行個體的 Slurm 節點名稱 (主機名稱) 取代 。<ip-ipv4>
執行此命令後,節點應進入 fail
狀態,等待目前執行中的任務完成,以運作狀態良好的執行個體取代,並使用相同的主機名稱復原。此程序需要的時間取決於可用區域中的可用執行個體,以及執行生命週期指令碼所需的時間。在更新和替換過程中,避免再次手動變更節點狀態或重新啟動 Slurm 控制器;這樣做可能會導致替換失敗。如果節點長時間後未復原或變成 idle
狀態,請聯絡 AWS 支援
如果故障節點持續卡在 fail
狀態中,您可以嘗試的最後一個手段是手動強制將節點狀態變更為 down
。這需要管理員權限 (sudo 許可)。
警告
在執行下列命令之前,請小心執行,因為它會強制刪除所有任務,而且可能會遺失所有未儲存的工作。
scontrol update node=
<ip-ipv4>
state=down
reason="Action:Replace"