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