基于FPGA的双乘法器卷积加速算子的封装方法

2022-08-16 03:26聂煜桐沈月峰王吕大
计算机工程与设计 2022年8期
关键词:校验算子乘法

聂煜桐,沈月峰,杨 帆,王吕大

(中国航天科工集团第二研究院 七〇六所,北京 100854)

0 引 言

近年来,卷积神经网络(convolutional neural network,CNN)应用场景愈加复杂,CNN网络模型的深度不断增加,FPGA因其在速度、灵活性、功耗等方面的优势使得基于FPGA的卷积加速研究成为热点[1,2]。通常情况下,FPGA上的卷积运算会交付给DSP块进行实现。换言之,使用FPGA实现CNN常常依赖于FPGA片上的DSP资源以获得最高的效率。然而DSP块具有固定的位宽,而基于FPGA的CNN实现会将数据量化为8 bits位宽。因此,在FPGA的DSP块没有单指令流多数据流(SIMD)乘法支持的情况下,需要在DSP块内创建一个虚拟的SIMD通道——双乘法器封装[3],用以提高DSP块的利用率。基于双乘法器的卷积算子可以使运算的吞吐量和DSP资源的利用率同时提高一倍。但是双乘法器是通过位拼接实现的,这会导致符号位变成运算位从而导致运算结果错误。因此简单的位拼接实现的双乘法器只支持无符号数乘无符号数,这种情况下封装的卷积算子只能配合ReLU激活函数来使用。本文设计了一种校验电路,实现了双有符号数拼接与有符号数的乘法。这使得该卷积算子支持如Leaky ReLU等多种激活函数。此外,FPGA拥有天生的并行性,对于该卷积算子而言,通过将卷积运算展开为向量内积可以提高乘法运算并行度,然后通过加法树的设计思路提高加法运算的并行度,从而提高算子的运算速度。最后,为了支持不同规模的卷积运算,本文采用参数化的设计方式来增加算子的灵活性,从而保证该算子可以适用于不同规模的神经网络。

1 相关工作

1.1 卷积神经网络的硬件加速研究

近年来,在机器学习领域,卷积神经网络(convolutional neural network,CNN)相比传统算法有了很大的进步,CNN在图像识别、计算机视觉、语音识别等场景的表现非常优异。以卷积神经网络为基础的算法研究已表现出了其可靠性和稳定性。大量可信数据的积累和硬件性能的提升,极大推动了以数据和算力为基础的神经网络算法的研究。当前实现神经网络的主要硬件平台有:通用处理器(central processing unit,CPU)、图形处理器(graphics processing unit,GPU)、专用集成芯片(application specific integrated circuit,ASIC)和现场可编程门阵列(field-programmable gate array,FPGA)。CPU的灵活性强,调度效率高,但是CPU的并行能力不足,运算效能相对较低。GPU拥有强大的浮点运算能力和极高的运算性能,非常适合执行复杂的数学和几何运算(尤其是并行运算)。但是由于GPU控制单元极少,故其必须由CPU进行控制调用。此外GPU的功耗很大,对于浮点运算精度不是很高的应用,会造成功耗的浪费。ASIC是一种为专门目的而设计的集成电路。ASIC芯片的效能要远高于其它硬件平台。但是ASIC芯片灵活性很低,可扩展性很差。相比之下,FPGA是作为ASIC领域中一种半定制电路而出现的,它拥有可定制、易扩展、高并行等特点,可以实时实现定制化设计,FPGA理论上可以达到与定制芯片相当的性能。同时它又有很强的灵活性,很容易修改和扩展新的算法。此外,对于通信密集型的任务,FPGA 有比GPU更大的优势。除了性能和灵活度的优势以外,FPGA的功耗相对也比较低。因此,FPGA更适用于CNN算法的推理阶段。

1.2 基于FPGA的卷积加速研究

FPGA是一种可自定义编程的硬件结构,其硬件结构特性非常适合卷积运算的特点。目前针对硬件结构的优化有很多的研究工作。亚利桑那州立大学的Ma Yufei等[4]利用循环交换技术,改变循环计算的顺序,利用循环展开技术以充分利用硬件的并行度,在Altera Arria10 GX 1150 FPGA上实现了645.25 GOPS的吞吐率。北京大学的Zhang Chen等[5]提出了核内并行,核间并行以及混合并行3种数据级并行方式,并可以根据每层的参数,选择不同的并行方式。相比传统方式,取得了4.0倍-8.3倍加速比。复旦大学的Li Huimin等[6]在卷积内并行的基础上,充分探索了卷积之间的并行度,提出一种全流水线架构。它将网络的每一层作为流水线的一级,映射到硬件中独立的一部分。但是由于每两层之间都需要加入PingPong-Buffer来存储相邻层的中间结果,所以这种架构需要消耗大量内存。为解决该问题,石溪大学的Shen Yongming等[7]将卷积分为不同组,将FPGA的资源分为多个小的卷积处理器,每个小的卷积处理器处理同组内的多层卷积运算。该设计不仅具有更高的资源利用率和吞吐率,同时相比全流水结构,其所需中间缓存大大减小。为了进一步提高FPGA的资源利用率,韩国蔚山科技大学的Nguyen等[3]提出了双乘法器封装技术。本文在这些研究的基础上进行了卷积算子级的优化,扩大了算子适用范围的基础上,提高了算子的运算性能。

2 卷积算子加速方法

卷积算子是CNN模型中最核心的计算算子,是深度神经网络不可或缺的组成部分。在图像领域,卷积层通过卷积算子的运算可以提取出输入图像中比较复杂的特征,以实现图像识别、分类等特定功能。

2.1 卷积运算

卷积运算是将矩阵A[n,n] (卷积核矩阵)在矩阵B[n,n] (图像矩阵)上做滑窗操作。在每一个窗口上,将矩阵A[n,n]对应的元素与矩阵B[n,n]的元素相乘,然后将所有的乘法结果相加作为对应窗口的卷积结果进行输出。滑动窗口的设置可以将高维卷积分解为二维卷积。二维卷积每一个窗口上的数学运算表达式(1)如下所示(式中⊗表示卷积运算)

(1)

在整个输入特征图上的卷积运算过程如图1所示。

图1 卷积运算过程

图1所示的二维卷积运算过程可以抽象成算法1所示的由四层循环表示的伪码。

算法1:二维卷积算法伪码

输入:输入特征图Datain[ci,ri], 卷积核K[n,n], 步长s

输出:输出特征图Dataout[co,ro]

(1)for(i=0;i

(2)for(j=0;j

(3)for(p=0;p

(4)for(q=0;q

(5)Dataout[i,j]+=Datain[p,q]×K[n-p,n-q]

2.2 基于FPGA的硬件加速设计

FPGA拥有灵活性强,并行度高,运算速度快等优点。此外,FPGA还集成了大量的DSP资源以支持高并发的乘加运算。因此FPGA非常适合用于卷积运算的硬件加速。但是FPGA因其硬件特性导致它无法高效地支持大量浮点数运算。定点量化[8]技术很好地解决了这一问题。定点量化即将高位表示的浮点数量化成低位表示的定点数。相关实验结果表明,当量化位宽在8 bits及以上时,各网络的损失基本在1%以内。定点量化的做法不仅可以降低运算的复杂度,还可以很好实现CNN在FPGA上的映射。因此基于FPGA 的CNN加速器通常使用8 bits的量化方式来实现卷积运算。但是目前FPGA中的DSP资源支持最多25 bits×18 bits的有符号乘法运算,同时拥有25 bits的预加器和48 bits的累加器。DSP块是FPGA中承担卷积运算的主要运算硬件单元。但是经过定点量化的卷积运算通常只需要进行8 bits×8 bits的有符号乘法运算,这无疑会带来很大的位宽浪费。为了减小上述位宽的浪费,提高DSP资源的利用率,Nguyen提出了双乘法封装的方法[3],即将两个有相同乘数的乘法拼接在一起交给DSP模块进行运算。如图2(a)所示的两个乘法A×C和B×C,其中A、B、C都为n bits无符号数,将A和B进行拼接,由于n bits×n bits的结果为2n bits,故需要在拼接数中间插入n+1 bits的0以保证A×C和B×C互不影响。如图2(b)所示,对于两个无符号数与无符号数的乘法进行上述封装,可以输出正确结果。但是如图2(c)所示,对于乘数是有符号数的情况,经过位拼接后,会将低位乘数的符号位误作为运算位进行处理,这种情况下会产生误差导致运算结果错误。在实践中,卷积层通常要配合激活函数一起搭建完整的网络。若卷积算子只能支持无符号数的运算,这将会进一步影响到激活函数的选择。为解决这一问题,需要设计相关的校验电路进行符号校验以支持双有符号数与有符号数乘法的封装。

图2 双乘法器封装及示例

3 设计与实现

3.1 双乘法器封装及校验电路设计

为解决有符号数双乘法封装中符号位带来的问题,设计相应的校验电路。需要封装的乘法为A×C和B×C。首先对各乘数的符号状态进行分析,表1列出了乘数符号可能出现的所有组合。

表1 乘数符号组合

通过对表1的分析可以,根据公共乘数C的符号可将运算分成*×Singed与*×UnSinged两类。因此校验电路可以先设置一个比较器(Comparer)用于判断公共乘数C的符号,然后根据比较结果对乘数的符号顺序进行调整,将两类乘法统一为同一类,即*×UnSinged。通过这一步的调整,只需要校验乘数A与乘数B的拼接问题而无需考虑公共乘数C的符号。符号顺序调整公式如式(2)所示

C>0 A=-A, B=-B, C=-C ≤0 A=A, B=B, C=C

(2)

经过符号调整后进行第二步校验。首先分析有符号数的二进制表示方式。有符号数常采用二进制补码的表示方式,设n bits有符号数A=an-1an-2…a1a0。 按照补码的运算方式可得A的计算公式如式(3)所示

(3)

根据数学运算有-2n-1=2n-1-2n, 将该式代入式(3)可得

(4)

(5)

图3 校验电路设计

3.2 并行加速

通常情况下,基于FPGA的卷积神经网络进行并行处理的方法有以下3种:卷积内并行、卷积间并行、混合并行[9]。但是实践中通常将卷积单元和池化单元作为一个整体运算单元,通过运算单元层级的流水线设计达到并行效果。从本质上讲,这是一种卷积核间并行的设计方式。算法1-1的四层循环中,最内层的两层循环是对卷积核的遍历。对于K×K卷积核,完成这两层循环共需K2个时钟周期。通常情况下K的值是确定的,所以可以通过有限次的展开将这两层for循环转换成K2个并行的计算[8],即将矩阵的内积展开成为向量的内积,这样便可在一个时钟周期内完成运算并实现同样的功能。在卷积运算过程中,通过大小为K×K的滑动窗口选择参与运算的数据,然后将运算数据和卷积核参数分别逐行分割并拼接成一维向量,最后对生成的两个向量做内积得到卷积运算的结果,以一个3×3的卷积窗口为例,具体运算过程如图4所示。

图4 卷积展开的计算过程

并行计算完这K2个乘法后,最终的卷积输出需要将这K2个乘法结果相加。一般情况下需要做K2-1次加法。但是在FPGA中可以使用加法树的计算方法来进一步提高加法运算的并行度。如图5所示,该图展示了加法树的运算结构,以该方式进行计算只需做log2(K2-1) 次加法即可完成所有的运算。

图5 加法树

3.3 卷积算子封装

卷积算子最终要服务于完整的网络模型才能发挥自己的作用。在完整的网络搭建过程中,往往需要不同规模的卷积层。这就要求底层设计的卷积算子易扩展,方便修改对于卷积核大小的配置。故最终需要将算子封装成一个卷积核大小可变的用户IP核以适应卷积神经网络中规模不断变化的卷积运算需求。使用参数化设计进行RTL级的开发及封装即可满足这一需求。详细的封装电路设计如图6所示。

4 测试与验证

4.1 实验说明

本文通过对卷积神经网路中的核心算子——卷积算子的运算原理以及FPGA资源特性和运算特性的研究,设计了基于FPGA的双乘法器卷积加速算子。算子的封装过程中使用了双有符号数乘法器,在提高DSP资源的利用率的同时实现运算加速,即在一个时钟周期完成两个乘法运算。由于底层加法器支持双有符号数乘法,故该算子可以支持负数型激活函数。此外,本设计充分利用FPGA并行计算的优势,将卷积运算展开,通过卷积核内并行的方式对算子进行加速。根据以上的设计要点,需要开展以下实验进行验证:①双乘法器封装及校验电路的测试实验;②卷积算子封装测试实验;③卷积算子性能验证实验。通过这些实验,一方面可以通过充分的仿真测试保证算子运算输出的正确性,另一方面通过设置对照实验,对所使用的资源数量进行统计,验证资源利用率的提升,同时通过对一定规模的卷积运算所消耗的时钟周期数进行统计,可以定量地说明算子运算性能的提升。

图6 卷积加速算子封装电路设计

4.2 实验条件与环境

本文基于Xilinx的系列设计套件进行实验开发及验证。硬件选择Artix-7系列的开发板,该开发板可以提供丰富的DSP、LUT等逻辑资源和时钟资源,完全可以满足算子的封装需求。此外,卷积算子最终要为大规模的神经网络服务,因此使用资源丰富的开发板使得算子的扩展使用更加方便。编译器选择Windows 10操作系统下的Vivado2019.2设计工具。Vivado套件支持FPGA的RTL级开发,支持Verilog语言的编译、仿真、综合、布局布线以及bitstream文件的生成。同时它还提供ChipScope在线波形仿真功能,通过设计编写测试文件可以直接生成电路测试波形,方便对设计的正确性进行检验。此外Vivado可以分别统计综合与布局布线后所用资源的数量及利用率,方便对资源利用率动态变化的分析。FPGA板卡通过Platform Cable USB与主机连接后,可进行bitstream的下载以及仿真波形的采集。具体实验环境的配置见表2。

4.3 实验内容及实验结果

本文所有的实验都使用Verilog语言进行RTL级开发,并设计Testbench文件对所开发模块进行仿真验证。根据4.1实验说明的介绍,共有3组实验,下文对这3组实验内容进行详细说明。

表2 开发环境配置

4.3.1 双乘法器封装及校验电路的测试实验

该部分实验完成对于双乘法器的封装,并按照4.1介绍的校验方法开发对应的校验电路。测试值覆盖了8 bits位宽所表示有符号数的部分中间数值(如3、4、-3、-4等)和所有边界数值(如127、-127、128、-128)以及部分越界数值(如255、-255等)。设置的测试用例覆盖全面,且具有代表性,能够充分验证设计的正确性。

实验结果部分仿真图如图7所示。图中a1、a2表示拼接的两个乘数,b表示公共乘数,c1为a1×b的结果,c2为a2×b的结果。通过对测试结果的检验,所有测试数据对应的输出结果均正确。

图7 双乘法器封装验证实验仿真

4.3.2 卷积算子封装测试实验

图8 卷积算子封装实验整数卷积仿真

4.3.3 卷积算子优化效果验证实验

本文通过对卷积算子的封装主要实现以下两方面的优化。①通过双乘法器的封装提升DSP资源的使用率;②通过卷积展开和双乘法器运算,同时提高卷积运算核内与核间的并行度,从而实现运算速度的提升。为了验证上述优化效果,本部分将设置相应的对照实验。首先取消双乘法器的封装,使用正常的乘加器实现两个与4.3.2实验中规模相同的卷积运算,对比该实验与4.3.2实验各需要使用多少DSP资源。第二组对照实验将在上述实验的基础上取消卷积展开的设计,每个时钟周期只计算一个乘法。该实验与4.3.2实验接入相同的时钟周期,最后统计两个实验完成相同规模卷积运算所需的时钟周期数,时钟周期的对比即可说明运算速度提升的大小。

不同乘法器参与卷积运算的资源统计如图9所示。其中,图9(a)为基于双乘法器的卷积算子封装资源消耗统计,图9(b)对照实验中资源消耗统计。且两张资源消耗统计图皆为编译器Vivado综合以及布局布线后统计的资源消耗数据。由图9(a)可知,基于双乘法器封装的卷积算子共消耗了9个DSP,而对照实验中,实现相同规模的卷积需要消耗28个DSP资源。二者相比,资源利用率提高了3倍。然而,基于双乘法器的卷积算子封装,由于需要设计额外的校验电路,因而会消耗额外的LUT资源。但是对于FPGA而言,LUT属于丰富资源,牺牲一定数量的LUT资源换取稀缺资源DSP利用率的提升是非常有价值的。

图9 卷积算子封装资源消耗统计

完成资源利用率的对比后,需要进一步验证速度的提升。实验仿真时序图如图10所示。假设封装的算子接入的时钟为50 MHz,可以得到如图10(a)所示的基于双乘法封装及卷积展开的卷积算子运算时序图。然后设置对照实验,同样在50 MHz的时钟下完成相同规模的两个卷积运算,可得图10(b)所示的时序图。

图10 卷积算子运算仿真时序图

5 结束语

近年来,卷积神经网络有了很广泛的应用。随着数据量的不断增加,卷积神经网络的硬件加速引发了广泛的关注。FPGA因其功耗低、运算速度快、并发度高、灵活性强等特点成为硬件加速的研究热点。

猜你喜欢
校验算子乘法
算乘法
与由分数阶Laplace算子生成的热半群相关的微分变换算子的有界性
使用Excel朗读功能校验工作表中的数据
我们一起来学习“乘法的初步认识”
《整式的乘法与因式分解》巩固练习
Domestication or Foreignization:A Cultural Choice
把加法变成乘法
智能电能表的现场快速校验方法探讨
QK空间上的叠加算子
电子式互感器校验方式研究