深度教堂

  • 榜单数据10-16 17:00
  • 论文数据10-16 13:30
  • 周报10-17 11:22

LLM 后训练工程与 Infra:把策略更新变成可靠流水线

未发布阅读约 14 分钟人工撰写已核查审核人 ai-fact-check

前沿研究与工程

本讲迁移自原课程讲义,经 AI 事实核查未发现存疑项,未逐页人工审核;如有出入,以原始论文和 CS285 课程资料为准。

第 17 讲前沿研究与工程前沿研究与工程(Offer Track)

学习目标

  • 给 policy/reference/reward/critic、KV cache、梯度与 optimizer state 做显存和生命周期账本。
  • 能设计 colocate、训推分离及异步队列,定义并控制策略版本陈旧度。
  • 推导 importance ratio、policy lag 一阶偏差、KL 的 k1/k2/k3 估计与有效吞吐。
  • 建立训练/系统联合监控、恢复协议和可执行 runbook;写出本地缩放与 8×GPU 配方。

算法式子只描述一次更新;后训练系统必须同时承载生成、打分、反传、权重发布与恢复。本讲从“单进程 PPO 为什么失效”出发,沿同步到全异步的演进,建立可量化的新鲜度—吞吐—收敛三角,并落到一个不虚构运行结果的 7B GRPO 项目。

学习目标

  • 给 policy/reference/reward/critic、KV cache、梯度与 optimizer state 做显存和生命周期账本。
  • 能设计 colocate、训推分离及异步队列,定义并控制策略版本陈旧度。
  • 推导 importance ratio、policy lag 一阶偏差、KL 的 k1/k2/k3 估计与有效吞吐。
  • 建立训练/系统联合监控、恢复协议和可执行 runbook;写出本地缩放与 8×GPU 配方。

先修与证据

先修:PPO/信赖域、GRPO 与 RLVR。本页不重复算法长推导,而回答“它如何稳定跑起来”。【A 原始论文】【B 官方代码/文档】【C 多方工程经验】【D 编者方案】;前沿事实最后核验:2026-07-11。

1. 目标、先修与系统账本:经典单进程 PPO 为何失效

1.1 旧做法 → 失败 → 转念

旧做法: 小型控制任务中,一个进程交替执行环境 rollout 与 actor-critic 更新,环境步便宜,网络相同,batch 长度近似。失败: LLM 的 rollout 是自回归推理,训练是全序列反向传播;前者依赖 KV cache、动态批处理和低延迟解码,后者依赖大矩阵、高带宽 collective 与 optimizer state。把二者塞进同一执行图,会让 GPU 在“显存腾挪—长尾等待—重新装权重”中产生气泡。关键转念: 后训练不是一个模型,而是带版本语义的数据流水线。

对象主要状态负载典型风险
policy/actor参数、梯度、optimizer训练 + 发布版本不一致、OOM
rollout policy推理权重、KV cache逐 token 解码P99 长尾、碎片
reference冻结参数计算 logprob/KL重复前向的成本
reward/verifierRM 或执行沙箱异构、可能 CPU/网络重超时、漏洞、非确定
critic(PPO)参数、梯度、optimizer训练前向/反向额外近一套训练状态

若参数量为 PP,混合精度参数、梯度和 Adam 一阶/二阶状态的朴素量级可达每参数约 12–20 bytes(取决于 master weights、分片和精度);KV cache 则近似随并发 BB、层数 LL、KV heads HkvH_{kv}、head 维 dd 与上下文 TT 线性增长:

MKV≈2BLHkvdT⋅belem.(17.1)M_{\mathrm{KV}}\approx 2BLH_{kv}dT\cdot b_{\mathrm{elem}}. \tag{17.1}

不能只报“模型能放下”

权重能放下不等于 RL 能运行。必须同时列峰值 activation、KV cache、通信 buffer、CUDA graph、碎片余量和 reward/verifier 峰值。预算保留 10%–20% 余量是工程策略,不是理论常数。

2. 架构演进:从严格 on-policy 到全异步

阶段关键转念收益代价/后续
同步 on-policy整批 rollout 后再更新数据语义最清楚最慢样本决定迭代时间
colocate训推共卡,sleep/wake 复用显存少机器、权重传输近模式切换和碎片,训练/推理不能真正重叠
训推分离rollout 与 learner 独立资源池负载各自优化,可并行权重广播和空闲配比
one-step-off-policy采第 vv 版时学第 v+1v{+}1 版隐藏一轮采样等待必须记录 behavior logprob 与版本
fully async样本流式入队、learner 连续消费吞吐与容错上限更高lag 分布、选择偏差、可复现性更难

为每条轨迹记录采样版本 vbv_b、消费版本 vℓv_\ell,定义步陈旧度与参数距离:

Δv=vℓ−vb,Dlag(x,y)=1T∑t∣log⁡πθℓ(yt∣st)−log⁡μθb(yt∣st)∣.(17.2)\Delta v=v_\ell-v_b,\qquad D_{\mathrm{lag}}(x,y)=\frac1T\sum_t\left|\log\pi_{\theta_\ell}(y_t|s_t)-\log\mu_{\theta_b}(y_t|s_t)\right|. \tag{17.2}

Δv\Delta v 易监控但不同更新幅度不可比;DlagD_{\mathrm{lag}} 更接近分布变化,却需要 learner 重算 logprob。生产中同时报 P50/P95/P99,设置硬 TTL、软降权和“版本差升高自动减慢 learner/扩 rollout”的背压。

核心主线

异步化不是把 on-policy 标签改名。系统每隐藏一段等待,就向统计估计借一笔偏差债;版本、behavior logprob 和队列年龄是偿债凭证。

3. 生产架构与框架职责边界

图 17-1:数据平面流动轨迹,控制平面发布不可变权重清单;评测不消费训练队列。

图 17-1:数据平面流动轨迹,控制平面发布不可变权重清单;评测不消费训练队列。

3.1 组件契约

  • actor/rollout worker: 输出 token、action mask、behavior logprob、采样参数、policy version;不得只传文本。
  • reward/verifier: 输出分项 reward、grader version、错误码、执行日志摘要;超时不是零分,应单独标记。
  • queue: 至少支持幂等 trajectory id、WAL/重放、TTL、配额和队列年龄;优先级采样要记录概率,否则改变训练分布。
  • broadcaster: 先写分片,再发布原子 manifest;worker 验 checksum 后切换,禁止半新半旧。
  • checkpoint/eval: checkpoint 保存 optimizer、scheduler、RNG、data cursor 与版本图;eval 使用隔离数据和固定解码协议。

3.2 工具不是同一层

层代表工具负责不负责
推理引擎vLLM / SGLangpaged KV、连续批处理、服务式生成RL 目标、optimizer、实验语义
RL 编排verl / HybridFlow 思路角色、数据流、训推切换/分离替代底层并行和正确 reward
资源/任务Rayactor、placement group、重启自动保证 on-policy 或 exactly-once
训练并行FSDP / DeepSpeed / Megatron参数/状态分片、ZeRO、张量/流水并行高效 token 解码和队列调度

选型原则

先写角色契约和瓶颈,再选实现。7B、8 卡常先用 FSDP/ZeRO + 独立推理服务;超大模型或跨节点通信成为主瓶颈时才引入更复杂的 TP/PP。框架组合必须用端到端 profile 证明,而非按流行度叠加。

4. 理论推导:importance ratio、policy lag 与 KL

轨迹由 behavior policy μ=πθb\mu=\pi_{\theta_b} 采样,learner 更新 πθ\pi_\theta。逐 token ratio:

rt(θ)=πθ(at∣st)μ(at∣st)=exp⁡{log⁡πθ(at∣st)−log⁡μ(at∣st)}.(17.3)r_t(\theta)=\frac{\pi_\theta(a_t|s_t)}{\mu(a_t|s_t)} =\exp\{\log\pi_\theta(a_t|s_t)-\log\mu(a_t|s_t)\}. \tag{17.3}

用 PPO clip 的近似目标(状态分布仍来自 μ\mu):

Lclip=Eτ∼μ∑tmin⁡(rtA^t,clip⁡(rt,1−ϵ,1+ϵ)A^t).(17.4)L^{\mathrm{clip}}=\mathbb E_{\tau\sim\mu}\sum_t\min\left(r_t\hat A_t,\operatorname{clip}(r_t,1-\epsilon,1+\epsilon)\hat A_t\right). \tag{17.4}

推导:policy lag 的一阶偏差直觉

假设

θ=θb+δ\theta=\theta_b+\delta,∥δ∥\|\delta\| 小;support 覆盖;暂忽略环境状态分布变化与优势估计误差。

对 log policy 一阶展开:log⁡πθb+δ(a∣s)−log⁡πθb(a∣s)≈δ⊤∇θlog⁡πθb(a∣s)\log\pi_{\theta_b+\delta}(a|s)-\log\pi_{\theta_b}(a|s)\approx \delta^\top\nabla_\theta\log\pi_{\theta_b}(a|s),故

rt≈1+δ⊤gt,gt=∇θlog⁡πθb(at∣st).(17.5)r_t\approx 1+\delta^\top g_t,\qquad g_t=\nabla_\theta\log\pi_{\theta_b}(a_t|s_t). \tag{17.5}

若错误地把旧样本当作当前 on-policy、令 rt=1r_t=1,梯度缺失项一阶量级为 E[(δ⊤gt)gtA^t]\mathbb E[(\delta^\top g_t)g_t\hat A_t];若使用 ratio,可修正动作条件分布,但不能完全修正由旧策略造成的状态/前缀分布与 A^t\hat A_t 漂移。序列乘积 ratio 又随长度指数方差。因此实践使用逐 token clip、短 TTL 和 lag 诊断,而不是宣称“importance sampling 已消除异步偏差”。

4.1 KL 的三种 Monte Carlo 估计

令 x=log⁡p(a)−log⁡q(a)x=\log p(a)-\log q(a),样本从 pp 采。常见估计:

k1=x,k2=12x2,k3=e−x−1+x.(17.6)k_1=x,\qquad k_2=\tfrac12x^2,\qquad k_3=e^{-x}-1+x. \tag{17.6}
  • k1k_1 是 KL(p∥q)\mathrm{KL}(p\|q) 的无偏样本估计,但单样本可为负、方差高。
  • k2k_2 非一般无偏;仅在 p≈qp\approx q 时由二阶近似接近 KL,优点是非负。
  • k3k_3 非负,因为 e−x≥1−xe^{-x}\ge1-x;且在 a∼pa\sim p 时 Ep[e−x]=∑aq(a)=1\mathbb E_p[e^{-x}]=\sum_a q(a)=1,故期望等于 Ep[x]=KL(p∥q)\mathbb E_p[x]=\mathrm{KL}(p\|q),前提是共同 support 与精确采样。

两个 KL 不要混

policy-to-reference KL 控制能力/风格漂移;learner-to-behavior KL 衡量异步 lag。前者小不代表样本新鲜,后者小也不代表未偏离 SFT 锚点。

5. 吞吐、利用率与有效样本率

端到端 wall time 不是 tokens/s 的同义词。定义 rollout、reward、learner、同步阶段耗时 Tr,Tv,Tl,TsT_r,T_v,T_l,T_s。同步系统近似:

Titer=Tr+Tv+Tl+Ts,Upipe=TusefulNGPUTwall.(17.7)T_{\mathrm{iter}}=T_r+T_v+T_l+T_s,\qquad \mathcal U_{\mathrm{pipe}}=\frac{T_{\mathrm{useful}}}{N_{\mathrm{GPU}}T_{\mathrm{wall}}}. \tag{17.7}

理想训推分离可把关键路径逼近 max⁡(Tr+Tv,Tl)+Ts\max(T_r+T_v,T_l)+T_s,但只有队列稳定时成立。若到达率 λ\lambda 长期大于 learner 服务率 μ\mu,队列年龄发散。把通过格式/验证、未超 TTL、未因全同 reward 而零优势且未被 clip 饱和的 token 视为有效:

ESR=Nvalid,fresh,informativeNgenerated,Effective TPS=Generated TPS×ESR.(17.8)\mathrm{ESR}=\frac{N_{\mathrm{valid,fresh,informative}}}{N_{\mathrm{generated}}},\quad \mathrm{Effective\ TPS}=\mathrm{Generated\ TPS}\times\mathrm{ESR}. \tag{17.8}

这揭示“生成更快但学得更慢”的常见反例:过时样本、超长错误答案或零方差组把 raw TPS 转成热量,而非梯度信息。

症状先看可能动作
rollout GPU 低利用batch occupancy、KV 命中、P99 length长度桶、连续批处理、限制极端上限
learner 饥饿queue depth、verifier timeout扩 rollout/verifier、降低更新频率
队列持续增长lag P95、消费率背压/丢弃 TTL、扩 learner、减采样
TPS 高而 reward 不动ESR、组 reward 方差、clip fraction重采 prompt、修 verifier、减 lag

6. 工程实现、指标与监控

# 轨迹契约(伪代码)
Trajectory {
  id, prompt_id, dataset_version, policy_version, tokenizer_hash,
  prompt_tokens, response_tokens, action_mask, behavior_logprobs,
  sampling_config, reward_components, grader_version, terminal_reason,
  rollout_started_at, scored_at, checksum
}

while true:
  batch = queue.take(max_age_steps=2, same_tokenizer=true)
  current_logp = learner.logprob(batch)
  lag = mean_abs(current_logp - batch.behavior_logprobs)
  if lag.p95 > threshold: quarantine_or_downweight(batch)
  loss = clipped_objective(batch, current_logp)
  atomic_step(loss)
  if publish_due: broadcaster.publish(checkpoint_manifest())
面板必须联合观察红旗
学习reward 总/分项、KL-ref、entropy、length、clip fraction、grad normreward 涨但独立 eval 跌;熵/长度单向漂移
数值loss scale、NaN/Inf、最大 logit、零梯度层grad norm 尖峰后 reward 归零
系统generated/learned tokens/s、GPU util/memory、通信占比利用率高但 effective TPS 低
尾延迟rollout P50/P95/P99、verifier P99、timeoutP99 拉长同步 barrier
队列/版本depth、age、drop、Δv\Delta v、DlagD_{\rm lag}版本长尾持续扩张

核验至 2026-07-11

服务式 rollout、动态批处理、训推分离与受控异步是公开系统的活跃方向;任何具体倍数都依模型、长度分布、网络与资源配比而变。本文不将官方 benchmark 外推为通用结论。

7. Checkpoint、恢复、确定性与故障诊断树

7.1 恢复协议

  1. checkpoint 采用不可变目录:权重分片、optimizer、scheduler、AMP scaler、全局 step、RNG、数据 cursor、代码/镜像/配置 hash。
  2. 全部分片落盘并校验后,原子写 COMMITTED manifest;broadcaster 只发布 committed 版本。
  3. 重启先恢复 learner,再恢复 queue WAL;按 trajectory id 去重。旧轨迹是否保留由 TTL 与 behavior version 决定。
  4. 做 shadow forward:固定 batch 比较 logits/logprob 容差;随后 canary 小更新,再扩容。

确定性边界: 固定 seed 不足以保证 bitwise 重现;异步到达顺序、动态 batching、非确定 CUDA kernel 与浮点规约都会改变轨迹。研究报告应承诺“统计复现”(多 seed 置信区间),并为单步 debug 提供 deterministic 小模式。

7.2 数值与 OOM

  • BF16 通常比 FP16 有更大指数范围;敏感归约、reward 标准化和 log-ratio 可升到 FP32。不要先把所有 NaN 用 clamp 隐藏。
  • OOM 分为静态参数、activation 峰值、KV cache、通信 buffer 与碎片;先用 memory snapshot 定位,再调整 microbatch、checkpointing、长度/并发或分片。
  • 数据必须版本化 prompt、过滤器、模板、tokenizer 与 grader;“同名数据集”不是可复现标识。

故障诊断树:reward 突降或 NaN

reward/独立 eval 异常
├─ loss/grad 出现 NaN/Inf?
│  ├─ 是 → 定位首个坏 tensor → 检查 log-ratio/除零/AMP
│  │       → 回滚 committed ckpt → 降 LR/缩 microbatch → canary
│  └─ 否
├─ grader error/timeout 上升?
│  ├─ 是 → 隔离 verifier 版本;超时样本不当零分;重放 golden set
│  └─ 否
├─ policy lag/queue age 上升?
│  ├─ 是 → 启动背压;丢弃 TTL;验证权重 manifest/checksum
│  └─ 否
├─ entropy↓、length↑、clip fraction↑?
│  ├─ 是 → 疑似坍缩/长度 hack;停训并做人审与固定集 eval
│  └─ 否 → 检查数据版本/模板/tokenizer 与重复样本

8. 项目:7B GRPO 的两级配方

诚实边界

以下是可执行实验设计,未在本机或本仓库实际训练;显存、耗时与费用只能在目标硬件 dry-run 后填写,不能把预算估计写成结果。

8.1 共同任务与验收

选许可清晰、可程序验证的数学子集;冻结 3 份:train、开发集、从未参与 prompt/reward 调试的 hidden test。每 prompt 组采样 GG 个回答,reward 分为答案正确、格式、超长惩罚;同时保留纯正确性对照。

A^i=Ri−Rˉmax⁡(sR,ε),L=−1∑i∣yi∣∑i,tmitmin⁡(ritA^i,clip⁡(rit,1−ϵ,1+ϵ)A^i).(17.9)\hat A_i=\frac{R_i-\bar R}{\max(s_R,\varepsilon)},\qquad L=-\frac1{\sum_i|y_i|}\sum_{i,t}m_{it}\min(r_{it}\hat A_i,\operatorname{clip}(r_{it},1-\epsilon,1+\epsilon)\hat A_i). \tag{17.9}

验收门:训练前 dry-run 通过;无 NaN/OOM;hidden pass@1 相对固定 SFT baseline 有预注册提升且 95% paired bootstrap CI 不跨 0;KL/长度在预设护栏;至少 3 seeds;提交失败样本与成本。

8.2 本地缩放版(算法/数据管线验证)

模型0.5B–1.5B instruct/base(7B 配方的缩放替身,不声称等价)
资源单张可用 GPU;LoRA/QLoRA 可用于接线验证,但与 full-parameter 结果分开
配置起点G=4G=4,max prompt 512,response 512–1024,BF16(硬件支持时),microbatch=1,grad accumulation 调全局 batch
预算先 32 prompt smoke,再 200–1000 prompt 短跑;以实测 tokens/s 推算,不预填小时数
产物schema 样例、单步 loss 对账、reward golden tests、监控截图、恢复演练记录

8.3 8×GPU/集群版(7B 目标)

拓扑方案 A:4 卡 rollout + 4 卡 learner;方案 B:8 卡 colocate。先各跑同 token 预算 profile 决策
训练7B、FSDP/ZeRO-3,BF16,activation checkpoint,G=8G=8 起步,global prompts/batch 32–128 由显存验证
推理vLLM/SGLang 服务模式,记录引擎 commit、TP、KV cache 配额、采样参数;权重原子发布
新鲜度先同步基线;异步实验分别预注册 Δv≤1\Delta v\le1 与 Δv≤2\Delta v\le2,超 TTL 丢弃并报告 ESR
预算表GPU-hours = GPU 数×wall-hours;另报 generated/accepted/learned tokens 与 verifier CPU-hours
停止条件hidden eval 连续两次下降、KL/entropy 越界、grader 漏洞、NaN 或 lag P95 超阈值

8.4 消融矩阵

轴取值主测量
架构colocate / disaggregateeffective TPS、GPU-hours、P99
新鲜度sync / lag≤1 / lag≤2hidden pass@1、clip、lag KL
组大小4 / 8 / 16reward 方差、零方差组、成本
KL无 / 固定 β\beta / 自适应能力、长度、漂移
归一化序列 / token 聚合长度偏置、稳定性

9. 可证伪实验、RS/RE 面试与一手来源

9.1 三个可证伪命题

  1. “异步更快且不伤质量”: 固定 generated tokens 与超参,对比 sync、lag≤1、lag≤2;若 wall time 降但 hidden score/有效 token 不升,则强主张失败。
  2. “训推分离优于 colocate”: 固定硬件与 token 预算,扫长度分布。若短序列下传权重成本超过重叠收益,结论只在长尾条件成立。
  3. “raw TPS 可代表系统好坏”: 注入 10% verifier timeout/陈旧样本;若 TPS 不变而 ESR/质量下降,代理指标被证伪。

9.2 面试问题

RS(研究科学家)RE(研究工程师)
逐 token IS 为何不能完全修正状态分布 lag?设计原子权重发布,如何避免 worker 混用分片?
k1/k2/k3 的偏差、方差和采样方向是什么?queue depth 上升但 GPU util 很高,如何定位?
如何证明异步收益不是额外样本预算造成?checkpoint 中哪些非权重状态缺失会静默改变实验?
长度分布如何同时影响估计器与系统吞吐?7B 在 8 卡 colocate/disaggregate 如何做容量规划?

9.3 论文与一手来源

  • 【A】 Schulman et al., Proximal Policy Optimization Algorithms, 2017;importance ratio 与 clipped surrogate。
  • 【A】 Shao et al., DeepSeekMath, 2024;GRPO。算法 canonical 讲解见模块 13。
  • 【A】 Sheng et al., HybridFlow / verl, EuroSys 2025;RL 数据流抽象与系统设计。
  • 【B】 verl、vLLM、SGLang、PyTorch FSDP、DeepSpeed、Megatron-Core、Ray 官方文档与代码仓库(具体行为以锁定 commit 为准)。
  • 【A】 vLLM(PagedAttention)与 SGLang 相关系统论文;推理引擎能力须按版本核验。
  • 【C】 异步 LLM-RL 的吞吐/收敛经验;本文只作为待复现实践,不把特定集群倍数当一般事实。

10. 复现清单与交付标准

  • □ 锁定模型、tokenizer、代码、容器、驱动、数据、grader 与配置 hash;保存硬件拓扑。
  • □ 单步对账:behavior/current/ref logprob、mask、reward、advantage、loss 与梯度符号。
  • □ 记录 reward/KL/entropy/length/clip/grad/NaN、TPS/util/P50/P99/queue/lag 全套指标。
  • □ 完成 OOM、verifier timeout、worker 崩溃、坏 checkpoint、网络分区五类注入演练。
  • □ 以同步基线、同 token/同 GPU-hour 双口径比较;报告 ESR 与失败样本,不只报峰值 TPS。
  • □ 至少三 seed;hidden eval 与训练 grader 隔离;明确所有未运行或估算项。

带走一句话

成熟的 RL infra 不追求“所有 GPU 永远 100%”,而追求每一个被计算的 token 都有明确版本、统计意义、恢复路径和可审计成本。

参考来源

  1. [1]CS 285: Deep Reinforcement Learning(UC Berkeley)(在新窗口打开)UC Berkeley · 访问于 2026-10-16