An Asynchronous Energy-Efficient CNN Accelerator with Reconfigurable Architecture
二、Abstract & Introduction why?卷积神经网络在计算机视觉领域被广泛使用,并且展示了它在图像分类、目标检测以及视频监控等方面的巨大优势。传统上 ,卷积神经网络的推断过程在CPU和GPU上完成,但是,CPU计算资源有限,并行度不够,而GPU虽然在计算方面强于CPU,但是GPU有着极高的功耗,ASIC能获得最大的能效,但是ASIC灵活性不够,一旦流片无法更改,因此需要在灵活性和能效上做一个权衡。
how?FPGA显然是一个很好的兼顾灵活性和能效的工具,且FPGA具有可重构的特性,能适应日新月异变化的深度学习算法。 本文中,作者提出了一个基于FPGA的可重构可配置加速器,它采用异步电路,包含6个计算核,每个核由5x5个PE构成,在这个加速器中,作者采用了一种叫做convolution-and-pooling-integrated的计算模式,大大降低了对片外DRAM的访问,显著降低了系统的功耗。
result?作者在Xilinx VC707上实现了该加速器,并用LeNet-5进行了测试,实验发现,异步计算核的动态功耗比同步的降低了84%,加速器的效率达到了30.03GOPS/W,是前人工作的2.1倍。
三、Methods A.Design of the CNN Accelerator 1.Architecture of the accelerator 如图1是加速器的总体架构,输入数据存在片外DRAM中,来自控制模块的配置信息会被发送到computing array,这样,激活函数、池化运算、以及数据流动的方向就会被确定。computing array主要负责卷积和池化运算,运算结果则被写回DRAM。
如图所示,这是Computation core的结构,每个核由5x5个PE单元组成,每个PE,包括一个寄存器和一个乘法器,因此它同时具有乘法运算和数据缓存的功能,此外,每一个PE都能接收来自周围PE的数据(上,下,左,右),这就使得数据重用成为了可能。每个PE的数据大小和数据路径都能由配置信息配置,各个PE之间既能一起工作,也能独立工作,在本文的设计中,作者采用异步电路,通过握手协议来进行各个PE之间的协调,这种“事件驱动"的异步握手协议,使得当一个PE完成自己的工作并没有继续收到request信号时,可以完全关闭,从而降低了系统的动态功耗。当所有PE计算都完成时,这些结果就被相加求和,作为输出送入下一个池化层。
如图4(a),本文采用的是两相异步握手协议,图4(b)和4©分别是两相握手协议和四相握手协议的示意图,两相握手协议中,一个跳变沿就表示一个事件,而四相握手协议中,高电平才表示一次req信号,因此握手完成后还需要将Req和Ack信号拉低,因而可以知道,两相握手协议在速度和功耗上都比四相握手协议更具优势,这也是本文采取两相握手协议的原因。
图3是Click element的示意图,每当有一个request信号到达时,Click element都会产生一个高电平的fire信号,用来使能FF或者Latch.
图5是具体的电路图,三个串行连接的Click形成了一个三阶段的异步流水线。若没有request信号,那么整个电路都是关闭的,没有任何动态功耗。当一个request信号到来时,配置信息会在fire1为高时被写入DFF1,当fire2信号为高时,输入数据(来自上下左右或者local_in)会被写入DFF2,并且同时将该数据送入乘法器和权重相乘,最后,当fire3为高时,输入数据会被写入DFF3以供之后相邻的PE重用,而乘法结果也被相应的寄存器寄存。
如图6,是池化层的计算单元电路图。卷积电路的所有PE的req输出信号都被连接到Muller C,以用来检测卷积计算是否完成。激活函数、池化方式和池化大小都能动态配置,对于激活函数,ReLU很容易实现,但是对于Sigmoid和Tanh这种复杂函数,本文通过查找表来实现,这也加快了激活函数的计算速度。
对于CNN加速器来说,对片外DRAM的频繁访问已经成为了加速器能耗优化方面的一个瓶颈。因此,本文提出了一种叫做Convolution-and-Pooling-Inter grated Computing的方法,并且进行了数据的复用,这些措施使得对片外DRAM的访问减少了88%,大大降低了加速器的功耗。
1.The convolution-and-pooling-intergrated computing 如图8所示,这里卷积核大小为2,池化窗口大小也是2。在传统的卷积计算中,四次卷积之后,我们得到的应该是A,B,C,D这四个输出神经元,但是池化运算所需要的是ABHG,因此,AB必须一直被存储直到HG也被计算完毕,但是在图8(b)的convolution-and-pooing-integrated computing中,由于卷积运算的顺序作了改变,ABHG是可以同时得到的,因此就省去了中间数据的存储。
以图9为例,同样是2x2的卷积,卷积步长为1,那么可以发现,相邻的卷积窗口之间是存在数据重叠的,因此可以进行数据复用。 在这个加速器中,四个权重是分散在4个PE上,每个PE上的权重和相应的输入神经元相乘,最后四个PE的结果相加,便能得到一个输出神经元的部分和或者最终结果,即采用的是weight-stationary方式。 卷积运算四次后,会得到O1,O2,O3,O4四个值,从O1到O4所需的输入数据来看,并不需要完全从缓存中读取,例如O1到O2,左边两个PE所需的数据可以从它们右边邻近的PE得到,而右边两个PE所需的数据才需要从缓存中读取,O2到O3,O3到O4可类比分析。
表1展示了使用该方法前后每一层访问数据的次数。可以看到,未使用该方法之前,总的数据访问次数为66.4KB,而采用了作者提出的方法( integration computing and input data reuse)之后,访存次数减为7.8KB,减少了88%!而且对那些更加复杂的CNN来说,效果还会更加显著。
作者在Xilinx FPGA VC707上实现了修改过后的LeNet-5,并且为了进行比较,作者还实现了 一个采用同步电路的加速器,其他方面均不变。 实验结果表明,采用同步电路加速器的功耗为45.96mW,而异步的仅为7.25mW,该异步电路加速器的效率则达到了30.03GOPS/W,优于许多之前的工作,除此之外,10000张mnist手写体在我们的实验平台上进行了测试,错误率仅为2%。
五、Conclusion懒得打字了,如下