训练容错
AIStudio 训练服务模块提供平台级别的容错能力,可以自动恢复训练(训练脚本必须支持优雅重启),避免训练过程中的错误和故障中断整个训练作业,导致丢失训练状态。
前提条件
接入 AIStudio 的训练容错能力需要满足以下要求:
- 为任务开启容错功能。在创建任务时,请确保「容错」开关为开启状态。
- 确保训练脚本支持优雅重启。您的训练脚本应定期保存 Checkpoint,并在开始训练时加载上次保存的 Checkpoint。
了解容错流程
- Bootcheck(启动检测):在任务启动时自动检查关键的软件和硬件环境(GPU/RDMA/IO/通信)。仅在发现掉卡错误时会阻断任务并重新调度健康节点。其他情况下会报告并继续执行用户代码。您可以通过
ATLAS_BOOTCHECK_ITEMS
环境变量自定义检测项以优化启动时间,详见下文自定义启动检测项。 - Command(模型训练):执行用户代码。
- Troubleshoot(异常定位):在用户代码执行失败时,检测硬件健康情况。仅在发现掉卡错误时会重新调度健康节点。其他情况下会报告并继续执行用户代码。如果用户代码有问题,可能将反复循环,直到达到最大容错次数。
提示
AIStudio 任务模块提供 atlctl
命令行调试工具,支持用户从 Web Terminal 登录任务 Worker 对任务执行环境进行原地调试。上图未体现生命周期中的 atlctl 调试状态。详见 atlctl 调试工具。
自定义启动检测项
AIStudio 平台在任务启动时会自动执行启动检测 (Bootcheck),用于检查关键的软件和硬件环境,包括 GPU、RDMA、IO 和通信组件。通过 ATLAS_BOOTCHECK_ITEMS
环境变量,您可以自定义需要执行的检测项,以优化任务启动时间或满足特定的检测需求。
可用检测项与时间开销
检测项 | 描述 | 预估时间开销 | 适用场景 |
---|---|---|---|
all | 进行全部检测项,包括所有硬件和软件环境检查 | 2-4分钟 | 大规模训练、关键生产任务 |
allreduce | 进行全局 allreduce 连通性检测(不测全局速度) | 1-2分钟 | 分布式训练任务 |
gpu | 进行 gemm / transfer 以及 GPU 进程残留检测 | 1.5-3分钟 | 所有 GPU 任务 |
gpu_gemm | 仅进行 GPU gemm 计算检测 | 20-70秒 | GPU 计算性能验证 |
gpu_transfer | 仅进行 GPU 数据传输检测 | 20-80秒 | GPU 内存传输验证 |
gpu_process | 进行 GPU 进程残留检测 | 5-20秒 | GPU 进程清理验证 |
mount | 进行挂载存储读写检测 | 单个文件系统 5-30秒 | 存储 IO 验证 |
rdma | 进行 RDMA 网络检测 | 1-5秒 | 高速网络连通性验证 |
runtime | 进行运行时环境检测 | 1-5秒 | 环境验证 |
none | 不进行任何检测,直接进入用户命令执行阶段(优先级最高) | --- | --- |
注意
多个检测项可以合并,请用英文逗号或分号分隔,例如:gpu_gemm,gpu_transfer
或 gpu_gemm;gpu_transfer
配置方式
ATLAS_BOOTCHECK_ITEMS
环境变量仅在创建任务时通过网页的「环境变量」表单配置时生效。
在创建任务的「环境变量」变量编辑框中粘贴环境变量 KV(或直接编辑环境变量 KV 表单):
ATLAS_BOOTCHECK_ITEMS=gpu,allreduce,rdma
重要
ATLAS_BOOTCHECK_ITEMS
必须在创建任务时通过网页的「环境变量」字段设置。- 在启动命令或训练脚本中设置该环境变量无效。
- 任务创建后如需修改启动检测项配置,请使用「改配重跑」功能。
- 如果不在「环境变量」字段中设置
ATLAS_BOOTCHECK_ITEMS
,系统默认执行全部开机检测项。
查看容错日志
开启容器功能后,可在任务的详情页中找到容错日志标签。其中记录了每一轮容错时开机检测结果、异常定位、重启操作等记录。
容错日志顶部会提示当前任务的最大重启次数、已重启次数、因硬件问题导致的重调度次数。
启动检测(Bootcheck)与训练失败时执行的异常定位(Troubleshoot),均会检查关键的软件和硬件环境(GPU/RDMA/IO/通信)。正常输出示例:
2025-01-08 15:54:15 Bootcheck starting...
2025-01-08 15:54:16 [IO Check] IO Path: /mnt/public, Read 7.6 GB/s, Write 408 MB/s.
2025-01-08 15:54:18 [RDMA Check] NIC Type: nil; Total NICs: 0, NotReady: 0.
2025-01-08 15:54:25 [Runtime Check] PyTorch: v2.3.0a0+40ec155e58.nv24.03; CUDA: 12.4; NCCL: (2, 20, 5).
2025-01-08 15:54:25 [GPU Check] GPU Type: NVIDIA A100-PCIE-40GB; Total GPUs: 2; Not Ready: 0
2025-01-08 15:54:31 [Communication Check] AllReduce connection passed.
2025-01-08 15:54:31 Check Finished.
注意
任务详情页的任务日志也会输出容错日志。
为任务开启容错功能
仅训练任务类型支持开启容错。在创建任务时,请确保「容错」开关为开启状态。默认最多重启 1 次,最大可改为 10 次。任务超过最大重启次数后将失败并结束。
训练脚本支持优雅重启
支持优雅重启指每个进程的入口点首先加载并初始化上次保存的 Checkpoint,然后继续训练。因此,在任何故障情况下,您只会丢失自上次保存快照以来的训练进度。
为支持优化重启,训练脚本中应存在 load_snapshot
、save_snapshot(snapshot_path)
等类似逻辑。
def main():
load_snapshot(snapshot_path)
initialize()
train()
def train():
for batch in iter(dataset):
train_step(batch)
if should_checkpoint:
save_snapshot(snapshot_path)
- 具体实现可参考 Pytorch 官方文档 Saving and loading snapshots - Fault-tolerant Distributed Training with torchrun
- 使用 DDP 时,一个优化方法是只在一个进程中保存模型,然后在所有进程中加载,从而减少写入开销。参见 Pytorch 官方文档的详细示例:Save and Load Checkpoints - Getting Started with Distributed Data Parallel