跳到主要内容
推理优化

4.5 FP8 与 NVFP4/MXFP4:低比特浮点量化

从 Hopper 原生 FP8(E4M3/E5M2)到 Blackwell 的 NVFP4 与 MXFP4:浮点量化的格式设计、硬件加速与 vLLM 支持现状

FP8NVFP4MXFP4HopperBlackwell低比特浮点

前面几节讲的都是整数量化(INT8/INT4)。但从 Hopper(H100)开始,工业界的重心明显转移到了低比特浮点格式:FP8 是 Hopper 的原生语言,NVFP4/MXFP4 是 Blackwell 的原生语言。为什么要从整数转向浮点?因为浮点格式的动态范围天然更大,不需要像 INT 量化那样精心设计 per-group 粒度也能保住精度——量化变简单了,精度还更稳了。

这一节讲清楚三件事:FP8 的两种格式(E4M3/E5M2)和 W8A8 使用方式;NVFP4 的两级缩放设计(它为什么比 MXFP4 更准);以及它们在 vLLM 里的工程现状——截至 v0.26.0,NVFP4/MXFP4 在 Blackwell 上已经是第一方支持。

📑 目录


1. 为什么从 INT 转向浮点

INT8 有 256 个格子,均匀分布在 [127,127][-127, 127];FP8 同样 8 位,但它是浮点——指数位带来的是不均匀的格子分布:数值大时格子粗,数值小时格子细,自动贴合”数值小、需要更精细表示”的常见分布。

这带来两个直接收益:

  1. 动态范围大:FP8(E4M3)最大可表示约 448,最小非零约 262^{-6},覆盖 4 个数量级以上;INT8 要表示同样范围必须牺牲格子密度
  2. 量化变简单:很多模型直接 RTN(四舍五入)到 FP8 就足够准,不需要 SmoothQuant 的平滑变换、不需要 GPTQ 的逐层重建——scale 和格式本身就在做”自适应”

📌 关键点:INT 量化是”把连续值硬塞进均匀格子”,浮点量化是”用更科学的数字格式表示”——所以 FP8 时代量化的重心从”算法”转向了”格式与硬件”。这也是 NVIDIA 从 Hopper 起在硬件层全面拥抱 FP8 的根本原因。


2. FP8 格式:E4M3 与 E5M2

FP8 是 IEEE 754 的 8 位变体(2022 年 OCP 8-bit Floating Point 规范定义),两种子格式:

格式结构(符号/指数/尾数)最大表示精度特点
E4M31 + 4 + 3448精度高(3 位尾数),范围小
E5M21 + 5 + 257344范围大(5 位指数),精度低

设计意图非常明确:

  • E4M3 用于权重和激活(W8A8 GEMM 的主格式):权重/激活的数值范围通常不大,但精度重要
  • E5M2 用于梯度(训练场景):梯度变化范围大、可能冲出 E4M3 的范围,牺牲一点精度换范围
  • 推理场景基本只用 E4M3;E5M2 在 KV Cache(fp8_e5m2)和训练中见到

⚠️ 注意:E4M3 的最大值只有 448——如果激活里有值超过 448,会被 clamp(截断)到 448。所以 FP8 依然需要 scale:把一个张量整体除以合适的 scale,让数值落进 E4M3 的舒适区。FP8 不是”免校准”,而是”校准变得简单”


3. W8A8 FP8 的使用方式:静态与动态 scale

FP8 W8A8 的 scale 策略(与 INT8 W8A8 同构,但重要性不同):

3.1 权重:静态 per-channel(或 per-tensor)

权重是静态的,量化时(离线)统计一次 range 就固定 scale,存进模型。默认 per-channel(每输出通道一个 scale),张量核计算时 scale 融入累加器,零额外开销。也可以在 128×128 块内做更细的 block-wise scale(FP8 block 方案),进一步压低误差。

3.2 激活:per-token 动态(主流)或静态

激活是动态的,两种做法:

  • 动态 per-token:每个 Token 单独算 scale(运行时统计该 token 的最大值),一行代码、无需校准集,精度通常已足够——这是 llm-compressor FP8 默认、也最常见的配置
  • 静态 per-tensor:离线用校准集统计一个固定 scale,运行时快一点但精度略低,且依赖校准集质量

3.3 一句话总结

FP8 W8A8 的默认配方 = per-channel 静态权重 scale + per-token 动态激活 scale,不需要校准集(用 RTN 即可),精度在绝大多数模型上接近 FP16。这比 SmoothQuant 时代的 INT8 方案(需要校准、需要平滑)简单得多——格式的进步直接简化了算法。


4. 硬件视角:FP8 的算力账本

FP8 在 Hopper 上是原生张量核指令,吞吐是 FP16 的两倍:

硬件FP16 稠密吞吐FP8 稠密吞吐比值
H100 SXM约 990 TFLOPS约 1980 TFLOPS2x
B200约 2.25 PFLOPS约 4.5 PFLOPS2x
GB300(Blackwell Ultra)-FP8 约 5 PFLOPS-
  • GEMM 直接翻倍:Prefill(Compute Bound)的收益最直接——同一个 GEMM,FP8 张量核一半时间跑完
  • Decode 同时受益:权重字节数减半 → 带宽压力减半 → Memory Bound 的 Decode 吞吐接近翻倍
  • FP8 是”算力 + 带宽”双收益,这也是为什么 vLLM 上 FP8 是”无脑可开”的第一档优化(--quantization fp8

💡 提示:FP8 在 Hopper 上还有一个隐藏福利——它是 NVIDIA Transformer Engine 的默认路径,训练与推理共用同一套格式与内核优化,生态深度远超 INT8。


5. Blackwell 与 4-bit 浮点:FP4/MXFP4/NVFP4

Blackwell(SM100/SM110,B200/B300)张量核原生支持 FP4 运算(吞吐是 FP8 的 2 倍)。但”4 位浮点”有几种不同形态:

格式结构scale 方案硬件加速
FP4(E2M1)1+2+1软件逐张量 scaleBlackwell 有,无硬件 scale 融合
MXFP41+2+1每 32 元素共享 1 个 E8M0(2 的幂)scale有(block scale 硬件融合)
NVFP41+2+1每 16 元素共享 1 个 E4M3(FP8)scale + 逐张量 FP32 二级 scale有(微块 scale 硬件融合)

三者底层数据都是 E2M1(1 符号 + 2 指数 + 1 尾数),差别全在 scale 的设计上:

  • FP4 裸用:无共享 scale,精度最差,基本只有实验价值
  • MXFP4:来自 OCP(Open Compute Project)的 Microscaling Formats 规范(E8M0 scale,2 的幂),块大小 32,是跨厂商的开放标准(AMD、Intel 同样支持)
  • NVFP4:NVIDIA 自家的 Blackwell 原生格式,块大小减到 16,scale 用 E4M3 而非 E8M0——更精细

6. NVFP4 深度:两级缩放设计

6.1 两级 scale 为什么更好

NVFP4 的官方定位是”在 4-bit 下保住 FP8 水平的精度”。它靠两个设计:

  1. 更小的块(16 元素):MXFP4 的块是 32 个元素共享一个 scale,遇到块内数值跨度大时(部分值大、部分值小),32 个值被一个 scale 约束,量化误差大。NVFP4 把块减半到 16,更贴合局部的动态范围——数值的”局部性”更强,误差显著下降。

  2. E4M3 scale(非 2 的幂):E8M0 的 scale 只能是 2 的幂(2152^{-15}2152^{15} 共 32 档),是一种”阶梯”;E4M3 有 3 位尾数,scale 可以有小数部分——对数据分布贴合得更精细。代价是 scale 本身需要 1 字节/16 元素,存储略增。

  3. 逐张量 FP32 二级 scale:E4M3 scale 的可表示范围有限(最大 448 附近),如果整个张量的数值整体偏移,一级 scale 可能越界——用一个逐张量的 FP32 乘子先做整体归一化,保证所有微块的 E4M3 scale 都落在舒适区。

6.2 效果数据

  • 显存:模型权重内存约为 FP16 的 1/3.5(每个值 4-bit + 每 16 值 1 字节 scale ≈ 4.5 bit/值),约为 FP8 的 1/1.8
  • 精度:NVIDIA 官方在 DeepSeek-R1-0528(原 FP8 模型)上验证,PTQ 到 NVFP4 后主要任务退化 ≤1%,AIME 2024 甚至反升 2%
  • 算力:GB300 的 NVFP4 稠密吞吐最高约 15 PFLOPS,是 FP8 的 3 倍;MLPerf 训练上 GB300 用 NVFP4 跑 Llama-3.1-405B 预训练比 GB200 用 FP8 快 1.9x
  • 生产形态:Blackwell 上 NVFP4 的 W4A16/W4A8 推理已是主流部署形态,各家(vLLM、TensorRT-LLM)第一方支持

📌 关键点:NVFP4 与 MXFP4 的竞争本质是”封闭 vs 开放”与”精细 vs 通用”之争。NVIDIA 在自家生态推 NVFP4(块更小、更准),MXFP4 是跨厂商开放标准(兼容性更好)。对 vLLM 用户来说两者都能用,Blackwell 上 NVFP4 精度上限更高,MXFP4 生态更广。


7. vLLM 支持现状:从 FP8 到 NVFP4/MXFP4

截至 vLLM v0.26.0(2026-07),量化方法的支持矩阵:

量化方法启动参数硬件要求说明
FP8(W8A8)--quantization fp8Ada / Hopper / Blackwell / AMD MI300+llm-compressor 产出,生态最成熟
NVFP4--quantization modelopt_fp4Blackwell(SM100)NVIDIA Model Optimizer 产出
MXFP4--quantization mxfp4BlackwellOCP 开放标准,CuTe-DSL 内核
MXFP8--quantization mxfp8Blackwell32 元素 block scale 的 FP8
FP8 KV Cache--kv-cache-dtype fp8Ada / Hopper / Blackwell见 4.4 节

v0.26.0 与量化直接相关的更新:

  • NVFP4 生态补全nvfp4_per_token 在线 MoE 量化(专家权重运行时量化,减少显存搬运);FP4 MoE 权重重打包的峰值内存受限优化
  • MXFP4 内核:CuTe-DSL 版 FlashInfer MXFP4 GEMM,效率对齐 NVFP4
  • Humming 系列:compressed-tensors 新增 w[2-7]a[4,8] 的 weight-only 支持(灵活位宽的 INT 量化,覆盖 LLM Compressor 生态)
  • Inkling 模型族(新模型)出厂即带 ModelOpt NVFP4 量化支持

工程要点:

  • NVFP4/MXFP4 都要 Blackwell GPU,老卡上加载会报 capability 错误
  • 模型产出工具链:NVFP4 用 NVIDIA Model Optimizermodelopt_fp4),MXFP4 用 llm-compressor(compressed-tensors 格式),两者产出后 vLLM 自动识别
  • 没有 Blackwell 又想省显存:FP8 或 INT4(GPTQ/AWQ)依然是通用选择

📝 总结

  • 浮点量化的优势:动态范围大、格子分布贴合自然分布,RTN 直出即可用,算法复杂度远低于 INT 量化
  • FP8 两种格式:E4M3(权重/激活,精度优先)、E5M2(梯度/范围优先);推理默认 E4M3
  • FP8 默认配方:per-channel 静态权重 scale + per-token 动态激活 scale,无需校准集
  • 硬件账本:FP8 = FP16 的 2 倍吞吐 + 权重带宽减半,Hopper 起的原生能力
  • 4-bit 浮点三兄弟:FP4(裸用不行)、MXFP4(OCP 开放标准,32 块 + E8M0 scale)、NVFP4(NVIDIA 原生,16 块 + E4M3 scale + FP32 二级 scale)
  • NVFP4 效果:显存约为 FP16 的 1/3.5,精度退化 ≤1%,GB300 吞吐为 FP8 的 3 倍
  • vLLM 现状:FP8 全硬件通用;NVFP4(modelopt_fp4)/MXFP4 需 Blackwell,已是一等公民

🎯 自我检验清单

  • E4M3 和 E5M2 各自的适用场景?为什么推理用 E4M3?
  • FP8 为什么还需要 scale?E4M3 的最大值是多少?
  • “动态 per-token 激活 scale”为什么不需要校准集?
  • FP8 相比 INT8 量化为什么”算法变简单”?
  • NVFP4 相对 MXFP4 的两个改进是什么?各自解决什么问题?
  • NVFP4 的二级 scale 解决什么问题?
  • vLLM 里启用 NVFP4 需要什么硬件?

📚 参考资料