verl 代码库学习指南
verl 代码库学习指南
适合对 LLM 强化学习训练框架感兴趣、想深入理解 verl 代码的开发者。
一、项目简介
verl(Volcano Engine Reinforcement Learning)是字节跳动开源的、面向 LLM 后训练(Post-Training)的强化学习框架,是 HybridFlow 论文 的开源实现。
核心目标:
- 灵活支持多种 RL 算法(PPO、GRPO、DAPO 等)
- 高效集成主流 LLM 训练/推理框架(FSDP、Megatron-LM、vLLM、SGLang)
- 支持灵活的 GPU 资源分配与并行策略
二、总体架构
2.1 设计哲学:Hybrid-Controller(混合控制器)
verl 采用 HybridFlow 架构,融合了两种编程范式:
┌─────────────────────────────────────────────────────────┐
│ High-Level Single-Controller (MPMD) │
│ RLTrainer(单一进程)— 管理全局计算图、调度各阶段任务 │
│ ↓ 调用 │
│ Internal Multi-Controller (SPMD) │
│ Model Engine Workers — 执行重型分布式计算(FSDP/Megatron)│
└─────────────────────────────────────────────────────────┘
| 层次 | 角色 | 实现 |
|---|---|---|
| 单控制器 | 全局调度、数据流管理 | RLTrainer (Python 单进程 + Ray) |
| 多控制器 | 执行具体的前向/反向/推理 | Worker 进程(SPMD,集合通信) |
2.2 两层架构:verl-core + verl-trainer
┌──────────────────────────────────────┐
│ verl-trainer │
│ On-Policy / Async / Fully-Async │ ← 面向场景的完整训练流水线
├──────────────────────────────────────┤
│ verl-core │
│ Model Engine | Rollout Engine │ ← 可插拔的核心组件
│ Checkpoint Engine | TransferQueue │
└──────────────────────────────────────┘
三、核心组件详解
3.1 Model Engine(模型引擎)
位置:verl/workers/engine/
负责模型的训练计算,提供统一抽象接口(BaseEngine),支持多种后端:
| 后端 | 并行方式 | 文件 |
|---|---|---|
| FSDP | FSDP + SP | verl/workers/engine/fsdp/ |
| Megatron-LM | DP+TP+PP+EP+CP | verl/workers/engine/megatron/ |
| VeOmni | FSDP+SP+EP | verl/workers/engine/veomni/ |
核心接口(BaseEngine):
initialize() # 初始化模型、优化器、LR scheduler
forward_backward_batch() # 前向 + 反向传播
optimizer_step() # 优化器更新
get_per_tensor_param() # 获取模型参数(用于权重同步)
to(device) # 模型/优化器 CPU↔GPU 迁移
调用链:TrainingWorker(verl/workers/engine_workers.py)封装了 BaseEngine,并通过 @register 装饰器暴露给单控制器调用。
3.2 Rollout Engine(推理引擎)
位置:verl/workers/rollout/
负责 LLM 推理/采样,采用 Server 模式(LLM 作为在线服务):
AgentLoop(客户端)
↓ HTTP 请求(per-sample)
LLM Server(vLLM / SGLang / TRT-LLM)
↓ 动态批处理
多卡推理 Workers
AgentLoop 抽象(verl/workers/rollout/base.py):
SingleTurnAgentLoop:单轮对话ToolAgentLoop:ReAct 多轮工具调用- 用户可自定义(如 SWEAgentLoop、GUIAgentLoop)
各推理后端目录:
| 后端 | 目录 |
|---|---|
| vLLM | verl/workers/rollout/vllm_rollout/ |
| SGLang | verl/workers/rollout/sglang_rollout/ |
| TensorRT-LLM | verl/workers/rollout/trtllm_rollout/ |
3.3 Single-Controller(单控制器)
位置:verl/single_controller/
这是 verl 的"大脑",实现了 Trainer 对 Workers 的统一调度:
verl/single_controller/
├── base/
│ ├── worker.py # Worker 基类
│ ├── worker_group.py # WorkerGroup、ResourcePool 抽象
│ └── decorator.py # @register 装饰器、Dispatch 枚举
└── ray/
├── base.py # Ray 实现的 RayWorkerGroup
└── __init__.py
关键概念:
ResourcePool:管理一组 GPU 资源(对应 Ray placement group)WorkerGroup:一组运行相同代码的 Worker(对应 Ray actor group)@register(dispatch_mode=...):注册 Worker 方法,并声明数据如何分发/收集Dispatch:数据分发策略(ONE_TO_ALL、MEGATRON_COMPUTE 等)
3.4 DataProto(数据协议)
位置:verl/protocol.py
verl 各组件间传递数据的标准格式,基于 TensorDict 封装:
DataProto
├── batch: TensorDict # 张量数据(input_ids, attention_mask 等)
├── non_tensor_batch # 非张量数据(原始文本、元信息)
└── meta_info # 元信息
理解 DataProto 是读懂 Trainer 代码的关键。
3.5 Checkpoint Engine & TransferQueue(v0.7+)
- CheckpointEngine(
verl/checkpoint_engine/):统一的权重同步接口,支持 NCCL / NIXL 传输后端,用于 Trainer 和 Rollout 节点之间的模型权重同步。 - TransferQueue:解耦控制流与数据流,Trainer 只传元数据,实际大数据通过 TransferQueue 传输(零拷贝,支持 RDMA)。
四、训练流水线
4.1 三种训练模式
| 模式 | 特点 | 适用场景 |
|---|---|---|
| On-Policy(同步) | Rollout 和 Training 串行,GPU 共享(Colocate) | 基线实现、算法正确性优先 |
| One-step-off-policy(异步) | 当前 step 训练与下一 batch 生成重叠 | 中等规模,效率提升 20-40% |
| Fully Async(完全异步) | Trainer 和 Rollout 完全解耦,跨节点流式传输 | 大规模(128+ GPUs)或长链推理 |
4.2 主训练流程(以同步 PPO 为例)
入口:verl/trainer/main_ppo.py → RayPPOTrainer.fit()(verl/trainer/ppo/ray_trainer.py)
每个训练步骤(fit_step):
1. 从 DataLoader 取一个 batch
2. rollout_manager.generate_sequences() ← Rollout Engine 生成回答
3. actor_wg.compute_log_prob() ← Actor 计算 log prob
4. ref_policy_wg.compute_ref_log_prob() ← Reference Policy 计算 KL
5. critic_wg.compute_values() ← Critic 计算 value(PPO 专有)
6. reward_manager.compute_reward() ← 奖励计算
7. compute_advantage() ← 计算优势函数(GAE)
8. actor_wg.update_actor() ← Actor Policy 梯度更新
9. critic_wg.update_critic() ← Critic 更新(PPO 专有)
4.3 算法核心
位置:verl/trainer/ppo/core_algos.py
实现了所有 RL 算法的数学核心:
compute_gae_advantage_return():GAE 优势估计- PPO clip loss、GRPO loss、DAPO loss 等通过注册表(
POLICY_LOSS_REGISTRY)管理 - KL 散度计算、KL Controller(自适应/固定)
五、代码阅读路线图
第一步:建立整体认知(1-2 天)
- 阅读 HybridFlow 论文(摘要 + 第 3-4 节)
- 阅读官方文档首页:
docs/index.rst - 阅读架构概述博客:
docs/blog/v0.7.md(Overview + verl-core + verl-trainer 三节) - 阅读:
docs/hybrid_flow.rst、docs/single_controller.rst
第二步:理解数据流(0.5 天)
- 阅读
verl/protocol.py前 200 行(DataProto定义) - 理解
DataProto如何在 WorkerGroup 中分发和收集
第三步:理解控制层(0.5 天)
- 阅读
verl/single_controller/base/worker_group.py(WorkerGroup、ResourcePool) - 阅读
verl/single_controller/base/decorator.py(@register、Dispatch) - 阅读
verl/single_controller/ray/base.py的RayWorkerGroup
第四步:理解训练主循环(1-2 天)
- 阅读
verl/trainer/main_ppo.py(入口,了解 Ray 初始化、Worker 创建) - 阅读
verl/trainer/ppo/ray_trainer.py中的RayPPOTrainer.fit()和fit_step() - 阅读
verl/trainer/ppo/core_algos.py中的 GAE、PPO loss
第五步:理解 Worker 实现(1-2 天)
- 阅读
verl/workers/engine_workers.py(TrainingWorker,新版引擎 API) - 选择一个推理后端,如
verl/workers/rollout/vllm_rollout/vllm_rollout.py - 阅读
verl/workers/engine/fsdp/(FSDP 后端引擎实现)
第六步:按需深入
| 目标 | 建议阅读 |
|---|---|
| 添加新 RL 算法 | verl/trainer/ppo/core_algos.py + examples/grpo_trainer/ |
| 自定义奖励函数 | docs/preparation/reward_function.rst + verl/trainer/ppo/reward.py |
| 多轮/工具调用 | docs/advance/agent_loop.rst + verl/workers/rollout/base.py |
| 多节点部署 | docs/start/multinode.rst |
| 性能优化/Profiling | docs/ascend_tutorial/profiling/ |
| 添加新推理后端 | verl/workers/rollout/ 下任意一个后端实现 |
| 添加新训练后端 | verl/workers/engine/base.py 接口 + 参考 fsdp/ 实现 |
六、目录结构速查
verl/
├── protocol.py # DataProto:核心数据传输协议
├── base_config.py # 基础配置类
├── single_controller/ # 单控制器调度层(WorkerGroup、ResourcePool)
│ ├── base/ # 抽象基类 + @register 装饰器
│ └── ray/ # Ray 实现
├── trainer/
│ ├── main_ppo.py # RL 训练主入口
│ ├── sft_trainer.py # SFT 训练主入口
│ └── ppo/
│ ├── ray_trainer.py # RayPPOTrainer(核心训练循环)
│ ├── core_algos.py # PPO/GRPO 等算法数学核心
│ └── reward.py # 奖励提取逻辑
├── workers/
│ ├── engine_workers.py # TrainingWorker(新版,封装 BaseEngine)
│ ├── fsdp_workers.py # Legacy FSDP Worker(将弃用)
│ ├── engine/ # 各后端训练引擎(fsdp/megatron/veomni)
│ ├── rollout/ # 推理引擎(vllm/sglang/trtllm)
│ ├── actor/ # Actor 相关逻辑
│ ├── critic/ # Critic 相关逻辑
│ ├── reward_manager/ # 奖励管理器
│ └── sharding_manager/ # 权重分片/resharding 管理
├── checkpoint_engine/ # Checkpoint Engine(权重同步)
├── experimental/ # 实验性功能(fully_async、agent_loop 等)
├── models/ # 模型定义(基于 HuggingFace)
└── utils/ # 公共工具(设备、配置、调试等)
examples/
├── grpo_trainer/ # GRPO 配置示例
├── ppo_trainer/ # PPO 配置示例
├── data_preprocess/ # 数据预处理脚本
└── sft/ # SFT 示例
docs/
├── hybrid_flow.rst # HybridFlow 编程模型
├── single_controller.rst # 单控制器设计
├── blog/v0.7.md # v0.7 架构详解(推荐阅读)
└── advance/ # 高级主题(agent_loop、reward 等)
七、关键概念词典
| 术语 | 含义 |
|---|---|
| HybridFlow | verl 的混合控制器架构,单控制器调度 + 多控制器执行 |
| WorkerGroup | 一组运行相同代码的 Ray Worker,对应一个模型角色(Actor、Critic 等) |
| ResourcePool | GPU 资源池,管理 WorkerGroup 的 GPU 分配(对应 Ray placement group) |
| DataProto | verl 内部数据传输的标准格式,基于 TensorDict |
| @register | 装饰器,把 Worker 方法暴露给单控制器,并声明数据分发策略 |
| Dispatch | 数据分发策略(ONE_TO_ALL、DP_COMPUTE、MEGATRON_COMPUTE 等) |
| AgentLoop | 客户端与 LLM Server 交互的抽象,管理单轮/多轮对话逻辑 |
| Colocate | Actor 和 Rollout 共享同一套 GPU(对比 Disaggregated) |
| HybridEngine | 同一套权重交替用于训练和推理,通过 resharding 切换并行策略 |
| TransferQueue | 解耦控制流与数据流的队列,支持 zero-copy 张量传输 |
| CheckpointEngine | 跨节点权重同步抽象,支持 NCCL/NIXL 后端 |
八、快速上手建议
- 先跑通一个 example:参考
docs/start/quickstart.rst,用 GSM8K + Qwen2.5-7B 跑一遍 GRPO。 - 结合配置文件阅读代码:
verl/trainer/config/ppo_trainer.yaml是所有配置项的集中入口,对照代码看每个参数的作用。 - 利用日志和指标:训练时观察 Wandb/TensorBoard 上的
actor/entropy、critic/vf_loss、reward/mean等指标,帮助理解训练过程。 - 读 examples 比读框架代码更容易入门:
examples/grpo_trainer/、examples/ppo_trainer/里的配置和 README 直接展示了如何用 verl。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)