Hotdry.
ai-engineering

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

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

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)

查看归档