在大型语言模型(LLM)对齐中,离线 RLHF(Reinforcement Learning from Human Feedback)通过奖励建模绕过昂贵的人类在线偏好数据,实现数据高效的对齐。VERL 作为 Volcano Engine 的 RL 训练库,支持 KL 正则化 PPO(Proximal Policy Optimization),结合多 GPU 部署,提供稳定、高吞吐的解决方案。该方法利用参考策略的 KL 散度惩罚,防止策略过度偏离初始模型,确保训练稳定性,同时通过规则或模型奖励函数处理离线数据。
KL 正则化 PPO 的核心机制
PPO 通过剪切代理目标函数限制策略更新幅度,避免大步长导致的不稳定。VERL 中引入 KL 正则化,进一步控制策略与参考模型(通常为 SFT 模型)的 KL 散度,防止奖励黑客(reward hacking)或模式崩溃。两种实现方式:KL 奖励惩罚(in-reward KL penalty)和 KL 损失(KL loss)。
- KL 奖励惩罚:在奖励信号中直接减去 KL 项,配置
algorithm.use_kl_in_reward: true,KL 系数初始为 kl_ctrl.kl_coef: 0.001,类型支持 fixed 或 adaptive(目标 KL 为 0.1,horizon 10000)。这动态调整惩罚强度,适应训练进程。
- KL 损失:在 actor 更新中添加 KL 损失,配置
actor_rollout_ref.actor.use_kl_loss: true,系数 kl_loss_coef: 0.001,类型如 low_var_kl(低方差 KL 估计)。VERL 文档指出,这种机制源自 InstructGPT 实践,确保策略不偏离参考模型。[1]
实际调参中,clip_ratio 默认 0.2,结合 GAE(Generalized Advantage Estimation,lam=0.95,gamma=1.0)降低方差。证据显示,在 GSM8K 数据集上,Qwen2.5-0.5B 通过 PPO 从 36.4% 提升至 56.7%,KL 正则显著提升稳定性。
离线 RLHF:奖励建模与数据准备
传统 RLHF 依赖在线人类偏好,但离线模式使用固定数据集(如 Parquet 格式的 prompt-response),通过奖励函数或奖励模型(RM)评分。VERL 支持自定义奖励函数 custom_reward_function,如 GSM8K 的精确匹配,或模型基 RM(如 AutoModelForSequenceClassification)。
配置示例:
data:
train_files: ~/data/gsm8k/train.parquet
train_batch_size: 1024 # 全局批次,每 prompt 生成 n=1-多响应
reward_model:
enable: true
path: ~/models/Anomy-RM-v0.1 # RM 路径
Rollout 使用 vLLM/SGLang 生成轨迹,max_prompt_length=512,max_response_length=512。无需在线交互,数据高效:sequence packing 和 LoRA RL 节省内存,支持多模态(VLM)和工具调用。
优势在于绕过偏好标注成本,使用 verifiable reward(如数学求解器)对齐推理模型。VERL recipe 如 DAPO、ReTool 证明,在 AIME 2024 上达 50+ 分,超越 GRPO。
多 GPU 部署与分片策略
VERL 支持 FSDP2/Megatron-LM 后端,灵活设备映射。Actor、Critic、Rollout 可独立置于 GPU 组,避免冗余。
- FSDP 后端:
actor_rollout_ref.actor.strategy: fsdp2,启用 cpu offload fsdp_config.offload_policy: true,ppo_mini_batch_size=256,micro_batch_size_per_gpu=8。3D-HybridEngine 实现 actor-rollout 间高效 resharding,减少通信开销。
- Megatron 后端:支持 TP/PP/EP,如 DeepSeek-671B,ulysses_sequence_parallel_size=1。
- Rollout:vLLM gpu_memory_utilization=0.5,tensor_model_parallel_size=2,max_num_batched_tokens=8192。
多节点配置:nnodes=1,n_gpus_per_node=8,scales to 数百 GPU。性能调优指南强调 torch.compile 和 flash_attention_2,提升 1.4x 吞吐。
调参清单与监控要点
落地参数:
- 批次与长度:train_batch_size=1024,ppo_epochs=1-4,ppo_max_token_len_per_gpu=16384。
- 优化器:lr=1e-6,cosine scheduler,warmup_ratio=0.1,grad_clip=1.0。
- KL 阈值:target_kl=0.1-0.3,clip_ratio_c=3.0(Dual-clip PPO)。
- 监控:wandb 日志 KL div、policy loss、value loss、reward mean。阈值:KL >0.2 触发 early stop,回滚 lr。
- 回滚策略:若不稳定,增大 kl_coef 至 0.005,减小 clip_ratio 至 0.1;内存 OOM 降 micro_batch_size。
风险:过度 KL 抑制探索(熵系数 entropy_coeff=0.0-0.01);离线 RM 偏差需验证集校准。
实践脚本:从 VERL examples/ppo_trainer 启动,ray up 集群,resume_mode=auto。结合 recipe/dapo,实现端到端对齐。
来源:
[1] VERL PPO 文档:https://verl.readthedocs.io/en/latest/algo/ppo.html
[2] VERL GitHub:https://github.com/volcengine/verl
[3] HybridFlow 论文:https://arxiv.org/abs/2409.19256
(正文约 950 字)