基于改进动态配置的FPGA卷积神经网络加速器的优化方法①

2020-04-21 02:28陈庆清王海霞张怡龙刘义鹏梁荣华
高技术通讯 2020年3期
关键词:流水线加速器定点

陈 朋 陈庆清 王海霞 张怡龙 刘义鹏 梁荣华

(*浙江工业大学计算机科学与技术学院 杭州 310000) (**浙江工业大学信息工程学院 杭州 310000)

0 引 言

近年来,由于卷积神经网络(convolutional neural network,CNN)的结构层次越来越深,在图像分类、目标检测、目标跟踪[1]等计算机视觉领域都得到了广泛的应用,但高计算复杂度和大内存占用是硬件加速的瓶颈,需要开发更高效的硬件加速解决方案来驱动实时应用程序[2]。Li等人[3]提出了基于GPU的大规模递归神经网络的高效实现。Li等人[4]分析了GPU加速器潜在的性能瓶颈。随着CNN模型越来越大、越来越深,CNN加速器需要更多的计算操作和数据访问,虽然GPU具有强大的计算能力,但也存在着功耗较高、体积较大和成本较高等问题。

现场可编程门阵列(field programmable gate arrang, FPGA)具有大量阵列形式逻辑、运算单元,在尺寸、功耗和并行运算方面都比GPU有优势[5],具有高性能、低功耗、使用灵活方便等优点[6]。传统构造FPGA的卷积神经网络的方式是基于寄存器传输级(register transfer level,RTL)描述语言设计的。郭晓丹等人[7]在FPGA上实现了单比特BP人工神经网络,采用了低环路延迟加法器、混合信号乘法器来减少硬件消耗,提高运算精度。Han等人[8]在FPGA平台上设计的网络加速器,其能源效率是CPU的40倍,GPU的11.5倍。林军等人[9]提出了基于数据流水线的资源管理,冯煜晶等人[10]针对流水线停顿提出了动态指令调度机制。Li等人[11]采用流水线结构达到565.94 GOP/s和391 fps的峰值性能。但传统的基于RTL设计的神经网络仍然具有流程复杂、周期较长和优化空间较小等问题[12]。Ma等人[13,14]基于RTL设计了可扩展的自动编译器,但仍然无法避免流程复杂、周期较长等问题。

在其他基于FPGA的CNN加速器的设计方法中,使用基于高层次综合(high-level synthesis,HLS)工具可以将高级编程语言直接转化为硬件描述语言(hardware description language,HDL),并且对所生成的硬件结构可以通过插入优化指令进行优化,其中包括映射硬件寄存器、循环、接口等操作[15]。Zhang等人[16]通过HLS工具,使得基于FPGA的加速器的速度是NVIDIA K80的4.75倍。卢治等人[17]使用HLS工具证明了FPGA平台在不同的网络模型下效能远高于GPU平台。由此可见,HLS工具设计的FPGA神经网络加速器同样具有良好的性能,而且在设计周期上远远短于传统方法,具有良好的可扩展性。

另一方面,在数据规模较大的分类场景下,并不需要网络的高精度,需要的是更高实时性。在FPGA上,实现定点运算的效率比浮点运算高得多。Gysel等人[18]和Qiu等人[19]分别在GPU平台和基于RTL设计的FPGA平台提出动态定点数据量化方法,并且Qiu等人[19]只引入了0.4%的精度损失,实现了4.45 fps的帧率。在可接受的精度损失的条件下,对FPGA卷积加速器采用定点设计,可以有效减少硬件开销,从而提升加速器的性能。

综上所述,本文提出改进动态配置的FPGA卷积神经网络加速器的优化方法。该方法采用C++作为编程语言,将加速器任务划分到处理器系统与可编程逻辑上。处理器系统上使用基于模块复用的流水线方式,多个模块之间通过片内总线实现高速互连。在可编程逻辑上将引入分割参数,使用HLS工具设计具有可扩展性卷积加速器并实现其功能。同时采用8-16位动态定点方案,将浮点数据改为动态定点数据,引入量化参数,以适配不同网络层量化配置。本文将ImageNet数据库作为数据集,在FPGA上搭建了CNN网络加速器,验证了方法的有效性。本文的主要工作如下。

(1) 引入分割参数后,以流水线的方式将网络中相同层进行模块复用来实现并行工作,并建立冲突解决机制来解决输入数据的竞争问题。

(2) 根据FPGA的计算特性,采用动态定点数据量化方法,将浮点数据改为动态定点数据。并在HLS工具设计过程中引入量化参数,以适配不同网络层量化配置。

1 FPGA卷积神经网络加速器的优化方法

1.1 系统任务的软硬件划分

本文对优化对象进行划分,将不同的优化对象分别划分到处理器系统(processing system,PS)与可编程逻辑(programmable logic,PL)上,优化示意图如图1所示。在PS部分上实现基于流水线结构的层间模块复用,并建立对应的冲突处理机制来解决复用造成的信号冲突;在PL部分上利用HLS工具设计优化卷积加速器,通过仿真报告来验证资源占用比。完成设计后,对整个系统进行联合仿真,验证结果的准确性,通过实验来验证设计方法的有效性。

图1 优化示意图

1.2 具有可扩展性的卷积加速器设计

卷积神经网络的特征提取阶段往往由多个计算层组成,例如AlexNet网络,它的特征提取阶段可以由5个卷积层和3个池化层组成。卷积运算如图2所示。卷积层接收特征图作为输入,每个输入特征图通过卷积核映射生成输出特性,输出特征图将形成下一个卷积层的输入特征图集。N表示特征图的个数,W和H分别表示输入特征图的宽与高,K×K表示卷积核的窗口大小,S(通常小于K)表示窗口的平移步长,M表示输出特征图的个数和卷积核的个数,C和R分别表示输出特征图的宽与高。

图2 卷积运算示意图

池化层的目标是减少前一个卷积层产生的数据的大小,同时保持最相关的特性。实际上,池化层通常插入到2个卷积层之间。因为卷积层和池化层拥有相似的内存访问模式,因此它们在本文中使用相同的内存和优化设计方案,可以用式(1)表达。其中OUT表示输出特征图,W表示权重系数,IN表示输入特征图。

×INti,S×row+i,S×col+j

(1)

在一般情况下,卷积神经网络所处理的输入集输出集均为3维数据,需要和各个层的卷积核大小和步长一起作为函数变量进行传递。但如果循环内含有变量,就不能利用HLS工具的循环展开、循环流水线等优化方式进行优化。

为了提高数据处理的并行度,引入分割参数,对输出特征图深度、输入特征图深度、输出特征图宽和长进行分割。在Zhang等人[20]的工作中,不同循环迭代之间的数据共享关系可以分为3类:无关、独立、依赖。循环参数Tr、Tc和输入集IN是依赖关系,和输出集OUT是独立关系;Tm和权重集W、输出集OUT均是独立关系;Tn和输入集IN、权重集W均是独立关系。

在卷积层加速器进行高层次综合之前,需要确定分割参数的数值,即将其作为固定的加速器参数。根据数据共享关系,对循环进行分割及重排后的卷积结构如式(2)所示。其中F(x)表示循环展开,L(x)表示循环流水线。在经过优化后,卷积层中的卷积运算根据分割参数的设定,展开为多条处理通道进行并行计算。

(2)

1.3 资源约束下基于流水线结构的层间模块复用

对于大规模的应用场景,图像数据往往是具有连续性的。根据CNN数据处理特性,可知CNN内部的数据处理过程是依照不同处理层顺序进行的,即网络中前后相邻的层之间,数据具有依赖关系,无法进行并行处理。对于GPU来说,卷积神经网络的每一层输入都是上一层的输出,层间的数据关系紧密相关,是一种串行结构,无法做到层间并行运算。相比于GPU,FPGA的硬件结构可以采用流水线结构,用以减少运算的时间开销,提高资源利用率。

本文中的流水线由多个卷积神经网络的层级结构组成。由于流水线中的不同层级模块具有不同的计算时间,计算周期最长的层级模块是流水线中瓶颈段,实际加速比也由瓶颈段所决定的。实际加速比S如式(3)所示:

(3)

在资源约束情况下,想要保持卷积神经网络良好的计算性能,需要充分考虑其并行运算的情况。由于相邻层之间具有数据依赖关系,其数据处理无法并行进行,为达到对资源的高效利用,本文采用各个不同网络层间模块复用的方案,如图3所示,以实现对硬件资源的节约并提高单个加速器的计算效能。即其中所有卷积层采用同一个卷积加速器进行计算,所有池化层采用同一个池化层加速器进行处理,所有全连接层采用同一个全连接层加速器进行处理。

图3 网络层间模块复用示意图

模块复用的关键在于解决输入数据的竞争问题。模块重用之前,各个模块的输入和输出是相互独立的。模块重用之后,多个输入需要整合成一个输入,重用模块的输出是根据输入选择的。t时刻多个输入数据的冲突信号C是由输入数据的有效信号V组成的,如式(4)所示,其中v表示输入数据个数。

(4)

如果重用模块在t时刻检测到冲突(C≥1),就需要建立冲突解决机制来避免冲突。我们通过增加流水线cache的方式,避免数据同时到达重用模块的输入端口。具体操作是在后一个模块数据输入前增加FIFO来缓存输入数据,直到冲突解决。

对于流水线中的第k个模块,它在t时刻输入信号Vα如式(5)所示。当Vα=0时,说明输入无效。当Vα>0时,则说明输入有效。

(5)

在增加了x级的cache后,模块的流水线在t时刻输入信号Vβ如式(6)所示,此时冲突信号C如式(7)所示。其中Vx表示在增加了x级的cache后,重用模块的输入数据的有效信号。

(6)

(7)

1.4 动态定点数据量化

卷积神经网络的复杂性集中在两部分,卷积层中存在着大量的运算,而网络权重通常集中于全连接层。例如AlexNet,超过90%的运算集中在卷积层,超过90%的网络权值集中在全连接层中,如图4所示。

图4 AlexNet中不同层的运算次数和权重数

传统的卷积神经网络模型在CPU和GPU的训练过程中得到的都是32位的浮点型数据,但是在测试或者分类阶段,并不需要这样的高精度。FPGA卷积神经网络加速器的设计目标是以最高性能实现最佳精度。在Zhang等人[20]的工作中,实现模型采用32位的浮点型数据进行计算。然而在FPGA上,实现定点运算的效率比浮点运算高得多[21]。在尽可能不影响精度的前提下,如果将网络进行量化,使用定点运算来代替浮点运算,直接降低存储需求以及存储传输所消耗的能量,从而提升加速器的性能。网络的准确性往往取决于用于表示特征图和训练参数的精度参数,需要合理的量化参数来保证模型量化后的网络准确性。

对传统的静态定点方案而言,只能满足大部分的权重取值范围,而动态定点方案可以通过调整数据格式来满足不同网络层的精度需求。在动态定点方案中,每个数字都可以用式(8)表示:

(8)

其中B表示位宽,S表示符号位,F表示小数长度,x表示当前位的值。动态精度量化与静态精度量化不同之处在于FL对于不同网络层的特征图集是动态的,而在一个图层中是静态的,这样做是为了将每个网络层的误差最小化。

由于动态定点中每个网络层的量化参数各有差异,特别是针对层间模块复用的情况,因此在使用HLS工具设计网络层加速器时,需引入量化参数来适配各种量化配置的情况。表示输入集、输出集、权重集所需的位宽,表示输入集、输出集、权重集所需的小数位。

在完成训练之后需要对网络进行量化来获取量化参数,并根据网络精度变化来选取最优的量化参数。在选取量化参数时应满足式(9)的条件:

F=argmin∑|R-RB,F|

(9)

其中,R为训练时得到的定点数据,RB,F为给定条件下的定点格式。

2 实验结果和分析

本文实验采用了Xilinx公司的Xilinx SDSoC 2017.4软件环境进行硬件开发,使用的硬件平台为该公司的ZCU102开发板,其芯片型号为ZU9EG,使用的工作频率为200 MHz,采用了8-16位动态定点方案。实验采用的数据集为ImageNet数据集,对比的GPU平台为NVIDIA公司的TITAN-X,本实验测试的网络结构为AlexNet网络和VGG网络。

卷积层加速器内部的乘加运算需调用数字信号处理器(digital signal processor, DSP)来进行,在本文中,对卷积操作的循环进行了展开,卷积层加速器所消耗的DSP数量与循环分割参数Tm和Tn的关系如图5所示,可见卷积层加速器的DSP的消耗量与分割参数Tm×Tn呈线性关系,循环展开越大,DSP消耗量也越大。

卷积层加速器内部的片上缓存主要是调用双极随机存取存储器(bipolar random access memory, BRAM)来进行存储的,在本文中卷积层加速器所消耗的BRAM与循环分割参数Tr和Tc的关系如图6所示,可见BRAM的消耗量与分割参数Tr×Tc基本呈线性关系,便于之后的拓展设计。

AlexNet网络和VGG网络在动态定点量化前后的Top-1和Top-5的准确率如表1所示。AlexNet网络量化前后Top-1和Top-5的精度损失为0.4%和0.14%,VGG网络量化前后Top-1和Top-5的精度损失为0.63%和0.53%,与其他加速算法的精度损失对比如表2所示。Naveen等人[22]和Wei等人[23]采用8-16位定点,Zhang等人[24]采用16位定点,其算法精度损失均在1%~2%左右。而本文采用的8-16位动态定点设计方案在此基础上将精度损失减小至0.63%。

图5 不同参数配置下的DSP消耗量

图6 不同参数配置下的BRAM消耗量表1 量化前后网络模型精度比较

准确率32位浮点Top-1Top-58-16位动态定点Top-1Top-5AlexNet63.87%85.39%63.47%85.25%VGG71.59%90.07%70.96%89.54%

表2 不同加速器的精度损失比较

利用循环展开、流水线等HLS工具的优化技术进行网络加速,表3显示了优化前后的单张图片运行时间和资源占用比。DSP的资源比优化前增加7.2倍,其余资源也有增加,但都未超过系统所提供的硬件资源上限,同时运算速度提升了295.7倍。在应用层间模块复用后,硬件资源基本没有变动,但平均计算时间仅是原来的20%。

表3 优化前后运算时间、资源占用对比

针对AlexNet网络结构,应用本文的优化配置后,对其性能及功耗进行测量,并将结果与其他优化方法比较,其对比结果如表4所示。在TIAN-X上每幅图的计算时间为1.93 ms,本文每幅图的计算时间为3.44 ms,是TIAN-X的1.78倍,但在TIAN-X上每幅图所需功耗为0.511 J,本文每幅图所需功耗仅需0.078 J,其计算能效达到了GPU的7.2倍,并且FPGA的便携性远远高于GPU。Zhang等人[20]使用HLS工具,提出了基于循环迭代之间的数据共享关系的循环分割与重排。本文在此基础上进行8-16位的动态定点量化,并引入了基于流水线层间模块复用,将计算速度提高了6.2倍,同时也优于文献[22]基于OpenCL的开发方式。文献[9]基于RTL设计,用流水线结构来增加吞吐量,达到了391 fps的峰值性能。虽然Li等人[9]设计的加速器速度更快,但由于功耗更大,其计算能效和本文的方法几乎相同,且开发周期较长,应对不同网络结构的可扩展性不强。

针对VGG网络结构的性能比较如表5所示,在TIAN-X上每幅图的计算时间为6.60 ms,本文每幅图的计算时间为18.37 ms,计算能效达到了GPU的3.89倍。文献[23]采用的是脉动阵列的高通量CNN设计,每幅图的计算时间为26.85 ms。文献[25]针对卷积循环的内存访问和数据移动进行了定量分析和优化,每幅图的计算时间分别为47.97 ms。文献[24]使用RTL提出了一个深度流水线的多FPGA架构。而本文结合了循环迭代优化和流水线优化,提高了计算速度的优化上限,把计算速度提高了至少2倍。

表4 AlexNet网络加速器的性能比较

表5 VGG网络加速器的性能比较

3 结 论

本文利用HLS工具的可扩展性,提出了一种改进动态配置的FPGA卷积神经网络加速器的优化方法。引入循环分割参数,设计了具有可扩展性的卷积加速器。将网络层通过复用模块,组合成流水线的工作方式,采用8-16位动态定点方案。在Xilinx的ZCU102开发板上实现了AlexNet网络和VGG网络。在最大精度损失0.63%的条件下,将加速器性能分别从46.3 fps和37.2 fps提高到了290.7 fps和54.4 fps,计算能效分别达到了TITAN-X的1.78倍和3.89倍。实验结果表明,本文所提出的改进动态配置的FPGA卷积神经网络加速器的优化方法,在计算能效上优于GPU Titan-X,满足了计算实时性的要求,同时也解决了功耗和体积问题。

猜你喜欢
流水线加速器定点
莫比斯加速器众创办公空间
知识快餐店 科学加速器
例谈圆锥曲线中的定点定值问题
定点帮扶让村民过上美好生活
解析几何中定点问题的处理策略
全民小康路上的“加速器”
直线过定点的5种特优解法
流水线
报废汽车拆解半自动流水线研究
流水线生产杀死艺术