一、veRL 框架详解

1 veRL 背景

1.1 强化学习工作流特性

强化学习(RL)是多阶段、多模型、异构工作流,包含 Actor、Critic、Reward Model、Reference Policy、Cost Model 等多组件协同,传统框架难以高效编排。

1.2 核心设计:Hybrid Flow

veRL 采用 Hybrid Flow 混合流设计

  • 把网络层构建为计算图,由 Single Controller 统一全局编排
  • 节点内用 SPMD 负责分布式计算
  • 融合:Single-controller (MPMD) + Multi-controller (SPMD)
    Single-controller (MPMD) 负责全局工作流编排,Multi-controller (SPMD) 负责组件内分布式计算,二者结合实现灵活调度与高效并行的统一。
    优势:全局统一编排、计算图构建高度灵活、分布式效率更高。
    在这里插入图片描述

1.3 传统 RL 框架痛点

  1. 训练:缺少抽象层,不同后端代码冗余
  2. Rollout:SPMD 侵入性强,多轮对话不友好
  3. Single-controller:控制流与数据流耦合,扩展性差
  4. 异步训练:无原生支持,大规模场景受限

2 RLHF 训练流程与伪代码实现

2.1 极简编程范式

veRL 仅需十行左右伪代码即可完成完整 RLHF 计算流程:

# Generate
actor

# Experience Preparation
reward
reference
critic

# Train
critic.update
actor.update

2.2 Actor(策略)在 RLHF 中的三大角色

  1. 生成(Generation)
    根据提示词逐词生成回答,以当前已生成内容为状态,选择下一个词为动作。

  2. 优势评估(Advantage)
    用 GAE 计算动作优势值,正向优势提升概率,负向降低概率。

  3. 策略更新(Update)
    基于 PPO 类算法,限制新旧策略 KL 散度,防止训练崩溃。

2.3 完整 RLHF 训练伪代码

# Pseudo-code for RLHF training loop (Actor-Critic + GAE)
for prompts in dataloader:
    # Stage 1: 生成
    batch = actor.generate_sequences(prompts)

    # Stage 2: 经验准备
    batch = reward.compute_reward(batch)
    batch = reference.compute_log_prob(batch)
    batch = critic.compute_values(batch)
    batch = compute_advantage(batch, "gae")

    # Stage 3: 训练更新
    critic.update_critic(batch)
    actor.update_actor(batch)

2.4 Single-Controller 编程接口

基于单控制器范式,RL 算法核心逻辑极简实现,支持 PPO、GRPO、RLOO、ReMax、PRIME、DAPO 等主流算法

在这里插入图片描述


3 veRL 整体架构

veRL 架构分为两层:

  • verl-core:提供原子级 building block
  • verl-trainer:基于 core 构建 RL 训练流水线
    veRL 的 core和 trainer 两部分。 提供原子粒度的 building block,包含四个核心组件,重要的是负责训练的 model engine 和负责 raw 推理的模块。还有用于衔接训练推理的 transfer engine 和 transfer queue。基于这些组件可灵活构建强化学习、VLA 等 trainer。
    支持:在线策略、离线策略、全异步、VLA 多模态等训练模式。
    在这里插入图片描述

4 verl-core 四大核心组件

4.1 Model Engine(模型训练引擎)

定位:RL/SFT 核心训练引擎,目标支持超大模型、长上下文、极致 MFU。

  • 基类:BaseEngine 提供初始化、优化器、学习率调度等原始 API
  • 运行方式:SPMD 并行,Single Controller 感知并行策略分发数据
  • 支持后端:FSDP、Megatron-Core、VeOmni 等
  • 特性:序列均衡、LoRA、FP8 训练、高性能 Kernel
    在这里插入图片描述

4.2 Rollout Engine(推理 Rollout 引擎)

定位:生成、环境交互、奖励计算,解决多轮对话低效问题。
最早做 RL 用 batch inference 模式,在多轮交互中低效,重要工作是重构该模式为所有模式,使每个 prompt 可独立推理等。引入 agent loop 抽象,以用户编写 Loop 与多方面交互。Server 改成新模式后对引擎无侵入,还增加了数据传输同步等功能。

  • 重构为单 Prompt 独立推理,无侵入式架构
  • 核心抽象
    • AgentLoop:支持 ReAct、SWE、GUI 等多轮智能体交互
    • RewardLoop:异步奖励计算,支持规则/模型类奖励
  • 兼容 LLM Server:VLLM、SGLang、TensorRT-LLM
  • 能力:权重同步、FP8 在线量化、Router replay
    在这里插入图片描述

4.3 TransferQueue(数据传输队列)

定位:全组件数据总线 + 回放缓冲区,解耦控制流与数据流
目前 IO 采用的 single Controller 存在数据和控制流耦合问题,集群和数据规模扩大后 trainer 会成瓶颈,尤其在多模态场景。为解决此问题,引入 transfer queue 解耦数据和控制流,trainer 传数据指针,worker 从 transfer queue 取数据。transfer queue 是多节点多 backend 存储,有 Tensor 传输优化,支持细粒度列访问控制和主动生命周期管理。

  • 解决痛点:Single Controller 数据/控制耦合导致的信道瓶颈
  • 核心优势
    • Zero-serialization 零序列化开销
    • 支持 TCP/RDMA 多传输方式
    • 细粒度列级读写/追加
    • 主动生命周期管理
  • 机制:Channel 只传数据指针,Worker 从队列取数据
    在这里插入图片描述

4.4 Checkpoint Engine(参数同步引擎)

定位:统一模型权重同步,训练 ↔ 推理引擎无缝传递。
通过统一的 checkpoint engine 负责参数同步,训练引擎调用 sendwait 接口传入 Tensor Generator,推理引擎通过 receivewait 接口返回 Tensor Generator。

  • 训练引擎:sendwait 传入 Tensor Generator
  • 推理引擎:receivewait 获取 Tensor Generator
  • 传输层可插拔:Nico 集合通信、P2P、MQ 等
  • 新引擎可无缝接入,无需改造上层

在这里插入图片描述


5 verl-trainer 训练流水线

基于 verl-core 四大组件,灵活构建训练流水线:

  1. On-policy trainer:同步在线训练
  2. One-step-off-policy trainer:单步离线训练
  3. Fully async trainer:全异步训练
  4. VLA trainer:视觉语言动作多模态训练
  5. 更多自定义 Trainer 存放于 verl-recipe

在这里插入图片描述


6 框架优势与总结

  1. 架构先进:Hybrid Flow 适配异构 RL 工作流
  2. 使用极简:十行代码实现 RLHF 全流程
  3. 组件解耦:数据流/控制流分离,分布式可水平扩展
  4. 生态兼容:支持主流训练/推理后端与 RL 算法
  5. 场景全覆盖:文本 RL、多模态 VLA、智能体、多轮对话

二、veRL实践

由于veRL版本会不断更新,我们以0.7.1为例

1 clone代码

https://github.com/verl-project/verl/tree/release/v0.7.1
在这里插入图片描述

# 创建虚拟环境
conda create -n verl python==3.12
conda activate verl
# clone 0.7.1分支代码
git clone https://github.com/verl-project/verl --branch release/v0.7.1 --depth 1
cd verl

2 修改配置

这里为了能把veRL跑起来,未使用MEGATRON英伟达的加速组件,后续大家想使用可自行修改scripts/install_vllm_sglang_mcore.sh 脚本

vi scripts/install_vllm_sglang_mcore.sh 

此脚本是 verl 框架的标准安装流程的一部分,专门用于设置推理和训练环境

3 USE_MEGATRON=${USE_MEGATRON:-1} 

替换成

3 USE_MEGATRON=0

同时因为 wget 下载flash-attn的whl 在服务器不好下载,可自己下载了传上去

 29 wget -nv https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl && \
 30     pip install --no-cache-dir flash_attn-2.8.1+cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl

可把29行去掉,自己下载 https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl

执行scripts/install_vllm_sglang_mcore.sh脚本 安装 verl 框架推理和训练环境环境

bash scripts/install_vllm_sglang_mcore.sh
pip install --no-deps -e .

3 数据集下载

首先配置国内hf的地址

export HF_ENDPOINT=https://hf-mirror.com

gsm8k数据准备执行python代码,下载数据集

python examples/data_preprocess/gsm8k.py

4 模型下载

git clone https://www.modelscope.cn/Qwen/Qwen2.5-0.5B-Instruct.git

5 执行训练代码

这里需要把备注去掉,并且文件数据集路径和模型路径需要修改成对应本地数据集和模型路径

# 环境变量:保证日志实时输出,不缓存(避免训练过程中看不到实时日志)
export PYTHONUNBUFFERED=1

python3 -m verl.trainer.main_ppo \
 data.train_files=$HOME/data/gsm8k/train.parquet \ # 训练数据集
 data.val_files=$HOME/data/gsm8k/test.parquet \ # 验证数据集
 data.train_batch_size=256 \ # 每一步迭代读取256道数学题
 data.max_prompt_length=512 \ # 题目最大长度
 data.max_response_length=512 \ # 答案最大长度

 actor_rollout_ref.model.path=Qwen/Qwen2.5-0.5B-Instruct \ # Actor模型路径
 actor_rollout_ref.actor.optim.lr=1e-6 \ # Actor学习率
 actor_rollout_ref.actor.ppo_mini_batch_size=64 \ # 迷你批次(一次加载64个 加载256个容易炸内存 但256个才进行梯度更新 相当于off-policy)
 actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4 \ # 每个GPU加载几个(比迷你批次还小)

 actor_rollout_ref.rollout.name=vllm \ # vllm 采样器 生成回答
 actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=8 \ # rollout时 每个GPU同时算几个 策略的对数概率
 actor_rollout_ref.rollout.tensor_model_parallel_size=1 \ # 张量并行
 actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \ # 采样的GPU 显存利用率限额
 actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=4 \ # 旧策略ref 每个GPU同时算几个 策略的对数概率

 critic.optim.lr=1e-5 \ # Critic学习率
 critic.model.path=Qwen/Qwen2.5-0.5B-Instruct \ # Critic模型路径
 critic.ppo_micro_batch_size_per_gpu=4 \ # Critic 每个GPU微批次每次处理4个样本
 algorithm.kl_ctrl.kl_coef=0.001 \ # KL系数

 trainer.logger=console \ # 训练过程中实时在终端打印日志信息
 trainer.val_before_train=False \ # 训练前是否验证

 trainer.n_gpus_per_node=1 \ # 每个节点的GPU数量
 trainer.nnodes=1 \ # 训练节点数量

 trainer.save_freq=10 \ # checkpoint 保存频率
 trainer.test_freq=10 \ # 测试频率
 trainer.total_epochs=15 \ # 完整遍历15遍训练数据集
 2>&1 | tee verl_demo.log # 保存日志的位置;正常信息和报错都写入

执行后报错,需要回退一下numpy版本,期望numpy版本低于2.2.0

pip install numpy==2.2.0

6 最后执行结果

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐