【GaintPandaCV导语】F8Net用定点化量化方法对DNN进行量化,在模型推理只有8-bit的乘法,没有16-bit/32-bit的乘法,采用非学习的方法即标准差来定小数位宽。目前是我看到的第一篇硬件层面全8-bit乘法的模型推理的方法。
论文出处:ICLR2022 Oral《F8Net: Fixed-Point 8-bit Only Multiplication for Network Quantization》
问题1:什么是定点化(fixed-point)?
答曰:这个链接讲的非常好浮点数的定点化 - 知乎 (zhihu.com) ,我复述(抄一下)一下:
1.定点转换
以两个16位的浮点数相乘为例
2.918 × 3.1415926 = 9.1671672068
将此浮点数定点化,定点要求为Qn=12(这里Qn=12表示小数位数占12bit),取符号位为1bit,则整数部分为3bit。
2.918 × 2^12 = 11952.168 定点化后取整为:11952;
3.1415926× 2^12 = 12867.8632896 定点化后取整为:12868;
以上做舍入误差后取整数。
2.定点数相乘:
11952 * 12868 = 153798336.
3.定点数还原为小数
153798336 / (2^24) = 9.167095184326171875
两个12bit的数相乘,结果为24bit,因此除以2^24可以还原原数据,由于存在舍入误差
还有2个小点“ 量化误差与量化精度 ”和“ 无损定点化 ”,请大家去链接上面看,记得得作者点赞!!!
问题2:为什么要做这样的量化,跟之前的量化有什么不同?
请看图,因为目前“常识”中的量化推理有int32的乘法,IAQ(也就是tflite的量化推理)把scale用定点化来逼近,需要int16或者int32的乘法,也就是说现有的量化推理还是需要int32的乘法,F8Net想做的事情就是在量化推理中只有int8的乘法,没有16bit/32bit的乘法。
图1
首先来总结一下,F8Net做了什么事情:
1、模型量化推理只有8-bit位宽的乘法; 2、提出一个选择小数位宽的方法,对weight和activation都做定点化; 3、采用PACT的方法优化定点化的参数,把定点化和PACT的方法结合,推导出这样的优化公式; 4、定点化有效权重和有效偏差,有效权重和有效偏差指的是fold bn的con-bn的参数; 5、对残差块的d定点化参数对齐方法的实验和探究; 6、高精度的乘法对神经网络的性能来说,不是必须的。
如何选择小数位宽:用标准差来选择小数位宽
看到这里的大家肯定有疑问, “就这???这论文是水文啊??用标准差来选择位宽,这个太naive吧。 ” emmm,别急,好好看他怎么做的。
首先,作者用高斯分布(这里有个小问题,为什么用高斯呢)生成一堆随机数。采用均值为0,不同的方差来生成随机数,然后用不同的小数位宽来做定点化,计算他的相对量化误差。
图2
看这个图,横坐标是不同数值的标准差,纵坐标是相对量化误差。 可以发现不同的FL(小数位宽),都有自己相对误差最小时候的标准差 ,也就是说,可以根据标准来选择小数位宽。
那么这里就会有质疑:这是因为你用了假设,这个假设是高斯分布。这个读者可以思考一下,这种假设是否合理。我的观点是: 合理 !
ok,那么找到了一个选位宽的标准了,接下来呢,这个数值怎么计算呢?看另外一张图。
图3
把图2转换成图3(a)和(c),这个转换非常好理解,就不描述了。然后 找蓝色线的阶梯和红色线的关系,找到每个阶梯对应标准差的阈值 。
作者把他取log后,发现这个阈值与位宽是接近线性的,那么得出图3(b)和(d)的阈值经验公式。那么小数位宽的选择阈值已经找到了。这个F8Net的最主体的部分已经完成了。
这里大家又有疑问了:为什么要用取log?这就是传说中的调参吗?
分享一下我的理解:看图3(a)和(c)阶梯对应的红色线,这个尺度下,你只能看出随着阶梯下降,红色线有一点点上升的趋势。这个尺度下你看不清楚,要怎么办?换个尺度,而log就是非常常用的方法。
与PACT方法结合:找截断阈值
这里先抛出问题:为什么要用PACT?做量化不外乎:什么量化方法(线性量化/非线性,对称量化/非对称量化等等),以及这么找数值阈值(也就是截断阈值)。PACT就是非常简单又非常使用的方法。我在做量化训练的时候也是用了PACT。PACT YYDS!
这里公式非常好理解,也非常好推导,也就是简单的变换而已,这里就不做公式推导,因为推导非常简单。
有效权重weight与有效偏差bias
什么是有效weight和有效bias?这里说的是conv和bn融合后的conv_bn的weight和bias。