Hotdry.

Article

VERL离线RLHF工具包:PPO Actor-Critic架构与KL正则工程实践

VERL开源工具包实现离线RLHF全流程,详解PPO actor-critic训练、KL罚项稳定对齐及vLLM/FSDP2高效参数配置。

2025-11-24ai-engineering

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% 吞吐。

落地实施清单

  1. 环境准备

    • Docker 拉取 verl:latest 镜像。
    • pip install -e .[all],安装 vLLM 0.8+、FlashAttention2。
    • CUDA 12.4+,PyTorch 2.4+。
  2. 数据处理

    • 下载偏好数据集(如 Anthropic HH,hh-rlhf)。
    • 脚本转换:python prepare_data.py --input jsonl --output train.parquet
    • 拆分 train/val,配置 reward 函数(e.g., rule-based for math)。
  3. 奖励模型训练(可选,自监督用):

    python -m verl.trainer.main_sft \
      data.train_files=train.parquet \
      reward_model.path=Reward/Qwen2-7B-RM
    
  4. PPO 主训练

    python -m verl.trainer.main_ppo @ppo_config.yaml \
      trainer.n_gpus_per_node=8 trainer.total_epochs=3 \
      trainer.logger=['wandb', 'console']
    
  5. 监控与早停

    • WandB 跟踪:reward_mean、kl、policy_entropy、vf_loss。
    • 阈值:KL>0.1 暂停,entropy<1.0 过拟合。
    • 验证集 eval 每 1000 步,perplexity < 预训练值则回滚。
  6. 部署

    • 保存 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)

ai-engineering