Hotdry.
ai-systems

用 VERL 实现 LLM 离线 RLHF 流水线:奖励建模与 PPO Actor-Critic 优化

详解 VERL 在离线 RLHF 中的完整 pipeline:数据准备、reward modeling、actor-critic 训练循环、PPO 参数优化与评估,确保高效偏好对齐。

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 数据加载。

  1. 预处理脚本:运行 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=512max_response_length=256:序列长度阈值。
  2. 关键参数

    参数 作用
    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 估计价值。

循环流程

  1. Rollout:Actor(+ ref model)生成响应,vLLM 引擎加速。配置 actor_rollout_ref.rollout.name="vllm"gpu_memory_utilization=0.4
  2. Reward 计算:应用 RM 或规则函数,得 token-level rewards。
  3. GAE 优势估计algorithm.adv_estimator="gae"gamma=1.0lam=0.95。公式:A_t = δ_t + γλ A_{t+1},降低方差。
  4. Actor 更新:clipped surrogate loss,clip_ratio=0.2ppo_epochs=4
  5. Critic 更新:MSE loss,critic.optim.lr=1e-5

并行优化:Actor/Critic 独立 worker,ppo_mini_batch_size=64ppo_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=32target_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

  1. 安装:pip install -e .,Docker 镜像 hiyouga/verl:ngc-vllm0.8
  2. 脚本:python -m verl.trainer.main_ppo [config],单 GPU 起步,扩展 nnodes。
  3. 回滚:若 KL>0.05,降 lr 或增 kl_coef。
  4. 规模化:FSDP2 (strategy="fsdp2") + 多节点。

VERL 离线 RLHF pipeline 在 Qwen2.5/DeepSeek 上验证,GSM8K 达 90%+ 准确。通过参数微调,实现生产级偏好对齐。

资料来源

(正文约 1200 字)

查看归档