FP8 ViT 编码器注意力¶
对于具有大图像(如 QHD、4K)和相对较短文本提示/生成的视觉理解工作负载,ViT 编码器注意力可能会成为显著的瓶颈,特别是当文本模型被量化时(如 NVFP4)。vLLM 支持通过 FlashInfer cuDNN 后端为 ViT 编码器注意力提供可选的 FP8 量化。Q/K/V 在 cuDNN 注意力调用之前会实时量化为 FP8。
注意
- 目前仅支持 Qwen3-VL 系列模型(
qwen3_vl、qwen3_vl_moe、qwen3_5、qwen3_5_moe以及其他使用 Qwen3 ViT 的模型)。 - 动态缩放与 ViT 全 CUDA 图不兼容。
- 性能提升主要见于 QHD/4K 分辨率或多图像请求。较小的图像可能因量化开销(3 个量化内核启动 + 去填充)而没有加速效果。
- FP8 tensor-core 的加速效果在 GB300 上比 GB200 更为显著。
要求¶
- 具有 cuDNN >= 9.17.1 的 FlashInfer cuDNN 后端。
用法¶
通过传递 --mm-encoder-attn-dtype fp8 以及 --mm-encoder-attn-backend FLASHINFER 来启用 FP8 ViT 注意力。
默认情况下(无 scale 文件),使用动态缩放:由 16 个观测到的 Q/K/V amax 值组成的循环缓冲区驱动每次前向传递的缩放更新。这在无需任何校准的情况下即可达到 BF16 的精度,但会增加少量的每次前向开销。
一次校准,重复使用工作流(推荐)¶
对于生产环境,请在代表性数据集上校准一次静态缩放系数(static scales)并重复使用它们,以避免动态开销。
# Step 1: calibrate and save scales (runs dynamic scaling for 16 passes,
# then dumps the learned scales to JSON).
vllm bench mm-processor \
--model $MODEL --mm-encoder-attn-backend FLASHINFER \
--mm-encoder-attn-dtype fp8 \
--mm-encoder-fp8-scale-save-path /path/to/scales.json \
--dataset-name hf --dataset-path lmarena-ai/VisionArena-Chat \
--num-prompts 100
# Step 2: serve with static scales (no dynamic overhead).
vllm serve $MODEL \
--mm-encoder-attn-backend FLASHINFER \
--mm-encoder-attn-dtype fp8 \
--mm-encoder-fp8-scale-path /path/to/scales.json
保存的缩放系数将乘以 --mm-encoder-fp8-scale-save-margin(默认为 1.5),以为校准集中不存在的激活离群值留出余量。默认值已通过验证,可推广到不同数据集(例如,VisionArena-Chat 校准在 ChartQA 上保持了 BF16 的精度)。
Scale 文件格式¶
{
"visual.blocks.0.attn.attn": {"q": 224.0, "k": 198.0, "v": 210.0},
"visual.blocks.1.attn.attn": {"q": 218.0, "k": 195.0, "v": 207.0}
}
键名 q_scale / k_scale / v_scale 被接受为别名。
性能¶
核心 cuDNN 注意力内核 (PyTorch profiler, cudnn_generated_fort_native_sdpa_sm100_flash_fprop, head_dim=128, seq_len=8192)
| 硬件 | BF16 | FP8 | 加速比 |
|---|---|---|---|
| GB200 | 350 us | 312 us | 1.12x |
| GB300 | 300 us | 211 us | 1.42x |
端到端编码器前向时间 (Qwen3-VL-30B-A3B-Instruct 在 GB200 上, 3 图像/请求)
| 分辨率 | BF16 中位数 | FP8 中位数 | 加速比 |
|---|---|---|---|
| HD (720x1280) | 31.77 ms | 36.39 ms | 0.87x |
| FullHD (1080x1920) | 57.99 ms | 58.73 ms | ~持平 |
| QHD (1440x2560) | 131.83 ms | 122.30 ms | 1.08x |
| 4K (2160x3840) | 543.44 ms | 460.31 ms | 1.18x |
转折点在大约 FullHD 分辨率且每请求 3 张图像时。在 QHD 及以上分辨率,FP8 具有优势。
准确率¶
ChartQA, Qwen3-VL-8B-Instruct, 500 个样本。FP8 静态使用在 VisionArena-Chat 上校准的缩放系数(带默认 1.5x 余量)
| 指标 | BF16 | FP8 动态 | FP8 静态 |
|---|---|---|---|
| 宽松准确率 (relaxed_accuracy) | 0.780 | 0.776 | 0.780 |
| 任意位置准确率 (anywhere_accuracy) | 0.806 | 0.816 | 0.814 |
| 精确匹配 (exact_match) | 0.584 | 0.582 | 0.578 |
所有三种配置在统计噪声范围内一致,证实了在一个数据集上校准的静态缩放系数可以推广到另一个数据集。