verl 的 FP8 rollout

最后更新时间:11/19/2025

本文档介绍了搭配 vllm 推理后端的 FP8 rollout(滚动部署)。

我们通过 monkey patch 了几项 vLLM 函数,以启用 FP8 rollout 进行强化学习。

  1. load_weights:一个自定义的 load_weights 函数,用于将即时模型权重从更高精度格式量化到 FP8。

  2. process weights after loading:替换 vllm.model_executor.layers.quantization.fp8.Fp8LinearMethod.process_weights_after_loading 函数,以处理量化后的模型权重加载。

支持矩阵

  • FP8 分块量化用于 rollout(滚动)

    • 用于 Deepseek 中,该量化方式对激活采用 1x128,对模型权重采用 128x128

  • Dense 模型和 MoE 模型

  • Async rollout(异步滚动)接口

  • vLLM 0.10.x & vLLM 0.11

  • FSDP 和 Megatron 训练后端

实验与成果

Qwen3-8B-Base Dense 模型

配置

  • DAPO recipe(配方)。AIME24 线上验证。

  • vLLM(FP8 spmd rollout) + FSDP

    • 注意 SPMD rollout 已被弃用,因此我们移除了 FP8 SPMD rollout。

  • Prompt 批大小 32,n=16。

  • Rollout 批大小:32*3*16

  • Train_batch_size & ppo_mini_batch_size 32(训练批大小和 ppo 迷你批大小均为 32)

  • 最大响应长度 20K

  • Token-level TIS(令牌级别的温度重要性采样),C=2

  • 8*H100

  • vLLM 0.10.0+CUDA 12.6 vs vLLM 0.11.0+CUDA 12.9

准确性

Qwen3-8b-base_fp8_acc 深绿色:BF16,橙色:FP8 rollout + 令牌级 TIS,轻绿色:FP8 rollout + 无 TIS

结果和观察:

  • 启用 TIS 时,FP8 rollout 与 BF16 对齐

  • 未启用 TIS 时准确性明显下降

  • 高于匹配 kl(KL 散度)但在训练过程中处于可接受范围内

性能

Qwen3-8b-base_fp8_rollout_perf 绿色:BF16,橙色:FP8 rollout + CUDA 12.6 + DeepGemm,紫色:FP8 rollout + CUDA 12.9 + DeepGemm

结果和观察:

  • FP8 rollout 与 CUDA 12.6 + DeepGemm 结合可带来约 12% 的 rollout 加速

  • 升级到 CUDA 12.9 时,加速可达约 18%

Qwen3-30B-A3B-Base MoE 模型

配置

  • DAPO recipe。AIME24 线上验证。

  • FP8 async rollout,vLLM+FSDP

  • Prompt 批大小 32

  • Rollout 批大小:32*3*16

  • Train_batch_size & ppo_mini_batch_size 32

  • 最大响应长度 20K

  • Token-level TIS,C=2

  • 2*8*H100

  • vLLM 0.10.0+CUDA 12.6

请参考 recipe/dapo/run_dapo_qwen3_moe_30b_vllm_fp8_rollout.sh

准确性

Qwen3-30b-a3b_fp8_acc 灰色:BF16 + 令牌级 TIS,红色:FP8 rollout + 令牌级 TIS

结果和观察:

  • 对于 MoE,rollout 和训练分布不匹配总体上较高

  • 即使是 BF16 也需要 rollout 校正

  • FP8 rollout 与 令牌级 TIS 结合时与 BF16 对齐

性能

Qwen3-30b-a3b_fp8_perf 灰色:BF16 + 令牌级 TIS,红色:FP8 rollout + 令牌级 TIS

结果和观察:

  • FP8 rollout:rollout 加速超过 35%

  • 预计与 CUDA 12.9 结合可获得更多性能提升

使用方法

FP8 可以在配置文件 verl/trainer/config/ppo_megatron_trainer.yaml 中启用:

rollout:
  quantization: "fp8"

或者通过命令行启用:

  • actor_rollout_ref.rollout.quantization=fp8

请参考 recipe/dapo/run_dapo_qwen3_moe_30b_vllm_fp8_rollout.sh

计划

  • 将另起一个 PR 以支持 SGLang 中的 FP8 rollout

  • 进一步启用 megatron 中的 FP8 训练