Post

大模型量化入门:精度、离群值与三种 PTQ 思路

理解量化如何压缩权重,以及 LLM.int8、SmoothQuant、GPTQ 分别处理什么问题。

大模型量化入门:精度、离群值与三种 PTQ 思路

量化的出发点很直接:用更少的位数存储或计算数值,降低模型推理的资源需求。但低位宽会引入误差,真正要解决的是如何在资源开销和模型质量之间取得平衡。

这篇文章由个人量化笔记整理,聚焦概念与训练后量化(Post-Training Quantization,PTQ),不包含实测性能结论。

先区分数值范围与精度

格式符号位指数位尾数位主要区别
FP321823范围较大,精度较高
FP161510占用较小,数值范围较窄
BF16187指数范围与 FP32 接近,尾数精度较低

指数位主要影响可表示的数值范围,尾数位主要影响有效精度。BF16 也有舍入误差和溢出边界,不能把“范围较大”理解为任何大数都没有问题。

减少权重位宽可以压缩权重存储,但运行时还包含 KV cache、激活和临时缓冲区,所以权重压缩比例不能直接等同于总显存下降比例。是否加速还取决于计算内核、硬件和转换开销。

用缩放因子映射数值

以简化的对称整数定点量化为例:

\[q=\operatorname{clip}\!\left(\operatorname{round}(x/s),q_{\min},q_{\max}\right), \qquad \hat{x}=s q\]

其中 \(s>0\) 是缩放因子,\(q\) 是整数编码,\(\hat{x}\) 是重建值。舍入带来误差,超出范围的值被截断也会带来误差。实际方案还可能使用零点偏移,以及不同粒度的缩放因子。

如果一个向量中的多数值落在很小的范围,只有一个值特别大,为覆盖这个离群值而设置的缩放因子会让多数普通值失去精细分辨率。这正是大模型量化常见的困难之一。

三种方法分别在解决什么

方法主要思路阅读时关注的区别
LLM.int8对离群特征采用较高精度,其余部分使用 INT8混合精度分解
SmoothQuant等价缩放激活与权重,平衡两者的量化难度权重与激活量化
GPTQ用校准输入和近似二阶信息控制逐层量化误差低位宽权重量化

LLM.int8:把离群特征分离出来

简单地使用统一的低精度计算,可能被少量激活离群值影响。LLM.int8采用混合精度分解,让离群特征对应的部分保留较高精度,其余部分进行 INT8 矩阵乘法。

这里的重点是识别并处理影响显著的特征维度,不能把某个模型实验中观察到的离群维度数量当成所有模型的固定常数。

SmoothQuant:重新分配量化难度

设线性层为 \(Y=XW\),\(D\) 是非零正对角缩放矩阵,则:

\[XW=(XD^{-1})(DW)\]

在量化之前,这是一种保持输出的等价变换。SmoothQuant利用逐通道缩放来减轻激活离群值的影响,将部分量化难度转移到权重上,为权重和激活的低精度计算创造更合适的数值范围。

GPTQ:控制层输出的变化

只比较权重本身的误差,不一定能反映它对实际输出的影响。GPTQ使用校准数据,围绕层输出的重建误差组织权重量化。用上述矩阵约定,可以把目标直观写成:

\[\min_{\hat W}\;\|XW-X\hat W\|_F^2\]

这是帮助理解的目标表达式,完整算法还包括近似二阶信息和误差补偿。校准样本应覆盖实际输入分布,否则小的校准误差也未必代表真实任务上的质量。

实际比较时要记录什么

比较量化方案,应同时记录权重和激活的位宽、缩放粒度、校准数据、任务质量、峰值显存及端到端延迟。对不同模型或运行后端,结论可能不同。

这些方法提供了三种理解路径:保留关键部分的精度、调整数值范围,以及直接约束输出误差。掌握这个区别,比只记住“INT8”或“4 bit”更有助于阅读后续工作。

This post is licensed under CC BY 4.0 by the author.