完成期限设计台
固定条件:全参数训练、混合精度 Adam、序列 8,192 token,每步 384 条序列,共 31,790 步;全组 ZeRO-3(TP = PP = 1),每卡一次处理一条序列;RTX 4090 BF16 峰值 165.2 TFLOP/s、可用显存按 22 GiB 计;30 天里预留 5 天给启动、评估和计划停顿。点下面的场景,或者自己拖参数。
模型:每步计算 = 1.66×10¹⁷ FLOPs ÷ (卡数 × 165.2 TFLOP/s × 效率);ZeRO-3 每步通信量 V = 3m·(d−1)/d·2N;保存附加比例按每卡 MTBF 约 337 天、保存 16.4 s、恢复 120 s、间隔 1800 s 的一阶模型计算(见 10.4.4);完成时间 T = 5 天 + 31,790 · ts · (1 + L)。
根据训练任务估算容量与时间
一次训练迭代包括前向、反向、梯度归约和参数更新;持续训练还要准备输入、保存 checkpoint,再算上启动和维护。统计完成量时只算有效 token,为对齐长度补进去的填充不算。
先把期限摊到每一步:25 天、31,790 步,每步只有约 67.9 s。计算、通信等待、输入等待,以及分摊下来的保存和故障恢复,全都要装进这 67.9 s。
从任务量到每步预算
⌈10¹¹ / 3,145,728⌉ = 31,790 步batch 为什么停在 384 条:临界 batch size
batch 越大,梯度噪声越小;但过了某个点,再加样本只能略微减少所需步数,每步计算量却成比例增加。这个转折点叫临界 batch size,约等于梯度噪声尺度 Bnoise。
弱扩展 vs 强扩展:加卡后完成时间
参考:48 卡 · 每步 3,145,728 token · 31,790 步弱扩展:每卡固定累积 8 个 micro-batch,每步 52.8 s,全局 batch 随卡数放大。强扩展:全局 batch 固定,单卡计算与卡数成反比,每步 0.58 s 的通信与输入等待不变。两者都不计并行效率变化。Bnoise 是本例取值,没有对本章模型实测;文献在已训练的最大模型上测得收敛时约一到二百万 token。
每参数 16 字节:训练状态是权重的 8 倍
混合精度 Adam 用 BF16 权重做矩阵运算,用 FP32 主权重保存更新后的参数,再保存两份 FP32 矩状态(一阶矩记方向历史,二阶矩记大小历史);梯度以 BF16 累积。
图 10-2 · 常驻训练状态
Qwen3-8B · N = 8,190,735,360| 状态 | 字节/参数 | 什么时候用 |
|---|---|---|
| BF16 模型权重 | 2 | 前向与反向的矩阵运算 |
| BF16 梯度 | 2 | 反向时产生,计算新参数时使用 |
| FP32 主权重 | 4 | 保存新参数,随后生成 BF16 副本 |
| Adam 一阶矩 | 4 | 跨迭代保留梯度历史 |
| Adam 二阶矩 | 4 | 跨迭代保留梯度平方历史 |
MoE 每次只激活部分专家,但每个专家都有待更新参数和优化器历史,所以状态容量按全部可训练参数算。LoRA 则相反:梯度和优化器状态主要取决于适配器参数量。
显存峰值看的是同一时刻驻留的总量:Mpeak = maxt[常驻状态 + 激活 + 临时缓冲]。8 GiB 激活和 4 GiB 收集缓冲同时出现就要 12 GiB;先释放激活再收集参数,同一块空间可以复用。所以优化有两个方向:把张量变小,或者让它们不要同时存在。
浮点格式:省容量,也换来数值风险
FP16 的下溢与损失缩放
最小正规数 2⁻¹⁴ · 最小次正规数 2⁻²⁴ · 最大 65,504反向前把损失乘以 S,梯度跟着放大 S 倍进入 FP16 的可表示范围,更新前再除回去。混合精度训练论文用的因子在 8 到 32K 之间;语音识别模型的权重梯度里约 5% 的值指数小于 −24,在 FP16 里会直接变成 0。因子太小仍然下溢,太大会溢出成无穷,只能跳过这次更新、调小因子。
FP16 · 2 字节
矩阵运算读 16.4 GB 权重。需要全局损失缩放;风险是梯度下溢、缩放溢出。
BF16 · 2 字节
8 位指数与 FP32 相同,不需要缩放,本章状态表就用它。尾数只有 7 位,长内积靠 FP32 累加器保证精度。
FP8 E4M3 · ≈1.0002 字节
最大正规数 448,单一全局因子装不下各层激活。DeepSeek-V3 按块缩放:激活 1×128、权重 128×128,每累加 128 个元素转 FP32;相对损失误差低于 0.25%。只有矩阵运算那份副本降到约 8.2 GB,16 字节/参数的常驻状态不变。
不管起因是缩放失效、数据异常还是硬件错误,训练偏离都表现为损失尖峰(loss spike),通常回滚到上一份 checkpoint 重来。回滚的代价在 10.4.5 计入保存周期模型。
计算量决定卡数下限
一条 8,192 token 序列的前向加反向约 4.31×10¹⁴ FLOPs(每 token 约 52.7 GFLOPs),100B token 共约 5.27×10²¹ FLOPs。
图 10-3 ~ 10-5 · 30 天全部用于计算,至少要几张卡
F = 5.27×10²¹ FLOPs柱:计算需求;菱形:把 131.1 GB 常驻状态理想均分时的显存下限(RTX 4090 24 GB,A100/H100 80 GB)。对本章任务,卡数主要由计算决定。H100 峰值 989 TFLOP/s、RTX 4090 165.2 TFLOP/s 为书中给出;A100 312、B200 约 2,250 TFLOP/s 由书中图表与 1T 算例反推。效率 40% 来自 Llama 3:405B 模型在 8,192~16,384 张 H100 上的 BF16 MFU 为 38%~43%。
另外六成算力去哪了
无法与计算重叠的通信(10.3.3)、流水线气泡(10.3.2)、受内存带宽限制的参数更新与格式转换(10.2.3)、重计算(10.2.2)、掉队者(10.4.5)、checkpoint 保存(10.4.3)。前四项是必须计入的工作,漏掉任何一项都会把完成时间估短;后两项和没重叠的通信才含有可以压缩的开销。
训练状态的分片、重计算与卸载
同步数据并行让每张卡处理不同样本,归约梯度后各自更新,于是每张卡都存着一份完全相同的权重和优化器状态——卡越多,重复越多。ZeRO(微软,2019 年提出、2020 年发表)把这些状态切开,每张卡只负责更新一部分参数;FSDP 按同样的思路组织执行。
图 10-6 ~ 10-9 · 四张卡上的状态归属
“完整” = 整份 · “片 i” = 只存四分之一分片缩小的是常驻状态,执行时还得把完整模块权重收集回来。每个模块:AllGather 取得参数 → 前向或反向 → ReduceScatter 汇总梯度并分到负责的卡 → 各自更新。完整权重缓冲的大小由模块决定,不随卡数变小。
图 10-10 · 一个模块在 GPU 0 上的执行
前向后释放完整参数,反向前就要再收集一次;保留它则省一次通信,但会和后续激活同时占显存。一组 FSDP2 的 CPU 小模型实验:进程从 2 个增到 4 个,参数更新后保留的状态从约 18 MiB 减到 9 MiB,执行峰值却只从约 39 MiB 降到 30 MiB(约 23%),因为执行中仍要约 21 MiB 其他张量和缓冲。
激活:保留、重算,看生命周期
矩阵运算 Y = XW 的反向要算 dX = dY·Wᵀ(交给前一层)和 dW = Xᵀ·dY(交给本层更新)。算 dW 需要前向输入 X,所以 X 要从前向一直留到反向。前向留下的激活像草稿纸:全留着取用方便但占地方,只留一部分就得在用之前重算。
图 10-12 / 10-13 · MLP 的门控乘积 h = a ⊙ u
128 个 token、FP32 激活,h 的形状 [128, 12288],128 × 12288 × 4 = 6 MiB;重建约 157 万次乘法。同层两个归一化加权输出各 [128, 4096] = 2 MiB,也能从已保存的归一化结果和权重重建。每层省 6 + 2 + 2 = 10 MiB。
选择性重计算能省多少
每层 GEMM 输入 15 MiB,其中可重建 10 MiB收益来自生命周期:等反向的 micro-batch 越多,要长期保存的越多;逐层重建却只需反复用同一块 6 MiB 工作区。流水调度让反向更早开始,等待的份数又会下降——重计算与调度共同决定要存多少。
卸载:显存问题变成传输问题
不重算,而是把数据挪到更大的主机内存,用前再传回来。设数据量 V、链路有效带宽 B、从能开始传到算子要用之间有 W 秒:
图 10-14 / 10-15 · 梯度在 CPU 还是 GPU 上转成 FP32
门控投影梯度 [12288, 4096] · BF16 96 MiB转换都要读 G、写 2G,共访问 3G 字节,受内存带宽限制:GPU 取 RTX 4090 的 1008 GB/s,CPU 取第四代至强单路八通道 DDR5-4800 的 307.2 GB/s。分界点 B* = 1 / (3(1/Cc − 1/Cg)) ≈ 147 GB/s,高于 PCIe 5.0 的 64 GB/s,所以经 PCIe 连接的卡都应先传 BF16、在 CPU 上转换。GPU 转换时输入输出共存,峰值 288 MiB,要多 192 MiB 缓冲。SuperOffload 就是在 GH200 这类紧耦合芯片上安排这个取舍。
三种办法,一张对照表
| 方法 | 减少的显存 | 增加的工作 | 收益取决于 |
|---|---|---|---|
| 状态分片 | 重复保存的权重、梯度、优化器状态 | 参数收集、梯度归约并分片 | 收集能否赶在模块执行前完成 |
| 激活重计算 | 前向到反向之间保存的中间值 | 重建前向值 | 重建是否拖慢关键路径上的反向 |
| 状态卸载 | 暂时不用的状态 | 主机与加速器间传输 | 数据能否在使用前传回 |
组合成完整系统时,还要定它们作用于哪些卡和通信组:TP 切层内矩阵,PP 切层,DP 切样本,EP 切专家;SP 沿序列切逐 token 算子的激活,CP 把一条长序列的注意力上下文分到多卡。先定每份参数由谁更新,再沿依赖安排收集、交换与归约,就同时得到每卡容量和各接口流量。
图 10-16 · 加卡分片,还是重算激活
曲线:16N/d + 附加缓冲 · 横线:RTX 4090 可用 22 GiBZeRO-3 八卡:每卡 15.3 GiB,加 10 GiB 共 25.3 GiB,超出约 3.3 GiB。要么用重计算省出 3.3 GiB(增加重建计算),要么增到 16 卡、常驻降到约 7.6 GiB、总量约 17.6 GiB(增加卡数并改变通信组)。先在图上找出放得下的方案,再比较每步耗时。设计案例 32/48 卡:常驻 3.8/2.5 GiB,总量 13.8/12.5 GiB,余量 8.2/9.5 GiB——显存都够,接下来比时间。
训练步的流水调度与通信重叠
容量分析回答“放得下吗”,时间分析回答“数据能不能及时到”。全局 batch 可以拆成多个 micro-batch 依次反向、累积梯度后统一更新:只要每个 micro-batch 的损失都除以同一个总有效 token 数 L,拆分就只改变执行顺序,不改变每个 token 的权重。
例 · 分母选错,梯度就变了
8 条回答:4 条各 2 个有效 token,4 条各 3 个,共 20 个短回答每 token 损失 θ/5,长回答 2θ/5。按 token 平均时长回答占 12/20 = 60% 的权重,梯度更靠近 0.4。分母决定每个 token 对梯度的贡献。
流水线:气泡与激活寿命,两根轴
流水线并行把模型分成多个阶段,micro-batch 依次前向、再反向传回。填满排空先做完所有前向再集中反向;1F1B 预热后交替做一次前向、一次反向,让早到的 micro-batch 早点释放激活。每份激活从前向结束起就要留在显存里,直到它的反向到来——同一时刻有几个 micro-batch 在等反向,就有几份激活。
图 10-17 ~ 10-22 · 流水线事件模型
Qwen3-8B 36 层 → 4 个九层阶段 · 每个 micro-batch 128 token按依赖排定:F(s,i) 要等上一阶段的 F(s−1,i) 传过来,B(s,i) 要等下一阶段的 B(s+1,i) 传回来和本阶段的 F(s,i);正反方向链路独立。默认参数下复现书中结果:填满排空 337 ms、1F1B 347 ms、ZB-H1 283 ms;m = 16 时 1F1B 599 ms、ZB-H1 523 ms。下方条形是每个阶段同时驻留的激活份数峰值(ZB-H1 按事件模型把激活保留到 dW 执行)。
1F1B 并不比填满排空快:气泡同为 (p−1)(tf+tb),交错还多出依赖等待,慢约 3%;它赢在显存。中间结果与缓冲峰值从约 2.57 GB 降到 0.97 GB(−62%)。只给这些数据留 1 GB 时,只有 1F1B 跑得起来;容量充裕时,337 ms 的填满排空先完成。看阶段 3 的 93–95 ms:第 2 个反向做完了,第 3 个前向输入还没到。
压缩气泡:三种扩展调度各拿什么换
交错式 1F1B(v = 2)把 36 层切成 8 块轮流分给 4 张卡,气泡比例从 (p−1)/m 缩为 (1/v)·(p−1)/m,代价是跨界传输翻倍以上(全步前向消息 24 → 56 次)。零气泡把反向拆成 dX(B,上一阶段在等它,必须尽早做)和 dW(W,只进本层梯度累积,可以挪进空隙):气泡 1F1B 为 (p−1)(TF+TB+TW),ZB-H1 为 (p−1)(TF+TB−TW),ZB-H2 为 (p−1)(TF+TB−2TW);本例 TB = TW = 10 ms,下界 90 / 30 / 0 ms。DualPipe 把 micro-batch 分两半从两端相向注入,气泡 (PP/2−1)(F&B + B − 3W) = 20 ms,代价是每卡两份参数、激活 PP+1 份。
图 10-24 · 五种调度,没有谁在两根轴上都赢
4 阶段 · 前向 10 · 反向 20 · 传输 1 · 更新 1 ms| 调度(8 个 micro-batch) | 完成 / ms | 每卡空闲 / ms | 阶段 0 峰值 / MiB | 压缩气泡的手段 | 主要代价 |
|---|---|---|---|---|---|
| 填满排空 | 337 | 96 | 1,840(阶段 3 为 2,448) | 无 | 激活驻留最高,容量紧张时跑不起来 |
| 1F1B | 347 | 106 | 921 | 无 | 显存最省,但慢约 3% |
| 交错式 1F1B,v = 2 | 298 | 57 | 1,329 | 每卡层块拆成 v 段 | 前向消息 24 → 56 次 |
| 零气泡 ZB-H1 | 283 | 42 | 921(阶段 3 为 1,226) | dW 延后填进空隙 | 靠后阶段激活要留到 dW |
| DualPipe | 306 | 65 | 1,228(阶段 1、2 为 1,612) | 两端相向流动 | 每卡参数两份 |
交错式与 DualPipe 的完成时间来自书中事件模型(槽位规则见书注),这里不重新模拟;填满排空、1F1B、ZB-H1 可在上面的事件模型里复现。m 增大时气泡比例本身就在降(1F1B 从 37.5% 降到 18.8%),而交错式多出的通信、零气泡多出的激活驻留、DualPipe 多出的参数量都不随 m 缩小。容量紧张时顺序反过来:先排除峰值放不下的调度,再比时间。
梯度分桶与通信重叠
发送之前要等数据产生,发送时又要等链路空闲。反向逐层产生梯度,实现里通常把多个梯度合成一个通信桶,桶内梯度都算完才发:桶越大越容易等最后那个梯度,桶越小启动次数越多。
图 10-25 / 10-26 · 3 ms 归约能否藏进 5 ms 计算
数据依赖给出最早开始时刻,资源争用把它往后推,后续算子的依赖决定这段等待会不会拉长整步。先算 dX 让前一层早点开始反向,先算 dW 让本层梯度早点开始通信——两者争同一份计算资源时,改顺序就是重新分配通信窗口。
设计案例 · ZeRO-3 的 12 秒链路时间藏在哪
每个 micro-batch 三次集合通信:前向前 AllGather 一遍 BF16 权重,反向前再收集一遍,反向后对 BF16 梯度 ReduceScatter;每次每卡收发 (d−1)/d × 2N,48 卡约 16.0 GB。RTX 4090 没有 NVLink、不支持卡间 P2P,同机两卡交换也要经过主机内存,所以全部收发都走各自的 PCIe 4.0 x16(32 GB/s);每台八卡主机配八张 200 Gbit/s 网卡,环形通信把跨机流量分到八张网卡上,网卡不是瓶颈。逐层看,收集一层约 0.39 GB 参数只需约 12 ms,远短于这一层的计算。MegaScale 指出无法隐藏的只剩第一次 AllGather 和最后一次 ReduceScatter,二者都作用于约 1.24 GB 的词嵌入,合计约 0.08 s。图中层内细节为示意排布。
案例 · MegaScale:卡数翻四倍,加速 3.7 倍
175B 模型,全局 batch 固定 6144,卡数从 3072 增到 12288。每步从约 23.7 s 降到 6.3 s(理想 5.9 s),扩展效率约 93%。每卡活变少后,跨组同步和负载不均在每步中的占比上升——先把这些扩展本身带来的等待补进模型,剩下解释不了的差额才归于实现开销。
MoE 与长上下文:工作怎么分、谁最后完成
图 10-27 · 容量因子:丢 token 还是补零
Qwen3-235B-A22B · E = 128 · k = 8 · 8,192 token65,536 次 dispatch,平均每专家 512 行。书中设一半专家收到 1.5 倍均值(与两专家 96/32 的小例同为 3:1);其他热度是示意。最忙那张卡决定完成时间:96/32 改成 64/64,专家计算缩短三分之一。辅助损失直接惩罚不均,DeepSeek-V3 的无辅助损失方案按负载动态调路由偏置,二者都让 c 可以取得更小。
切小桶:总时间更长,却不再拖慢训练步
72 MiB FP32 专家梯度 · 4 成员环形 AllReduce · 启动 0.02 ms · 三个 2 ms 空隙图 10-28 / 10-29 · 同样 8,192 token,注意力配对数不同
长度 s 的因果序列:s(s+1)/2 对长三角形多出的面积是真实的注意力关系,删填充也去不掉。打包减少填充,按长度分组让各卡的三角形面积更接近,上下文并行把长序列分到多卡并交换 K、V。比较方案时保持长度分布、掩码和损失权重不变,才能把调度收益和任务变化分开。
数据输入、checkpoint 与故障恢复
前面假定输入已经备好、训练不会中断。持续运行时,读取—分词—筛选—打包—锁页内存—传到 GPU 这条链要跟上计算,还要有 checkpoint 保存可恢复的状态。输入决定卡能不能一直有活干,恢复决定做过的工作有多少要重做。
GPU 收到的字节很少,瓶颈在 CPU 准备
46,300 token/s ≈ 5.7 条/s · int64 token ID 仅约 0.37 MB/s设计案例用四个进程,合计 8 条/s;48 卡输入就绪时每步约 52.3 s、384 条,需求约 7.3 条/s。准备比消耗快,短暂变慢后能补满预取队列。再给每步 0.5 s 平均输入等待,表示预取没消除的部分:每步变成约 78.9 s(32 卡)与 52.8 s(48 卡)。
图 10-30 · 预取进度 ≠ 训练进度
已训练到 batch 100 · 已分配准备到 108101–108 有的已准备好、有的还在处理(虚线框)。恢复时要么保留它们,要么重新准备,都从 101 继续。checkpoint 写入也受同样约束:平均产生速率超过存储能持续接收的速率,待写快照就会越积越多。本章设计案例 1800 s 存一次约 115 GB,平均只有约 64 MB/s。
可恢复状态:只存权重不够
要存什么
权重、Adam 一阶矩与二阶矩、步数、学习率状态、随机状态、下一批数据的组成。权重相同但矩状态不同,下一次更新就不同;读取位置相同但打包时剩下的 token 不同,下一条序列也会变。一次迭代结束时梯度会重新产生,不用存:BF16 权重 2 + FP32 主权重 4 + 两份矩 8 = 14 字节/参数,约 115 GB。
打包器的残余 token
打包器手里留着 2,000 个 token,下一份数据给 6,192 个,凑成下一条 8,192 token 序列。丢了这 2,000 个,就只能从后续数据补齐,序列的前缀、注意力关系和标签都会变。已训练的数据位置、尚未凑成整条序列的 token 要和参数一起保存。
图 10-31 · 从四路张量并行重分片为八路
门控投影 [12288, 4096] · BF16 96 MiB沿输出维四分每片 3072 行、24 MiB;八分每片 1536 行、12 MiB。rank r 读旧分片 ⌊r/2⌋,偶数取前半、奇数取后半。FP32 主权重和两份 Adam 状态按同样的行范围拆,各是 BF16 权重的两倍,这个矩阵在 checkpoint 里共 96 × (1+2+2+2) = 672 MiB。ByteCheckpoint 一类系统用全局形状、偏移和片段长度描述张量,按目标布局只读需要的范围。
异步保存:返回了不等于存好了
同步保存先生成固定快照,写完再继续训练。异步保存把快照复制到独立缓冲后让训练继续,后台写入;只有写完并提交的快照才能用于恢复。
图 10-32 ~ 10-34 · 112 GB 快照,故障时能退回哪里
第 20、40 s 捕获,各花 0.5 s 复制到缓冲后上传。两种存储的前台暂停都是两次 0.5 s,区别只在后台何时写完。另一组 CPU 实验:保存接口约 7 ms 返回,恢复元数据约 48 ms 才提交;提交前杀掉进程,恢复程序就选上一份完整 checkpoint。数据文件 + 提交记录才构成可用快照。7 GB/s 来自 DGX SuperPOD 参考架构 NLP 训练对应的 Good 档(一个 32 台 DGX 的 SU)。
保存间隔太短会积压
7 GB/s 写一份 112 GB 要 16 s。每 10 s 产生一份,待写速率 11.2 GB/s,队列持续增长;改成每 20 s 一份,平均需求 5.6 GB/s,下一份到来前能写完上一份。
保存周期:保存成本与重做成本的平衡点
图 10-35 · 附加时间随保存间隔变化
每卡 MTBF ≈ 337 天 · 保存 c ≈ 16.4 s · 恢复 r = 120 sc = 114,670,295,040 字节 ÷ 7 GB/s ≈ 16.38 s。1024 卡时 300/900/1800 s 合计 6.4%/3.8%/4.5%:从 5 分钟延到 15 分钟,省下的保存多于新增的重做;再延到 30 分钟就反过来。最低点很平,配置时选附近顺手的值即可。卡数翻倍或保存速度翻倍,最优间隔都缩为 1/√2。设计案例取 1800 s:32 卡附加 1.02%,48 卡 1.08%;加上 7 天一次的尖峰回滚,48 卡升到约 1.25%,完成时间只多约 0.03 天。
掉队者:每步等最慢的那张卡
N 张卡计算时间的最大值
μ = 52.2 s(48 卡单卡计算)· 通信与输入等待 0.58 sE[max] 按 N 个独立正态样本的最大值数值积分求得:N = 8、48、1024 时约为 μ + 1.42σ、2.23σ、3.25σ;未模拟相关性、周期抖动或持续慢卡(σ 为本例取值)。慢卡可以从通信等待中认出来:每张卡在梯度桶 AllReduce 上等的时间 = 步结束时刻 − 自己的计算结束时刻。MegaScale 报告约 0.5% 的机器明显变慢;Meta 统计 1024 卡作业平均无故障 7.9 小时,8 卡作业 47.7 天。
强化学习训练
前四节的数据是给定的。RL 让模型参与产生下一批数据:生成轨迹 → 算奖励或验证 → 训练 → 新权重又改变下一轮生成。训练流水变成了反馈循环,新问题集中在各阶段速度、切换时的状态重叠,以及样本到底由哪一版策略产生。
一轮反馈循环
4 条提示词,每题生成 2 条回答,共 8 条轨迹。提示词和回答都参与前向(这次小模型实验输入有效 token 共 366),损失只按选中的回答 token 归一化(20 个,含 EOS):生成长度影响计算成本,损失掩码决定谁参与梯度。样本标识把生成、奖励、学习三种形式的数据串起来。
组内相对奖励决定优势
两条都得 1,减去组内均值后优势都是 0,策略没有方向。verl + vLLM 的小模型实验里,算术题精确匹配奖励让同组奖励相同,梯度为零,参数变化只来自 AdamW 的权重衰减;改用固定符号奖励后梯度非零,但算术验证仍只有 2/4 正确。统计吞吐要按实际用于训练的轨迹算,能力提升要用固定评估检验。
SFT、OPD、在线、on-policy
SFT 在给定答案的真实前缀上预测下一个 token(教师强制),部署时模型却接着自己生成的前缀写,一步错就进入训练少见的上下文。OPD 让学生自己生成轨迹,教师针对学生实际写出的前缀给逐 token 监督(DeepSeek V4 用多教师 OPD 合入领域专家能力),代价是在线生成、教师前向与权重同步,总 GPU 小时省不省要实测。离线/在线说的是数据是否预先固定;on-policy 进一步要求采样分布与被优化的策略一致。
三道工序:扩容先扩最慢的那道
图 10-36 · 生成、验证、学习
等长轨迹 · 条/s共享加速器:切换顺序决定峰值
同一组卡轮流训练和生成,省掉重复资源;但切换时旧状态还没放、新状态已开始加载,两阶段单独都放得下,切换瞬间却可能超容量。
图 10-37 / 10-38 · 一张 H100 SXM(80 GB ≈ 74.5 GiB)
训练状态 40 GiB(分片/卸载后,给定输入),生成要 15.3 GiB BF16 权重 + 24 GiB KV 池,两阶段共用开销 4 GiB。训练独占 44 GiB、生成独占约 43.3 GiB。两条路径终点相同,峰值差 24 GiB,正好一份 KV 池。
独立部署:按分片发权重
Qwen3-235B-A22B 的 BF16 专家权重 423 GiB。EP16 时每个接收方只需约 26.4 GiB:逐一向 16 个接收方发完整专家集合共 6,768 GiB,按各自分片发只要 423 GiB。先确定每个接收方要哪些分片,再组织分发。
两种权重生命周期
固定参考模型的权重长期不变,可以放在第 4.7.3 节的固定权重加速器(ROM)里反复读;持续更新的策略模型用可写权重存储,训练产生 v0 → v1 后发布给生成端,保持版本一致。KV 写入和权重更新走不同的数据通路。
异步训练:重叠换来的时间,要扣掉过期样本
图 10-41 / 10-42 · 同步 60 s vs 异步 44 s
每批生成 40 s、学习 16 s、阻塞两侧的权重同步 4 s。异步时生成下一批与学习上一批在独立资源上重叠,周期 max(40, 16) + 4 = 44 s。有效吞吐:同步 B/60,异步 qB/44,异步更快要求 q > 11/15 ≈ 73.3%。长轨迹更容易跨过参数更新或遇到中断:持续 t 的轨迹完整生成的概率是 e−λt,总是丢弃中断轨迹会偏向短样本;逐 token 记录进度和策略版本,就能接着生成同一条。Qwen3-8B 的 8K BF16 KV 占 1.125 GiB,恢复时比较取回与重建(重跑 prefill)的时间。
训推一致性:三个策略,两种差异
误用重算的 logprob,样本权重就被改了
行为策略记录的 logprob = −3右边第一项是本轮参数优化带来的变化,第二项是采样分布与起点策略的差异——可能是版本滞后,也可能是采样配置或跨引擎计算差异。即使每轮先同步权重,第二项也未必为 1:生成端逐 token decode 读 KV,训练端整段并行重算;注意力实现、归约次序、batch 形状、KV 精度都会让 logprob 不同(第 5.2.4 节:同一行按不同段数归约,平方和差 166 个 ULP)。温度、top-k/top-p 要按变换后的概率保存。PPO 的裁剪会把实现差异误当成参数更新;用序列概率比时各 token 的差还会累加,长轨迹更容易波动。
MoE:数值差异变成路径差异 · 路由重放
top-2 · 专家 1 = 0.500 · 专家 2 = 0.301路由重放(Routing Replay)记录生成时选中的逻辑专家 ID,训练时按 ID 选专家,再用当前权重算分数、输出和梯度:离散路径一致,数值仍反映当前参数。样本 + token 位置 + 层号定位一条记录;打包、上下文切分、重计算都要让 ID 跟着 token 走。Qwen3-30B-A3B:8,192 token × 48 层 × top-8 × 2 字节(uint16)= 6 MiB,int32 则 12 MiB。NVIDIA 公布的 R3 验证四组对照各 100 步:logprob 误差中位数都下降,每步耗时中位数略长,训练奖励没有一致提高。
从系统方案到完成期限与硬件选择
| 设计项 | 32 卡方案 | 48 卡方案 |
|---|---|---|
| 八卡主机数 | 4 | 6 |
| 全组 ZeRO-3,每卡单序列累积次数 | 12 | 8 |
| 每卡预计显存 / 可用(GiB) | 13.8 / 22 | 12.5 / 22 |
| 每步单卡计算 / s | 78.3 | 52.2 |
| 每步 ZeRO-3 链路时间(PCIe 4.0 x16)/ s | 17.9 | 12.0 |
| 每步通信等待 / s | 0.08 | 0.08 |
| 每步输入等待 / s | 0.5 | 0.5 |
| 每步训练时间 / s | 78.9 | 52.8 |
| 保存、重做与恢复附加 | 1.02% | 1.08% |
| 基础训练时间 / 天 | 29.0 | 19.4 |
| 加上保存恢复和 5 天预留 / 天 | 34.3 ✗ | 24.6 ✓ |
选 48 卡:两套都放得下,32 卡超过 30 天被排除;48 卡约 24.6 天完成,剩约 5.4 天。多加卡的主要价值是减少每卡的训练工作,额外的故障成本只抵消很小一部分。
48 卡的可行范围
把余量摊回每步:ts ≤ 25 × 86400 / (31,790 × 1.0108) ≈ 67.2 s。现在 52.8 s,余量约 14.4 s/步,通信等待最多可到约 14.5 s。即使预取全部失效,12.0 s 链路时间整段暴露,每步约 64.8 s,仍在上限内。但若一台主机八张卡共用一张网卡,385 GB 都要过这张 25 GB/s 网卡,链路 15.4 s,预取一失效就是 68.1 s,超期——共用网卡把按期完成押在了重叠上。
32 卡要多高的效率
扣除恢复、0.08 s 通信和 0.5 s 输入后,留给单卡计算约 66.7 s,而 40% 效率要 78.3 s。所以要把效率提到 40% × 78.3 / 66.7 ≈ 47%,已高于 Llama 3 报告的最高 43%。两条路线可以直接比:加两台主机,或者在原有卡上把效率从 40% 提到 47%。(设计台 ⑥)
换硬件:先看每项原来占多少
图 10-45 · 带宽变化的影响由原来的等待占比决定
100 ms 里只有 5 ms 通信等待,带宽减半变成 105 ms;通信占 50 ms 时变成 150 ms。48 卡方案暴露的通信只占每步约 0.14%:PCIe 带宽减半,每个 micro-batch 的链路时间升到约 3.0 s,仍短于 6.53 s 计算,暴露部分翻倍到约 0.15 s,每步 52.8 → 52.9 s。效率从 40% 掉到 30% 却会让每步变成约 70.2 s,超过 67.2 s。对这套方案,决定能否按期的是单卡计算效率。比较 A100、A800、H20 等时,把单卡计算、接口传输和容量代入同一分析,满足期限的再比租用、能源和准备成本。
放大模型:6ND 与期限
图 10-46 · 稠密模型训练要多少卡、多少天
固定 D = 20T token 或 D = 20N1T 参数、16,384 张卡、40% MFU:A100、H100、B200 分别约需 679、214、94 天,90 天内三者都完不成;B200 要增到约 17,147 张。MFU 到 50% 时 B200 降到约 75 天,剩约 15 天给计划停顿与恢复——10 个百分点的 MFU,决定 16,384 张 B200 能否 90 天训完 1T 模型。D = 20N 时 F = 120N²,参数量翻 5 倍计算量翻 25 倍。MoE 要分开算全部参数的状态与激活路径的执行工作,再把专家交换放进关键路径。
设计完成后:用公开日志检验长期速率
从 checkpoint 继续训练时,本次新增 token = 结束累计值 − 恢复起点累计值;新增工作除以本次时间,就是长期速率,可以直接检验系统能否保持设计中的有效训练进度(书中用 SmolLM3 原始训练记录核验)。
五个容易下错的结论
分片只缩小常驻状态。小模型例中常驻从 18 MiB 减到 9 MiB,执行中其他张量和缓冲仍占约 21 MiB,峰值只从 39 降到 30 MiB。决定容量的是同一时刻的总占用。
三个小桶总共 4.59 ms,比整桶 4.55 ms 还长,却能分别塞进三个计算空隙。通信何时完成,才决定它会不会拉长训练步。
50 s 故障时能退回哪里,取决于哪份快照已经提交。同样 1 s 前台暂停,可能对应 30 s 重做,也可能只有 10 s。
生成 12、验证 6、保留 75% 时,学习端每秒只收到 4.5 条。加生成没用,提高验证才会把瓶颈移到训练端。
超过临界 batch size 后步数不再明显减少。噪声尺度二百万 token 时,batch 从 315 万放到约一亿 token(1536 卡),完成时间只从 19.4 天降到 12.1 天,上限 1.64 倍。只有保持 batch 不变的强扩展不受它限制。
容量、执行、恢复连成一个设计问题
一、容量看格式、分配和寿命
存储格式、各卡如何分配、每份数据活多久,共同决定显存。ZeRO 减少复制,重计算减少前向到反向之间要存的数据,卸载把暂时不用的状态挪到主机——都是拿计算或传输换空间。
二、每步耗时看依赖与资源
数据就绪和资源空闲共同决定开始时刻,沿依赖累积到参数更新结束就是一步。batch 能否随卡数放大由临界 batch size 决定,每步由最慢的卡决定;长期还要加上数据准备、保存和故障重做。
三、RL 要追踪版本与概率
样本标识、策略版本、行为概率都要跟着样本走,生成与训练的数值路径要对齐。控制住分布偏移和执行误差后,才能用有效样本吞吐和任务评估判断阶段重叠是否加快了学习。
设计案例:32 卡和 48 卡 RTX 4090 都放得下训练状态,同样目标和效率下分别约 34.3 天和 24.6 天完成。48 卡满足期限,每步上限约 67.2 s;ZeRO-3 每步 12.0 s 链路时间绝大部分被计算覆盖,即使完全暴露也不超限。同一个模型也给出了效率、通信、故障条件变化时能否按期的临界值。下一章讨论这些作业与阶段如何共享资源池。
动手验证
习题 10-1 · 基础:训练状态分片与每卡峰值内存
把梯度改成 FP32,计算 Qwen3-8B 常驻训练状态,再求八卡 ZeRO-1/2/3 的每卡容量(10.1 的状态计算器可切梯度格式)。设执行中有 6 GiB 激活和两份各 3 GiB 的模块缓冲,分别计算两份缓冲同时占用与顺序复用时的峰值。
习题 10-2 · 基础:按期完成需要多高的单卡计算效率
全局 batch 384 条,算 30 天和 25 天对应的每步预算。给定 32 卡,按 10.3.3 求 ZeRO-3 每步链路时间与暴露的通信等待,加 0.5 s 输入等待;先忽略恢复求 25 天内完成所需的最低效率,再加入恢复成本。最后取噪声尺度二百万 token,求弱扩展上限,以及 96 卡与 1536 卡在弱/强扩展下的完成时间;改成两千万 token 再算上限。
习题 10-3 · 综合设计:容量、期限与加速器成本
比较 32 卡与 48 卡的完成时间与累计 GPU·小时。把激活与临时缓冲从 10 GiB 提到 20 GiB 重新判断容量(设计台可切换);若 BF16 权重副本改用 FP8 分块缩放格式,重算两套方案的每卡常驻状态与余量。若只能租四台八卡主机,分别求要把任务量减到多少、期限延到多久,或效率提到多少。实验部分选一条路线实测,替换本章给定参数。
习题 10-4 · 分析:micro-batch 数与激活重计算如何改变流水开销
四阶段、前向 10 ms、反向 20 ms,求 1、4、8、16 个 micro-batch 的理想利用率。沿图 10-19 解释 93–95 ms 的等待来自哪项依赖。对八个 micro-batch,用气泡公式比较交错式(v=2)与 ZB-H1,对照事件模型的 298 与 283 ms,说明交错式为什么增加跨界传输。每层每个 micro-batch 可重建乘积 10 MiB、四个 micro-batch 各保留九层:改为逐层逐个重建、用完即放,少保留多少、工作区多大?两层同时反向时工作区怎样变化?
习题 10-5 · 分析:数据准备进程暂停时要预取多少序列
48 卡每步 384 条、52.8 s,四个进程各 2 条/s。一个进程暂停 60 s,按训练端平均消耗率求至少预存多少条,以及全部恢复后多久能补回暂停前的队列长度。再按 7 GB/s 存储写入,求约 115 GB checkpoint 不积压的最短保存间隔。
习题 10-6 · 分析:checkpoint 保存频率与故障重做成本
推导一阶模型的最优保存周期,算 1024 卡作业 300、900、1800 s 间隔的保存与重做开销。加入每天一次、同时影响全作业的共同中断,重算故障率与最优周期。再把平均七天一次的损失尖峰回滚加入 48 卡模型,重算最优周期与 600 s 间隔的附加比例。实验:在提交前后分别注入故障,比较恢复位置与重做量。
习题 10-7 · 综合设计:RL 各阶段配比与有效样本吞吐
生成、验证、学习 12、6、8 条/s,保留 75%,比较只把一个阶段翻倍的收益。再用生成 40 s、学习 16 s、同步 4 s 的周期模型,算异步后保留 80% 与 70% 时的有效吞吐,并与不丢样本的同步执行比较(可表示为每秒处理的 batch 比例)。实验:追踪一批样本的标识、奖励、有效损失位置和接收方权重。
习题 10-8 · 分析:路由记录与样本对应关系
8K token、48 层、每层 8 个专家,分别算 uint16 与 int32 编码专家 ID 的记录容量。把两条序列打包后再沿上下文切成四份,描述专家 ID 如何随 token 重排;构造一个 token 位置错位的例子,说明训练端会怎样用错专家,并设计定位这一错误的检查。
习题 10-9 · 分析:通信、效率与输入等待如何影响期限
在 48 卡案例中分别把 PCIe 带宽减半(预取有效/失效)、效率降到 30%、输入等待增到 5 s,重算完成时间并判断是否满足期限(设计台均可直接调)。再给每卡计算时间加 5% 标准差的独立波动,求每步期望耗时。若上述退化同时发生、只能恢复其中一项,比较各自能减少的关键路径耗时。再选一份硬件规格或执行记录,把一个给定输入替换成有来源的数值。
习题 10-10 · 综合设计:满足期限需要多少加速器、多少成本
对 1T、5T、10T 稠密模型,用 6ND 算 D = 20T 与 D = 20N 两种数据规模的运算量;按 40% 与 50% MFU,求 90 天与 180 天内完成所需的最少 A100、H100、B200 卡数(10.6 的规模计算器可直接查)。以累计 GPU·小时比较两个满足期限的方案,并说明准备时间和恢复参数如何改变结论。实验:选一份标明恢复起点的公开日志,扣除恢复时已完成的 token,算观察期内的平均处理速率。