算子量化技术基本概念

INT8量化分为非对称量化与对称量化。对称量化是非对称量化的一个特例, 通常对称量化的性能会优于非对称量化, 而精度上非对称量化更优。

非对称量化

 

如上图所示, 非对称量化其实就是把[min,max]范围内的数值定点到[-128, 127]或者[0, 255]区间。

从int8到float的量化公式表达如下:

 其中r是真实的值, float类型; q是量化后的值, INT8或者UINT8类型;

S表示scale, 是float; Z是零点, 是INT8类型;

当量化到INT8时,

 =127,

 =-128; UINT8时,

 =255,

 =0。

反过来从float到int8的量化公式如下:

 对称量化

对称量化是非对称量化Z=0时的特例, 公式表达式如下所示:

 A)threshold是阈值, 可以理解为张量的范围是[-threshold, threshold];

B)这里

 , 通常是激活函数情况;

C)对于weight, 一般

 ;

D)对于UINT8, Tensor范围是[0, threshold], 此时

 。

Scale转换

公式表达:

其中取值是一个非负数

 ,其中

 取值[0.5,1],

 是一个非负数。

换个表述来说, 就是浮点数Scale, 可以转换成乘法与rshift, 如下表达:

 举例说明:

 乘法支持的位数越高, 就越接近Scale, 但是性能会越差。一般芯片会用32位或8位的乘法。

量化推导

可以用量化公式, 对不同的OP进行量化推导, 得到其对应的INT8计算方式。

对称与非对称都用在激活函数上, 对于权重一般只用对称量化。

卷积

卷积的表达式简略为: 

 代入int8量化公式, 推导如下:

 非对称量化特别注意的是, Pad需要填入

 。 

对称量化时, Pad填入0, 上述推导中

 与

 皆为0。

在PerAxis(或称PerChannal)量化时, 会取Filter的每个OC做量化, 推导公式不变, 但是会有OC个乘法、rshift。

内积

表达式与推导方式与卷积相同

Add

加法的表达式为: 

 代入int8量化公式, 推导如下:

 加法最终如何用TPU实现, 与TPU具体的指令有关。

这里对称提供的方式是用INT16做中间缓存;

在网络中,输入A、B已经是量化后的结果

 、

 ,因此非对称是先反量化成float, 做加法后再重量化成INT8

平均池化

平均池化的表达式可以简写为: 其中

 ,其中

 代入int8量化公式, 推导如下:

 其中

 LeakyReLU

LeakyReLU(泄漏ReLU)的表达式可以简写为: 

 代入int8量化公式, 推导如下:

 对称量化时,

  , 非对称量化时,

  。通过向后校准操作后, , 此时Sx/Sy = 1。

  当为对称量化时,

 与

 均为0。

Pad填充

Pad的表达式可以简写为:

 代入int8量化公式, 推导如下:

 通过前向校准操作后,

 , 此时

 / 

 = 1。

 对称量化时,

 与

 均为0, pad填入 round(value/

 ), 非对称量化时, pad填入round(value/

 +

 )。

PReLU

PReLU的表达式可以简写为: 

 代入int8量化公式, 推导如下:

 通过向后校准操作后,

 , 此时

 /

  = 1。

 一共有多个乘法与1个rshift。当为对称量化时,

 与

 均为0。

 

参考文献链接
posted @ 2024-04-09 05:34  吴建明wujianming  阅读(127)  评论(0编辑  收藏  举报