跳转到内容

故障恢复

前面各章讲的是检测(straggler、网络故障)与容错的设计(训练容错)。这一章把恢复的完整链路串起来:从故障发生到训练继续,每一段的时间预算与自动化设计。恢复速度决定有效算力(见容错的账),这条链路上的每一分钟都是钱。

一次典型故障(一张卡挂了)到训练恢复:

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 连续性自动校验

检测的权衡是快 vs 误报:太慢(NCCL 默认 watchdog 10–30 分钟)浪费恢复时间;太激进(秒级超时)误报频发(瞬时抖动当故障)。

生产级的分层检测:

层机制超时作用
心跳层每 step / 每分钟 rank 间心跳秒–分钟级快速发现卡死
NCCL watchdog集合通信超时10–30 分钟(兜底)通信死锁的兜底
硬件层XID 错误、ECC、链路状态事件驱动即时发现硬件故障
梯度层per-rank 梯度统计每 N step发现静默劣化(见straggler)

心跳层是最快的主通道(秒级),硬件层事件即时触发,NCCL watchdog 只做兜底——三层互补,快而不误报。

故障后的第一个决策:直接重启(可能瞬时故障)还是踢出节点(可能永久故障)?

生产级的策略(见训练容错):

第一次故障 → 自动重启(从检查点)—— 瞬时故障占多数,重启就好
同一节点第二次故障 → 踢出节点,集群缩容继续 —— 永久故障,别等修复

为什么"先重启":瞬时故障(闪断、误报、软错误)占真实故障的多数,重启成功率 70%+——每次都踢节点会放大算力损失(万卡少 8 卡就是 0.08%,但频繁踢出会累积);为什么不"一直重启":同一节点反复失败 = 永久故障,踢出止损。

决策的输入:故障类型(XID 编码区分硬件/软件)、历史(该节点的故障记录)、集群状态(有无备用节点)。

恢复的完整动作(见检查点的细节):

  1. 新拓扑确定:缩容后的集群(960 卡)重新编排 rank
  2. 分片检查点按新拓扑 reshard:每卡加载自己在新拓扑下的分片
  3. 数据游标回位:各 rank 的数据位置精确回到检查点(见数据管道)
  4. RNG/schedule 状态恢复:随机数与学习率进度(漏一样就不连续)
  5. loss 连续性验证:恢复后前几步的 loss 与故障前连续——跳变 = 恢复出错,自动告警

reshard 的弹性是关键:坏了几张卡后拓扑变了,检查点要按新拓扑重新映射加载——torch distributed checkpoint 的 resharding、或框架级的弹性支持。

恢复链路本身的监控:

指标用途
MTBF(平均无故障时间)集群健康度的直接指标
MTTR(平均恢复时间)恢复链路的效率
恢复成功率(重启 vs 踢出)决策策略的校准
丢失进度(每次故障丢多少 step)检查点频率的校准
有效算力 = 标称 × (1 - 恢复时间占比)最终指标

每次故障都要复盘:根因(硬件/网络/软件)、恢复时间、丢失进度、决策是否正确——故障数据是集群改进的燃料。

  • 恢复链路五段:检测 → 决策 → 重启 → 检查点恢复 → 验证;生产级总预算 ~6 分钟。
  • 分层检测:心跳层(秒级,主通道)+ 硬件层(事件驱动)+ NCCL watchdog(兜底)+ 梯度层(静默劣化)——快而不误报。
  • 决策策略:第一次重启(瞬时故障占多数),同节点第二次踢出(永久故障止损)。
  • 恢复的关键是 reshard 弹性:按新拓扑重新映射分片;数据游标/RNG/schedule 一样不能少。
  • loss 连续性验证是恢复的验收:跳变 = 恢复出错。
  • 有效算力 = 标称 × (1 − 恢复时间占比);每次故障复盘,故障数据是改进的燃料。