本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SageMaker HyperPod 集群弹性
SageMaker HyperPod 提供以下集群弹性功能。
集群运行状况检查
本节介绍了一组运行状况检查,这些 SageMaker HyperPod 检查用于定期监控集群实例的运行状况,以发现加速器(GPU 和 Trainium 内核)和网络 (EFA) 等设备存在问题。
类别 | 实用程序名称 | 实例类型兼容性 | 描述 |
---|---|---|---|
Accelerator | DCGM 策略 | GPU | 集群中的每个实例都会使用 NVIDIA DCGM |
Accelerator | NVIDIA SMI | GPU | nvidia-sminvidia-smi 的输出,以确定实例的运行状况。 |
Accelerator | Neuron sysfs | Trainium | 对于 Trainium-powered 实例,Neuron 设备的运行状况由 Neuron 驱动程序直接从 Neuron sysfs |
网络 | EFA | GPU 和 Trainium | 为帮助诊断弹性 Fabric 适配器 (EFA) 设备,EFA 运行状况检查程序会使用实例中所有可用的 EFA 卡运行一系列连接性测试。 |
压力 | 第 2 级 DCGM 诊断 |
GPU | DCGM 诊断 |
压力 | CPU 压力 | GPU 和 Trainium | 使用 Linux 压力 |
自动恢复
本节介绍如何使用 SageMaker HyperPod 自动恢复功能运行训练作业,该功能提供了零接触弹性基础架构,可在节点超过 16 个的集群出现硬件故障时自动从上次保存的检查点恢复训练作业。
借助自动恢复功能,如果作业由于硬件故障或训练间隔期间的任何暂时问题而失败,则 SageMaker HyperPod 自动恢复将启动节点替换工作流程,并在更换故障节点后重新启动作业。
注意
当通用资源(GRES)
在 Slur SageMaker HyperPod m 中使用自动恢复功能
当你在 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
,然后根据MASTER_NODE
变量设置MASTER_ADDR
和NODE_LIST
变量。#!/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 自动恢复的情况下启动作业,方法是添加标志,
--auto-resume=1
以指示在出现硬件故障时应自动重试该srun
命令。注意
如果您使用
sbatch
或salloc
设置了资源分配,则可以在分配中运行多个srun
命令。如果出现故障, SageMaker HyperPod自动恢复功能仅在带有标志--auto-resume=1
的srun
命令的当前作业步骤中运行。换句话说,在 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
运行 sinfo
可检查 Slurm 节点的状态。
如果您的节点遇到问题但无法通过 HyperPod 自动恢复功能修复,我们建议您运行以下命令将该节点的状态更改为fail
。
scontrol update node=
<ip-ipv4>
state=fail
reason="Action:Replace"
在前面的命令示例中,用要替换的故障实例的 Slurm 节点名称(主机名)替换
。<ip-ipv4>
运行此命令后,节点应进入 fail
状态,等待当前运行的作业结束,然后替换为运行状况的实例,并以相同的主机名恢复。这一过程所需的时间取决于可用性区域中的可用实例以及运行生命周期脚本所需的时间。在更新和替换过程中,避免再次手动更改节点状态或重启 Slurm 控制器;否则会导致替换失败。如果节点长时间无法恢复或转为 idle
状态,请联系 Amazon
支持
如果故障节点持续停留在 fail
状态,最后的办法就是手动强制将节点状态更改为 down
。这需要管理员权限(sudo 权限)。
警告
在运行以下命令之前请谨慎操作,因为它会强制终止所有作业,您可能会丢失所有未保存的工作。
scontrol update node=
<ip-ipv4>
state=down
reason="Action:Replace"