LLM 后训练工程与 Infra:把策略更新变成可靠流水线
本讲迁移自原课程讲义,经 AI 事实核查未发现存疑项,未逐页人工审核;如有出入,以原始论文和 CS285 课程资料为准。
学习目标
- 给 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/verifier | RM 或执行沙箱 | 异构、可能 CPU/网络重 | 超时、漏洞、非确定 |
| critic(PPO) | 参数、梯度、optimizer | 训练前向/反向 | 额外近一套训练状态 |
若参数量为 ,混合精度参数、梯度和 Adam 一阶/二阶状态的朴素量级可达每参数约 12–20 bytes(取决于 master weights、分片和精度);KV cache 则近似随并发 、层数 、KV heads 、head 维 与上下文 线性增长:
不能只报“模型能放下”
权重能放下不等于 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 | 采第 版时学第 版 | 隐藏一轮采样等待 | 必须记录 behavior logprob 与版本 |
| fully async | 样本流式入队、learner 连续消费 | 吞吐与容错上限更高 | lag 分布、选择偏差、可复现性更难 |
为每条轨迹记录采样版本 、消费版本 ,定义步陈旧度与参数距离:
易监控但不同更新幅度不可比; 更接近分布变化,却需要 learner 重算 logprob。生产中同时报 P50/P95/P99,设置硬 TTL、软降权和“版本差升高自动减慢 learner/扩 rollout”的背压。
核心主线
异步化不是把 on-policy 标签改名。系统每隐藏一段等待,就向统计估计借一笔偏差债;版本、behavior logprob 和队列年龄是偿债凭证。
3. 生产架构与框架职责边界
图 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 / SGLang | paged KV、连续批处理、服务式生成 | RL 目标、optimizer、实验语义 |
| RL 编排 | verl / HybridFlow 思路 | 角色、数据流、训推切换/分离 | 替代底层并行和正确 reward |
| 资源/任务 | Ray | actor、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 采样,learner 更新 。逐 token ratio:
用 PPO clip 的近似目标(状态分布仍来自 ):
推导:policy lag 的一阶偏差直觉
假设
, 小;support 覆盖;暂忽略环境状态分布变化与优势估计误差。
对 log policy 一阶展开:,故
若错误地把旧样本当作当前 on-policy、令 ,梯度缺失项一阶量级为 ;若使用 ratio,可修正动作条件分布,但不能完全修正由旧策略造成的状态/前缀分布与 漂移。序列乘积 ratio 又随长度指数方差。因此实践使用逐 token clip、短 TTL 和 lag 诊断,而不是宣称“importance sampling 已消除异步偏差”。
4.1 KL 的三种 Monte Carlo 估计
令 ,样本从 采。常见估计:
- 是 的无偏样本估计,但单样本可为负、方差高。
- 非一般无偏;仅在 时由二阶近似接近 KL,优点是非负。
- 非负,因为 ;且在 时 ,故期望等于 ,前提是共同 support 与精确采样。
两个 KL 不要混
policy-to-reference KL 控制能力/风格漂移;learner-to-behavior KL 衡量异步 lag。前者小不代表样本新鲜,后者小也不代表未偏离 SFT 锚点。
5. 吞吐、利用率与有效样本率
端到端 wall time 不是 tokens/s 的同义词。定义 rollout、reward、learner、同步阶段耗时 。同步系统近似:
理想训推分离可把关键路径逼近 ,但只有队列稳定时成立。若到达率 长期大于 learner 服务率 ,队列年龄发散。把通过格式/验证、未超 TTL、未因全同 reward 而零优势且未被 clip 饱和的 token 视为有效:
这揭示“生成更快但学得更慢”的常见反例:过时样本、超长错误答案或零方差组把 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 norm | reward 涨但独立 eval 跌;熵/长度单向漂移 |
| 数值 | loss scale、NaN/Inf、最大 logit、零梯度层 | grad norm 尖峰后 reward 归零 |
| 系统 | generated/learned tokens/s、GPU util/memory、通信占比 | 利用率高但 effective TPS 低 |
| 尾延迟 | rollout P50/P95/P99、verifier P99、timeout | P99 拉长同步 barrier |
| 队列/版本 | depth、age、drop、、 | 版本长尾持续扩张 |
核验至 2026-07-11
服务式 rollout、动态批处理、训推分离与受控异步是公开系统的活跃方向;任何具体倍数都依模型、长度分布、网络与资源配比而变。本文不将官方 benchmark 外推为通用结论。
7. Checkpoint、恢复、确定性与故障诊断树
7.1 恢复协议
- checkpoint 采用不可变目录:权重分片、optimizer、scheduler、AMP scaler、全局 step、RNG、数据 cursor、代码/镜像/配置 hash。
- 全部分片落盘并校验后,原子写
COMMITTEDmanifest;broadcaster 只发布 committed 版本。 - 重启先恢复 learner,再恢复 queue WAL;按 trajectory id 去重。旧轨迹是否保留由 TTL 与 behavior version 决定。
- 做 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 组采样 个回答,reward 分为答案正确、格式、超长惩罚;同时保留纯正确性对照。
验收门:训练前 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 结果分开 |
| 配置起点 | ,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, 起步,global prompts/batch 32–128 由显存验证 |
| 推理 | vLLM/SGLang 服务模式,记录引擎 commit、TP、KV cache 配额、采样参数;权重原子发布 |
| 新鲜度 | 先同步基线;异步实验分别预注册 与 ,超 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 / disaggregate | effective TPS、GPU-hours、P99 |
| 新鲜度 | sync / lag≤1 / lag≤2 | hidden pass@1、clip、lag KL |
| 组大小 | 4 / 8 / 16 | reward 方差、零方差组、成本 |
| KL | 无 / 固定 / 自适应 | 能力、长度、漂移 |
| 归一化 | 序列 / token 聚合 | 长度偏置、稳定性 |
9. 可证伪实验、RS/RE 面试与一手来源
9.1 三个可证伪命题
- “异步更快且不伤质量”: 固定 generated tokens 与超参,对比 sync、lag≤1、lag≤2;若 wall time 降但 hidden score/有效 token 不升,则强主张失败。
- “训推分离优于 colocate”: 固定硬件与 token 预算,扫长度分布。若短序列下传权重成本超过重叠收益,结论只在长尾条件成立。
- “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 都有明确版本、统计意义、恢复路径和可审计成本。