I·Infra Notes AI Infra 工程实践指南 ← 返回主博客
加速与分布式 / READING NOTES

10.5 FP8 与 NVFP4 / MXFP4:Hopper、Blackwell 的低比特浮点

量化原理、低比特 Kernel、KV 压缩与部署选型

10.5.1 FP8 不是不需要 scale 的 INT8 替代品

E4M3 使用 1 符号、4 指数、3 尾数位;E5M2 为 1+5+2。常见 E4M3 格式最大有限值约 448,E5M2 约 57344。前者精度更细,后者动态范围更大;具体特殊值规则要按格式定义检查。

x_fp8 = cast_fp8(x / s)
x̂ = cast_float(x_fp8) × s
# 误差与值的指数区间有关,不是固定间距的整数网格。

FP8 仍会受 Outlier、上溢、下溢与 scale 粒度影响。Per-tensor、per-token 或 block scale 如何选,要结合输入分布与硬件路径。累加常用更高精度,但内部累加、分段提升和输出 dtype 都需检查 Kernel,不能只看输入格式。

Hopper 支持原生 FP8 Tensor Core,Ada 也有 FP8 支持;不能把「FP8 始于 Hopper」或「老 GPU 只支持 INT8」当成通用规则。没有原生算术支持的设备也可能读取 FP8 存储后转换计算,性能含义不同。vLLM 硬件支持表

10.5.2 MXFP4 与 NVFP4:同为 E2M1,Scale 设计不同

4 bit 浮点通常用 E2M1:1 符号、2 指数、1 尾数位,非负数值集合为 {0,0.5,1,1.5,2,3,4,6}。动态范围依赖共享 scale;它与 INT4 的均匀整数网格不同。

格式 元素编码 Block 大小 Block scale 额外 scale
FP8 E4M3 / E5M2 由方案决定 常用浮点 scale 由方案决定
MXFP4 E2M1 32 个元素 E8M0,表示 2 的幂 按具体实现检查
NVFP4 E2M1 16 个元素 E4M3,可表示更细的 scale FP32 per-tensor scale
MXFP4:x̂ = fp4_value × block_scale
NVFP4:x̂ = fp4_value × block_scale × tensor_scale

NVFP4 更小的 block 能限制 Outlier 对邻近值的影响,E4M3 scale 能比仅 2 的幂更细地拟合范围;代价是更多 metadata 与两级 scale。Blackwell 的原生低比特 Tensor Core 路径可消费相应 block scale;实际模型层、GPU SKU 和后端支持仍需核对。NVIDIA NVFP4 格式说明

只计元素和 block scale:MXFP4 有效 4+8/32=4.25 bits/element,NVFP4 为 4+8/16=4.5,后者还需摊销 tensor scale。更细 scale 可以提升拟合能力,却不保证任意模型 / 任务质量更高;应在相同 workload 下比较。

关键区分:W4A16 的 INT4 经常解包后做浮点计算;原生 FP4 的 W4A4 路径把两侧低比特操作数及 block scale 一起交给硬件。也有 FP4 Weight-only 或 emulation 后端,checkpoint 是 FP4 不代表激活一定 FP4,更不代表已经使用原生 FP4 MMA。

10.5.3 编码格式速查

格式 位宽与表示 典型作用
FP32 1+8+23,32 bit 参考计算、常见累加
TF32 运算有效精度 1+8+10,张量通常仍按 FP32 存储 Tensor Core 计算模式,不能按 19 bit 算存储压缩
FP16 1+5+10,16 bit 精度较细、范围较小
BF16 1+8+7,16 bit 指数范围大,常用 LLM 基线
FP8 E4M3 / E5M2,8 bit + scale W/A 或 KV 压缩;算术路径独立检查
INT8 / INT4 8 / 4 bit 整数编码 + scale / 可选 zero-point W8A8、Weight-only 或 KV,需声明对象
MXFP4 / NVFP4 E2M1,4 bit + block scale 微缩放浮点,需要匹配的布局与 Kernel

NF4 是针对近似正态分布设计的非均匀 4 bit codebook,常见于 QLoRA;它与 INT4、E2M1 FP4 不是同一种格式。