这份路线图按照训练数据流与工程依赖组织 verl 源码阅读。顺序不追随仓库目录,也不同时展开所有算法和 backend:先建立一条能够闭合的同步训练链,再沿着数据、算法、调度、执行后端和异步系统逐层深入。
项目定位、系统地图与固定源码版本见 verl Source Reading。
路线总览
sync GRPO 闭环
-> config 与 batch lifecycle
-> rollout / reward / AgentLoop
-> advantage / policy loss / PPO comparison
-> Single Controller / Ray
-> FSDP / Megatron backend
-> hybrid engine / weight sync
-> agentic RL
-> async / off-policy每一轮都沿用前一轮已经确认的对象和字段。新的专题只增加必要变量:从 GRPO 到 PPO 时增加 critic / value / GAE;从 FSDP 到 Megatron 时替换 worker-side execution;从 sync 到 async 时增加 policy version 与 replay semantics。
SFT 不作为 RL 阅读路线中的一轮,而作为一条辅助对照路径单独阅读:verl SFT Training Path。它用于建立 messages -> loss_mask -> sft_loss -> TrainingWorker -> engine -> checkpoint 的监督训练链,并帮助区分通用 engine 能力与 RL 特有的 rollout、reward、advantage 逻辑。
第一轮:Sync GRPO 闭环
核心问题
一次 sync GRPO update 如何从 prompt 开始,
经过 rollout、reward 和 advantage,最终完成 actor update?阅读入口
阅读产物
当前已经完成固定 revision 下的静态调用链、session / trajectory 层级、字段 lineage、batch-size 语义和 FSDP baseline 边界;下一步是用最小 GPU run 将实际 shape、device、timing 和 weight version 回填为 tested behavior。
第二轮:Config 与数据生命周期
核心问题
- shell overrides 如何经过 Hydra composition 变成最终 runtime config?
RLHFDataset、TensorDict、DataProto、KVBatchMeta各自处于哪一层?- TransferQueue 为什么将 tag 与 value 分开?
- nested、padded、DP-balanced 和 micro-batch representation 如何转换?
阅读顺序
ppo_trainer.yaml and config groups
-> Hydra resolved config
-> RLHFDataset / collate_fn
-> prompt uid
-> AgentLoopOutput
-> TransferQueue fields
-> ReplayBuffer materialization
-> worker dispatch阅读产物
这一轮完成后,应能从任意一个训练字段反向回答它的 producer、consumer、shape、mask、存储位置和生命周期。
第三轮:Rollout、Reward 与 AgentLoop
核心问题
- 为什么 V1 将普通单轮生成也统一放入 AgentLoop?
rollout.n如何形成同一 prompt 的多个独立 sessions?- multi-turn trajectory 中哪些 token 是 policy action,哪些是 observation?
- rule-based reward、custom reward 和 reward model 分别在哪里执行?
- reward 是在 rollout 过程中并行计算,还是在采样后 colocated 计算?
阅读顺序
AgentLoopManager
-> AgentLoopWorker
-> SingleTurnAgentLoop / ToolAgentLoop
-> LLMServerManager
-> AgentLoopOutput / response_mask
-> RewardLoopWorker / RewardLoopManager
-> rm_scores阅读产物
第四轮:Advantage 与 Policy Loss
核心问题
rm_scores
-> token_level_scores / rewards
-> advantages / returns
-> old / reference / current log-prob
-> policy loss / KL loss先完成 GRPO outcome advantage、group normalization、loss mask 和 vanilla PPO loss,再加入 critic、value inference、GAE 与 value loss。算法变体只有在 baseline 字段链明确之后再展开。
从 GRPO 切换到 PPO 时,只追踪新增分支:
critic initialization
-> value inference
-> GAE and returns
-> critic update阅读产物
第五轮:Single Controller 与 Ray
核心问题
controller 上的一次 Python method call,
如何变成多个 GPU worker 上的分布式执行?依次追踪 @register、dispatch / collect、WorkerGroup、ResourcePool、colocated worker class 和 Ray actor handle。重点不是罗列 Ray API,而是建立:
logical role
-> resource pool
-> worker group
-> dispatch mode
-> DP / model-parallel rank
-> returned metadata or tensors阅读产物
第六轮:Model Engine 与 Training Backend
核心问题
- 公共
TrainingWorker如何调用不同 model engine? - 相同的全局 PPO mini-batch 如何映射到不同 process-group topology?
- FSDP 的 shard mesh、Ulysses SP 与 logical DP 如何关联?
- Megatron 的 TP / PP / CP / DP / EP 如何改变 batch、forward-backward 和 optimizer?
- checkpoint 与参数导出的 backend contract 是否一致?
先用 FSDP 解释公共 engine contract,再用同一组 controller-level 输入映射到 Megatron。对照时保持 rollout、reward 和 advantage 不变,只替换 worker-side execution,避免把算法差异与 backend 差异混在一起。
阅读产物
第七轮:Hybrid Engine 与 Weight Sync
核心问题
actor training weights
-> model-engine parameters
-> checkpoint / direct / delta transport
-> rollout replica
-> next policy version重点追踪 LLMServerManager、CheckpointEngineManager、sleep / wake、KV cache、abort / resume 和 update_weights。需要明确区分 rollout policy、old policy、current actor 和 reference policy,记录它们在每个时刻对应的版本。
阅读产物
第八轮:Agentic RL
核心问题
assistant generation
-> tool call
-> tool execution
-> observation
-> next assistant generation
-> termination / reward这一轮集中检查 chat template、continuous token construction、response / loss mask、turn state、tool result truncation、failure handling、terminal reward 和 trajectory-level credit assignment。普通 language-model response 与 environment observation 必须在 token、mask 和 reward 三个层面保持边界一致。
阅读产物
第九轮:Async 与 Off-policy
最后比较 V1 的 sync、colocate_async 和 separate_async:
- rollout 与 training 是否共享 GPU;
- generation 与 optimization 是否重叠;
- rollout 是否跨越多个 actor versions;
- ReplayBuffer 如何判断 trajectory 可训练性;
- stale group 如何 drop、wait 或 refill;
- old log-prob 如何作为 proximal anchor;
- rollout correction、partial rollout 和 parameter sync cadence 如何影响训练分布。
这一轮必须以已经完成的 sync 数据流为对照。异步系统增加的是时间和版本维度,不应重新发明 prompt、reward 和 advantage 的基本语义。
阅读产物
完成标准
完成这组源码阅读后,应能够独立回答:
- 一个 prompt 如何形成
rollout.n条独立 sessions; - session、AgentLoopOutput、trajectory key 和多轮 turn 分别是什么;
- reward、advantage、old/reference/current log-prob 在哪里产生;
train_batch_size、ppo_mini_batch_size、rollout.n和 DP 如何共同决定 batch;- GRPO 和 PPO 在相同 trainer 中经过哪些不同分支;
- Ray WorkerGroup 如何把 controller 调用映射到分布式 workers;
- FSDP 与 Megatron 为什么会给同一全局 batch 不同的本地执行布局;
- actor update 后 rollout engine 如何获得新权重;
- multi-turn observation 为什么不能进入 policy loss;
- async trainer 的 off-policy 来自哪些 policy-version 差异;
- 训练异常应从 rollout、reward、advantage、loss、调度、backend 还是 weight sync 哪一层定位。