基于FPGA的深度学习算法加速

原文作者:FPGA设计论坛 

1.GPU加速:GPU是一种多核处理器,GPU起初是用来进行图形处理任务的,经过长时间的发展,GPU的发展是日趋复杂的,而且针对不同的领域也有不同。

        当GPU被用来进行通用计算时,就产生了一些通用的计算框架,比如说Opencl和CUDA。比如说高端GPU TItan系列,其频率可以达到1Ghz,拥有330GB的带宽,提供每秒极高的算力,但是功耗也达到了惊人的250W。对于嵌入式的GPU,比如说TegraX1,拥有256个处理核,带宽为25GB/s,同样在1Ghz的频率下,算力仍可以达到近Titan的十分之一,但是功耗只有10W。

2.ASIC加速:这些芯片分为两类:第一类,用来做训练和推理,这些芯片可以用来做DNN的训练,也可以做DNN的推理。第二类,用来做推理,这些ASICs用来运行在GPU或者其他硬件上已经训练好的模型,然后对训练过的网络进行修改,使得网络可以运行在不同的ASIC上。

3.FPGA加速:FPGA是一种可以重复配置的电路。在延迟方面,FPGA要比GPU更好。FPGA可以提供很高的带宽同时也可以降低延迟。

1.2 FPGA实现

        要实现某种运算,其中一种方法就是将这种运算以电路的方式实现,而使用FPGA就是其中一个相对简单的方法,使用者可以将FPGA配置为所需要的电路。基于指令的硬件是通过软件来实现的,而FPGA是通过专用硬件实现的。对于一些需要低延迟的算法,比如说智能驾驶,FPGA的延迟要比GPU更低。当时用FPGA时,可以将延迟控制在1微秒或者1微秒之外,但是对于CPU来说,延迟低于50微秒,性能就已经很强了。除此之外,FPGA的定制化更强,延迟能够人为的控制,FPGA不需要操作系统,内部也不需要想CPU一样通过总线进行通行。

        在FPGA中,可以连接任何的数据源,比如说网口或者传感器,可以直接通过芯片的引脚就可以连接,这就和GPU与CPU形成了鲜明的对比(GPU和CPU与外界数据交互需要标准总线进行连接)。

        FPGA的直连技术可以为数据提供很高的带宽,同时也降低了时延。

2、为什么用FPGA来加速YOLOV2

        对于卷积核和池化的运算来说,因为是矩阵运算,这就需要相当高的算力。而由于卷积和池化运算都是流式运算,所以将他们放在FPGA中实现从而进行加速是一个很好的选择。对于YOLOV2中的部分运算,比如说计算坐标图像的预处理等,都是一些非流式运算,或者是标准运算,这些运算适合放在ARM中进行,于是将YOLOV2中的运算做一下划分,充分利用软硬件协同的优势,从而对整个算法进行加速。

FPGA:卷积层和池化层

ARM:Softmax

3、FPGA简介

3.1 FPGA的基本结构

        基本构成:CLB(可配置逻辑块),IOS(输入输出模块),IR(互联资源)

        FPGA的功能是由SRAM中的数据类配置的,所以大部分FPGA芯片中都是采用查找表结构的。FPGA中组合逻辑使用小型LUT实现的,这些LUT输出端连接到D触发器的输入端,D在连接到其他逻辑电路或者是驱动IO来对其进行驱动。

        FPGA中的逻辑是通过加载编程数据来实现的,这些编程数据通过内部静态存储单元来进行加载。存储单元的值可以配置逻辑单元各个模块的连接通路,以及逻辑单元所实现的功能,也可以配置IO的功能以及电气鼠性等,这些最终构成了一个可以实现目标功能的FPGA系统。

3.2 FPGA的相对优势:

与DSP和MCU相比,FPGA的运算速度较快,实现控制功能更加灵活,与传统的CPLD相比,FPGA更适合做一些规模更大逻辑更复杂的设计。

(1).FPGA有六部分构成:可编程CLB,可编程IO,布线资源,嵌入式RAM,专用迎合以及内嵌功能模块。CLPD功能更加简单,构成:可编程IO,基本逻辑单元,布线pool。2).FPGA更容易实现时序逻辑,CPLD更适合大规模组合逻辑。

(3).FPGA连线资源非常丰富,且CLB的利用率很高。

(4).同专用集成电路比,FPGA更加灵活,开发周期更短,可以降低成本,同时也可以保证保密性和可靠性。

4、PYNQ开发框架与HLS加速理论

4.1 PYNQ

        传统的FPGA的框架有两种,一种是FPGA与CPU互联的,另一种是FPGA与RAM互联的。但是这两种开发对于然间人员来说很不友好,而PYNQ就很好的解决了这个问题,。PYNQ可以在ZYNQ上面运行,ZYNQ包含PL和PS部分,PS部分是ARM的处理器,上面可以运行LINUX系统,操作系统上运行ptyhon。PL部分是可编程逻辑资源,在开发过程中,首先在PL端设计IP核,将IP核配置成为AXI总线形式,然后在PS中对驱动函数进行调用。

        PYQN是一种全新的开发框架,能够用PYTHON对其进行快速的FPGA部署,在部署过程中不用研究硬件的实现细节。

4.2 HLS

        开发流程是基于C语言,能够节约用户大量的时间。其重要流程包括:C开发,C仿真,C综合以及RTL综合等。

4.2.1 用HLS加速IP

        内层并行现实化:在FPGA实现深度学习算法中的一层,在计算时候对这一层进行复用,计算完一层以后将数据缓存到片外的DDR中,当进行下一层计算式,再将数据读入运算单元中,在这个过程中需要FPGA的ARM来对IP核进行配置,包括输入输出通道的数量,卷积核的尺寸等。配置完成后,IP和就可以进行相应层的运算。

        实现卷积IP核的经典架构

        这个系统包含了片外DDR,ARM处理器,控制器,运算单元以及各种缓冲器。缓存器:输入输出,权重缓冲等。输入的图像首先要加载带输入的寄存器中,然后通过运算单元执行卷积操作,卷积操作是通过多个运算单元来运算的,以保证运算的速度。在进行卷积运算时,第一季输出缓存中的数据会被输出到第二级输出缓存,在当前层运算完之后,运算结构就会成为下一级的运算输出,用这样的方式实现网络每一层的加速。

        如上图所展示的流程图,可以实现网络在单层内部运算的并行优化,不必将整个网络全部展开,可以奖励网络的资源占用率,进而降低功耗,实现了新跟你乖面积以及功耗的平衡。如果想药实现单层网络的加速效果,就需要在层的内部实现流水。所以就需要一种数据拆分机制,将数据分为多个小块,然后并行去处理这些数据。

        将图像分割为多个小块,每个小块的尺寸为Tr X Tc X Tn,而这一块经过计算之后得到的结果应该是卷积计算的部分和,尺寸为Th X Tl X Tm,在这个运算过程中,所欲要的权重尺寸是K X K X Tn X Tm。在处理完这一块数据后,再处理这个特征图的下一块数据。这样按快处理,直到本层的数据处理完成。

4.2.2 循环优化

        HLS针对循环的优化指令很多,这里只使用Loop Pipeline和Loop Unrolling。

        Loop Pipeline的作用是对循环的进行流水线化的并行处理,这种方式可以让两轮循环执行时间重叠,使得在本轮循环过程中下一轮循环也可以同时执行。

        上述图片是未经过流水化处理和经过处理的运算步骤,可以清楚地看出,如果以两次迭代为例,未经过处理的运算需要经过5个时钟周期才能完成运算,而经过流谁化处理的运算仅仅需要三个时钟周期。

        Loop Unorlling在没有进行循环优化之前,循环的运行按照默认设置来操作的。而当进行循环展开后,循环的电路会被设置为N份,N一般有HLS中的指令factor来指定。比如说factor为2时,此时的迭代次数为8的话,那么迭代会被分为4次进行,内次是2个循环一次实现的。

4.3 硬件系统的构建

4.3.1 PL部分

PL部分使用HLS来实现卷积神经网络。

硬件配置如下:

        最后将PL端生成的bitfile加载到FPGA中,最后在PC上观察吃力后的图像,进行结果分析与统计。

5、实验结果

加速前

加速后

        加速前后的时间对比。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值