低精度数据格式

低精度的优势

  1. 省内存
  2. 提高tensor core的吞吐

浮点数的计算公式

简而言之就是动态范围+精度

FP32 / TF32

TF32 降低了精度

FP32转换TF32用什么技术

可以直接处理

FP8 两个变体 E4M3 E5M2

动态范围差很多,针对激活通常小范围,梯度是大范围

FP8 scaling:平时搭配一个FP32 的 per-tensor scaling factor(H100 的 Transformer Engine 自动维护)

FP6 与 FP4 微缩格式

MX 把「per-tensor scaling」做成「per-block scaling」 — 每 32 个数共享一个 8 位的指数 scale,等于在硬件层面就内置了 fine-grained 量化。

NVFP4 把块大小从 32 缩到 16,把块 scale 从纯指数 E8M0 换成更精细的 FP8(E4M3),再外面套一层 FP32 per-tensor scale — 三层 scale 结构让它在 Blackwell 推理上的精度比 MXFP4 明显更好,代价是 metadata 占用稍微多一点。

整数格式 INT8 / INT4

动态范围完全靠外部 scale 决定

能力

指数位多的(BF16、FP8-E5M2)适合训练 — 梯度跨数量级时不会溢出;尾数位多的(FP16、FP8-E4M3、FP6-E2M3)适合推理 — 权重数值分布已知,精度更值钱。

TF32 / BF16 是「FP32 的截断」。把它们和 FP32 叠在一起,bar 的左右端完全重合,只是精度刻度不同。这就是为什么 FP32 ↔ BF16 / TF32 转换硬件代价几乎为零。

参考

https://research.frankk.site/llm-low-precision-formats