跳转到主要内容

FP4/FP8 量化:值域、Scale 与运行时合同

区分 FP4/FP8 数值格式、Current/Delayed/Block scaling、NVFP4 与 MXFP8,并说明 Checkpoint 到 Kernel 的能力边界

· 约 6 分钟阅读

讨论 FP4/FP8 时必须拆成三层:E4M3、E5M2、E2M1 等值格式,Scale 的时间来源、共享粒度与自身类型,以及设备和引擎最终执行的运行时路径。少写其中一层,就无法判断模型到底存了什么、算了什么。

旧式“FP8 固定使用 per-128×128”“NVFP4 就是 per-32 E8M0”“MXFP4 等于 NVFP4”都不成立。数值格式和 Scale recipe 不能混为一谈。

30 秒复习
  • 一句话:FP4/FP8 只有与 Scale recipe 和实际 Kernel 一起描述,才是一份可执行的低精度合同。
  • 三个判断:E4M3/E2M1 不定义 Scale 粒度;NVFP4 不等于 MXFP4;Checkpoint 标签不能证明原生低精度执行。
  • 核心模型:用 低精度值 × block Scale × global Scale 还原数值,再用 checkpoint + recipe + engine + architecture + shape 定位实际路径。
  • 边界:理论 payload 不是实例显存,硬件峰值也不是端到端 TPS;版本、shape、padding 与 fallback 都要进入验收。

FP8 Current、Delayed、MXFP8 与 NVFP4 的 Scale 合同

从 AMX 迁移的直觉:E4M3/E2M1 对应低精度 operand 格式,Scale 对应表示范围合同,Tensor Core 类似专用 tile 矩阵乘单元,FP32 accumulator 则对应 AMX 中“窄输入、宽累加”的数值保护。类比只到执行合同为止;两者的并行规模、存储层次和支持格式并不相同。

1. FP8 值格式

NVIDIA Transformer Engine 当前定义两种 FP8:

格式位布局最大有限幅值取舍
E4M31 sign + 4 exponent + 3 mantissa448尾数更多,精度相对更高
E5M21 sign + 5 exponent + 2 mantissa57344动态范围更大,精度相对更低

这张表只描述值本身。同一个 E4M3 张量可以使用 per-tensor、per-channel 或 block scaling,Scale 也可能来自当前 amax、历史 amax 或每个 block 的动态计算。

2. FP8 的三种典型 Scale 配方

2.1 Current Scaling

Current Scaling 根据当前张量的 amax 计算 Scale,然后再执行 cast:

s=amax(x)maxFP8,xq=castFP8(xs)s = \frac{\operatorname{amax}(x)}{\operatorname{max}_{\mathrm{FP8}}}, \qquad x_q = \operatorname{cast}_{\mathrm{FP8}}\left(\frac{x}{s}\right)

它能跟随当前分布,但通常需要一次读取求 amax、再读取并转换。

2.2 Delayed Scaling

Delayed Scaling 使用历史 amax 估计当前 Scale。它减少了本次量化前的张量扫描,但 Scale 对突发分布变化的响应更慢。

Current 与 Delayed 都可以使用 E4M3/E5M2;区别在 Scale 的时间来源,不是值格式。

2.3 MXFP8

MXFP8 是 microscaling FP8:

  • 数据值使用 FP8 E4M3。
  • 每 32 个连续元素共享一个 E8M0 Scale。
  • Scale 是 2 的幂,适合硬件 block scaling。
  • 每个 block 独立,减少整个张量被少数 outlier 拉宽的问题。

MXFP8 的 32 + E8M0 不能套到 NVFP4 上。

3. NVFP4 的分层 Scale

NVFP4 的低精度值采用 E2M1,可表示的幅值集合为:

0, ±0.5, ±1, ±1.5, ±2, ±3, ±4, ±6

Transformer Engine 的 NVFP4 使用分层 scaling:

xxE2M1sblocksglobalx \approx x_{\mathrm{E2M1}} \cdot s_{\mathrm{block}} \cdot s_{\mathrm{global}}
  • x_E2M1:4 bit E2M1 值。
  • s_block:每 16 个连续元素共享的 FP8 E4M3 Scale。
  • s_global:整个张量共享的 FP32 Scale。

对于权重,Transformer Engine 默认还可以采用 16×16 的二维 scaling;激活和梯度使用一维 16-element block。二维权重 Scale 的布局不能用一维公式直接估算。

NVFP4 与 MX 家族不是同义词

方案数据值Local ScaleBlock额外全局 Scale
MXFP8FP8 E4M3E8M032
NVFP4FP4 E2M1FP8 E4M316FP32 per-tensor
OCP MXFP4FP4 E2M1E8M032

NVFP4 与 MXFP4 都使用 E2M1,不代表它们拥有相同的 Scale 类型、block size、数值误差或 Kernel 合同。

4. 从 Checkpoint 到 Kernel

Checkpoint 中出现 fp4nvfp4,只能证明存储或 recipe 元数据;不能自动证明硬件执行了原生 FP4 MMA。

真实路径由以下联合决定:

(checkpoint format,
 recipe and scale layout,
 engine version,
 kernel backend,
 GPU architecture,
 operand shape)
→ executed runtime path

可能结果包括:

结果含义验证证据
Native低精度 operand 直接进入目标 Tensor Core 路径Kernel 名、operand dtype、设备能力
Cast / dequant存储为低精度,计算前转换为 FP8/BF16Q/DQ 或 cast Kernel、额外中间张量
Pre-expand加载阶段展开为更高精度常驻加载日志、实际 HBM、权重 buffer dtype
Fallback / reject不支持该 recipe 或 shapeWarning/error、替代 Kernel、性能与容量异常

Hopper 支持原生 FP8 Tensor Core;原生 FP4 计算属于 Blackwell 及之后的设备能力。H100/H200 如何处理一个 FP4 Checkpoint 不是统一答案:引擎可能转换、展开、回退或拒绝,因此不能直接写死“显存一定翻倍”。

5. Scale Metadata 的容量账本

以下只用于理解数量级,真实实现还要加 padding、alignment、transpose copy 和未量化层:

配方数据 bytes/valueScale 开销备注
FP8 per-tensor1每张量约一个 FP32 Scale不包含 amax history
MXFP81每 32 值一个 E8M0 byte1 + 1/32 bytes/value
NVFP4 1D0.5每 16 值一个 E4M3 byte + 全局 FP320.5 + 1/16 bytes/value
NVFP4 2D weight0.5按 16×16 tile 组织 Scale以实际布局和 padding 计算

模拟器不应只存一个 dtype -> bytes 映射。至少要记录:

value format
scale format
scale granularity
packing and padding
runtime expansion
excluded high-precision tensors

6. FP4/FP8 的性能边界

容量收益

只要低精度数据保持压缩存储,权重或 KV 的 HBM 占用就会下降;但比例要包含 Scale、padding 和高精度例外。

带宽收益

Decode 等 memory-bound 路径可能因为读取字节减少而受益。前提是解包、Scale 读取、cast 和不连续访问没有抵消收益。

计算收益

只有设备和 Kernel 对目标 operand 组合提供原生支持,低精度峰值算力才有意义。不要用硬件峰值表直接推导端到端 TPS:

Tendtoend=Tquant+TGEMM/BMM+Tattention+Tcommunication+TframeworkT_{\mathrm{end-to-end}} = T_{\mathrm{quant}} + T_{\mathrm{GEMM/BMM}} + T_{\mathrm{attention}} + T_{\mathrm{communication}} + T_{\mathrm{framework}}

对于混合精度模型,每个算子应使用自己的精度峰值和实际时间建模,而不是把 FP4、FP8、BF16 FLOPs 相加后统一除以一个峰值。

7. 实际核对清单

Checkpoint

  • 权重值格式是什么?
  • Scale dtype、shape 和 block size 是什么?
  • 哪些层没有量化?
  • 是否同时保存 rowwise/columnwise 或 transpose copy?

Runtime

  • 引擎版本是否支持该 recipe?
  • 设备 compute capability 是否支持目标低精度 Kernel?
  • 日志和 trace 中的 operand dtype 是什么?
  • 是否出现 cast、dequant、pre-expand 或 fallback?

Acceptance

  • 实际峰值 HBM 是否与容量账本一致?
  • TTFT、TPOT、TPS 是在完全相同 Case 下比较的吗?
  • 质量是否覆盖 PPL、任务分数、长上下文和业务样本?

相关页面

参考资料