Skip to content

架构设计 ​

训练可靠性不是某个单点组件,而是一套贯穿硬件、运行时、调度、存储与数据管线的分层体系。本章给出参考架构:每一层只依赖下一层的健康信号,任何一层失效都不让故障穿透到训练进程。

3.1 分层参考架构 ​

五个设计原则贯穿各层:

  1. 控制面与数据面分离。训练进程(数据面)只做计算与上报;检测、决策、调度(控制面)由独立组件完成,控制面自身的故障不能中断训练。ByteRobust 的控制器用约 2 万行 Go 实现,代理仅约 5 千行 Python——轻代理、重控制面。
  2. 故障信号分级。带内信号(进程内可见的 Xid、ECC、NCCL 错误)秒级可达;带外信号(BMC、交换机遥测)分钟级。检测系统必须把两级信号对齐到同一个节点画像,才能解释"进程看到网络超时,带外看到光模块告警"。
  3. 恢复动作幂等。替换节点、回滚 checkpoint、重建通信组,每一步都可能部分失败并重试;所有恢复动作必须可以在任意中间状态下安全重放。
  4. blast radius 受控。故障域(机架、cube、PP group)在架构期就切分好,保证单点故障最多损失一个域。Google 把 TPUv4 的故障域切成 64 芯片 cube 并用 OCS 重连(Google 案例);流水线并行中一个 stage 宕机只影响持有该 stage 的节点组。
  5. 一切都是数据。每次检测、每次定位、每次恢复都落库,形成故障知识库——SDC 排查、慢节点画像、硬件批次质量,全部靠它。

3.2 弹性运行时:训练进程内发生了什么 ​

弹性运行时层是架构的中枢。一个现代弹性训练进程的简化视图:

三个关键时延预算(ByteRobust 实测)决定了这条链路的紧绷程度:

环节目标实测参照
本地检测秒级OS 内核 2 s / GPU 10 s / NIC 30 s
定位归因分钟级CUDA 错误平均 93 s(选择性压力测试 518 s)
替换恢复分钟级热更新 46-65 s;全量 requeue 454-768 s

PyTorch 自带的弹性入口 torchrun 只解决这条链路的"入口"问题:--max-restarts 控制重启次数上限、rendezvous(c10d 后端)负责成员关系同步,文档明确写着失败时 "ALL surviving workers are killed immediately. Make sure to checkpoint your progress."——即原生语义是"全员陪葬 + 从 checkpoint 重启"。生产系统的全部优化,就是把这句话变成"只杀故障者、不停机替换"(第 5、6 章展开)。

3.3 调度层:Gang 语义与热备池 ​

调度层面对的核心矛盾:Gang 语义要求所有 rank 同时就绪,而节点随时会坏。

  • Gang 调度:训练作业以"全部节点"为单位申请资源,任何一个节点不可用则整个作业pending。Kubernetes 生态通过 Volcano / Kueue 等实现,Slurm 生态通过整作业预留实现。Gang 是可用性按"最弱一环"计算的根源,也是热备池存在的理由——有热备,gang 的"就绪"才不会被单节点故障卡死。
  • 热备池管理:容量按 P99 二项模型配置(第 2 章),状态机为"自检 → 休眠 → 唤醒热更新"。热备池要避免两个陷阱:一是"幽灵健康"——备机长期休眠后悄悄劣化,所以 ByteRobust 要求备机常驻自检;二是"备机被借走"——资源紧张时备机被调度走,故障来临时裸奔,需要调度策略级保障(预留配额 + 抢占优先级)。
  • 节点健康画像:每次故障处理后更新节点画像(故障类别、次数、最近证据),坏的节点被污点(taint)隔离并送修,修复后经过压力测试才能回池。画像数据也是采购与硬件批次质量管理的输入。

3.4 存储层:checkpoint 引擎与故障知识库 ​

存储层有两个职责。其一是 checkpoint 引擎(第 2 章概念、第 5 章模块细节),其核心设计要求:

  • 分层:GPU 显存 → CPU DRAM → 本地 SSD → 并行文件系统/对象存储。越靠近计算、越贵越快、越易失;远端层负责抗机架级灾难。
  • 异步与原子性:异步写入 + 临时目录 + rename 提交,保证进程任何时候被杀都留有一个完整可用的 checkpoint。
  • 跨故障域冗余:ByteRobust 的"跨并行组备份"让每份分片在 TP/PP/DP 组之外还有副本——即使整组被过度驱逐,checkpoint 也不丢。
  • 带宽预算:10 万卡模型的 checkpoint 可达数十 TB,写入带宽直接决定 RPO 下限。Gemini(SOSP'23)用 CPU 内存 + 远程复制的分层设计把 checkpoint 频率提到每迭代一次;差量 checkpoint(arXiv:2509.04084)把每次写入量再压一个量级。

其二是故障知识库:结构化记录每一次中断(时间、节点、类别、定位证据、恢复路径、耗时)。它是三类工作的基础设施——SDC 长周期排查(ByteRobust 案例中一次 SDC 排查需要 8 小时离线压测 + 历史画像)、慢节点黑名单、以及硬件 RMA 的举证。

3.5 硬件健康层:把故障消灭在上电之前 ​

运行时的检测再快也是"事后",最便宜可靠的是在节点进入训练池之前把不健康者筛掉:

  • Burn-in(烧机):新节点上电后跑数小时到数天的高压负载(高功耗 GEMM 循环、显存扫描、网络打流),把"早夭"(infant mortality)拦在池外。xAI 在 122 天建设 10 万卡集群的过程中,"上架 19 天就开训"的代价之一就是早期失效节点更多——建设与筛选工期是直接竞争关系(xAI 案例)。
  • 带内信号:GPU Xid 错误码、ECC 计数、温度/功耗曲线、NVLink/IB 误码率——这些信号便宜但只能在节点运行时采集,适合做持续画像。
  • 带外管理:BMC/Redfish 提供独立于操作系统的硬件事件(PSU 故障、风扇、内存 CE/UE),是带内信号的交叉验证来源。
  • 确定性自检负载:EUD(NVIDIA Device-Side Kernel Self-Test)类工具跑确定性 kernel 对比结果,ByteRobust 报告其对 SDC 召回率约 70%——必要但不充分,需要配合双跑冗余。

3.6 与相邻基础设施的边界 ​

系统职责边界协作接口
Kubernetes / Slurm资源分配、进程生命周期、节点污点驱逐通知、重调度请求、健康检查钩子
网络 fabric链路冗余、故障隔离、reroute 能力链路遥测、(Google 场景下)容错路由表
存储系统checkpoint 落盘带宽与持久性分层存储、快照、带宽配额(见 存储系统)
训练框架(Megatron/PyTorch)step 执行、状态字典、通信组checkpoint API、elastic agent 钩子
监控可观测平台指标、日志、trace故障知识库的写入与查询(见 AI SRE)

边界划分的判断标准:凡是"需要理解训练语义"的决策(回滚多少、替换哪台、是否要双跑)留在训练平台;凡是"通用资源管理"(打包、排队、驱逐)交给底层调度。

小结 ​

参考架构 = 硬件健康层把关(把故障拦在池外)+ 调度层兜底(热备与 gang)+ 运行时层处置(检测-定位-恢复)+ 存储层减负(高频低损 checkpoint)+ 算法数据层止损(幂等与数值守卫)。下一章把"检测-定位-决策-恢复"展开成可执行的工作流程。

Released under CC-BY-SA-4.0 License.