训练容错与弹性
万卡训练数周起步,而硬件的平均无故障时间(MTBF)以小时计:一万张卡、数万条链路、数千台机器,每小时都有东西在坏。Llama 3 405B 的 54 天训练里发生了 419 次意外中断(约每 3 小时一次)。容错不是"可选项",是大模型训练的核心工程。本章讲清楚故障的来源、检查点的设计、以及弹性调度怎么做。
Llama 3 公开的故障统计给了一个真实的分布:
| 故障源 | 占比 | 典型形式 |
|---|---|---|
| GPU 硬件(含 NVLink) | ~30% | 卡掉线、HBM 报错、NVLink 故障 |
| 网络 | ~30% | 光模块、链路 flap、交换机 |
| 存储/其他 | ~20% | 检查点慢、盘满 |
| 软件 bug | ~15% | 框架、驱动、OOM |
| 主动缩容维护 | ~5% | 排除坏节点 |
三个反直觉的事实:
- 故障是常态不是例外:万卡集群小时级 MTBF 意味着一天几十次中断
- 大部分中断不是永久故障:闪断、误报、瞬时拥塞——重启就好的占多数,所以"先自动重启、不行再换节点"是标准流程
- 故障恢复的速度决定有效算力:恢复要 1 小时的集群,实际算力 = 标称 × (1 - 恢复时间占比)
检查点:容错的基石
Section titled “检查点:容错的基石”检查点(checkpoint)= 把训练状态(模型、优化器、数据位置、随机数)定期写到存储。恢复时间与两个参数直接相关:
检查点大小 ≈ 16 B/参数(模型 2 + 优化器 12 + 梯度杂项):7B 模型 ~112 GB,175B 模型 ~2.8 TB。以 10 GB/s 的并行读取:
| 模型 | 检查点 | 写入时间(10 GB/s) | 恢复读取时间 |
|---|---|---|---|
| 7B | 112 GB | ~11 s | ~11 s |
| 70B | 1.1 TB | ~2 min | ~2 min |
| 175B | 2.8 TB | ~5 min | ~5 min |
三个设计决策:
一、检查点频率:每 30–60 分钟一次是常见值。太密则写入开销挤占训练(每次 2–5 分钟的写入是真实的停顿),太疏则一次故障丢失的进度多。丢失期望 = 间隔/2,写入开销 = 频率 × 写入时间,两者平衡。
二、异步检查点:把写盘与训练重叠(先存 CPU 内存副本,后台写盘),消除停顿——现代框架(torch dist-checkpoint、DeepSpeed async)已标配。
三、分片检查点:每卡只存自己的分片(与 ZeRO 分片一致),写入带宽随卡数线性扩展;恢复时按新拓扑重新分片加载——弹性恢复的关键。
弹性调度:踢节点与缩容
Section titled “弹性调度:踢节点与缩容”现代训练框架(torch elastic、DeepSpeed、Ray)的标准流程:
检测:通信超时 / NCCL watchdog / 硬件 XID 错误 ↓ (秒级)隔离:把坏节点踢出,全集群重启 ↓ (分钟级)恢复:从最近检查点 + 新拓扑重新分片加载 ↓继续:数据位置回退到检查点时刻,缩小后的集群继续训练关键设计:
- 快速检测:NCCL watchdog 超时(典型 10–30 分钟)太慢,生产集群用更积极的健康检查(每 step 心跳、秒级超时)把检测压到分钟级
- 自动重启先于换节点:瞬时故障占多数,第一次失败自动重启,同一节点第二次失败才踢出——避免误杀与过度反应的平衡
- 缩容继续:256 卡坏 4 张,用 252 张继续(DP 规模可变),比等待换卡(小时级)划算得多——有效算力的最大化
训练代码的容错意识
Section titled “训练代码的容错意识”容错不只是平台的事,训练代码要配合:
一、确定性可恢复:数据加载器的位置(skip 到第几个样本)、dropout 等随机数种子、学习率 schedule 的进度——全部要进检查点。漏一项,恢复后的 loss 曲线就跳变。
二、定期验证恢复:每 N 个检查点做一次"恢复演练"(加载 → 跑几步 → 对比 loss 连续性)。没演练过的检查点等于没有检查点——真故障时才发现格式错位,是最贵的教训。
三、loss 曲线的连续性监控:恢复后 loss 突然跳升 = 恢复出问题(数据位置错、学习率进度错),自动告警。
算一笔容错的账
Section titled “算一笔容错的账”万卡训练 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 天。
- 混合并行与配置方法论 — 上一章:分片拓扑决定恢复方式
- 检查点与存储系统 — 检查点的存储侧
- 故障恢复 — 更完整的恢复机制
- 拥塞、抖动与网络故障 — 故障检测的网络侧