跳转到内容

Straggler 与静默错误

同步训练里,九千九百九十九张卡都正常没用——一张慢卡拖住全体(straggler)。更阴险的是静默错误(silent data corruption):不报错、不崩溃,就是算错了——梯度悄悄劣化,loss 曲线看起来正常,模型质量却受损。两类坏点是大模型训练可靠性的核心敌人。

straggler(掉队者)= 同步屏障上最慢的那个成员。同步训练的每一步(all-reduce、all-gather)都要等全体——一个节点慢 10%,全集群慢 10%(见拥塞同样的数学)。

straggler 的来源与特征:

来源特征检测
热降频(thermal throttling)散热差的节点持续降频SM clock 遥测 vs 集群分布(见功耗)
网络慢(NIC 降速/抖动)该节点的 all-reduce 慢通信时间按节点分解
硬件劣化(HBM/PCIe)持续慢但无报错性能基线对比
数据不均某些 rank 的数据大(变长、packing 不均)每 rank 的 step 时间分解
系统抖动(后台任务、页回收)间歇性慢毛刺监控(见抖动)

检测的核心是"按节点分解 step 时间":全集群的 step time 分布里,长尾的节点就是 straggler——把每个节点的 barrier 到达时间收集起来,最慢的 1% 节点就是嫌疑人。

处理三板斧:

  1. 确认:慢节点隔离重测(基准测试 vs 集群分布)
  2. 隔离:确认坏点后踢出(见训练容错的自动排除)
  3. 预防:锁频(消热降频)、性能基线(新节点入集群前测一遍)、数据均衡

SDC(Silent Data Corruption):硬件算错了但不报任何错误。真实的诱因:

  • 硅片缺陷(制造瑕疵,某些边缘条件算错)
  • 电压/温度边缘(降频救不回来的边缘)
  • 老化(长期高温后的退化)

SDC 的可怕之处:没有任何报错信号,只有结果不对。梯度悄悄错一点,loss 曲线看不出异常,训练几周后模型质量莫名劣化——排查方向完全错误。

Meta 的公开研究(Silent Data Corruptions at Scale)给出了真实规模:大规模集群里每年数千个 SDC GPU,且需要主动检测才能发现。

SDC 没有报错,只能主动检测:

手段原理成本
训练中校验(结果 hash)定期对固定输入算一遍、对比 hash1% 算力
定期压力测试非训练时段跑 SDC 检测套件(Meta 的 Fiji)维护窗口
同值重复算对比(对偶计算)关键层的部分计算重复算、对比结果训练中 ~1–5%
ECC 与硬件自检硬件层的保护(对显存有效,对计算无效)免费

训练中的轻量校验是性价比之王:每 N 步对固定输入跑一次小矩阵乘,对比 hash——1% 的算力换"及时发现坏卡"。

SDC 之外的"软错误"(数值劣化)靠梯度监控发现:

指标异常信号
梯度范数(每 rank)某个 rank 的梯度范数系统性偏移 → 该 rank 的计算/数据有问题
梯度范数突增/消失精度问题(见混合精度)或数据问题
loss 曲线的平台/跳变学习率、数据、或坏点(见容错)
NaN/Inf 计数任何非零都是信号
更新与参数的比值(update/param ratio)训练健康度的综合指标

per-rank 的梯度范数分布是定位"哪个 rank 有问题"的最直接手段:正常训练里各 rank 的梯度统计应一致(同 batch 分布下),系统性偏移的 rank 就是嫌疑人。

生产训练的可靠性组合:

  1. 锁频 + 温度监控(消热降频 straggler)
  2. 性能基线(新节点入集群前测,straggler 早发现)
  3. 按节点分解 step 时间(straggler 实时定位)
  4. 训练中轻量 SDC 校验(1% 算力,主动发现坏卡)
  5. per-rank 梯度统计(软错误定位)
  6. 自动隔离(确认坏点 → 踢出 → 检查点恢复)
  • Straggler 拖住全体:一个节点慢 10%,全集群慢 10%;检测靠"按节点分解 step 时间",长尾节点是嫌疑人。
  • straggler 三板斧:确认(隔离重测)→ 隔离(踢出)→ 预防(锁频 + 性能基线)。
  • SDC 不报错只算错:每年数千个 SDC GPU(Meta 实测);没有信号,只能主动检测。
  • 训练中轻量校验(固定输入 + hash 对比)用 1% 算力换及时发现的坏卡。
  • per-rank 梯度范数分布是软错误的定位手段:系统性偏移的 rank 是嫌疑人。
  • 组合拳:锁频 + 基线 + 分解 + SDC 校验 + 梯度统计 + 自动隔离。