

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

# 自動節點復原和自動恢復
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume"></a>

**注意**  
截至 2025 年 9 月 11 日，HyperPod 搭配 Slurm 協同運作現在支援運作狀態監控代理程式。執行 [UpdateClusterSoftware](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_UpdateClusterSoftware.html) 並更新至最新版本的 AMI，以使用此功能。

本節討論 Amazon SageMaker HyperPod 的兩個互補彈性功能：自動節點復原可取代故障的基礎設施，無需手動介入，以及在硬體故障後從最後一個檢查點重新啟動訓練任務的自動恢復功能。

## 自動節點復原的運作方式
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume-how"></a>

在叢集建立或更新期間，叢集管理員使用者可以在叢集層級於 `Automatic` (建議) 與 `None` 之間選取節點 (執行個體) 復原選項。如果設定為 `Automatic`，SageMaker HyperPod 會自動重新啟動或取代故障的節點。

**重要**  
建議您設定 `Automatic` 選項。根據預設，叢集會使用自動節點復原進行設定。

從運作狀態監控代理程式、基本運作狀態檢查和深層運作狀態檢查發現問題時，會自動執行節點復原。如果設定為 `None`，運作狀態監控代理程式會在偵測到故障時標記執行個體，但不會自動對受影響的節點啟動任何修復或復原動作。我們不建議使用此選項。

## 使用 Amazon SageMaker HyperPod 自動恢復功能執行訓練任務
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume-job"></a>

本節描述如何使用 SageMaker HyperPod 自動繼續功能執行訓練任務，該功能提供零接觸彈性基礎設施，以在發生硬體故障時自動從上次儲存的檢查點復原訓練任務。

使用自動繼續功能，如果任務由於硬體故障或訓練之間任何暫時性問題而失敗，SageMaker HyperPod 會自動繼續啟動節點取代工作流程，並在取代故障節點之後重新啟動任務。使用自動恢復時，每當任務失敗時，就會執行下列硬體檢查：


| Category | 公用程式名稱 | 執行個體類型相容性 | Description | 
| --- | --- | --- | --- | 
| 加速器 | NVIDIA SMI | GPU | [nvidia-smi](https://developer.nvidia.com/nvidia-system-management-interface) 公用程式是管理和監控 GPU 的知名 CLI。內建的運作狀態檢查程式會剖析來自 nvidia-smi 的輸出，以判斷執行個體的運作狀態。 | 
| 加速器 | Neuron sysfs | Trainium | 對於採用 Trainium 技術的執行個體，Neuron 裝置的運作狀態取決於從 [Neuron sysfs](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/tools/neuron-sys-tools/neuron-sysfs-user-guide.html)讀取由 Neuron 驅動程式直接傳播的計數器。 | 
| 網路 | EFA | GPU 和 Trainium | 為了協助診斷 Elastic Fabric Adaptor (EFA) 裝置，EFA 運作狀態檢查程式會使用執行個體內所有可用的 EFA 卡執行一系列連線測試。 | 

**注意**  
當[一般資源 (GRES)](https://slurm.schedmd.com/gres.html) 連接到 Slurm 節點時，Slurm 通常不允許節點配置的變更，例如取代節點，因此不允許繼續失敗的任務。除非明確禁止，否則 HyperPod 自動繼續功能會自動將與啟用 GRES 的節點相關聯的任何錯誤任務重新排入佇列。此程序涉及停止任務、將其放回任務佇列，然後從頭重新啟動任務。

**搭配 Slurm 使用 SageMaker HyperPod 自動繼續功能**

當您搭配 Slurm 使用 SageMaker HyperPod 自動繼續時，您應該在透過使用 `salloc` 或 `sbatch` 取得的專屬配置內執行任務。無論如何，您都需要修改進入點指令碼，以確保在繼續任務時，所有設定步驟都在單一 `srun` 命令中執行。透過進入點指令碼，請務必在取代的節點上設定環境，以符合任務步驟在停止之前執行的環境。下列程序說明如何準備進入點指令碼，讓環境保持一致，並以單一`srun`命令執行。

**提示**  
如果使用 `sbatch`，您可以建立單獨的指令碼來設定環境並使用單一 `srun` 命令，使批次指令碼保持簡單。

1. 使用下列程式碼範例建立指令碼，並將其儲存為 `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
   ```
**提示**  
您可以使用上述指令碼新增更多命令，為您的任務安裝任何其他相依性。不過，我們建議您將相依性安裝指令碼保留至叢集建立期間使用的[一組生命週期指令碼](sagemaker-hyperpod-lifecycle-best-practices-slurm-slurm-base-config.md)。如果您使用共用目錄上託管的虛擬環境，也可以利用此指令碼來啟用虛擬環境。

1. 透過新增旗標 `--auto-resume=1` 啟動已啟用 SageMaker HyperPod 自動繼續的任務，以指示應在硬體故障時自動重試 `srun` 命令。
**注意**  
如果您已使用 `sbatch` 或 `salloc` 設定資源配置，則可以在配置內執行多個 `srun` 命令。發生故障時，SageMaker HyperPod 自動繼續功能只會在 `srun` 命令的目前[任務步驟](https://slurm.schedmd.com/job_launch.html#step_allocation)中操作，旗標為 `--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
   ```

## 自動節點復原和自動恢復如何一起運作
<a name="sagemaker-hyperpod-resiliency-slurm-auto-resume-node-recovery"></a>

當自動節點復原和自動恢復系統都處於作用中狀態時，它們會遵循協調方法來處理失敗。如果 HMA 偵測到硬體故障，無論任務層級狀態為何，節點都會標記為耗盡。啟用節點自動復原後，節點會在節點中執行的所有任務結束時自動取代。在此案例中，對於啟用自動恢復的任務，如果步驟中有非零的結束狀態，則自動恢復會啟動 （任務會在節點取代後恢復）。未啟用自動恢復的任務只會結束，需要管理員或使用者手動重新提交。

**注意**  
如果您使用自動恢復，則偵測到硬體故障時，一律會取代節點 （不會重新啟動）。