模型量化的目的

本文的模型量化是优化深度学习模型推理过程的内存容量和内存带宽问题的概念,通过将模型参数的浮点数类型转换称整型存储的一种模型压缩技术。以可以接受的精度损失换取更少的存储开销和带宽需求,更快的计算速度,更低的能耗与占用面积。

比如int8量化,就是让原来32bit存储的数字映射到8bit存储。int8范围是[-128,127], uint8范围是[0,255]。

模型量化优点:

  • 减小模型尺寸,如8位整型量化可减少75%的模型大小
  • 减少存储空间,在边缘侧存储空间不足时更具有意义
  • 易于在线升级,模型更小意味着更加容易传输
  • 减少内存耗用,更小的模型大小意味着不需要更多的内存
  • 加快推理速度,访问一次32位浮点型可以访问四次int8整型,整型运算比浮点型运算更快
  • 减少设备功耗,内存耗用少了推理速度快了自然减少了设备功耗
  • 支持微处理器,有些微处理器属于8位的,低功耗运行浮点运算速度慢,需要进行8bit量化

模型量化缺点:

  • 模型量化增加了操作复杂度,在量化时需要做一些特殊的处理,否则精度损失更严重
  • 模型量化会损失一定的精度,虽然在微调后可以减少精度损失,但推理精度确实下降

量化数据映射的实现

pytorch QAT 反量化 pytorch模型int8量化_浮点数

比如进行int8的量化,数据范围是[-128,127],最大值最小值分别是Xmax, Xmin,X_q表示量化后的数据,X_f表示浮点数据。

X_q=X_f/scale +zero

scale=(Xmax-Xmin)/(127-(-128))=(Xmax-Xmin)/255

zero=0-round(Xmin/scale)或者zero=255-round(Xmax/scale)

量化方式分为对称量化非对称量化,其中上面是非对称量化的方式,如果是对称量化,则是将原浮点数的范围由[Xmin, Xmax]扩充为[-Xmax, Xmax],这里假定 |Xmax|>|Xmin|。然后按照上面公式转换量化值。对称量化对于正负数不均匀分布的情况不够友好,比如如果浮点数全部是正数,量化后的数据范围是[128,255], [0,127]的范围就浪费了,减弱了int8数据的表示范围。

对称量化的图示

pytorch QAT 反量化 pytorch模型int8量化_模型量化_02

非对称量化的图示

pytorch QAT 反量化 pytorch模型int8量化_浮点数_03