当前位置:首页 > 新闻资讯 > FPGA之家动态 >

深度学习FPGA加速器设计 (二)

时间:2024-08-07      来源:网络搜集 关于我们 0

上一篇的入门实例中,我们针对一层卷积神经网络设计了一个完全流水化的并行加速器,并获得了不错的加速效果(传送门:3天上手,30天精通!—— 深度学习FPGA加速器设计)。在此基础上,本文对基于FPGA的深度学习加速器设计进行进一步的优化。

在入门实例中,我们完成了仅支持一个很小规模的卷积层的加速器设计,这个设计离实用还有相当远的一段距离。这里面主要涉及两方面的问题:一方面,现阶段实际应用的CNN往往都是由多个卷积层级联而成的,而每一个卷积层所处理的图像通道数、图像大小也各不相同,如何为不同配置的CNN模型设计加速器呢?另一方面,无论我们采用什么FPGA芯片,片上的计算资源(DSP等)和存储资源(BRAM等)都是有限的,而CNN的规模、图像的大小理论上是可以无限增长的,那么如何在资源限制下让加速器实现对大规模CNN模型的支持呢?

为了解决上面提到的两个问题,一个最简单、有效的方式就是在最大化硬件资源利用率的条件下实现一个固定的卷积计算加速器。这样一来,在处理CNN中不同配置、不同规模的卷积层计算的时候,我们都是调用这个加速器进行计算,而对于不同的层,执行时的区别也就只体现在调用次数的不同。那么对应到HLS实现中,我们如何具体实现这个方法呢?这里我们需要应用到循环分块。

循环分块

回顾一下,在上一篇的上手实例中,我们所加速的卷积层(记为CONV1)的配置如下:

我们在CHin和CHout两个维度对循环进行了完全展开,实现了并行度为4×4的卷积运算加速器。对应代码如下:

现在,假定并行度为4×4的卷积运算加速器已经将FPGA片上的计算资源和存储资源完全耗尽了,我们考虑利用该加速器对一个如下配置的卷积层(记为CONV2)进行加速处理:

显然,我们不可能仅依靠修改参数(CHin:4→8, CHout:4→8)

完成新的加速器设计。如果仅仅修改配置参数,我们将实现一个并行度为8×8的卷积运算加速器,势必需要消耗更多的计算资源和存储资源,超出了FPGA片上资源的限制。为了解决这个问题,我们需要进行循环分块以达成对更大规模的卷积层的支持:我们可以将新的卷积层在CHin和CHout两个维度进行循环分块,每块的大小为4。这样一来,我们的加速器的并行度仍为4×4,没有超出片上资源限制,而CONV2的计算总共需要重复调用这个加速器4次。

鉴于我们的加速器也将片上存储资源消耗一空,我们就不得不利用容量更大的片下DRAM来存储卷积层运算所需的全部数据,并让加速器和DRAM进行数据交换。由于目前片上存储资源仅能容纳1个输入数据块(In数组),1个输出数据块(Out数组)和1个权重数据块(W数组),我们在每次需要切换数据块的时候,都需要和片下DRAM的对应位置进行数据交互。在HLS中,DRAM的数据口以指针形式表示,具体使用规则请参考Xilinx官方文档。循环分块后的HLS示意代码如下:

按照上述代码实现,我们利用循环分块和片下DRAM,配合我们原有的加速器设计,就完成了对不同配置、不同规模的卷积层的加速支持。

粗粒度流水

根据上文的描述,我们的4×4卷积加速器对于CONV2的处理时序大致如下图所示:

观察上图,我们不难发现,该加速器的处理还存在进一步优化的空间,即:粗粒度流水。由于数据搬运过程与卷积运算过程是在不同的硬件模块中实现的,原理上我们可以将这两个过程做一个粗粒度的流水优化,从而进一步提升加速器的处理效率,而对应方法就是一个硬件架构设计中常见的方法:Double-buffering或者Ping-pong Buffer。

具体而言,我们将所有片上数据Buffer(In, Out, W)都实现为同样大小的两组(统一记为Buffer0和Buffer1)。在卷积运算模块处理Buffer0中的数据的时候,Buffer1可以同DRAM进行数据搬运操作;而当卷积运算模块处理完Buffer0中的数据以后,卷积运算模块就切换到处理Buffer1中的数据,而Buffer0则继续其数据搬运操作。这样一来,数据搬运和卷积运算就可以流水起来,降低处理延迟。优化后的加速器处理时序如下图所示:

结语

循环分块和粗粒度流水是硬件架构设计中很常见也很重要的设计方法。本文利用这两种方法展示了一个可以灵活支持不同配置、不同规模的卷积层计算的加速器设计,后续我们会考虑从加速器架构、数值精度、模型压缩、算法变换等角度为大家继续分享深度学习加速器的优化方法,希望读者能够多多反馈意见。

致谢

感谢北京大学高能效计算与应用中心孙广宇教授、罗国杰教授和Xilinx大中华区教育与创新生态高级经理陆佳华先生对本文的校订和支持。

CECA系统结构组简介

北京大学高能效计算与应用中心(Center for Energy-Efficient Computing and Applications,简称CECA)成立于2010年。该中心是北京大学在“985工程”中建设的开展国际先进水平的高能效计算与应用研究的科研机构。该中心既是北京大学计算机系统结构学科的重要组成部分,又是一个交叉研究机构。CECA系统结构组的主要研究方向包括:面向深度学习等应用的加速器系统架构设计,面向边缘计算等新兴应用的高能效系统研究,和基于新型存储器的高能效存储系统结构研究。

本文原创,欢迎个人共享转发,媒体转载请联系作者。


注明:本内容来源网络,不用于商业使用,禁止转载,如有侵权,请来信到邮箱:429562386ⓐqq.com 或联系本站客服处理,感谢配合!

用户登陆

    未注册用户登录后会自动为您创建账号

提交留言