优化基于FPGA的深度卷积神经网络的加速器设计

英文论文链接:http://cadlab.cs.ucla.edu/~cong/slides/fpga2015_chen.pdf

翻译:卜居

转载请注明出处:http://blog.csdn.net/kkk584520/article/details/47450159

【0. 摘要】

CNN已经广泛用于图像识别,因为它能模仿生物视觉神经的行为获得很高识别准确率。最近,基于深度学习算法的现代应用高速增长进一步改善了研究和实现。特别地,多种基于FPGA平台的深度CNN加速器被提出,具有高性能、可重配置、快速开发周期等优势。

尽管目前FPGA加速器已经展示了相比通用处理器更好的性能,加速器设计空间并没有很好发掘。一个严重的问题是,一个FPGA平台的计算吞吐并未很好匹配内存带宽。因此,已有的方案要么未充分利用逻辑资源,要么未充分利用内存带宽,都不能获得最佳性能。同时,深度学习应用不断增加的复杂度和可扩展性让这个问题更加严重。

为了克服这个问题,我们利用roofline模型提出一种设计分析方法。对于任意CNN设计方案,我们量化分析它使用不同优化技术(循环分块、变换)的计算吞吐和所需内存带宽。在roofline模型帮助下,我们可以发现最好性能和最低FPGA资源需求的解决方案。

作为案例研究,我们在VC707 FPGA板卡上实现了一个CNN加速器,并将它与之前的方案对比。我们的实现在100MHz工作频率下可获得61.62GFLOPS的峰值处理能力,大大优于之前的方案。

【1. 简介】

CNN是著名的深度学习架构,从人工神经网络扩展而来,它已经大量用于不同应用,包括视频监控,移动机器人视觉,数据中心的图像搜索引擎等【6】【7】【8】【10】【14】

受生物视觉神经行为的启发,CNN用多层神经元相连处理数据,在图像识别中可获得很高准确率。最近,基于深度学习算法的现代应用快速增长进一步改善了DCNN的研究。

由于CNN的特殊计算模式,通用处理器实现CNN并不高效,所以很难满足性能需求。于是,最近基于FPGA,GPU甚至ASIC的不同加速器被相继提出【3】【4】【9】以提升CNN设计性能。在这些方案中,基于FPGA的加速器由于其更好的性能,高能效,快速开发周期以及可重配置能力吸引了越来越多研究者的注意【1】【2】【3】【6】【12】【14】。

对于任意CNN算法实现,存在很多潜在解决方案,导致巨大的设计空间。在我们的实验中,我们发现使用同样FPGA逻辑资源的不同方案性能有最大90%差距。寻找最优解不无价值,尤其当考虑FPGA平台计算资源和内存带宽限制时。实际上,如果一个加速器结构并未仔细设计,它的计算吞吐与内存带宽不匹配。未充分利用逻辑资源或内存带宽都意味着性能下降。

不幸的是,FPGA技术进步和深度学习算法同时将该问题复杂化了。一方面,当前FPGA平台不断提升的逻辑资源和内存带宽扩大了设计空间,采取不同FPGA优化技术(如循环分块、变换)会进一步扩大设计空间。另一方面,为了满足现代应用需求,深度学习可扩展性和复杂性在持续增长。因此,在巨大的设计空间中寻找最优解就更加困难,亟需一种高效检索基于FPGA的CNN设计空间的方法。

为了高效检索设计空间,本文提出了分析设计的方法。我们的工作优于以前的方法,原因有二:

首先,【1,2,3,6,14】主要关注计算引擎优化,要么忽视了外部存储器操作,要么直接将他们的加速器接入外部存储器。我们的工作则考虑了缓冲区管理和带宽优化。

其次,【12】通过数据重用减少了外部数据获取从而获得加速。但是这种方法不必导致最优全局性能。另外他们的方法需要对每层重新配置,不太方便。我们的加速器无需重编程FPGA就能执行不同层的计算。

本文主要贡献如下:

* 量化分析可能解决方案的计算吞吐和所需内存带宽;

* 在计算资源和内存带宽限制下,我们用roofline模型识别所有可能的解决方案,讨论了不同层如何寻找最优解;

* 我们提出一种CNN加速器设计,对每层使用统一的循环展开因子;

* 实现了CNN加速器,获得61.62GFLOPS处理性能,是目前最优的;

【2. 背景】

2.1 CNN基础

CNN受神经科学研究的启发,经过长达20多年的演变,CNN在计算机视觉、AI(【11】【9】)领域越来越突出。作为一种经典有监督学习算法,CNN使用前馈处理用于识别,反馈用于训练。在工业实践中,很多应用设计者离线训练CNN,然后用训练好的CNN实现实时任务。因此,前馈计算速度是比较重要的。本文关注用基于FPGA的加速器设计前馈计算加速。

一个典型CNN由两部分组成:特征提取器 + 分类器。

特征提取器用于过滤输入图像,产生表示图像不同特征的特征图。这些特征可能包括拐角,线,圆弧等,对位置和形变不敏感。特征提取器的输出是包含这些特征的低维向量。

该向量送入分类器(通常基于传统的人工神经网络)分类器的目的是决定输入属于某个类别的可能性。

一个典型CNN包括多个计算层,例如,特征提取器可能包括几个卷积层和可选的下采样层。图1展示了卷积层的计算。

优化基于FPGA的深度卷积神经网络的加速器设计

在前馈计算角度,之前的论文【5】证明卷及操作会占据超过90%的总计算时间,所以本文我们关注加速卷积层。后面会考虑集成其他可选层,如下采样层、最大池化层。

一个真实的CNN

优化基于FPGA的深度卷积神经网络的加速器设计

2.2 Roofline模型

计算和通信是系统吞吐优化的两个基本限制。一个实现可能是计算受限的或访存受限的。【15】开发了roofline性能模型来将系统性能同片外存储带宽、峰值计算性能相关联。

公式(1)表示了特定硬件平台的可达吞吐率,用GFLOPS作为评估指标。

优化基于FPGA的深度卷积神经网络的加速器设计

图3将roofline模型可视化,分别展示了计算上限和IO带宽上限。算法2相比算法1有更高计算-通信比,或更好的数据重用.从图中看到算法2充分利用所有硬件计算资源,性能优于算法1。

【3. 加速器设计探索】

本节首先提供了我们的加速器结构概览,介绍了FPGA平台上的几个设计挑战。为了克服这些挑战,我们提出了相应的优化技术。

 

3.1 设计概览

优化基于FPGA的深度卷积神经网络的加速器设计

注意到循环变量i和j并未分块,因为CNN中卷积层kernel尺寸K太小(3~11)。

第二,我们讨论了计算引擎优化并将计算性能与分块系数建立联系。

第三,我们使用数据重用技术减少外存访问,建立了计算-访存比和分块系数的联系;

第四,利用上述两个变量,我们定义了设计空间,在FPGA平台上找最优解;

第五,我们讨论了怎样为多层CNN应用选择最好的加速器。

 

3.2 计算优化

本节使用标准基于多面体的数据相关性分析【13】来通过循环调度和循环分块尺寸穷举法衍生出一系列等效CNN设计实现。

计算优化目标是使用有效的循环展开、流水线,将计算资源完全利用。本节假设所有需要的数据都在片上。片外存储带宽限制将在3.3节讨论。

循环展开:用于增加海量计算资源利用率。在不同循环层次展开会产生不同实现。展开的执行单元是否共享数据以及共享到什么程度会影响生成硬件的复杂性,最终影响展开的复制品数量和硬件运行频率。某个循环维度中对一个数组的共享关系可以分为三种类型:

* 无关,如果循环变量i不出现在数组A的任何访问函数,则称相应循环维度对数组A是无关的;

* 独立,如果数组A沿着某个循环维度i是完全可分的,称i对数组A独立;

* 相关,如果数组A沿某个循环维度i不可分,称i对数组A依赖;

图6显示了不同数据共享关系时产生的硬件实现。

优化基于FPGA的深度卷积神经网络的加速器设计

最终,选择too和tii两个循环维度做循环展开,从而避免生成复杂硬件拓扑。我们需要将循环嵌套次序做修改,让too和tii到最内层循环,简化HLS代码生成。生成的硬件实现如图7所示。

优化基于FPGA的深度卷积神经网络的加速器设计

分块尺寸选择:将循环结构固定后,不同循环分块尺寸变化会有巨大性能变化。代码3中有效的循环分块尺寸由公式(2)确定:

优化基于FPGA的深度卷积神经网络的加速器设计

(卜居注:计算上限的单位是GFLOPS,也就是计算量除以耗时。公式分子为完成代码(1)的总乘、加计算量,分母为完成计算所需的时钟周期,由于使用了循环分块,所以括号内的时钟周期数目为流水线从开始到结束的总周期,括号外为分块外循环次数。)

3.3 访存优化

在3.2节,我们讨论了如何衍生设计变种使用不同计算上限,假设计算引擎所有数据访问都是片上已经缓存的。但是,当考虑内存带宽限制时,高计算上限的设计变种不一定能达到更高计算上限。本节我们将展示如何通过高效数据重用降低所需通信量。

图9展示了一个CNN层的内存传输操作。输入/输出特征图和权值在计算引擎开始之前就已经载入,产生的输出特征图写回主存。

优化基于FPGA的深度卷积神经网络的加速器设计降低至 优化基于FPGA的深度卷积神经网络的加速器设计

计算-通信比:用来描述每次访存的计算操作。数据重用优化会降低总的访存次数,进而提升计算-通信比。

图9代码的计算-通信比可以由公式(4)计算:

优化基于FPGA的深度卷积神经网络的加速器设计

给定一个特定循环结构和分块尺寸组(Tm, Tn, Tr, Tc),计算-通信比可以通过上述公式计算得到。

3.4 设计空间探索

综上所述,给定(Tm, Tn, Tr, Tc),可以计算该设计的计算能力上限和计算-通信比。枚举所有可能的循环次序和分块尺寸可以产生一系列计算性能和计算-通信比对,图8(a)显示了例子CNN第5层在roofline模型中的所有有效解,X轴表示计算-通信比,或者每DRAM字节访问的浮点处理性能。Y轴表示计算性能(GFLOPS)。任意点与原点(0, 0)的连线斜率表示该实现的最低访存带宽需求。

例如,设计P的最低访存带宽需求和P’ 是相同的。

优化基于FPGA的深度卷积神经网络的加速器设计

平台支持的设计定义为:位于带宽上限线右侧的集合。位于带宽上限线的是左侧点的投影。

我们探索平台支持最优方案的策略如下:最高性能,最高计算-通信比(这样有最小的访存需求)。该准则基于我们可以使用更少IO口,更少LUT和硬件连线,数据传输引擎有更低带宽需求。因此,点C是CNN第5层的最终选择,它的带宽需求为2.2GB/s。

3.5 多层CNN加速器设计

前几节我们讨论了如何为每个卷积层寻找最优实现参数。在CNN应用中,这些参数可能在不同层之间变化。表4显示了例子CNN中每层最优展开系数(Tm和Tn):

优化基于FPGA的深度卷积神经网络的加速器设计

全部系统都放在了单个FPGA芯片,使用DDR3 DRAM用于外部存储。

MicroBlaze是一个RISC处理器软核,用于帮助CNN加速器启动,与主机CPU通信,以及计时。

AXI4lite总线用于传输命令,AXI4总线用于传输数据

CNN加速器作为AXI总线上一个IP。它从MicroBlaze接收命令和配置参数,与定制的数据传输引擎通过FIFO接口通信,该数据传输引擎可以获取通过AXI4总线外部存储。

MicroBlaze和CNN加速器使用中断机制来提供精确的计时。

4.2 计算引擎

优化基于FPGA的深度卷积神经网络的加速器设计

第一个阶段时,计算引擎处理输入缓冲区0同时拷贝下一阶段数据到输入缓冲区1,下一阶段做相反的操作。这是输入特征图、权值的乒乓操作。

当[N/Tn]个阶段之后,输出特征图写入DRAM,”off-load”操作会将位于输出缓冲区0的结果写回DRAM,直到输出缓冲区1产生新的结果。这是输出特征图的乒乓操作。注意这两个独立存取通道机制适用于该框架下任何其他数据重用的场景。

4.4 外部数据传输引擎

使用外部数据传输引擎的目的有两个:(1)可以提供加速器和外部DRAM之间的数据传输;(2)可以隔离加速器和平台、工具相关带宽特性。

图13展示了一个实验,在Vivado 2013.4中的AXI4总线带宽。

优化基于FPGA的深度卷积神经网络的加速器设计

我们的加速器和基于软件的实现性能对比如表7所示。

优化基于FPGA的深度卷积神经网络的加速器设计

一个功率计用来测量运行时功率特性,大约18.6瓦特。CPU的热设计功率为95瓦特。因此,我们可以粗略估计软件和FPGA的功率。

表8显示了能耗相差至少24.6倍,FPGA实现消耗更少能量。

在表5中列出了已有的不同基于FPGA的CNN加速器同我们实现的对比情况。

优化基于FPGA的深度卷积神经网络的加速器设计

【6. 相关工作】

本节,我们讨论不同设计方法,参考其他之前的基于FPGA的CNN加速器设计工作。

首先,很多CNN应用加速器都聚焦在优化计算引擎上。实现【6】【14】【3】是三个代表。

最早的方法【6】主要用软件搭起CNN应用,而是用一个硬件脉动结构加速器完成滤波卷积工作。这个设计省下大量硬件资源,用于自动驾驶机器人的嵌入式系统。

【14】【2】【3】在FPGA上实现了完整CNN应用,但采取了不同并行措施。【14】【2】主要利用了特征图内部卷积核的并行性。【3】使用了输出内、输出间的并行性。我们的并行方法类似,但他们并未使用片上缓冲区做数据重用,而是用很高带宽和动态重配置来提高性能。我们的实现合理进行数据重用,平衡了带宽限制和FPGA计算能力。

其次,【12】考虑了CNN的通信问题,选择最大化数据重用,将带宽需求降至最低。但他们的方法并未考虑最大化计算性能,另外当换到下一层计算时他们需要为FPGA重编程(大约10秒),而我们的方案秩序消耗不到1us来配置几个寄存器。

【7. 结论】

本文中,我们提出了基于roofline模型的CNN FPGA加速方法。首先优化CNN的计算和访存,之后将所有可能涉及在roofline模型下建模,为每层寻找最优解。我们通过枚举发现了最好的跨层设计。最终,我们在Xilinx VC707板卡上实现,性能优于以往的实现。

【8. 致谢】

【9. 参考文献】

来源:卜居

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年7月23日
下一篇 2015年7月23日

相关推荐