故障恢复
前面各章讲的是检测(straggler、网络故障)与容错的设计(训练容错)。这一章把恢复的完整链路串起来:从故障发生到训练继续,每一段的时间预算与自动化设计。恢复速度决定有效算力(见容错的账),这条链路上的每一分钟都是钱。
恢复链路的完整时间线
Section titled “恢复链路的完整时间线”一次典型故障(一张卡挂了)到训练恢复:
T+0 故障发生(GPU XID 致命错误)T+30s 检测完成(NCCL watchdog / 健康检查超时)T+1min 自动决策(同一节点第二次 → 踢出,不等修复)T+2min 集群缩容重启(960 卡继续,坏节点摘除)T+5min 检查点恢复完成(1.1 TB 并行读取,见[检查点](/storage-data/02-checkpoint/checkpointing.md))T+6min 训练继续,loss 验证连续性总恢复时间 ~6 分钟——这是生产级的目标。每一段的时间预算:
| 段 | 时间 | 靠什么压缩 |
|---|---|---|
| 检测 | 秒–分钟 | 秒级心跳(不用 NCCL 默认 watchdog 的 10 分钟) |
| 决策 | 秒 | 自动化策略(重启 vs 踢出的规则) |
| 重启 | 分钟 | 集群编排(torchrun/调度器配合) |
| 检查点恢复 | 分钟 | 分片并行读 + 本地缓存 |
| 验证 | 秒–分钟 | loss 连续性自动校验 |
检测:快而不误报
Section titled “检测:快而不误报”检测的权衡是快 vs 误报:太慢(NCCL 默认 watchdog 10–30 分钟)浪费恢复时间;太激进(秒级超时)误报频发(瞬时抖动当故障)。
生产级的分层检测:
| 层 | 机制 | 超时 | 作用 |
|---|---|---|---|
| 心跳层 | 每 step / 每分钟 rank 间心跳 | 秒–分钟级 | 快速发现卡死 |
| NCCL watchdog | 集合通信超时 | 10–30 分钟(兜底) | 通信死锁的兜底 |
| 硬件层 | XID 错误、ECC、链路状态 | 事件驱动 | 即时发现硬件故障 |
| 梯度层 | per-rank 梯度统计 | 每 N step | 发现静默劣化(见straggler) |
心跳层是最快的主通道(秒级),硬件层事件即时触发,NCCL watchdog 只做兜底——三层互补,快而不误报。
决策:重启还是换节点
Section titled “决策:重启还是换节点”故障后的第一个决策:直接重启(可能瞬时故障)还是踢出节点(可能永久故障)?
生产级的策略(见训练容错):
第一次故障 → 自动重启(从检查点)—— 瞬时故障占多数,重启就好同一节点第二次故障 → 踢出节点,集群缩容继续 —— 永久故障,别等修复为什么"先重启":瞬时故障(闪断、误报、软错误)占真实故障的多数,重启成功率 70%+——每次都踢节点会放大算力损失(万卡少 8 卡就是 0.08%,但频繁踢出会累积);为什么不"一直重启":同一节点反复失败 = 永久故障,踢出止损。
决策的输入:故障类型(XID 编码区分硬件/软件)、历史(该节点的故障记录)、集群状态(有无备用节点)。
恢复:从检查点到继续
Section titled “恢复:从检查点到继续”恢复的完整动作(见检查点的细节):
- 新拓扑确定:缩容后的集群(960 卡)重新编排 rank
- 分片检查点按新拓扑 reshard:每卡加载自己在新拓扑下的分片
- 数据游标回位:各 rank 的数据位置精确回到检查点(见数据管道)
- RNG/schedule 状态恢复:随机数与学习率进度(漏一样就不连续)
- loss 连续性验证:恢复后前几步的 loss 与故障前连续——跳变 = 恢复出错,自动告警
reshard 的弹性是关键:坏了几张卡后拓扑变了,检查点要按新拓扑重新映射加载——torch distributed checkpoint 的 resharding、或框架级的弹性支持。
恢复链路本身的监控:
| 指标 | 用途 |
|---|---|
| MTBF(平均无故障时间) | 集群健康度的直接指标 |
| MTTR(平均恢复时间) | 恢复链路的效率 |
| 恢复成功率(重启 vs 踢出) | 决策策略的校准 |
| 丢失进度(每次故障丢多少 step) | 检查点频率的校准 |
| 有效算力 = 标称 × (1 - 恢复时间占比) | 最终指标 |
每次故障都要复盘:根因(硬件/网络/软件)、恢复时间、丢失进度、决策是否正确——故障数据是集群改进的燃料。
- 恢复链路五段:检测 → 决策 → 重启 → 检查点恢复 → 验证;生产级总预算 ~6 分钟。
- 分层检测:心跳层(秒级,主通道)+ 硬件层(事件驱动)+ NCCL watchdog(兜底)+ 梯度层(静默劣化)——快而不误报。
- 决策策略:第一次重启(瞬时故障占多数),同节点第二次踢出(永久故障止损)。
- 恢复的关键是 reshard 弹性:按新拓扑重新映射分片;数据游标/RNG/schedule 一样不能少。
- loss 连续性验证是恢复的验收:跳变 = 恢复出错。
- 有效算力 = 标称 × (1 − 恢复时间占比);每次故障复盘,故障数据是改进的燃料。
- 训练容错与弹性 — 容错的设计全景
- 检查点保存与恢复 — 恢复的数据基础
- Straggler 与静默错误 — 上一章:检测
- Profiling:指标与工具 — 监控体系