Skip to content

FPGA 部署中常常使用的是定点数量化推理,而之前研究的是关于整数量化推理的内容,定点数量化后的网络可以直接进行前向推理而不需要进行复杂的rescale来保证网络层和层之间运算的正确性。

image-20221012152329987

定点数量化

定点数地表示:

定点数有两个参数WL,FLWL表示一个数所占用的总比特数,FL表示一个数小数部分所占用的比特数。例如,WL=8,FL=4, 假设有一个无符号定点数为0b1101.1010,其表示的数可以记为:

1×8+1×4+0×2+1×1+0.5×1+0×0.25+1×0.125+0×0.0625=13.625

等价于

218×0.0625=13.625

此时一个无符号整数所能表示的范围为:[0,15.9425],表示精度为0.0625

无符号定点数量化

fix_quant=12FLround(clip(x2FL,0,2WL1))

有符号整数量化

fix_quant=12FLround(clip(x2FL,2WL1+1,2WL11))

Global Scale Factor

fix_quant=Gs2FLround(clip(xGs2FL,2WL1+1,2WL11))

当每个层的FL确定之后就可以很容易

因为采用了所有层都采用了

整数量化

常见的整数量化过程如下面的公式所示,其中q代表量化后的值,r代表全精度的值。

q=round(rS)r=S(qZ)S=(rmaxrmin)/(2WL1)

带0点的量化推理计算过程:

qc(i,k)=Zc+Pj=1N((qa(i,j)Za)(qb(j,k)Zb))qc(i,k)=Zc+P(NZaZbZaMb(k)ZbMa(i)+j=1Nqa(i,j)qb(j,k))P=SaSbScMb(k)=j=1Nqb(j,k),Ma(i)=j=1Nqa(i,j)

如果采用对称量化,即量化后的零点和量化前的值的零点是对齐的,所有的Z=0,公式就可以简化为

qc(i,k)=Pj=1N(qa(i,j)qb(j,k))P=SaSbSc

可以看到,公式中的Mb,Ma都是都是可以提前计算出来的,在推理过程中需要计算的就只有Pj=1Nqa(i,j)qb(j,k)这一项了。该部分的相乘累加是在整数上进行的。

定点数量化 vs 整数量化:

定点数量化可以当作整数量化的特殊情况,当FL确定之后,相当于整数量化中固定S=12FL,同时截断范围为clip(0,2FL(2WL1)。如果网络所有层采用同样的量化形式(即所有层的WL,FL的值均相等),在这种情况下网络间的运算就可以直接跳过 P参数的计算

思路:

  1. S=12FL不是最优的,但是具有计算上的优势,可以完全避免Rescale的额外计算,其本质上就是整个网络共享一个Scale
    1. 结合自适应的Scale训练方法,使整个网络共享一个Scale,这样就可以结合定点量化以及整数量化的优点
  2. Overflow问题
    1. 饱和赋值
    2. 接纳溢出,并加以利用

最新更新: