简要介绍典型quantization方式
AWQ
重点处理少量最重要的权重
- calib set推一遍forward,看激活值
- 太大的激活值对应的权重就定一个放大因子,让这些权重因为变大从而在量化时保留更多细节;输入的激活值相应缩小。
- 激活值一般还是FP16
- 速度快,泛化性更强(和GPTQ相比而言)
具体而言,假设某个linear是(注意是一个固定权重),普通PTQ会直接,而AWQ为了实现上面的想法,会设法找到一个,使得推理过程变成。
至于的寻找方法,其实就是,问题是量化不可导,于是使用带有经验性的定点搜索。
- calib set推一遍forward,看各层输入在样本维度求平均的结果作为
- 实践上有时会对这些值做一遍归一化,避免后面指数出问题
- 最后经验性地规定,在0到1之间取几个固定值搜索哪个能让上面的目标最小,就用哪个。(通常在0.3-0.7左右)
最后注意这块会多一步计算,因此在transformer里面要把它吸收到layernorm里面(二者都是逐通道的)
典型方案
通常的量化方案是:
-
注意模型尺寸
- 太小的(<3B)谨慎使用量化,这个道理对LLM也是适用的
-
使用量化框架将原始权重做成量化版本
- QAT:能训再用,一般魔改STE
- PTQ:通常直接AWQ
- 准备calib set(前向推理统计分析权重值,这个不用太大但要包含足够比例的业务数据)
- 定量化格式(AWQ基本就是W4A16,这个就是最常用的;新卡支持FP8要用其他工具,ModelOpt之类)
- 注:目前部署的时候一般不会NF4
-
推理框架直接加载
- W4A16-Marlin
- kvcache的量化在推理时开启