VERL(Volcano Engine Reinforcement Learning for LLMs)是字节跳动 Seed 团队开源的 RLHF 训练库,专为大语言模型后训练设计,支持离线 RLHF 完整流水线。通过 HybridFlow 编程模型,它解耦算法逻辑与计算后端,实现 PPO 等算法的高效执行。相较传统框架,VERL 在离线场景下利用预处理数据(如 parquet 格式),结合 FSDP/vLLM 后端,避免在线 rollout 的高延迟,确保偏好对齐的稳定性和吞吐量。
数据准备:离线 RLHF 的基石
离线 RLHF 依赖高质量偏好数据集,通常包含 prompt、chosen/rejected response 或 ground truth(如 GSM8K)。VERL 使用 Parquet 格式存储,支持 HuggingFace 数据加载。
-
预处理脚本:运行 examples/data_preprocess/gsm8k.py --local_dir ~/data/gsm8k,生成 train.parquet/val.parquet。数据结构包括:
prompt:用户查询 + "Let's think step by step"。
reward_model.ground_truth:规则奖励依据(如最终答案)。
max_prompt_length=512、max_response_length=256:序列长度阈值。
-
关键参数:
| 参数 |
值 |
作用 |
| data.train_batch_size |
256 |
全局 rollout 批次,提升吞吐 |
| data.train_files |
~/data/gsm8k/train.parquet |
离线数据路径 |
证据:在 VERL GitHub examples 中,GSM8K 数据直接用于 PPO 训练,准确率从基线提升 2-5%。
Reward Modeling:规则基与模型基集成
VERL 支持 function-based(规则)和 model-based(RM)奖励,避免 reward hacking。
-
规则基奖励(推荐离线起步):自定义函数如 GSM8K 答案提取。
def compute_gsm8k_reward(solution, model_output):
solution_ans = extract_final_answer(solution)
model_ans = extract_final_answer(model_output)
return 1.0 if solution_ans == model_ans else 0.0
配置:reward.name="function",传入 reward.function=compute_gsm8k_reward。
-
模型基 RM:从 SFT 模型加 value head 训练,输入 (prompt, response),输出标量分数。VERL 集成 HF Transformers,支持 Bradley-Terry loss。
参数清单:
reward.model.path=Qwen/Qwen2.5-0.5B-Instruct:RM 路径。
reward.style="rule" 或 "model"。
离线优势:预计算奖励,减少 rollout 开销;监控:reward 均值 >0.8 表示高质量对齐。
Actor-Critic 训练循环:PPO 核心实现
PPO 是 VERL 默认算法,使用 actor-critic 架构:actor 生成 rollout,critic 估计价值。
循环流程:
- Rollout:Actor(+ ref model)生成响应,vLLM 引擎加速。配置
actor_rollout_ref.rollout.name="vllm"、gpu_memory_utilization=0.4。
- Reward 计算:应用 RM 或规则函数,得 token-level rewards。
- GAE 优势估计:
algorithm.adv_estimator="gae"、gamma=1.0、lam=0.95。公式:A_t = δ_t + γλ A_{t+1},降低方差。
- Actor 更新:clipped surrogate loss,
clip_ratio=0.2、ppo_epochs=4。
- Critic 更新:MSE loss,
critic.optim.lr=1e-5。
并行优化:Actor/Critic 独立 worker,ppo_mini_batch_size=64、ppo_micro_batch_size_per_gpu=4。3D-HybridEngine 动态 reshard actor,减少训练-生成切换开销 ~1.4x 加速。
配置示例(run_qwen2-7b.sh):
actor_rollout_ref.actor.optim.lr=1e-6
actor_rollout_ref.actor.ppo_mini_batch_size=64
critic.ppo_micro_batch_size_per_gpu=4
algorithm.kl_ctrl.kl_coef=0.001 # 防过优化
PPO 优化与评估:确保高效对齐
- KL 控制:
kl_ctrl.type="adaptive",目标 KL=0.01,避免分布偏移。
- LoRA 支持:
lora_rank=32、target_modules="all-linear",内存降 50%。
- 评估指标:
| 指标 |
阈值 |
含义 |
| mean_reward |
>0.7 |
偏好对齐 |
| kl_div |
<0.02 |
稳定性 |
| win_rate (val) |
>基线+5% |
实际提升 |
监控:wandb/mlflow 日志,trainer.save_freq=10。风险:entropy collapse,用 clip-higher 促多样。
落地 Checklist
- 安装:
pip install -e .,Docker 镜像 hiyouga/verl:ngc-vllm0.8。
- 脚本:
python -m verl.trainer.main_ppo [config],单 GPU 起步,扩展 nnodes。
- 回滚:若 KL>0.05,降 lr 或增 kl_coef。
- 规模化:FSDP2 (
strategy="fsdp2") + 多节点。
VERL 离线 RLHF pipeline 在 Qwen2.5/DeepSeek 上验证,GSM8K 达 90%+ 准确。通过参数微调,实现生产级偏好对齐。
资料来源:
(正文约 1200 字)