[原]Tensorflow中采用的量化方案
摘要
本文根据google发表在cvpr2018上的量化文章《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》讲解量化过程,该过程同时也是谷歌的Tensorflow Lite中使用的量化方法。
1. 量化方案
经典的Uniform Affine Quantizer中存在计算量无法下降的问题,Tensorflow在其量化工具中进行了改进,实现了把浮点数计算变为整数计算,精度损失在1%-2%。量化过程如下:
设整数q与浮点数r的转换关系为:
假设卷积过程中的浮点数相乘过程如下:
r3为输出,r1、r2分别为输入的权重和数据,这三个数都是浮点数型。
在矩阵NxN中,对于一个浮点数,有
其中 把(2)带入(1)中得到,
从(4)中可以看出浮点数计算已经被转化为整数的计算,其中只有M是浮点数,并且M是可以预先计算出来的
M还可以再进一步进行简化运算,作者发现M值总是在(0,1)的区间之内,于是可以设
其中n为一个非负整数,M0处于区间[0.5,1)之间,M0可以采用int32来表示,即该值所有的值都是小数部分。所以公式(4)中乘以M的操作,可以等价为先乘一个定点的int32整数M0,再做n次位移操作。
观察发现,上面的公式(4)中每个数都需要先减对应的零点再做相乘操作,这样会进行较多的加减操作,在公式(4)的基础上可以进一步的推理变换如下形式:
此时,公式(7)中的计算就集中在
公式(7)中的值就采用int32来存储。
接下来将该卷积的bias进行int32的量化,定义量化步长和零点为:
所以,
将rbias带入到卷积求和公式中,可以得到
进行变换得到
最终输出该卷积层的量化输出值q_3^((i,k))
2. 实验
测试的例子以TF官网上已经预训练好的GoogLeNet 为例,对其量化为8bit精度模型,然后对量化前后的模型进行测试
模型原大小:91.24MB
量化后模型大小:23.18MB
原模型(浮点数)预测结果:
8bit量化后模型预测结果:
量化前耗时:0.27532124519348145s
量化后耗时:0.7184736728668213s
这是目前比较疑惑的地方,量化后使用的时间比量化前还多,具体原因还没弄清楚。量化后的pb文件还可以进一步转化为tflite文件,不过googLeNet中有不支持转化的算子,转化不成功。
在网上参考其他人的博客,有人把mobilenet量化后的.pb文件进一步转化为tflite文件,在3536上运行,速度有2-3倍的提升
3. 参考
- 《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》
https://arxiv.org/abs/1712.05877 - google量化白皮书
https://arxiv.org/pdf/1806.08342v1.pdfhttps://arxiv.org/pdf/1806.08342v1.pdf - https://blog.csdn.net/mizhenpeng/article/details/81488244
- https://zhuanlan.zhihu.com/p/35700882