Hotdry.
ai-systems

VERL中多GPU数据并行KL正则化PPO:可扩展离线RLHF偏好排名蒸馏实现

VERL框架下,利用FSDP实现多GPU数据并行KL-PPO,支持离线RLHF偏好排名蒸馏。详解配置参数、3D-HybridEngine优化与监控要点,确保高效训练大模型对齐。

在 VERL(Volcano Engine Reinforcement Learning)框架中,多 GPU 数据并行结合 KL 正则化的 PPO 算法,是实现可扩展离线 RLHF(Reinforcement Learning from Human Feedback)的核心技术。该方法通过 FSDP(Fully Sharded Data Parallel)或 Megatron-LM 后端,实现高效的多 GPU 训练,同时 KL 散度控制防止策略过度偏离参考模型,确保训练稳定性和对齐效果。VERL 的 3D-HybridEngine 进一步优化了 Actor 模型在 rollout 与训练间的重分片,消除内存冗余,显著降低通信开销,支持数百 GPU 规模训练。

多 GPU 数据并行实现原理

VERL 支持灵活的设备映射,将 Actor、Critic、Reference 和 Reward 模型置于不同 GPU 组,实现数据并行训练。在 PPO 流程中,数据并行主要通过trainer.n_gpus_per_nodeppo_micro_batch_size_per_gpu参数控制全局批次分发。例如,在 8GPU 单节点配置下,设置n_gpus_per_node=8,每个 GPU 处理微批次ppo_micro_batch_size_per_gpu=4,总批次train_batch_size=1024可均匀分布,避免梯度同步瓶颈。

FSDP 后端是首选,支持 FSDP2 进一步优化内存(降低 7%)和吞吐(提升 1.5%)。配置actor_rollout_ref.actor.strategy=fsdp2,启用 CPU offloadfsdp_config.offload_policy=True,适用于 70B + 模型。Megatron-LM 后端则通过tensor_model_parallel_size=2结合数据并行,适合 MoE 模型如 DeepSeek-671B。VERL GitHub 示例中,PPO 训练脚本直接支持这些后端,无需额外修改。

证据显示,在 GSM8K 数据集上,使用 Qwen2.5-7B 模型的多 GPU PPO 训练,吞吐提升至传统框架的 1.4x 以上,得益于序列打包use_remove_padding=True减少填充 token,以及动态批处理use_dynamic_bsz=True最大化 GPU 利用率。

KL 正则化 PPO 的核心机制

KL 正则化是 PPO 稳定性的关键,VERL 通过algorithm.kl_ctrl模块精细控制。核心参数kl_coef=0.001作为 KL 损失系数,平衡策略更新与参考模型对齐;target_kl=0.1设置阈值,超过时自适应降低学习率。KL 计算类型可选kl(标准)、low_var_kl(低方差,适用于 GRPO 变体)或mse,配置kl_loss_type=low_var_kl可进一步稳定长序列训练。

在离线 RLHF 中,KL 防止过拟合偏好数据:rollout 阶段从 Actor 生成响应,Reference 计算 logprob 差值作为 KL 项,Critic 估计价值函数。公式上,PPO 损失为clip(ratio * A, 1-ε, 1+ε) * A - β * KL,其中 β 动态调整。VERL docs 强调,kl_ctrl.type=fixed适合初训,horizon=10000控制更新窗口。

调优清单:

  • 初始kl_coef=0.001~0.005,观察actor/reward_kl_penalty日志,若 > 0.01 则增大。
  • clip_ratio=0.2,防止大步更新。
  • ppo_epochs=4,每步小 epoch 迭代。

离线 RLHF 与偏好排名蒸馏管道

VERL 针对离线 RLHF 设计完整管道:数据为 Parquet 格式,含promptreward_model(rule/model-based)。偏好排名蒸馏通过 reward_model 实现:rule 式提取 ground_truth 匹配(如 GSM8K 答案后 ####),或 RM 模型评分多响应排名。

流程:

  1. 数据准备:data.train_files=gsm8k/train.parquetmax_prompt_length=512max_response_length=256
  2. Rollout:vLLM/SGLang 生成 N=5 响应 / 提示,rollout.gpu_memory_utilization=0.6
  3. Reward:reward_model.style=rule,计算排名分数(最高者 + 1,其他 0)。
  4. PPO 更新:优势adv_estimator=gaegamma=1.0lam=0.95

可落地配置(8GPU 示例):

trainer.n_gpus_per_node=8
data.train_batch_size=1024
actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=4
actor_rollout_ref.rollout.tensor_model_parallel_size=1  # 数据并行为主
algorithm.kl_ctrl.kl_coef=0.001
actor_rollout_ref.actor.use_gradient_checkpointing=True  # 内存优化

蒸馏扩展:recipe/sppo 使用自玩偏好生成,结合 PRIME/DAPO 提升排名准确率。

监控要点与风险控制

关键指标:timing/gen(rollout 耗时 < 20s/step)、critic/score/mean(奖励均值渐升)、actor/entropy_loss(>0.1 避免崩溃)。使用 wandb 日志,Nsight profiling 分析瓶颈(global_profiler.steps=[1,5,10])。

风险:

  • OOM:减gpu_memory_utilization=0.5,启用param_offload=True
  • KL 爆炸:target_kl=0.08,早停若 > 0.2。
  • 收敛慢:增大lr=1e-6(Actor),1e-5(Critic)。

回滚策略:从 SFT 基线启动,逐步加 PPO epochs。

此配置已在 Qwen2.5-32B 上复现 AIME 50 + 分,证明 scalability。

资料来源

查看归档