1.模型为啥需要量化?
我们都知道越宽越深的模型比越窄越浅的模型精度高,效果好;但是越来越多的模型需要再边缘设备上部署,云部署还能满足计算要求,边缘设备上的算力有限.因此我们不得不考虑存储空间,设别内存,设备运行功耗以及延时性等问题,特别是在消费级pc上和移动终端上部署模型.因此解决模型的量化应运而生.
2.什么是模型量化?
模型量化即以较低的推理精度损失将连续取值的浮点型模型权重进行裁剪和取舍,它是以更少位数的数据类型用于近似表示32位有限范围浮点型数据的过程,而模型的输入输出依然是浮点型,从而达到减少模型尺寸大小、减少模型内存消耗及加快模型推理速度等目标。
比如int8量化,就是让原来32bit存储的数字映射到8bit存储。int8范围是[-128,127], uint8范围是[0,255]。
3. 模型量化的好处有哪些?
3.1 量化的优点
- 减小模型尺寸,如8位整型量化可减少75%的模型大小
- 减少存储空间,在边缘侧存储空间不足时更具有意义
- 易于在线升级,模型更小意味着更加容易传输
- 减少内存耗用,更小的模型大小意味着不需要更多的内存
- 加快推理速度,访问一次32位浮点型可以访问四次int8整型,整型运算比浮点型运算更快
- 减少设备功耗,内存耗用少了推理速度快了自然减少了设备功耗
- 支持微处理器,有些微处理器属于8位的,低功耗运行浮点运算速度慢,需要进行8bit量化
3.2 量化的缺点?
- 模型量化增加了操作复杂度,在量化时需要做一些特殊的处理,否则精度损失更严重
- 模型量化会损失一定的精度,虽然在微调后可以减少精度损失,但推理精度确实下降
4. 模型量化的原理
4.1 量化数据映射
比如进行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)
4.2 对称量化和非对称量化
量化方式分为对称量化和非对称量化,其中上面是非对称量化的方式,如果是对称量化,则是将原浮点数的范围由[Xmin, Xmax]扩充为[-Xmax, Xmax],这里假定 |Xmax|>|Xmin|。然后按照上面公式转换量化值。对称量化对于正负数不均匀分布的情况不够友好,比如如果浮点数全部是正数,量化后的数据范围是[128,255], [0,127]的范围就浪费了,减弱了int8数据的表示范围。