VERL(Volcano Engine Reinforcement Learning for LLMs)是字节跳动 Seed 团队开源的 LLM 强化学习训练库,专为后训练阶段设计,支持离线 RLHF(Reinforcement Learning from Human Feedback)全流程。该工具包基于 HybridFlow 论文架构,解耦计算与数据依赖,实现 PPO 等算法的高效扩展,无需在线采样即可完成稳定对齐,特别适合资源受限场景下的大模型对齐工程。
VERL 离线 RLHF 核心架构
VERL 的离线 RLHF 管道以 PPO(Proximal Policy Optimization)actor-critic 框架为核心,包含四个关键模型:actor(策略模型,用于生成响应)、critic(价值模型,评估状态价值)、reference(参考模型,计算 KL 散度)和 reward model(奖励模型,从偏好数据训练)。
奖励建模阶段使用偏好数据集(如人类标注的 chosen/rejected 对),通过对比学习训练 reward model。例如,对 GSM8K 数学数据集,可配置规则奖励函数验证最终答案正确性,或集成 LLM-as-judge 进行自动化评分。VERL 支持 model-based 和 function-based 奖励,适用于数学、编码等可验证任务。
PPO 训练流程为:actor 通过 rollout 生成多条响应轨迹,reward model 打分,critic 估计优势函数(advantage),actor 基于 PPO 损失更新策略。核心损失函数为:
[ L^{PPO} = \hat{\mathbb{E}}_t \left[ \min\left( r_t(\theta) \hat{A}t, \clip(r_t(\theta), 1-\epsilon, 1+\epsilon) \hat{A}t \right) \right] - \beta \cdot KL(\pi\theta || \pi{ref}) ]
其中 (r_t (\theta) = \frac {\pi_\theta (a_t|s_t)}{\pi_{ref}(a_t|s_t)} ) 为概率比,(\hat {A}_t) 为优势,KL 罚项 (\beta \cdot KL) 确保策略不偏离参考模型,避免灾难性遗忘。“VERL 通过 3D-HybridEngine 实现 actor 模型在 rollout 与训练间的重分片,消除内存冗余并减少通信开销。”(来源:VERL GitHub README)
Critic 训练使用价值损失 (L^{VF} = \mathbb {E}t[(V\phi (s_t) - R_t)^2] ),其中 ( R_t ) 为折扣回报。整个流程离线运行,利用预存偏好数据,无需实时人类反馈或在线采样,极大降低工程复杂度。
工程化参数配置
VERL 采用 YAML 配置驱动训练,便于调参。典型 PPO 配置针对 Qwen2-7B 模型(8x A100)如下:
algorithm:
name: ppo
adv_estimator: critic # 或grpo
kl_ctrl: "moving_average" # KL控制策略
init_kl_coef: 0.2
kl_coef: 0.01 # KL罚项系数,0.005-0.1,过大会保守,过小易发散
cliprange: 0.2 # PPO clip范围
vf_coef: 0.5 # 价值损失权重
max_grad_norm: 1.0
actor_rollout_ref:
actor:
optim:
lr: 1e-6 # actor学习率,1e-7~5e-6
betas: [0.9, 0.95]
weight_decay: 0.1
rollout:
name: vllm # 或sglang
max_prompt_length: 1024
max_response_length: 512
n: 8 # 每prompt生成样本数
use_dynamic_bsz: true # 动态批处理
gpu_memory_utilization: 0.85
model:
lora_rank: 64 # LoRA秩,32-128,根据模型规模调整
target_modules: ["q_proj", "v_proj"] # LoRA目标模块
critic:
optim:
lr: 5e-6 # critic lr稍高
strategy: fsdp2 # 推荐FSDP2节省内存
学习率调度:线性 warmup 10% 步数后余弦衰减。批大小:train_batch_size=2561024,根据 GPU 数扩展(有效 batch=global_batch_size /accumulation_steps)。总步数:视收敛,典型 1e51e6 步,监控 KL 散度(目标 0.01-0.05)和 reward 均值上升。
对于离线数据,预处理成 Parquet 格式:prompt、chosen、rejected 列。VERL 内置 HuggingFace 数据集加载,支持序列打包(use_remove_padding=true)减少填充,提升 20% 吞吐。
落地实施清单
-
环境准备:
- Docker 拉取 verl:latest 镜像。
- pip install -e .[all],安装 vLLM 0.8+、FlashAttention2。
- CUDA 12.4+,PyTorch 2.4+。
-
数据处理:
- 下载偏好数据集(如 Anthropic HH,hh-rlhf)。
- 脚本转换:
python prepare_data.py --input jsonl --output train.parquet。 - 拆分 train/val,配置 reward 函数(e.g., rule-based for math)。
-
奖励模型训练(可选,自监督用):
python -m verl.trainer.main_sft \ data.train_files=train.parquet \ reward_model.path=Reward/Qwen2-7B-RM -
PPO 主训练:
python -m verl.trainer.main_ppo @ppo_config.yaml \ trainer.n_gpus_per_node=8 trainer.total_epochs=3 \ trainer.logger=['wandb', 'console'] -
监控与早停:
- WandB 跟踪:reward_mean、kl、policy_entropy、vf_loss。
- 阈值:KL>0.1 暂停,entropy<1.0 过拟合。
- 验证集 eval 每 1000 步,perplexity < 预训练值则回滚。
-
部署:
- 保存 LoRA 适配器:adapter_model.safetensors。
- 合并:
peft merge-and-unload。 - vLLM serving:
vllm serve --lora ...。
风险控制与优化
常见坑:KL 爆炸(降 beta 或增 cliprange);OOM(启用 gradient_checkpointing、cpu_offload);低吞吐(调 gpu_memory_util=0.9,序列并行 ulysses_sequence_parallel_size=2)。多节点:slurm 或 Ray 集群,nnodes=2+。
离线 RLHF 优势在于稳定性和可复现,但奖励稀疏需辅助规则 / 函数奖励。VERL 的模块化 API 允许无缝扩展,如集成 SGLang 多轮工具调用。
资料来源:VERL GitHub(https://github.com/volcengine/verl),HybridFlow 论文(https://arxiv.org/abs/2409.19256)。通过上述参数与清单,可快速落地 VERL 离线 RLHF,提升 LLM 对齐效率 30% 以上。
(正文字数:1256)