APP下载

基于异构FPGA 的目标检测硬件加速器架构设计

2021-12-30夏琪迪颜秉勇周家乐王慧锋

关键词:加速器卷积模块

夏琪迪, 颜秉勇, 周家乐, 王慧锋

(华东理工大学信息科学与工程学院,上海 200237)

近年来,卷积神经网络(CNN)在计算机视觉领域发展迅速,且随着应用需求的增加和应用场景的复杂性,CNN 的应用也逐渐拓展到人脸识别、目标检测、自主驾驶和语音识别等领域[1-4]。随着CNN 的层次越来越深,模型的体系结构复杂度逐渐增加,所需的运算量大大提高[5],如何高效地实现低功耗、低成本的CNN 运算平台越来越受到关注。目前有许多基于CPU、GPU、FPGA 甚至ASIC 的CNN 实现被提出[6-9],其中兼具灵活性、低功耗和高效率的CPU+FPGA 的异构设计备受关注,成为主流的CNN硬件加速平台之一。

作为目前CNN 的主要应用领域,目标检测算法近年来出现了一些代表性的网络,其中YOLO(You Only Look Once)[10]系列算法在检测速度和准确性上都展现了优秀的效果,基于YOLO 模型的FPGA 加速方法成为研究热点。先前的研究[11]通过减少外部数据访问和精确的数据重用来加速CNN 的应用,但该方法不一定会带来最佳的整体性能,并且需要重新配置FPGA 以适应不同的计算层。Nguyen 等[12]采用RTL 电路对YOLOv2 算法进行了加速,将网络权值参数量化为二进制,使用更少的数字信号处理(Digital Signal Processing, DSP)完成计算。借助数据重用与动态随机访问,该设计的功耗降低至18.29 W,但对于边缘计算而言,其功耗有待进一步提高。Nakahara 等[13]在轻量级YOLOv2 中结合二进制和支持向量机设计了一套优化加速平台,通过降低计算复杂度来加快YOLO 算法的检测速度,但该方法没有考虑内存访问的优化。

针对现有研究存在的加速方法不足、功耗较高、内存访问优化不完善等问题,本文提出了一种结合内存访问优化方法和输入输出通道并行加速的新型异构FPGA 高能效硬件加速器。该设计对各个模块进行单独设计优化,改进加速器数据访存机制以减少繁琐的数据访问带来的系统时延,同时利用CPU 的逻辑处理能力和FPGA 的并行计算资源,实现低功耗高性能的目标检测硬件加速器。

1 技术背景

1.1 YOLO 介绍

目前基于深度学习的常用目标检测网络有RCNN、YOLO 系列等。基于YOLO 的优异检测性能及其在边缘计算方面的加速潜力,本文选择对YOLOv2网络进行硬件加速,其网络结构如图1 所示。

图1 YOLOv2 网络结构Fig. 1 YOLOv2 network structure

YOLOv2 目标检测网络包括卷积层、池化层、路由层和重排序层等。

(1) 卷积层。主要是借助卷积核对输入特征图进行卷积处理,经过权重和偏置获取特征。

(2) 池化层。通常跟在卷积层后进行特征压缩,去除冗余信息。

(3) 路由层。把需要的输入层进行级联,作为下一层的输入特征图,以实现多维度特征融合。

(4) 重排序层。对于待处理的特征图按照给定步长在邻域内取像素点,相同位置的像素组成新的输出特征图,可以更好地解释细粒度特征,提升模型识别准确度。

(5) 批归一化。批归一化(Batch Normalization,BN)主要用于加快模型收敛。YOLOv2 算法在训练时使用了批归一化,故在网络预测时需要先对卷积层输出特征图进行映射解析。

其中:x为输入的待预测样本;y为批归一化的输出结果;γ为尺度因子;β为平移因子;E[x]和Var[x]分别为训练时每批下的均值和方差; ε 是为了避免除数为0 时所使用的微小正数。

(6) 激活函数。YOLOv2 使用Leaky ReLU 激活函数来提升模型的非线性拟合性能。Leaky ReLU 函数快速计算、收敛的特点得使它不会消耗太多的FPGA 资源,其表达式如下:

其中 α 可由方向传播算法求得,通常取值为一个接近0 的正数。

1.2 高层次综合

高层次综合(High Level Synthesis, HLS)是近年来Xilinx 公司主推的高效FPGA 电路设计开发方法,它可以在高层次进行软件描述,之后综合成可用的网表文件。开发人员只需要采用C、C++等语言即可实现FPGA 电路编程,开发效率高,十分适合算法的快速验证。

2 系统设计与模块实现

2.1 加速器设计方案

YOLOv2 算法进行目标识别时主要有预处理、网络计算和后处理3 个步骤,其中网络部分占整个算法计算量的90%。本文将这部分作为FPGA 主要的加速目标,借助FPGA 丰富的片上资源和并行处理能力,通过合理的设计优化实现加速。预处理与后处理的计算量较小,并且涉及部分算法逻辑,故将它们放到CPU 端运行。

本文设计的FPGA 端加速器架构如图2 所示。架构中有数个AXI 主接口和一个AXILite 从接口,因为HLS 方法生成的AXI 主接口每个通道的读写机制类似直接内存读取(DMA),因此使用多个主接口来模拟DMA 并发访问,实现并行写入、写回数据,包括处理的特征图数据和需要加载的各层权重或偏置参数,控制信号、数据读写信号等则通过从接口传输。

图2 示出的黑色连线代表控制信号线,绿色连线代表处理的图像数据传输通路,红色模块分别为针对算法不同层进行独立设计实现的FPGA 模块和为了优化数据访问设计的数据收发模块。

图2 加速器数据流框架Fig. 2 Accelerator data flow framework

2.2 硬件加速策略

2.2.1 粗粒度优化 卷积层是整个算法中计算量最大的部分,它占YOLO 算法90%以上的运算时间[14]。针对卷积中大量的运算操作,FPGA 内的处理引擎(Process Engine,PE)可以多次执行相同的操作来完成整个计算任务。

针对这种可优化的串行处理方式,本文提出了粗粒度优化的加速策略,即利用FPGA 内部的空闲计算资源,将计算任务分配给多个PE,通过增加FPGA 内部电路使用以实现并行处理,提高卷积的计算速度。

如图3 所示,粗粒度优化的加速策略由M个PE 组成M-PEs 计算单元,矢量化的输入数据被划分成不同的部分,同时流入每个PE 进行并行计算。卷积所需的权重数据存储在片上存储器中,计算时输入数据和权重数据共同流入PE,每个PE 同时执行相同的乘法和加法运算,其输出作为下一个网络层的输入继续计算,同一控制信号控制多个PE。粗粒度优化的本质是使用FPGA 内部的计算资源来增加操作并行性,通过消耗更多的FPGA 资源来提高计算性能。

图3 粗粒度优化示意图Fig. 3 Schematic diagram of coarse-grained optimization

2.2.2 细粒度优化 实现粗粒度优化后,虽然可以调用多个PE 进行并行数据处理,但各个PE 对不同数据所需的处理时间不同,会造成不同大小的时延问题。假设粗粒度优化选定M个PE 进行并行处理,单个周期内,当M个PE 都计算完成后得到的输出才会进入下一层处理,造成FPGA 的资源利用不够充分。

针对上述时延问题,本文对处理引擎中的流水线进行优化,可以有效降低时间冗余和延迟,如图4所示。其中图4(a)示出了优化前FPGA 中的数据处理乘加操作,图4(b)示出了通过在FPGA 中的两个数据处理节点之间添加寄存器实现的流水线优化框架。在数据流处理过程中,每个寄存器在每个时钟周期内存储上一层计算节点的数据,并将前一个时钟周期中缓存的数据传输给下一个计算节点。对于有循环的计算,使用HLS 工具中的UNROLL 指令将循环计算过程转换为同步计算过程来展开循环,充分利用FPGA 的硬件资源,消除了无效的等待时间,提高了计算效率。

图4 优化前后FPGA 中的乘加操作对比Fig. 4 Comparison of multiplication and addition operations in FPGA before and after optimization

2.2.3 浮点数定点化 在计算卷积神经网络时,权值和偏差参数的大小会影响整个网络的性能[15]。大量的高精度浮点运算不仅会增加模型的功耗,而且会影响计算速度。在以往的研究[16-18]中发现,与浮点数运算相比,定点数据更适合使用FPGA 进行高效计算。在Chen 等[19]的研究中发现,16 位定点数据的功耗为32 位数据的0.136 倍,而模型的精度仅下降了0.26%。因此,本文在训练YOLO 网络时,使用32 位浮点数,在FPGA 中部署YOLO 模型时,特性图像素、卷积核和权重数据被量化为16 位定点数。

假设在训练YOLO 网络时获得的某个权重数据x为4.609 685 301 780 701,该32 位浮点数由1 位符号位、8 位指数位(整数部分)和23 位尾数位(小数部分)组成,则x在计算机底层的32 位浮点数表示如图5(a)所示。

定点数在确定了各位数的长度后,小数点的位置被固定,本文设定FPGA 中的16 位定点数各部分的位数为1、3、12,则x在FPGA 底层的16 位定点数表示如图5(b)所示。

图5 32 位浮点数和16 位定点数表示对比Fig. 5 Comparison between 32-bit floating-point numbers and 16-bit fixed-point numbers

由于数据位数不同带来的精度不同,该权重数据x的浮点数定点化前后误差为0.000 066 161 155 701,数据损失率仅为0.001 4%,不影响目标检测算法精度,可忽略不计。

2.3 各模块优化与实现

YOLOv2 算法主要包括4 层。卷积层的任务是提取特征;池化层用来降维去冗余;路由层用来进行特征融合;重排序层针对特征进行抽样打乱。在卷积层后常跟着批量归一化和激活函数,以加快模型收敛、提高非线性性[20]。

2.3.1 卷积模块(Conv) 与先前研究中常用的卷积计算单维度加速不同,本文提出了一种输入、输出通道两维展开的新型卷积加速策略。假设在YOLOv2算法中的某次卷积模块输出特征图个数为M,输入特征图个数为N,设Tm和Tn为这两个维度上的并行通道个数,单次卷积操作可以实现Tm×Tn个并行乘法操作,再借助Tm个加法树得到单次卷积输出。这种输出、输入通道的同时展开允许我们对卷积操作的底层乘加运算进行流水化处理,减少电路闲置时间,进而提升整个加速器的运算速度。假设现有Tm=2、Tn=4 的两维展开,其工作原理如图6 所示。

图6 示出的In[0]~In[3]为4 个输入通道的输入特征图缓存区,Out[0]和Out[1]是2 个输出通道的输出特征图缓存区,其他模块设计定义如下:

图6 卷积模块展开示意图Fig. 6 Schematic diagram of convolution module expansion

(1)存放Tm×Tn个大小为K×K的卷积核权重的缓存区;

(2)Tm×Tn个并行乘法单元;

(3)Tm个加法树进行并行加法运算操作;

(4)存放偏置参数的缓存区。

每个计算周期内,特定设计的卷积模块从存放有输入特征图的片上缓存中读取Tn个像素,同时与像素相同位置的权重(W)也会加载至待计算的Tm×Tn个卷积核中,加速器复用Tn个输入特征图进行运算,经过Tm个加法树累加后得到卷积结果,存放至相应的输出缓存中。

从卷积计算原理可以看出,新型卷积模块大部分消耗的是FPGA 中的乘法器和加法器资源,运算时使用的数据精度是消耗资源的主要影响因素,通过改变不同数据精度可以得出对应的资源耗费,见表1。可以看出,采用16 位定点数据精度的加法器和乘法器使用的DSP(Digital Signal Processing)和LUT (Look-Up Table)远少于32 位浮点数据精度下的资源消耗,进一步验证了浮点数定点化的可行性。

表1 不同数据精度消耗资源对比Table 1 Comparison of resource consumption with different data accuracy

对于Tm×Tn两维展开的卷积模块,其消耗的DSP 资源NDSP和LUT 资源NLUT计算公式如下:

其中:MDcost和ADcost分别为计算DSP 资源时的乘法器和加法器的耗费;MLcost和ALcost分别为计算LUT 资源时的乘法器和加法器的耗费;Selcost为移位电路和累加器的查找表耗费。

针对这种卷积的两维展开优化,分析方法可类比Roofline 模型[21],得到这种优化方法中的主要影响因素。假设R、C为输入特征图的行和列,M、N为神经网络输出、输入通道数,P为流水线深度,可得计算性能上限:

其中Osum为操作总次数;Zsum为执行周期总次数;Tr为输入特征图的行并行通道数;Tc为输入特征图的列并行通道数。可以看到,输入维度并行通道数Tm与输出维度并行通道数Tn越大则两维展开优化的计算性能越高。但并行度的选择并非只取决于Roofline 模型,在实际设计时仍需进行综合考量,获取最佳并行度。

2.3.2 池化模块(Pool) YOLOv2 算法的池化步长和池化大小均为2,其余原理与卷积层类似,不同处在于运算时池化层使用比较器,并非卷积层的乘、加操作,另一不同点在于池化可以针对单一输入特征图抽样。

由于卷积模块会消耗大部分板上资源,对池化模块的设计思路为消耗有限的硬件资源获取更多的并行度。图7 示出了池化模块示意图。假设有Tpool个输入特征图缓存,在单个池化周期内加速器将它们相同位置的像素输入到Tpool个比较器,进行并行比较计算获取最大值,存放至池化输出缓存区中。在本文的加速器设计中各模块共用输入和输出模块,则池化时其并行度为Tpool≤min(Tnmax,Tmmax)。

图7 池化模块示意图Fig. 7 Schematic diagram of pooling module

2.3.3 重排序模块(ReOrg) 假设重排序时设置的步长为S,重排序层读取单张输入特征图后会把S×S区域内的像素存放到S×S张输出特征图中,位置不变。基于重排序层的原理与特点,本设计使用1 块存放单张输入特征图的输入缓存和4 块存放输出特征图的输出缓存,以及一个4 通道选择器,以分配不同的输出缓存地址。

以1 张8×8 的输入特征图为例,排序过程如图8所示。处理后输出4 张4×4 的特征子图,存放至输出缓存中。

图8 重排序示意图Fig. 8 Schematic diagram of reordering

2.3.4 输入输出模块(Data Gather/Scatter) FPGA 底层在执行算法时需要对大量数据进行读写,现有研究对内存访问机制并没有较好地优化。本文针对数据的输入输出进行了特定优化和专门的模块设计,在单个周期内进行批量的数据读取或写入,存储到FPGA 的片上缓存,该批次数据复用完成后进行下一次读取,通过增加单次读取的数据块大小减少访存操作次数,缩短大量单次访存操作带来的时间延迟。

硬件加速器架构底层数据传输使用FPGA 片内AXI 高速总线,AXI4 master 模块接口读写通道相互独立,支持并发执行数据读写策略。各模块与片外RAM 进行数据传输时,借助特定设计的数据分发(Data Scatter)模块,通过数个读通道进行待处理特征图的并行输入,读取至片内时再分发到不同模块对应缓存;进行数据输出时则借助特定设计的数据收集(Data Gather)模块,先将待输出数据写回DRAM,通过数个写通道完成输出特征图像素块的并行写入,实现更佳的数据内存访问机制。

3 系统实现与评估

3.1 加速器系统实现

加速器系统结构可以分为两部分:PS(Processing System)和PL(Programming Logic)。基于PYNQ 框架的PS 端集成了ARM 内核和Python 编译环境,运行Linux 操作系统。

PS 端的CPU 可以控制PS 和PL 之间的所有接口,加速器使用CPU 调度将待输入特征图和YOLO 网络参数输入DDR 缓冲区,通过AXI(Advanced eXtensible Interface)总线与外围接口电路进行交互。CPU 使用AXI 总线读取加速电路的运算结果,执行图像预处理的应用程序并在PS 侧显示。在PL 端,外部DDR中的数据被读取至片上RAM,同时硬件设计比特流文件(Bit)和设计指令文件(Tcl)被传递到PS 端,经过识别解析,前文中对YOLO 加速器进行的各模块设计被部署到FPGA 上,YOLO 的IP 内核被增添到PYNQ 的Overlay 库中用于顶层调用,整个硬件加速器架构设计如图9。

图9 系统硬件加速器架构Fig. 9 System hardware accelerator architecture

基于上述硬件加速器框架,借助HLS 工具,本文进行了各模块的具体实现并通过Vivado 工具搭建了基于YOLOv2 的新型低功耗目标检测硬件加速系统,如图10 所示。此系统包括PS 端的ARM 微处理器和PL 端的YOLO 模块、外部存储器和总线互联器等,其中总线互联器可以将多个AXI 内存映射的主设备连接到对应的多个内存映射的从设备中,同时保证AXI 总线上的高速传输。

图10 YOLOv2 网络硬件加速系统Fig. 10 YOLOv2 network hardware acceleration system

3.2 实验评估

3.2.1 实验设置 低功耗目标检测加速器由Vivado HLS 2018.3 生成,HLS 工具可以将C/C++语言程序转换成FPGA 所需的RTL 电路,硬件架构构建于Vivado 2018.3,加速平台基于Xilinx PYNQ-Z2,主芯片ZYNQXC7Z0201CLG400C,板上包含一个630 KB 的块RAM、220 个DSP 片、一个ARM 双核Cortex-A9 处理器和一个外部512 MB DDR3。

3.2.2 结果评估 实验基于Xilinx 平台上实现了基于YOLOv2 目标检测网络的硬件加速器,使用Vivado HLS 2018.3 设计,生成加速器对应IP 核的Bit 文件和Tcl 文件,在Vivado 2018.3 中进行SOC 平台搭建,完成加速器架构设计。PS 端调度硬件逻辑并分配加速资源,大量并行计算卸载到PL 端进行。最终加速器的功耗为2.96 W,算力达到26.98 GOPs(Giga Operations Per Second)。实验环境及检测结果见图11。

图11 实验环境与检测结果Fig. 11 Experimental environment and test results

(1) 资源消耗评估。使用Vivado HLS 2018.3 对加速器主要IP 核进行实现后,可得到设计中的各模块资源消耗,见表2。其中DSP48E 主要用于细粒度优化策略和卷积模块中的乘法器和加法器配置,耗费152 个,充分利用FPGA 的计算资源。BRAM_18K用于实现粗粒度优化策略等存储量较大的缓存需求,除了YOLOv2 的IP 核使用BRAM_18K,加速器系统中的其他模块的接口缓存也会消耗BRAM 资源,例如偏置参数缓存和权重行缓存各需要两个BRAM_18K,输入缓存需要24 个BRAM。所有额外BRAM_18K 消耗共86 个。对于较小量级的数据缓存并不适合使用BRAM 资源,本设计中使用FF 和LUTs 资源来实现少量数据与信号的传输,此模块消耗35 977 个LUT 和32 049 个FF。

表2 加速器资源消耗Table 2 Accelerator resource consumption

(2) 性能评估。将该加速器与其他平台的加速效果进行对比,比较结果见表3。由于内存资源的限制,本文的加速器数据吞吐量不大,但是其功耗仅为2.96 W,算力达到26.98 GOPs。文献[22]设计了行缓冲模式,适用于不同大小的卷积核,但由于卷积加速模块与全连接模块分开设计,片上资源的重用率并不高,因此即使主频较高但实际计算性能只能达到18.82 GOPs,仅为本文设计的69.7%。Zynq Ultrascale+[13]平台上的加速器计算性能较好,但其消耗的FPGA 片上资源远多于本设计,功耗是本设计的1.5 倍。文献[23]的工作基于OpenGL 技术,其加速方法结合了通用矩阵乘法对输入特征图分块、并行计算,实现加速。然而,此设计没有考虑参数与输入特征图的排序问题,每次处理均需要额外的排序处理时间,限制了加速器的性能发挥,本设计的算力与其相比提升了38.71%。

表3 与其他FPGA 加速器设计的比较Table 3 Comparison with other FPGA accelerator designs

4 结 论

本文以典型目标检测算法YOLOv2 为基础,借助结合CPU 的异构FPGA 设计并实现了一种同时对卷积输入和输出进行展开的新型硬件加速器,同时在FPGA 上设计粗粒度和细粒度优化方法,提高硬件资源利用率,数据位宽上进行浮点数定点化,加快处理速度的同时降低系统功耗,通过对数据位宽转换前后对比验证了这种方法的可行性。本文另一创新在于针对容易被忽视的底层数据访问重新设计加速器数据访存机制,有效提高总线带宽利用率,减少系统传输时延。

本文设计的加速器的功耗约为2.96 W,算力达到26.98 GOPs。经过资源消耗评估,将加速器性能与现有工作进行对比,验证了在计算资源有限的平台上进行低功耗目标检测需求的可行性,为目标检测算法在实际应用时遇到的性能不足、功耗有限等问题提供了新架构。

未来工作可从两方面出发,底层的机制优化或算法网络层的优化,前者可从数据复用的进一步展开,对不同大小的输入特征图的存取需求进行不同处理;后者可以综合现有的一些轻量化网络设计,譬如多层融合,或使用Winograd 快速乘法减少卷积内循环的乘操作,通过转换乘加操作充分利用FPGA 片上资源,提高加速器性能。

猜你喜欢

加速器卷积模块
莫比斯加速器众创办公空间
基于全卷积神经网络的猪背膘厚快速准确测定
知识快餐店 科学加速器
国内外医用直线加速器可靠性对比研究
28通道收发处理模块设计
“选修3—3”模块的复习备考
一种基于卷积神经网络的地磁基准图构建方法
基于3D-Winograd的快速卷积算法设计及FPGA实现
一种并行不对称空洞卷积模块①
必修模块相关知识过关训练