背景
读 FireFly: A High-Throughput Hardware Accelerator for Spiking Neural Networks With Efficient DSP and Memory Optimization
硬件加速器包括直接在GPU上使用CUDA进行加速计算,亦或者使用FPGA设计电路,最终得到成熟的ASIC设计。使用FPGA进行加速相比于GPU会具备更高的能效比(帧率/功耗 或 算力/功耗),由于SNN天然具备稀疏性,这使得使用FPGA来设计SNN的加速器可以获得更高的能效比。本文的主要贡献可以被划分为
1.使用DSP设计PE脉动阵列,使用SIMD来加速DSP计算(减少了逻辑资源占用)。
2.设计了一套通用型硬件加速器。
3.对权重的缓存即部分重用FIFO很有特点。
设计流程
通过高级综合语言(Hign-Level Synthesis/Scala/Chisel)或直接使用verilog描述电路,同时使用FPGA芯片集成的一些DSP资源来加速计算,组成硬件加速器设计。文章中讲是使用的scala + SpinalHDL。这同样是一种高级综合语言。
设计目的
在FPGA上部署神经网络,仅使用片上存储虽然会带来很大的速度提升,但片上存储资源的大小也会限制网络。另外,SNN的计算与ANN不同,不需要复杂乘法,因此大多数工作都是直接使用RTL描述这一过程。FireFly利用DSP资源完成了这一过程,在内存方面,设计了一个形似ping-pang RAM + FIFO 的 部分重用FIFO(partial reuse FIFO)来提升外部存储访问速度。
Methods
图1
整体结构如图1,首先设计结构属于通用型硬件加速器,主要的计算逻辑都在PL端完成,通过Weight Delivery Hierchy和Linebuffer for Conv两个模块将计算需要的权重以及特征加载进PE单元进行计算,其中数据同步在AXI DataMover完成,通过地址线控制。计算完成后,配置了可选的Maxpool模块,网络中不需要时可以旁路。最后数据通过AXI总线再次送回DDR以供PS端调配。
PS端主要起到控制整体运算的作用,笔者推测PS端没有复杂逻辑,但DDR中的地址是和PL端有一套固定的协议的。不管PL端从其中取数计算,计算后存储等都是通过这套协议完成。
下面对其中主要的两个创新点进行分析:
部分重用FIFO
图2
文章首先给出了经典的乒乓RAM和FIFO的设计(a,b),其次给出了部分重用FIFO的设计(c)。乒乓RAM由于其深度不同,最少需要两倍于输入缓存的空间。FIFO由于先入先出,需要的空间不固定。不管是乒乓RAM或者FIFO,都需要输入输出两边的数据速率匹配,否则会存在被压爆的情况。图c的部分重用FIFO中,不仅有FIFO的输入输出指针,还多了一块重用空间,用Start和End来标识,当重用数据进入时,会存储进这块空间,在计算若干次后,重置这块空间。
隐藏数据传输延迟以提高吞吐量
图3
图3即图1中描述的Weight Delivery Hierchy。其中Lv1通过位宽放大将每拍1个数据转换成每8拍8个数据送入部分重用FIFO,其中有些数据会被送入重用空间,在这之后,数据以每拍8个数据输出,(笔者不清楚这里速率不匹配是否因为重用数据使用多次导致)。在之后再通过位宽放大至每8拍8x8个数据输出。文章使用这样的结构提前加载权重来隐藏了冗长的权重读取时间(从DDR过AXI总线到PE单元)。
利用DSP设计的特殊PE单元
图4
图4中(d)即图1的PE阵列,其中单个PE单元是通过串行8个DSP资源完成的。单个DSP资源的使用方式笔者也查阅了Xilinx的文档,其中支持了一种单指令多数据流的方式。
图5(图片来源Xilinx文档)
其中SIMD模式即将AB合起来(48bit)与C(48bit)进行加法计算,由于使用了SIMD,因此计算会被拆分成4个12bit和4个12bit之间的加法,输出也是4个12bit,进位会被输出到一个进位端口。FireFly一文在权重量化中选择8bit。因此DSP计算在不级联时不会进位(8+1 bit),最大级联16个时会产生进位。因此文章选择了长度8的级联方式。8bit+log2(8)+1 = 12,刚好不进位。
回到图4(c),使用SIMD将权重合并,利用输入脉冲作为驱动OPMODE(SIMD的端口使能)的信号,完成权重间加法运算,从而实现加速。
FireFly一文并没有过多提及如何利用这些8x8的PE单元来对应网络中某一块计算,也没有提及 部分重用FIFO 的重用数据如何划分的。笔者认为这些还是值得探讨的。
结论
使用DSP而不是直接使用LUT+FF的确减少了逻辑资源,但实际上LUT资源一般是够用的。需要特别节省的是内部的存储资源。
文章最后比对了资源使用和吞吐率。由于使用了DSP而不是LUT,可以看出LUT同比其他设计有明显减少。
最后,文章评估了在不同数据集下的准确率来验证设计的正确性,以及评估了功耗,其中2.55W的功耗非常亮眼。