核心模块
本章把架构中的关键模块拆到"可以开始写代码"的粒度:每个模块给职责、核心设计、关键参数与常见陷阱。
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 协议)比任何单模块的实现都更值得先设计稳定。下一章盘点可以直接拿来用的开源与商业生态。