1. absmax: 以fp16的0,对齐signed int8的0; 矩阵里fp16所有数的绝对值里最大的值,作为127,得到量化Scale值;乘法计算的时候,直接INT8*INT8=INT32,再缩放至INT8以进行下次计算;
2. max-min: 适合2个矩阵数值正负不均匀的情况,例如大部分是正数或大部分是负数。fp16矩阵里的(max-min)映射到255这个范围,fp16的0映射到int8的Z;
Af = Ai * SA + ZA
Bf = Bi * SB + ZB
其中,Af是A的fp16;Ai是A的int8;SA是量化scale;ZA是int8的Zero值;
则: Af*Bf
= (Ai * SA + ZA) * (Bi * SB + ZB)
= Ai*Bi*SA*SB + Ai*SA*ZB + Bi*SB*ZA + ZA*ZB
所以,Ai*Bi矩阵计算完成后,还要加上Ai矩阵乘以系数,再加上Bi矩阵乘以系数,再加ZA*ZB常数,该int32矩阵再缩放到int8,才是结果;
LLM.int8():
用的是absmax量化,即0是中点; INT8*INT8然后累加得到INT32(才能不溢出,INT16不够);
不是整个矩阵使用1个scale;而是每行或每列使用独立的scale:
row-wise quantization for the hidden state and column-wise quantization for the weight matrix