量化基础:INT8/INT4 数值表示与精度损失
一句话定位:量化就是用低位整数近似表示浮点数,用可控的精度损失换取显存、带宽与算力上的三重收益。
1. 数值表示:scale 与 zero-point
把浮点范围 [min, max] 线性映射到低位整数区间(INT8 为 [-128, 127]):
1 | q = round(x / scale) + zero_point |
- scale:缩放因子,决定每个整数刻度代表多大的浮点跨度;
- zero_point:零点偏移,使浮点 0 能被精确表示。
2. 精度损失从哪来
- 舍入误差(rounding):
round()带来的固有误差,位宽越低越大(INT4 只有 16 个刻度); - 动态范围截断(clipping):超出所选范围的值被截断;
- 异常值(outlier)是主要杀手:LLM 激活中常出现极少数远超其余值数十倍的离群值。由于 scale 由 max 决定,个别 outlier 会把 scale 撑得极大,导致绝大多数正常值挤在极少几个刻度里,有效精度崩塌。这也是 SmoothQuant、AWQ 等方法专门处理 outlier 的原因。
3. 三组关键取舍
- 对称 vs 非对称:
- 对称(zero_point=0):计算更快、实现简单,适合分布近似零均值的权重;
- 非对称:能贴合偏斜分布(如 ReLU 后全为正的激活),精度更好但多一次零点运算。
- 粒度:逐张量 / 逐通道 / 逐组:
- 逐张量(per-tensor):全张量一个 scale,开销最小、精度最差(最易被 outlier 毁掉);
- 逐通道(per-channel):每个输出通道一个 scale,精度明显更好,是权重量化的常规选择;
- 逐组(per-group):通道内再按 128/64 个元素分组,各组独立 scale,INT4 场景近乎必需,代价是额外存储 scale 与更复杂的 kernel。
- 规律:粒度越细 → 精度越高、元数据与计算开销越大。
4. 收益(为什么值得做)
- 显存减半以上:FP16→INT8 约省 50%,→INT4 约省 75%,可放更大模型或更多 KV Cache/并发(见 3.4);
- 带宽降低:LLM decode 阶段是访存密集(memory-bound),读权重的字节数减半基本等于延迟减半,这是量化提速最主要的来源;
- 低精度算力更高:现代 GPU 的 Tensor Core 对 INT8/FP8/INT4 提供数倍于 FP16 的理论算力。
参考:论文《A Survey of Quantization Methods for Efficient Neural Network Inference》