上期内容:过约束到底怎么做
越来越精确的深度学习模型面临两大挑战:计算密度越来越高;存储带宽越来越大。解决此问题的可行方法之一就是降低数据位宽。这是因为较低的数据位宽可以有效降低计算密度,同时减少计算时的功耗开销,而且也降低了存储需求。但是,这里有个前提条件,那就是降低位宽不能损失模型性能,或者降低位宽带来的收益远大于因此造成的模型性能损失,且损失是在可接受的范围之内。实践证明,在某些CNN模型中,采用INT8与采用浮点数据相比,精度损失很小。
这里我们将关注点放在INT8的具体实现上。就CNN模型而言,INT8主要用在卷积层。为便于说明,我们看一个典型的卷积层案例,如下图所示。输入为RGB三个通道,共有4套滤波器,每套滤波器有三个通道,与输入的三个通道相对应,输出为4通道。
采用FPGA实现时,核心部分是其中的乘加运算。为了充分利用FPGA内部的DSP48资源,需要探测上述结构的并行性。两种并行性如下图所示。左侧的并行性在于将来自于同一个IFM的不同数据同时与同一套权值相乘;右侧的并行性在于将同一个IFM的数据与两套不同的权值相乘。我们采取第二种并行性。这意味着IFM数据被复用,就下图而言,IFM的数据率将是权值数据率的一半。
DSP48E2的结构如下图所示(图片来源:wp486, Figure 1),这里我们将利用一个DSP48E2同时实现两个INT8乘法,前提条件是这两个INT8乘法具有一个相同的因子,也就是同时实现axb和dxb。这就需要用到一些技巧,毕竟从图中不难看出,只有一个可用的乘法单元。
考虑到axb和dxb等效于(a d)xb,这就可以利用到DSP48E2中的预加器(Pre-Adder)。但同时还要注意到,我们最终期望得到的是两个乘积axb和dxb,而不是乘积和。因此,我们按如下图所示操作。DSP48E2的端口A为27位,将其高9位填充数据a(这里对a做了符号位扩展,由8位变为9位),低18位填充0。DSP48E2的D端口为27位,将数据d进行符号位扩展,低9位填充数据d。DSP48E2的B端口为18位,将数据b进行符号位扩展,低8位填充数据b。最终,DSP48E2的P端口(48位)将输出ab(或ab-1)和db。
基于System Generator,我们搭建了上述模型,如下图所示。在实际应用中,充分利用DSP48E2实现两个INT8相乘可有效节省乘法器资源,提高乘法器的利用率。