本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
SageMaker HyperPod 集群弹性
SageMaker HyperPod 提供以下集群弹性功能。
集群运行状况检查
本节介绍了一组运行状况检查,这些 SageMaker HyperPod 检查用于定期监控集群实例的运行状况,以了解加速器(GPU和 Trainium 内核)和网络()等设备是否存在问题。EFA
类别 | 实用程序名称 | 实例类型兼容性 | 描述 |
---|---|---|---|
Accelerator | DCGM政策 | GPU | 集群中的每个实例都会持续监控所有GPU相关策略,包括XID错误NVIDIADCGM |
Accelerator | NVIDIA SMI | GPU | nvidia-sminvidia-smi 以确定实例的运行状况。 |
Accelerator | 神经元 sysfs | Trainium | 对于 Trainium 支持的实例,神经元设备的健康状况由读取神经元驱动程序直接传播的 Ne uron sysfs |
网络 | EFA | GPU和 Trainium | 为了帮助诊断 Elastic Fabric Adaptor (EFA) 设备,运行EFA状况检查器使用实例中的所有可用EFA卡运行一系列连接测试。 |
压力 | DCGM诊断 |
GPU | DCGM诊断 |
压力 | CPUstress | GPU和 Trainium | CPU运行状况是使用 Linux stres |
自动恢复
本节介绍如何使用 SageMaker HyperPod 自动恢复功能运行训练作业,该功能提供了零接触弹性基础架构,可在节点超过 16 个的集群出现硬件故障时自动从上次保存的检查点恢复训练作业。
借助自动恢复功能,如果作业由于硬件故障或训练间隔期间的任何暂时问题而失败,则 SageMaker HyperPod 自动恢复将启动节点更换工作流程,并在更换故障节点后重新启动作业。
注意
当通用资源 (GRES)
在 Slur SageMaker HyperPod m 中使用自动恢复功能
当你在 Slurm 中使用 SageMaker HyperPod 自动恢复时,你应该在通过使用或获得的独占分配中运行作业。salloc
sbatch
无论如何,您都需要修改 entrypoint 脚本,以确保在恢复作业时,所有设置步骤都在单个srun
命令中运行。通过 entrypoint 脚本,重要的是要在替换的节点上设置环境,使其与任务步骤停止前运行的环境保持一致。以下先例说明如何准备入口点脚本以保持环境一致并将其作为单个命令运行。srun
提示
如果使用sbatch
,则可以通过创建用于设置环境的单独脚本并使用单个srun
命令来简化批处理脚本。
-
使用以下代码示例创建脚本并将其另存为
train_auto_resume.sh
。此脚本部署训练环境设置时假设先前未对替换的节点进行任何手动配置。这样可以确保环境与节点无关,因此在替换节点时,在恢复作业之前,会在节点上配置相同的环境。注意
以下代码示例显示了如何发现与任务关联的 Slurm 节点列表。请勿使用 Slurm 提供的
$SLURM_JOB_NODELIST
环境变量,因为在 SageMaker HyperPod 自动恢复作业后,其值可能会过时。以下代码示例显示了如何定义要替换的新NODE_LIST
变量SLURM_JOB_NODELIST
,然后在该MASTER_ADDR
变量中设置MASTER_NODE
和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
标志和 entrypoint 脚本运行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
状态,请联系 Su Amazon
pp
如果故障节点持续处于该fail
状态,则可以尝试的最后一种方法是手动强制将节点状态更改为down
。这需要管理员权限(sudo 权限)。
警告
在运行以下命令之前,请谨慎行事,因为它会强制终止所有作业,并且您可能会丢失所有未保存的工作。
scontrol update node=
<ip-ipv4>
state=down
reason="Action:Replace"