2201 字
约 7 分钟
7
S23-J28 · 流水调度、checkpoint 与强化学习

适用读者:要调流水并行度、要设计 checkpoint 策略与故障恢复、要评估 RL 训练可行性的人。
前置:S23-J27(容量与分片)、J16(重计算)、J21(重叠与关键路径)。
覆盖旧文:A-4343 §10.3–§10.5(流水调度与通信重叠 + 数据/checkpoint/故障恢复 + 强化学习,480 点)→ 480 点。
扩展点:E-S23-102(气泡与利用率 u = m/(m+p−1):p=4、m=8 → 72.7%)、E-S23-103(1F1B 多花 3% 时间换显存 −62%:2.57 → 0.97 GB)、E-S23-104(checkpoint 写带宽决定重做量:7 vs 20 GB/s → 30 vs 10 s)、E-S23-105(异步保存的"提交点"才是可用恢复点)。
上一篇:S23-J27 · 训练容量估算与状态分片
下一篇:S23-J29 · 资源需求与环境生命周期。


1. 一句话结论

流水并行的两根轴要一起看:时间(气泡)和显存(激活驻留)。 1F1B 比填满排空慢 3%(347 vs 337 ms),却把峰值激活从 2.57 GB 降到 0.97 GB(−62%)——在容量紧张时,"慢一点但跑得起来"才是正确选择。

出处:AI Infra 教材 §10.3–§10.5(id 4343),Qwen3-8B 36 层分 4 阶段、8 个 micro-batch。

T = (m + p − 1)(t_f + t_b)      u = m/(m + p − 1)

2. micro-batch 与梯度累积(§10.3.1)

概念 含义 影响
micro-batch 一次前向/反向实际处理的切片 越小 → 气泡越少、矩阵效率越低
梯度累积 多个 micro-batch 的梯度累加后再更新 等效全局 batch,不增加显存
全局 batch micro × 累积 × DP 决定梯度信噪比(J27 的 B_noise)

判据:micro-batch 的取舍是"气泡 vs 矩阵效率"。 切太小,M 变小进入 J17 的低效区;切太大,激活装不下。


3. 流水线:气泡与激活驻留(E-S23-102、E-S23-103)

p 个平衡阶段,每阶段前向 t_f、反向 t_b:

填满排空:T = (m + p − 1)(t_f + t_b),气泡 = (p−1)(t_f+t_b)
p=4, m=8 → u = 8/11 ≈ 72.7%

本算例(Qwen3-8B):36 层 / 4 阶段 = 9 层/阶段;8 个 micro-batch;t_f = 10 ms、t_b = 20 ms、边界传输 1 ms、更新 1 ms。

调度 时间 峰值激活+缓冲 能否放进 1 GB
填满排空 337 ms 约 2.57 GB ❌
1F1B 347 ms 约 0.97 GB ✅
两者气泡相同:(p−1)(t_f+t_b) = 3×30 = 90 ms
1F1B 的 3% 额外时间来自交错引入的依赖等待(如阶段 3 的 2 ms 空档)

判据:"1F1B 更好"只在显存这根轴上成立。 容量充裕时填满排空更快;容量紧时 1F1B 是唯一能跑的选择。

推论:u = m/(m+p−1) 说明 阶段越多、micro-batch 越少,效率越差。p=4 想上 90%,需要 m≥27。


4. 反向依赖与通信重叠(§10.3.3)

反向顺序 = 前向的逆序 → 梯度一就绪就可以开始归约
分桶(bucket):把小梯度打包,减少启动次数(J19 的 α)
手段 重叠什么 前提
梯度分桶 + 异步 AllReduce 通信 ↔ 后续层反向计算 桶足够大(摊薄 α)
激活重算 显存 ↔ 算力 重算代价低于省下的字节
通信/计算多流 不同资源并行 不争同一接口

判据:重叠的天花板是"通信时间 ≤ 计算时间"(J21 的 max 公式)。超过就没有可藏的空间。

4.1 MoE 与长上下文的变化(§10.3.4)

负载 调度变化
MoE All-to-All 夹在专家层之间,气泡形状改变;EP 组越大,通信越难重叠
长上下文 激活随序列线性涨 → 必须重算或切 SP;prefill 阶段算力主导

5. checkpoint:写带宽决定重做量(E-S23-104)

同步保存:生成一致快照 → 写完 → 继续训练。
异步保存:快照复制到独立缓冲(快)→ 后台写(慢)→ 提交完成后才可用。

算例:每份快照 112 GB。

存储档 写带宽 一份耗时 每 20 s 一份的需求 结论
Good(1 SU) 7 GB/s 16 s 5.6 GB/s ✅ 跟得上
每 10 s 一份 7 GB/s 16 s 11.2 GB/s ❌ 队列持续增长
Better 20 GB/s 5.6 s 5.6 GB/s ✅ 余量大

故障在第 50 秒:

方案 提交时刻 可恢复到 重做量
7 GB/s 36.5 s、56.5 s(第二份未完成) 第 20 s 30 s
20 GB/s 26.1 s、46.1 s 第 40 s 10 s
前台暂停都是 2×0.5 s = 1 s(一样)
差别只在后台写带宽 → 可用恢复点更近 → 少重做 20 s

判据:checkpoint 的收益要用"重做量×故障率"衡量,不是"保存频率越高越好"。 频率超过写带宽承载能力,队列只会越积越长。


6. 故障规模与掉队者(§10.4.4–10.4.5)

现象 影响 手段
故障率高 重做量 × 频率 = 有效算力损失 缩短保存周期、异步提交
掉队者(straggler) 全体等最慢节点 检测 + 剔除/重调度,容忍异步更新
慢存储 数据加载卡住流水 预取、打包、本地缓存
有效训练进度 ≈ 总时间 × (1 − 故障损失率)
故障损失率 ≈ (MTTR + 重做量) / MTBF

判据:"有效进度"才是最终指标。 卡再多,故障与掉队吃掉的部分也算不进去。


7. 强化学习训练(§10.5,要点)

一轮包含:生成(rollout)→ 验证/打分 → 参数更新。

阶段 资源特征 与监督学习的差别
生成 推理式、KV 密集、长尾 用推理引擎,不是训练图
打分 规则/奖励模型 可能 CPU 或另一模型
更新 与 SFT 相同 样本来自自己,分布漂移

判据:RL 的瓶颈常在"生成"而非"更新"——rollout 是推理负载(J22–J24 的所有规律都适用),而更新只是一个小步。


8. 可复算(实测)

$ cd /root/博客运营官/blog-v2 && python3 tools/s23_book_calc.py | tail -8
流水 p=4, m=8: u = 0.727;气泡 (4−1)×30 = 90 ms
  填满排空 337 ms(峰值 2.57 GB)vs 1F1B 347 ms(峰值 0.97 GB,-62%)
checkpoint(112 GB/份)
  7 GB/s: 16.0 s/份;每 10 s 需求 11.2 GB/s > 带宽 → 积压;每 20 s 需求 5.6
  20 GB/s: 5.6 s/份;每 10 s 需求 11.2 GB/s;每 20 s 需求 5.6
  7 GB/s 提交 36.5/56.5 s;第 50 s 故障 → 恢复到 20 s,重做 30 s
  20 GB/s 提交 26.1/46.1 s;第 50 s 故障 → 恢复到 40 s,重做 10 s

9. 前提与边界

结论 成立条件 不成立时
u = m/(m+p−1) 各阶段平衡、无传输 阶段不均 → 最慢阶段决定
1F1B 省 62% 显存 依赖关系允许提前反向 某些算子必须等全批 → 无法交错
重做量 = 提交间隔 写带宽跟得上 跟不上 → 按写带宽算
异步保存更快 有独立缓冲 缓冲与训练争显存 → 变小 batch

10. 常见误区

误区 纠正
"1F1B 一定更快" 慢 3%,省的是显存
"气泡只跟阶段数有关" 还跟 m 有关:u = m/(m+p−1)
"checkpoint 越勤越好" 超过写带宽就积压
"保存完就能恢复" 要等提交完成
"RL 主要花在更新" 常花在 rollout 生成

11. 自测

  1. p=4、m=8,利用率多少?气泡多少 ms(t_f+t_b=30)?
  2. 填满排空与 1F1B 的时间与峰值显存各多少?为什么选 1F1B?
  3. 112 GB 快照、7 GB/s、每 20 s 一份,会积压吗?第 50 s 故障重做多少?
  4. 写带宽提到 20 GB/s,同一故障重做多少?
答案
  1. 8/11 ≈ 72.7%;气泡 3×30 = 90 ms。
  2. 337 ms / 2.57 GB vs 347 ms / 0.97 GB;容量只给 1 GB 时只有 1F1B 能跑。
  3. 需求 5.6 GB/s < 7,不积压;提交 36.5/56.5 s → 恢复到 20 s,重做 30 s。
  4. 提交 26.1/46.1 s → 恢复到 40 s,重做 10 s。

12. 下一篇

S23-J29 · 资源需求与环境生命周期 —— 进入第 11 章:一个集群的电力、制冷、网络与存储怎么配,从到货到退役要经历哪些阶段。

S23-J28 · 流水调度、checkpoint 与强化学习
https://www.clxhxhhr.top/posts/5555/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。