学习路线
这份路线面向刚进入 LLM post-training 的读者。你不需要一开始就会强化学习、Ray 或 Megatron,但要学会一件事:把一个训练 batch 从 prompt、rollout、reward、advantage 一直追到 actor update。
这个站怎么学
不要把 verl 当成一棵文件树硬啃。更好的读法是:
- 先用 预备概念 建立语言:policy、reward、KL、advantage、rollout、DataProto 到底指什么。
- 再用 源码地图 看一条样本如何流过
RayPPOTrainer.fit()。 - 然后读一个算法页,例如 PPO 或 GRPO,把公式变量和源码字段对齐。
- 最后读一个工程页,例如 Workers 或 Rollout,理解为什么 verl 要把控制流和计算流拆开。
每章末尾的“参考与延伸阅读”不是装饰。读源码时,建议按“本节源码 -> 本节官方文档 -> 论文/网页”的顺序回看。
7 天入门路线
这条路线目标是让你能读懂一次 GSM8K PPO/GRPO 训练的主线日志,而不是马上改框架。
| 天数 | 今天要学会什么 | 阅读 | 产出 |
|---|---|---|---|
| Day 1 | 分清 RLHF、RLVR、SFT、DPO、PPO、GRPO 的关系 | 预备概念 | 能解释 actor、ref、critic、reward 的职责 |
| Day 2 | 看懂一次 batch 的生命线 | 源码地图 | 能画出 DataProto -> rollout -> reward -> advantage -> update |
| Day 3 | PPO 为什么要 clip、GAE、KL | PPO | 能把 old_log_probs、log_probs、advantages 对到公式 |
| Day 4 | GRPO 为什么常用于 RLVR | GRPO | 能解释 uid、rollout.n、组内 reward 标准化 |
| Day 5 | 跟着 trainer 主循环读源码 | Trainer Loop | 能在 RayPPOTrainer.fit() 里找到生成、打分、更新 |
| Day 6 | 奖励函数如何接入 | Reward、奖励函数 | 能写一个规则 reward 并知道返回值放在哪里 |
| Day 7 | 用 GSM8K 串完整流程 | GSM8K PPO | 能解释脚本里每个关键配置影响哪段源码 |
14 天进阶路线
第二周建议把“算法差异”和“工程抽象”分开学。算法回答“训练信号怎么构造”,工程回答“这些信号怎样在多 GPU、多 worker、多推理后端之间流动”。
| 模块 | 你要回答的问题 | 推荐阅读 |
|---|---|---|
| DAPO-style recipe | 它是在 GRPO/PPO 主线上改了哪些训练细节? | DAPO-style 训练 |
| REINFORCE 家族 | 没有 critic 时,baseline 如何降低方差? | REINFORCE 家族 |
| Policy loss 变体 | 为什么同一个 actor update 会有 GPG、GSPO、CISPO 等 loss? | Policy loss 变体 |
| Rollout Correction | rollout policy 和 train policy 不一致时,为什么要修正? | Rollout Correction |
| OPD | teacher 的 token-level 信号如何进入 on-policy 数据? | OPD |
| DataProto | 为什么 verl 不直接传 Python dict? | DataProto |
| Workers | @register、dispatch mode、RayWorkerGroup 如何把远端 worker 包成本地调用? | Workers |
| Rollout | vLLM/SGLang 为什么是服务,而不是普通 generate()? | Rollout |
| Config | 命令行 override 如何进入 trainer 和 worker? | Config |
深入源码路线
深入时不要从目录树开始,而要从 RayPPOTrainer.fit() 的一条样本开始:
- dataloader 产出
batch_dict,包含 token tensor 和data_source、reward_model、extra_info等非 tensor 信息。 DataProto.from_single_dict()把它拆成batch、non_tensor_batch、meta_info。_get_gen_batch()保留 reward 所需字段,并准备送入 rollout 的 prompt。rollout.n将同一 prompt repeat 多次,GRPO/RLOO 等算法要靠这些 sibling responses 做比较。async_rollout_manager.generate_sequences()调 vLLM/SGLang 生成 response。- reward manager 或 reward loop 写入
rm_scores/token_level_scores。 _compute_old_log_prob()、_compute_ref_log_prob()、_compute_values()补齐训练信号。compute_advantage()根据algorithm.adv_estimator调 GAE、GRPO、RLOO、ReMax 等估计器。_update_critic()和_update_actor()把DataProto转成TensorDict,经 no-padding 转换后派发给 worker。checkpoint_manager.update_weights()把 actor 新权重同步到 rollout 引擎,进入下一轮生成。
学会这条线之后,verl 的目录会自然展开:trainer 负责控制流,core_algos 负责公式,protocol.py 负责数据协议,workers 负责远端计算,rollout 负责生成服务,reward_manager 负责评价。
读源码时的检查题
读完一章后,建议用这几个问题检查自己是不是只“看过”,还是已经“读懂”:
| 检查题 | 如果答不上来,回看 |
|---|---|
这个概念在 DataProto.batch、non_tensor_batch 还是 meta_info 里? | DataProto |
这个张量的 shape 是 [batch, response_length] 还是每条 response 一个 scalar? | 源码地图、PPO |
| 这个算法有没有 critic?如果没有,baseline 从哪里来? | GRPO、REINFORCE 家族 |
这个 worker 方法是 ONE_TO_ALL 还是按 data parallel 切 batch? | Workers |
| 这个配置字段最终被 trainer、actor worker、rollout server 还是 reward manager 使用? | Config |
本节参考与延伸阅读
docs/hybrid_flow.rst:解释 HybridFlow 为什么把 RL 控制流和大模型计算流拆开。docs/examples/ppo_code_architecture.rst:官方 PPO 代码架构导览。docs/workers/ray_trainer.rst:RayPPOTrainer 的数据准备、worker 初始化和训练循环。verl/trainer/ppo/ray_trainer.py:学习路线最终都要回到RayPPOTrainer.fit()。verl/protocol.py:理解DataProto后,后续章节会轻松很多。