一,模型量化概述
1.1,模型量化优点
模型量化是指将神经网络的浮点算法转换为定点。量化有一些相似的术语,低精度(Low precision)可能是常见的。
- 低精度模型表示模型权重数值格式为
FP16
(半精度浮点)或者INT8
(8位的定点整数),但是目前低精度往往就指代INT8
。 - 常规精度模型则一般表示模型权重数值格式为
FP32
(32位浮点,单精度)。 - 混合精度(Mixed precision)则在模型中同时使用
FP32
和FP16
的权重数值格式。FP16
减少了一半的内存大小,但有些参数或操作符必须采用FP32
格式才能保持准确度。
模型量化有以下好处:
- 减小模型大小:如
int8
量化可减少75%
的模型大小,int8
量化模型大小一般为32
位浮点模型大小的1/4
:
- 减少存储空间:在端侧存储空间不足时更具备意义。
- 减少内存占用:更小的模型当然就意味着不需要更多的内存空间。
- 减少设备功耗:内存耗用少了推理速度快了自然减少了设备功耗。
- 加快推理速度,访问一次
32
位浮点型可以访问四次int8
整型,整型运算比浮点型运算更快;CPU
用int8
计算的速度更快 - 某些硬件加速器如 DSP/NPU 只支持 int8。比如有些微处理器属于
8
位的,低功耗运行浮点运算速度慢,需要进行8bit
量化。
总结:模型量化主要意义就是加快模型端侧的推理速度,并降低设备功耗和减少存储空间,
工业界一般只使用 INT8
量化模型,如 NCNN
、TNN
等移动端模型推理框架都支持模型的 INT8
量化和量化模型的推理功能。
通常,可以根据 FP32
和 INT8
的转换机制对量化模型推理方案进行分类。一些框架简单地引入了 Quantize
和 Dequantize
层,当从卷积或全链接层送入或取出时,它将 FP32
转换为 INT8
或相反。在这种情况下,如下图的上半部分所示,模型本身和输入/输出采用 FP32
格式。深度学习推理框架加载模型时,重写网络以插入 Quantize
和 Dequantize
层,并将权重转换为 INT8
格式。
反量化层(
Dequantize
),是因为量化技术的早期,只有卷积算子支持量化,但实际网络中还包含其他算子,而其他算子又只支持FP32
计算,因此需要把 INT8 转换成 FP32。但随着技术的迭代,后期估计会逐步改善乃至消除Dequantize
操作,达成全网络的量化运行,而不是部分算子量化运行。