在大模型推理中,我们通常可以降低模型权重和激活值的位宽来降低模型的存储空间、提高推理效率,而这样的操作也称为量化。通过量化将浮点模型(float32)转化为低比特的定点模型(int8),使得模型运行的存储压力和计算复杂性都有所降低,从而使模型从GPU端移植到板载系统中运行成为可能
INT8量化
非饱和量化
非饱和量化是一种最简单粗暴的量化方法,其原理是根据float32数据中的最大绝对值计算出缩放因子scale,并使用线性映射的方法将float32中的值域转化到int8的值域(-127,
127)中 \[
R = scale * (value + zero\_point)
\]
非饱和量化的阈值选取方法能够将所有数据都映射到INT8数据域中,但非零点对称的分布会造成映射空间的浪费
饱和量化
饱和量化采取一定程度截断的方法,舍去出现频率低的\(|x|\)最大值,是的输入数据大致能够零点对称,而关于饱和量化中的阈值选取,参考KL散度算法
已知在量化的线性映射公式(1)中,当zero_point为0时为对称量化,当zero_point不为0时为非对称量化
KL散度
KL散度全称为kullback-leible散度,该算法用于衡量两个分布之间的匹配程度 \[ D_{KL}(p||q) = \sum_{i = 1}^{N}p(x_i)\log({p(x_i)\over q(x_i)}) \] 其中\(p(x_i)\)表示真实分布,\(q(x_i)\)表示我们去近似\(p(x_i)\)的分布。当KL散度计算值越接近0,两个分布的近似程度越高,反之差距越大。而KL散度具有正定性和非对称性