低精度数据格式
低精度的优势
- 省内存
- 提高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