Hotdry.
ai-engineering

VERL 中零冗余重分片与 HybridEngine:FSDP-3D KL-PPO 实现 1.4 倍吞吐提升

VERL 通过 3D-HybridEngine 实现 actor 模型训练与生成间的零冗余重分片,结合 FSDP-3D 和通信重叠,在 KL-PPO 中提升 LLM RLHF 训练 1.4 倍吞吐,提供配置参数与优化清单。

在 LLM RLHF 训练中,actor 模型需要在生成(rollout)和训练(update)阶段频繁切换,这种切换往往引入内存冗余和通信开销,导致吞吐低下。VERL(Volcano Engine Reinforcement Learning)通过 3D-HybridEngine 引入零冗余重分片(zero-redundancy resharding)机制,结合 FSDP-3D 并行策略和通信重叠(comm-overlap),在 KL-PPO 实现中将吞吐提升至 1.4 倍以上。这种优化不仅消除冗余内存占用,还显著降低 AllReduce 等通信量,实现高效的分布式 RLHF 训练。

零冗余重分片的原理与优势

传统 RLHF 框架中,actor 模型在生成阶段使用数据并行(DP)以最大化生成吞吐,而训练阶段切换至 FSDP(Fully Sharded Data Parallel)以节省内存。这种切换需复制模型参数,导致内存冗余高达 2 倍以上,并伴随大规模 AllGather/AllReduce 通信。VERL 的 3D-HybridEngine 采用 “卸载 - 重载”(offload-reload)+ 重分片策略:在生成后将模型参数卸载至 CPU,仅保留分片;在训练前根据 FSDP-3D(FSDP + 张量并行 TP + DP)需求重分片加载,避免任何冗余复制。

具体流程:

  1. 生成阶段:actor 以高 DP 度(如 TP=1, DP = 高)运行 vLLM/SGLang,最大化 rollout 吞吐。
  2. 切换阶段:调用 HybridEngine 的 resharding API,将分片参数 offload 到 CPU,释放 GPU 内存。
  3. 训练阶段:FSDP-3D 加载分片(TP>1, DP 适中),直接从分片计算,无需全模型复制。
  4. 通信重叠:利用 FSDP2 的 forward_prefetch 和 PyTorch 的 comm-overlap(如 torch.distributed 的 async allreduce),将 AllGather 与前向计算重叠,进一步降低延迟。

实验证据显示,在 Qwen2-7B KL-PPO 训练中,此机制相比基线版本实现~1.4x 整体吞吐提升,同时内存峰值降低 20% 以上。该优化特别适用于数百 GPU 集群,支持 MoE 模型如 DeepSeek-671B。

FSDP-3D 与 KL-PPO 集成配置

要落地此优化,需在 VERL 配置中启用 FSDP2(推荐 PyTorch 2.1+)作为训练后端,结合 HybridEngine。核心配置如下(基于 ppo_trainer.yaml):

# 启用 FSDP2 + 3D 并行
actor_rollout_ref:
  actor:
    strategy: fsdp2  # 关键:FSDP2 支持更好内存与吞吐
    fsdp_config:
      offload_policy: True  # CPU offload
      forward_prefetch: True  # 通信重叠
    tensor_parallel_size: 4  # TP=4 示例,视 GPU 调整
    data_parallel_size: 8    # DP 平衡生成/训练
  rollout:
    engine: vllm  # 生成引擎,gpu_memory_utilization=0.7
    gpu_memory_utilization: 0.7
    max_num_batched_tokens: 4096  # 增大批次吞吐

critic:
  strategy: fsdp2
  tensor_parallel_size: 4

# HybridEngine 自动处理 resharding,无需显式配置
hybrid_engine: true  # 默认启用 3D-HybridEngine

KL-PPO 特定调整(添加 KL 正则化):

algorithm:
  kl_coef: 0.02  # KL 散度系数
  entropy_coef: 0.01  # 熵正则,促进探索

性能调优参数清单

为最大化 1.4x 提升,遵循 VERL perf_tuning 指南,按以下清单逐步调优:

  1. Rollout 生成优化(占 RLHF 瓶颈 50%):

    • max_num_seqs: 256max_num_batched_tokens > 2048,增大并发。
    • tensor_parallel_size=1(生成偏 DP),HybridEngine 自动 reshard 到 TP>1。
    • vLLM >=0.8.3,避免旧版 OOM。
  2. 序列打包与动态批次(提升 20-30%):

    • use_remove_padding: True(支持 Llama/Qwen 等)。
    • use_dynamic_bsz: True,设置 ppo_max_token_len_per_gpu: 8192(3x (prompt+response))。
    • Critic/RM 参数 2-4x Actor(如 critic.ppo_max_token_len_per_gpu: 16384)。
  3. 训练后端调优(FSDP-3D):

    • 启用 enable_gradient_checkpointing: True + enable_activation_offload: True,增大 micro_batch_size_per_gpu 至 mini_batch_size。
    • Forward-only 参数(如 log_prob_micro_batch_size_per_gpu)2x 训练参数。
    • ulysses_sequence_parallel_size: 2 支持长上下文。
  4. 监控与回滚策略

    指标 目标阈值 异常处理
    GPU 利用率 >90% 调低 TP/DP
    Rollout TFLOPS >50% 峰值 增大 gpu_memory_utilization
    Resharding 时间 <5% 总时 启用 async offload
    内存峰值 <95% 减小 max_token_len 或 offload
    KL 散度 1e-2 ~ 1e-1 动态调整 kl_coef

    使用 WandB/MLflow 跟踪;若 OOM,回滚至 FSDP1 或减小 TP。

  5. 启动命令示例(8xA100,Qwen2-7B):

    verl-run examples/ppo_trainer/run_qwen2-7b_rm_seq_balance.sh --config ppo_trainer.yaml
    

风险:高 TP 下通信敏感,建议从小规模验证;AMD/ROCm 支持需额外 Docker。

此优化已在 DAPO/SPPO 等 recipe 中验证,适用于生产 RLHF。实际部署中,从小 batch 测试 resharding 开销,确保 <10s / 迭代。

资料来源

(正文约 1050 字)

查看归档