Skip to content

数值映射 ​

数值映射定义高精度值如何变成低精度编码,以及如何重建为近似值。Integer 与 Float 都需要数值映射,但两者的目标格点和映射参数不同。

数值类型定义目标编码,量化粒度定义多少元素共享映射参数;本文只讨论转换规则。

映射总览 ​

映射目标格点常见参数典型形式
Integer Mapping均匀整数格点scale、zero-pointAffine Quantization
Float Mapping由指数与尾数定义的非均匀格点可选 scaleDirect Cast、Scaled Cast

两类映射都会涉及舍入和范围处理。Zero-point 主要属于 Integer 的 Affine Mapping,不是低精度 Float 的常规参数。

Integer Mapping ​

Integer 常用 Affine Quantization:

q=clip(⌊xs⌉+z,qmin,qmax),x^=s(q−z).
  • x:原始高精度值。
  • q:低精度整数编码。
  • x^:反量化后的近似值。
  • s>0:scale,决定整数格点在原始数值域中的间距。
  • z:zero-point,使整数 q=z 对应原始值 0。

Symmetric / Asymmetric ​

对比项SymmetricAsymmetric
原始覆盖范围以 0 为中心,通常为 [−a,a]根据 [rmin,rmax] 平移
参数scale,zero-point 通常固定为 0scale 与 zero-point 或 offset
反量化x^=sqx^=s(q−z)
特点参数少、Kernel 简单更充分地利用非对称分布的编码范围

Symmetric / Asymmetric 描述整数格点相对 0 的布局,不是 Float 格式的分类。

Zero-Point ​

由 x^=s(q−z) 可知,q=z 时重建值为 0。Asymmetric Min-Max 映射通常使用:

z=clip(⌊qmin−rmins⌉,qmin,qmax).

Symmetric Quantization 通常令 z=0 并省略该字段。Asymmetric 实现也可以保存等价的实数 offset,应以反量化公式判断其语义。

Float Mapping ​

低精度 Float 的指数和尾数直接定义非均匀格点:数值越大,相邻可表示值的间距通常也越大。映射不使用整数 zero-point,常见形式包括:

Direct Cast ​

q=CastF(x),x^=Convert(q).

F 是目标 Float 格式,例如 FP8 E4M3。Direct Cast 不额外引入 scale,动态范围完全由目标格式决定。

Scaled Cast ​

q=CastF(xs),x^=sq.

Scale 先把局部数值范围对齐到目标 Float 格式,再由 Float 格点完成舍入。FP8、MXFP8 和 NVFP4 都可以采用 Scaled Cast,但 scale 的类型、粒度和层级不同。

参考 ​

  1. IEEE 754-2019:IEEE Standard for Floating-Point Arithmetic
  2. NVIDIA TensorRT:Quantization Schemes
  3. NVIDIA Transformer Engine:FP8 and FP4 Primer
  4. PyTorch torchao:Quantization Overview