跳转到内容

训练容错与弹性

万卡训练数周起步,而硬件的平均无故障时间(MTBF)以小时计:一万张卡、数万条链路、数千台机器,每小时都有东西在坏。Llama 3 405B 的 54 天训练里发生了 419 次意外中断(约每 3 小时一次)。容错不是"可选项",是大模型训练的核心工程。本章讲清楚故障的来源、检查点的设计、以及弹性调度怎么做。

Llama 3 公开的故障统计给了一个真实的分布:

故障源占比典型形式
GPU 硬件(含 NVLink)~30%卡掉线、HBM 报错、NVLink 故障
网络~30%光模块、链路 flap、交换机
存储/其他~20%检查点慢、盘满
软件 bug~15%框架、驱动、OOM
主动缩容维护~5%排除坏节点

三个反直觉的事实:

  • 故障是常态不是例外:万卡集群小时级 MTBF 意味着一天几十次中断
  • 大部分中断不是永久故障:闪断、误报、瞬时拥塞——重启就好的占多数,所以"先自动重启、不行再换节点"是标准流程
  • 故障恢复的速度决定有效算力:恢复要 1 小时的集群,实际算力 = 标称 × (1 - 恢复时间占比)

检查点(checkpoint)= 把训练状态(模型、优化器、数据位置、随机数)定期写到存储。恢复时间与两个参数直接相关:

T恢复=T重启+检查点大小读取带宽+T重载验证T_{\text{恢复}} = T_{\text{重启}} + \frac{\text{检查点大小}}{\text{读取带宽}} + T_{\text{重载验证}}

检查点大小 ≈ 16 B/参数(模型 2 + 优化器 12 + 梯度杂项):7B 模型 ~112 GB,175B 模型 ~2.8 TB。以 10 GB/s 的并行读取:

模型检查点写入时间(10 GB/s)恢复读取时间
7B112 GB~11 s~11 s
70B1.1 TB~2 min~2 min
175B2.8 TB~5 min~5 min

三个设计决策:

一、检查点频率:每 30–60 分钟一次是常见值。太密则写入开销挤占训练(每次 2–5 分钟的写入是真实的停顿),太疏则一次故障丢失的进度多。丢失期望 = 间隔/2,写入开销 = 频率 × 写入时间,两者平衡。

二、异步检查点:把写盘与训练重叠(先存 CPU 内存副本,后台写盘),消除停顿——现代框架(torch dist-checkpoint、DeepSpeed async)已标配。

三、分片检查点:每卡只存自己的分片(与 ZeRO 分片一致),写入带宽随卡数线性扩展;恢复时按新拓扑重新分片加载——弹性恢复的关键。

现代训练框架(torch elastic、DeepSpeed、Ray)的标准流程:

检测:通信超时 / NCCL watchdog / 硬件 XID 错误
↓ (秒级)
隔离:把坏节点踢出,全集群重启
↓ (分钟级)
恢复:从最近检查点 + 新拓扑重新分片加载
↓
继续:数据位置回退到检查点时刻,缩小后的集群继续训练

关键设计:

  • 快速检测:NCCL watchdog 超时(典型 10–30 分钟)太慢,生产集群用更积极的健康检查(每 step 心跳、秒级超时)把检测压到分钟级
  • 自动重启先于换节点:瞬时故障占多数,第一次失败自动重启,同一节点第二次失败才踢出——避免误杀与过度反应的平衡
  • 缩容继续:256 卡坏 4 张,用 252 张继续(DP 规模可变),比等待换卡(小时级)划算得多——有效算力的最大化

容错不只是平台的事,训练代码要配合:

一、确定性可恢复:数据加载器的位置(skip 到第几个样本)、dropout 等随机数种子、学习率 schedule 的进度——全部要进检查点。漏一项,恢复后的 loss 曲线就跳变。

二、定期验证恢复:每 N 个检查点做一次"恢复演练"(加载 → 跑几步 → 对比 loss 连续性)。没演练过的检查点等于没有检查点——真故障时才发现格式错位,是最贵的教训。

三、loss 曲线的连续性监控:恢复后 loss 突然跳升 = 恢复出问题(数据位置错、学习率进度错),自动告警。

万卡训练 30 天,假设:

参数值
中断频率每 3 小时一次(Llama 3 实测)
平均恢复时间15 分钟(自动重启 + 检查点恢复)
检查点间隔30 分钟
  • 中断总数:30 × 24 ÷ 3 = 240 次
  • 总恢复时间:240 × 15 min = 60 小时(2.5 天,8% 的时间在恢复)
  • 每次平均丢失进度:15 分钟 → 总丢失 60 小时

没有容错:故障一次全丢,30 天的训练永远跑不完。容错差(恢复 2 小时):损失 20 天(67%)。 容错工程的收益直接以"天"计——这就是为什么大模型团队把容错当作第一优先级的工程。

  • 万卡训练故障是常态:小时级 MTBF,Llama 3 实测每 3 小时一次中断;恢复速度决定有效算力。
  • 检查点大小 ≈ 16 B/参数;频率、异步化、分片是三个设计决策。
  • 弹性流程:快速检测(分钟级)→ 自动重启(先于换节点)→ 同节点二次失败才踢 → 缩容继续。
  • 训练代码要配合:状态全进检查点、定期恢复演练、恢复后 loss 连续性监控。
  • 没演练过的检查点等于没有检查点;恢复跳变(loss 突升)是恢复出错的信号。
  • 容错收益以天计:恢复 15 分钟 vs 2 小时,30 天训练差出 15 天。