0%

quantization (LLM)

简要介绍典型quantization方式

AWQ

重点处理少量最重要的权重

  • calib set推一遍forward,看激活值
  • 太大的激活值对应的权重就定一个放大因子,让这些权重因为变大从而在量化时保留更多细节;输入的激活值相应缩小。
  • 激活值一般还是FP16
  • 速度快,泛化性更强(和GPTQ相比而言)

具体而言,假设某个linear是Y=WXY=WX(注意WW是一个固定权重),普通PTQ会直接Y=quant[W]XY'=quant[W]X,而AWQ为了实现上面的想法,会设法找到一个S=diag(s1,...,sn)S=diag(s_1,...,s_n),使得推理过程变成Y=quant[WS]S1XY'=quant[WS]S^{-1}X

至于SS的寻找方法,其实就是S=argminYYS^*=\arg\min||Y'-Y||,问题是量化不可导,于是使用带有经验性的定点搜索。

  • calib set推一遍forward,看各层输入在样本维度求平均的结果作为sXis_{X_i}
  • 实践上有时会对这些值做一遍归一化,避免后面指数出问题
  • 最后经验性地规定si=sXiαs_i=s_{X_i}^{\alpha},在0到1之间取几个固定α\alpha值搜索哪个能让上面的目标最小,就用哪个α\alpha。(通常在0.3-0.7左右)

最后注意S1S^{-1}这块会多一步计算,因此在transformer里面要把它吸收到layernorm里面(二者都是逐通道的)

典型方案

通常的量化方案是:

  • 注意模型尺寸

    • 太小的(<3B)谨慎使用量化,这个道理对LLM也是适用的
  • 使用量化框架将原始权重做成量化版本

    • QAT:能训再用,一般魔改STE
    • PTQ:通常直接AWQ
      • 准备calib set(前向推理统计分析权重值,这个不用太大但要包含足够比例的业务数据)
      • 定量化格式(AWQ基本就是W4A16,这个就是最常用的;新卡支持FP8要用其他工具,ModelOpt之类)
      • 注:目前部署的时候一般不会NF4
  • 推理框架直接加载

    • W4A16-Marlin
    • kvcache的量化在推理时开启

欢迎关注我的其它发布渠道