name: verl-rl-training description: 提供使用verl(火山引擎强化学习)进行大型语言模型强化学习训练的指导。适用于实现RLHF、GRPO、PPO或其他RL算法,用于大规模LLM后训练,并具有灵活的基础设施后端。 version: 1.0.0 author: Orchestra Research license: MIT tags: [强化学习, RLHF, GRPO, PPO, 后训练, 分布式训练] dependencies: [verl>=0.3.0, torch>=2.0.0, ray>=2.41.0, vllm>=0.8.2, transformers>=4.40.0]
verl: 火山引擎大型语言模型强化学习
verl 是一个灵活、高效且生产就绪的强化学习训练库,用于大型语言模型,来自字节跳动的Seed团队。它实现了HybridFlow框架(EuroSys 2025),并驱动如Doubao-1.5-pro等模型,在数学基准测试中达到O1级别性能。
何时使用 verl
选择 verl 当您需要:
- 生产就绪的大规模RL训练(测试支持高达671B参数)
- 灵活切换后端(FSDP ↔ Megatron-LM ↔ vLLM ↔ SGLang)
- 支持多种RL算法(PPO、GRPO、RLOO、REINFORCE++、DAPO)
- 多轮回放与工具调用,用于智能体工作流
- 视觉语言模型RL训练
考虑替代方案当:
- 您需要Megatron原生训练 → 使用 slime 或 miles
- 您想要PyTorch原生抽象与Monarch → 使用 torchforge
- 您只需要简单的SFT/DPO → 使用 TRL 或 Axolotl
主要特性
- 训练后端: FSDP, FSDP2, Megatron-LM
- 回放引擎: vLLM, SGLang, HuggingFace Transformers
- 算法: PPO, GRPO, DAPO, RLOO, ReMax, REINFORCE++, SPIN, SPPO
- 模型: Qwen-3, Llama-3.1, DeepSeek, Gemma-2(0.5B 到 671B)
- 高级功能: LoRA RL, 序列并行, 专家并行, 多轮工具
安装
# 选项 1: pip 安装
pip install verl[vllm] # 或 verl[sglang] 用于 SGLang 后端
# 选项 2: Docker(推荐用于生产)
docker pull verlai/verl:vllm011.latest
# 选项 3: 从源码安装
git clone https://github.com/volcengine/verl.git
cd verl && pip install -e .[vllm,math]
快速开始:GRPO 训练
python3 -m verl.trainer.main_ppo \
algorithm.adv_estimator=grpo \
data.train_files=~/data/gsm8k/train.parquet \
actor_rollout_ref.model.path=Qwen/Qwen2.5-7B \
actor_rollout_ref.rollout.n=8 \
actor_rollout_ref.actor.use_kl_loss=True \
trainer.n_gpus_per_node=8
核心架构
verl 使用 HybridFlow 编程模型,将控制流与计算分离:
┌─────────────────────────────────────────────────────────┐
│ 单进程控制器(Ray) │
│ - 协调:回放 → 奖励 → 训练 → 同步 │
└─────────────────────┬───────────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────────┐
│ 多进程工作者 │
│ ├── ActorRolloutRefWorker(策略 + 生成) │
│ ├── CriticWorker(值估计,仅PPO) │
│ └── RewardManager(基于模型或规则的奖励) │
└─────────────────────────────────────────────────────────┘
工作流 1: 使用GRPO进行数学推理
使用此工作流在数学任务如GSM8K或MATH上训练推理模型。
先决条件清单
- [ ] 拥有8+ GPU的GPU集群(推荐H100)
- [ ] 数据集为parquet格式,包含
prompt和reward_model列 - [ ] HuggingFace Hub上的基础模型
步骤 1: 准备数据集
import pandas as pd
data = [
{
"prompt": [{"role": "user", "content": "What is 15 + 27?"}],
"reward_model": {"ground_truth": "42"}
},
# ... 更多示例
]
df = pd.DataFrame(data)
df.to_parquet("train.parquet")
步骤 2: 定义奖励函数
# reward_function.py
import re
def compute_reward(responses, ground_truths):
rewards = []
for response, gt in zip(responses, ground_truths):
# 从响应中提取答案
match = re.search(r'\\boxed{([^}]+)}', response)
if match and match.group(1).strip() == gt.strip():
rewards.append(1.0)
else:
rewards.append(0.0)
return rewards
步骤 3: 创建训练配置
# config/grpo_math.yaml
algorithm:
adv_estimator: grpo
gamma: 1.0
lam: 1.0
data:
train_files: /path/to/train.parquet
val_files: /path/to/val.parquet
train_batch_size: 256
max_prompt_length: 512
max_response_length: 2048
actor_rollout_ref:
model:
path: Qwen/Qwen2.5-7B-Instruct
actor:
use_kl_loss: true
kl_loss_coef: 0.001
ppo_mini_batch_size: 64
rollout:
name: vllm
n: 8 # 每个提示的样本数
temperature: 0.7
top_p: 0.95
trainer:
total_epochs: 3
n_gpus_per_node: 8
save_freq: 100
步骤 4: 启动训练
python3 -m verl.trainer.main_ppo \
--config-path config \
--config-name grpo_math \
trainer.experiment_name=grpo_math_qwen7b
步骤 5: 监控和验证
- [ ] 检查WandB/TensorBoard中的损失曲线
- [ ] 验证奖励随着步数增加而提高
- [ ] 在保留测试集上运行评估
工作流 2: 使用Critic模型的PPO
当您需要基于值的优势估计(GAE)时,使用此工作流。
与GRPO的关键区别
- 需要单独的critic模型
- 使用广义优势估计(GAE)
- 更适合密集奖励任务
配置
algorithm:
adv_estimator: gae # 使用GAE而非GRPO
gamma: 0.99
lam: 0.95
critic:
model:
path: Qwen/Qwen2.5-7B-Instruct # 可与actor相同或不同
ppo_mini_batch_size: 64
actor_rollout_ref:
actor:
use_kl_loss: true
kl_loss_coef: 0.02
clip_ratio: 0.2 # PPO剪裁
启动带Critic的训练
python3 -m verl.trainer.main_ppo \
algorithm.adv_estimator=gae \
critic.model.path=Qwen/Qwen2.5-7B-Instruct \
trainer.n_gpus_per_node=8
工作流 3: 使用Megatron的大规模训练
用于大于70B参数的模型或需要专家并行时,使用此工作流。
先决条件
- [ ] 安装Megatron-LM桥:
pip install mbridge - [ ] 将模型转换为Megatron格式
- [ ] 多节点集群,带NVLink/InfiniBand
70B+模型的配置
actor_rollout_ref:
model:
path: /path/to/megatron/checkpoint
backend: megatron
actor:
strategy: megatron
tensor_model_parallel_size: 8
pipeline_model_parallel_size: 2
rollout:
name: vllm
tensor_parallel_size: 8
启动多节点训练
# 在头节点上
ray start --head --port=6379
# 在工作节点上
ray start --address='head_ip:6379'
# 启动训练
python3 -m verl.trainer.main_ppo \
trainer.nnodes=4 \
trainer.n_gpus_per_node=8
配置参考
算法选择
| 算法 | adv_estimator |
使用场景 |
|---|---|---|
| GRPO | grpo |
无critic,数学/推理 |
| PPO/GAE | gae |
密集奖励,值估计 |
| REINFORCE++ | reinforce_plus_plus |
方差减少 |
| RLOO | rloo |
留一基线 |
| ReMax | remax |
最大奖励基线 |
| OPO | opo |
最优策略优化 |
关键参数
# 回放参数
actor_rollout_ref.rollout.n: 8 # 每个提示的样本数
actor_rollout_ref.rollout.temperature: 0.7 # 采样温度
actor_rollout_ref.rollout.top_p: 0.95 # 核采样
# 训练参数
actor_rollout_ref.actor.lr: 1e-6 # 学习率
actor_rollout_ref.actor.ppo_mini_batch_size: 64
actor_rollout_ref.actor.clip_ratio: 0.2 # PPO剪裁范围
# KL控制
actor_rollout_ref.actor.use_kl_loss: true
actor_rollout_ref.actor.kl_loss_coef: 0.001
algorithm.kl_ctrl.target_kl: 0.1 # 用于自适应KL控制
常见问题与解决方案
问题:回放期间内存溢出(OOM)
症状: 生成阶段CUDA内存不足
解决方案:
# 减少批量大小
actor_rollout_ref.rollout.log_prob_micro_batch_size: 4
# 启用梯度检查点
actor_rollout_ref.model.enable_gradient_checkpointing: true
# 使用带CPU卸载的FSDP2
actor_rollout_ref.actor.strategy: fsdp2
actor_rollout_ref.actor.fsdp_config.offload_policy: true
问题:训练不稳定
症状: 损失峰值,奖励崩溃
解决方案:
# 降低学习率
actor_rollout_ref.actor.lr: 5e-7
# 增加KL惩罚
actor_rollout_ref.actor.kl_loss_coef: 0.01
# 启用梯度剪裁
actor_rollout_ref.actor.max_grad_norm: 1.0
问题:权重同步缓慢
症状: 回放与训练间长时间暂停
解决方案:
# 使用FSDP2加速重分片
actor_rollout_ref.actor.strategy=fsdp2
# 启用异步权重传输
trainer.async_weight_update=true
问题:vLLM版本不匹配
症状: 导入错误或生成失败
解决方案: 使用兼容版本:
pip install vllm>=0.8.5,<=0.12.0
# 避免vLLM 0.7.x(已知错误)
高级主题
多轮工具调用
查看 references/multi-turn.md 获取带工具使用的智能体工作流。
视觉语言模型
actor_rollout_ref:
model:
path: Qwen/Qwen2.5-VL-7B-Instruct
rollout:
name: vllm
enable_vision: true
LoRA训练
actor_rollout_ref:
actor:
lora:
enabled: true
r: 16
alpha: 32
target_modules: ["q_proj", "v_proj"]
资源
- 文档: https://verl.readthedocs.io/
- 论文: https://arxiv.org/abs/2409.19256
- GitHub: https://github.com/volcengine/verl
- 食谱: https://github.com/verl-project/verl-recipe (DAPO, GSPO等)
- 社区: Slack at verl-project