Skip to content

核心模块 ​

本章把架构中的关键模块拆到"可以开始写代码"的粒度:每个模块给职责、核心设计、关键参数与常见陷阱。

5.1 健康检查与上线筛选模块 ​

职责:把不健康节点拦在训练池之外,并对在池节点做持续体检。

核心设计:

  • 三层体检:带外硬件事件(BMC/Redfish)→ 带内驱动信号(Xid、ECC、温度、功耗)→ 应用级确定性负载(GEMM 压测、显存扫描、EUD 类自检)。
  • 确定性负载是对 SDC 的主力防线:相同输入必须逐位相同,任何漂移都是嫌疑。ByteRobust 用 MiniGPT 式参考模型做逐位对齐测试;实测局限是 EUD 召回率约 70%,所以确定性负载必须多样(计算、访存、通信全覆盖)。
  • burn-in 时长是博弈:短了漏掉早夭节点,长了拖慢扩容(xAI 122 天建设期的核心权衡,见 xAI 案例)。经验是按硬件批次质量数据滚动调整,而不是固定时长。

关键参数:Xid 白名单/黑名单(有些 Xid 可恢复、有些是死刑)、ECC 错误率阈值、burn-in 负载矩阵与时长、回池前压测强度。

陷阱:把"体检通过"当成永久结论。节点劣化是连续的,体检只在时间点成立——持续画像比一次性筛选更重要。

5.2 故障检测模块 ​

职责:在秒级发现 fail-stop、在分钟级发现 fail-slow、为 SDC 提供统计信号。

核心设计:

  • 多信号融合:心跳与 step 计时(运行时)+ NCCL watchdog/超时(框架兜底)+ 硬件事件流(Xid/ECC/BMC)。单一信号都有盲区:watchdog 对 fail-slow 与 SDC 全盲,遥测对突发 crash 有窗口期,硬件事件不带训练语义。
  • step 计时是 straggler 检测的基本盘:每 rank 每步耗时上送,中位数基线 + 离群打分(Mini Demo 场景 4 的中位数法即最简形态;生产可用多轮投票压误报,如 ByteRobust 每 10 秒聚合一轮、5 轮累计标记最离群组)。
  • 数值守卫:loss/grad-norm 尖刺检测(ByteRobust 用 5 倍阈值)是 SDC 与数据 bug 的最后一道廉价防线,但要用滚动基线避免"真发散"被永久误报(Mini Demo 的场景 5 有对照实现)。

关键参数:心跳间隔、step 超时倍数、离群阈值(误报/漏报的权衡旋钮)、尖刺系数与滚动窗口。

陷阱:检测风暴——一个交换机故障可能同时触发几百个节点告警。检测模块必须有聚合与抑制逻辑(按故障域聚合告警,而不是按节点刷屏)。

5.3 故障定位模块 ​

职责:把"作业挂了"变成"节点 3742 的 HBM 通道 3",且足够快。

核心设计:

  • 二分定位:对挂起类故障,最朴素的是按子集重放(checkpoint + 子集重跑)。代价随作业规模上升,所以生产用更聪明的重放编排。
  • 双阶段 replay(ByteRobust 算法 1):水平分组(同 PP stage 机器)与垂直分组(跨 DP)两轮重放,保持 TP/PP 拓扑只变 DP 切分,用最小代价复现故障。实测分布:32.52% 直接解决、22.70% 重试恢复、9.20% 回滚处理,仅 1.23% 需要完整双阶段。
  • stack trace 聚类的过度驱逐:py-spy + flight recorder 全量采样,按栈相似度聚类,持续离群的并行组整体驱逐。故意多杀(8 台抓 1-2 台)换速度,误伤节点由热备池兜底。

关键参数:重放的最大尝试次数、分组维度选择(与并行拓扑绑定)、离群判定轮数。

陷阱:把定位做成"精确"科学。定位阶段的 KPI 是端到端恢复时间而非定位精度——杀错一台热备机是秒级成本,定位慢十分钟是全作业成本。

5.4 Checkpoint 引擎模块 ​

职责:以最小算力代价,把 RPO(恢复点目标)压到业务可接受的上限以内。

核心设计:

  • 写路径分层:训练 step 间隙把 state_dict 快照 de-stage 到 CPU DRAM(异步第一步),后台线程再刷本地 SSD(第二步),周期聚合写远端持久层(第三步)。PyTorch DCP 的 async_save 即"快照到 CPU + 线程落盘"的标准化实现。
  • 差量化:每步只写变化的分片(优化器状态多数分片变化慢),把每次写入量压缩一个量级,使"每步 checkpoint"在带宽上可行(差量方案见 arXiv:2509.04084;ByteRobust 的每步分层 checkpoint 实测开销 <0.9%、MFU 损失 0.71%)。
  • 冗余拓扑:跨 TP/PP/DP 组做副本——本组全灭时副本仍在(ByteRobust 的跨并行组备份)。代价是显存/内存占用,按故障域设计副本放置。
  • 原子提交与版本保留:临时目录写全 + rename 提交 + 保留最近 N 版 + 定期恢复演练。写坏的 checkpoint 是负资产。

关键参数:间隔 T(用 Daly 公式起步、按实测 MTBF 滚动修正)、分层每级带宽配额、保留份数、远端聚合周期。

陷阱一:checkpoint 与故障恢复争抢带宽——刚故障完所有节点同时读 checkpoint,存储容易被打爆。错峰读、限速读是必备能力。

陷阱二:优化器状态的体积常被低估。Megatron 类分布式优化器的 sharded optimizer state 是模型参数的数倍,checkpoint 引擎必须对参数/优化器/数据 loader 三类状态分别定策略(RL 训练还多一类 replay buffer/rollout 状态,见 RL Post-Training 的 checkpoint 特殊性讨论)。

5.5 弹性运行时模块 ​

职责:作业内部的生命周期管理——成员变更、状态一致性、快速重建。

核心设计:

  • 入口标准化:torchrun/torchelastic 提供 rendezvous(c10d 后端)、--max-restarts 重启上限、TORCHELASTIC_RESTART_COUNT 等环境变量。但它的原生失败语义是"全员退出、整作业重启"——只该被当作兜底。
  • in-process 恢复是演进方向:进程不退出,只修通信组。NVIDIA nvidia-resiliency-ext 的 inprocess 包(initialize / health_check / monitor_process 等组件)与 fault_tolerance 包(hang rank 检测、不重新分配 SLURM 节点的作业内重启)就是这个思路的产品化;TrainMover 的沙箱预热与两阶段建链则给出了性能上限(通信组建链 51 s → 7 s)。
  • 状态一致性协议:成员变化时谁提供权威状态(通常幸存 rank 持有、新 rank 拉取增量)、优化器状态如何重切分(分布式优化器的 shard 随成员数变化)、数据 loader 如何对齐到全局 step(dataloader state 必须进 checkpoint,否则重启后数据重复或跳过)。

关键参数:重启上限(防无限重启烧光队列)、rendezvous 超时、状态同步的阻塞预算、warmup 策略。

陷阱:把 elastic 当成"自动重启次数"。真正的弹性是状态一致性工程——每一次成员变化都是一次分布式快照恢复,处理不好就是静默的数据重复训练或跳过数据。

5.6 热备池与调度协同模块 ​

职责:让"替换"这个动作在秒级发生,且热备池成本可控。

核心设计:

  • P99 二项容量模型:N 节点、p 故障率,备机数取同时故障数的 99 分位。ByteRobust 实测 9,600 卡 P99 只需 2-4 台(32 台同时故障概率 <1%)。模型参数 p 应从知识库滚动估计,而不是拍固定值。
  • 备机状态机:自检 → 休眠 → 唤醒热更新。备机必须持续自检(防"幽灵劣化"),且调度层面要有预留配额防被借走。
  • 角色通用化:PP 角色只有首/中/尾三种时,一台通用备机可顶替任意角色(TrainMover),备机池从"每作业专属"升级为"集群共享",利用率倍增。

关键参数:目标分位(P99 vs P999 是成本与风险的旋钮)、备机预热深度(预热到哪一层:OS、驱动、框架、权重分片)、借出保护策略。

陷阱:热备池成为新的 SPOF 管理盲区——备机长期不参战,一旦需要时发现整个池子都坏了。定期"轮换演习"(强制用备机替换健康节点)是必要的校验手段。

5.7 SDC 防线模块 ​

职责:在"没有报警"的情况下发现"结果是错的"。

核心设计(纵深四道):

层机制成本覆盖
1 硬件纠错HBM/SRAM ECC、row remapping硅片面积单比特翻转
2 上线筛选burn-in、确定性负载、EUD池外时间病态节点
3 运行时冗余双跑对比、集合通信校验、checkpoint 副本对账算力/带宽运行期翻转
4 事后统计loss 尖刺、grad-norm 异常、权重哈希巡检近零慢性污染
  • 双跑对比是黄金标准:相同输入两次计算逐位比对(Mini Demo 场景 5 的 dual_run_compare),漏报为零但成本 2 倍算力——只对关键步骤(如每 N 步的主权重更新)或可疑节点启用。
  • 副本对账是性价比之选:把 checkpoint 分片存两份(或跨组备份),定期比哈希,能发现"慢性 SDC"(某一 rank 持续产出微错)。
  • 运行时校验和值得趋势关注:在集合通信内嵌 checksum(类似 NVLink/IB 链路 CRC 的思路上升到应用层),把第 3 道防线的成本从 2 倍算力降到几个百分点带宽。

关键参数:双跑的抽样频率、对账周期、尖刺阈值、嫌疑节点的隔离与复测流程(SDC 复现 notoriously 难——ByteRobust 案例中一次排查需要 8 小时离线压测)。

陷阱:NaN/尖刺检测触发后没有回滚动作。检测到数值异常而不回滚,等于把第 4 道防线变成了报警器摆设——SDC 分支的铁律(第 4 章)必须落成自动化。

5.8 Straggler 缓解模块 ​

职责:发现"变慢"并把它从"全员陪跑"变成"局部事件"。

核心设计:

  • 同步语义是问题的根源:step 时间 = max(全部 rank),一个慢 20% 的节点让 1,024 个节点每个 step 都慢 20%(Mini Demo 场景 4 直接演示)。
  • 检测:中位数/分位数基线 + 多轮投票。FALCON 在过万卡集群的部署达到 >99% 的检测准确率、缓解 60.1% 的减速;其关键在于把通信栈的 culprit 归因(算慢的是 GPU 还是链路)做进打分。
  • 缓解三选项:剔除换备(最常用)、通信路径绕行(Google reroute,需 fabric 支持)、作业内降级(缩小慢 rank 的负载,MoE 场景可用 expert 迁移)。TrainMover 的评估:1,024 卡上 20% 慢节点若放任,损失与理想逐迭代 checkpoint 相当,而热备替换只损失 4.7%——替换几乎总是对的。

关键参数:慢阈值(绝对秒数 vs 相对中位数倍数)、确认轮数、剔除粒度(单 rank 还是整 PP 组——拓扑约束常强制整组)。

陷阱:把 straggler 当 fail-stop 处理(重启)。慢节点重启后还是慢(硬件劣化不可自愈),重启只会浪费一次 6.47 分钟——这就是为什么决策树(第 4 章)把 fail-slow 单独成支。

小结 ​

七个模块共享同一条工程哲学:检测要快而糙、定位要快而宽、恢复要热而稳、存储要密而省。模块间的接口(节点画像、故障知识库、checkpoint 协议)比任何单模块的实现都更值得先设计稳定。下一章盘点可以直接拿来用的开源与商业生态。

Released under CC-BY-SA-4.0 License.