吴 进,张伟华,席 萌,代 巍
西安邮电大学 电子工程学院,西安710121
卷积神经网络(Convolutional Neural Network,CNN)是人工神经网络的一种[1],被广泛应用于图像识别,其缺点是运行期间会消耗越来越多的逻辑资源和存储器带宽,因此基于神经网络的计算要求,需要对不同的神经网络提出不同的加速方法[2]。现场可编程门阵列(Field Programmable Gate Array,FPGA)被广泛用于CNN 硬件加速的实现,特别是在移动和嵌入式设备上,为了解决FPGA平台未能充分利用逻辑资源和内存带宽,以及优化不全面、不能很好地实现加速效果的问题,本文设计了一个基于FPGA的人脸识别神经网络加速器,并且和已有的GPU 实现加速的结果进行比较,在功耗以及神经网络计算时间方面都呈现更加理想的结果。
人脸识别中经典LeNet-5神经网络模型示意图如图1所示,该网络模型由2个卷积层、2个池化层、3个全连接层构成,其中卷积层与池化层交替出现。假设使用3×3大小的卷积核进行图像的卷积运算,对于神经网络的各个层采用不同的卷积核进行图像特征提取。降采样时的缩放程度决定了池化层提取出特征的粗糙程度,均使用大小为2的缩放因子对特征图进行缩放,从而完成池化层操作。本文采用平均值池化方式完成池化操作,从而实现对CNN 网络模型的加速,即对2×2 大小的邻域求平均值,进而生成一个新的像素点,即所求的目标像素点。
图1 卷积神经网络结构示意图
图2 所示为嵌入式平台上的人脸识别加速器系统架构,Xilinx Zynq 系列平台为ARM+FPGA 的异构平台,ZC706平台上的PS部分实现整个系统的调度功能,PS 端的DDR 用于存储外部数据,卷积神经网络加速器由FPGA(PL部分)实现。
图2 加速器系统架构示意图
在FPGA 平台上进行CNN 加速器设计时通常会遇到片上资源不足、片外带宽不够大、对处理的数据进行重复利用以及所设计加速器的并行度不高等设计挑战[3]。Vivado HLS(Vivado 高层次设计工具)具有仿真方便、移植性好、描述层次高、有利于提升开发效率等优点[4]。因此本文使用HLS 工具对CNN 加速器进行性能优化。
3.2.1 存储优化
图像数据使用外部DDR 进行存储,FPGA 访问PS端的DDR会花费大量时间,本文采用在PL部分设计行缓冲区的方法来存放图像数据。由于所设计的缓冲区的行数有限,当新的图像数据需要进入缓冲区时,要通过对当前一行实现向上移位操作释放一部分存储空间来存储新的数据,存储优化的结果示意图如图3 所示。在FPGA端设计行缓冲区存放数据能够避免FPGA访问远端的DDR 存储器,其作用类似于Cache,能够提高处理器与存储之间的访问速度,进而提高系统性能。
图3 存储优化结果示意图
在HLS开发工具中,多维数组通常用来存放卷积核参数和特征图数据。在HLS 综合时,数组被实现为BRAM端口,由于所实现的BRAM端口大小的约束,读写操作在1 个时钟周期内至多完成2 次[5]。当优化操作需要展开循环时,在一个时钟周期内要对内存进行多次读/写。本文通过对数组降维的方法解决内存瓶颈,即将多维数组采用Block、Cyclic 以及Complete 等方式分割为低维数组。Block是将原来数组中的数据按照其顺序放置在若干个BRAM 中,即对于原来的数据依照其顺序进行了切割,形成多个BRAM模块,能够增加内存访问带宽,提高访问速度。Cyclic是将原数组中的数据以交叉存储的方式放置在若干个BRAM 中,即将原来数组中的数据按照奇偶的顺序分开。Complete 是将原有数组中的数据放置在寄存器中而不是BRAM 中,Complete 分割方式适用于较小的数组。以上三种数组分割示意图如图4所示。
3.2.2 定点量化
在人脸识别加速器设计过程中,冗余位的存在将会造成一定程度的硬件资源浪费[6]。因此,为了合理且有效地利用硬件资源,所设计的硬件电路不能局限于特定位数的精度,即需要满足任意精度要求。以下对定点的数据类型以及任意精度整数类型进行描述。
图4 多维数组分割示意图
(1)任意精度整数类型
在一定整数值的宽度范围内,HLS工具能够支持任意精度的整数数据类型。如表1 所示,C 和C++相关的库能够实现对任意精度整数类型的支持,其优点是具备更高的时钟频率、更好的数据吞吐率,并且消耗的资源较少,因此使用任意精度数据类型能用更少的资源获得相同的精度,并且可以实现更高的工作频率,C 和C++的字长均为1位到1 024位。
表1 任意精度整数数据类型
(2)任意精度定点类型
定点数的一般格式如图5所示,确定位数的整数部分位于二进制小数点的左边,小数部分位于右边,符号位为最高有效位(MSB)。W 表示字长总位数,I 表示整数部分的位数,B 表示小数部分的位数,则W=I+B。
图5 定点格式示例
在文献[2]的加速器设计中,芯片的工作频率低于100 MHz,且FPGA 资源的使用率在80%以上,对此,在无损精度的情况下,本文使用Vivado HLS 工具进行定点量化精度的探索。本文对网络中权值和特征图参数大小进行统计,为了防止数据溢出,将整数部分的位数设定为11 位。在权衡位宽及精度大小之后,将数据类型确定为ap_fixed<16,11>。图6 所示为未经过任何并行优化的定点加速器的资源利用率以及时间性能的结果报告,经过优化,该加速器的总周期数降低至385 122,工作频率提高到200 MHz。定点量化的优化结果如图7所示,采用定点量化的方式能够在一定程度上对CNN加速器进行优化,降低系统运行时间并且减少资源利用率,使得CNN加速器的性能更优。
图6 未优化时CNN浮点加速器综合报告
图7 定点量化后CNN浮点加速器综合报告
3.2.3 运算优化
(1)卷积层优化
卷积层的算法结构由多层嵌套循环组成,未经过优化之前的CNN 加速器计算时延为1 591 122 个时钟周期,其中卷积层C1 计算时延周期为509 388,卷积层C2计算时延周期为748 022,大约占用神经网络计算总时延的79%。因此,主要通过优化卷积层来减少加速器的时间延迟。
卷积层C1层的权值参数存放在卷积层计算的多维数组中,在HLS 工具中被综合为FPGA 中的ROM。输入图像的像素值缓存在input 数组中,该数组被实现为双端口RAM,深度为160。本文首先对于卷积层内部的并行性进行探索并分析,使用“#pragma HLS UNROLL”指令进行优化,优化之后的电路能够同时完成25 个乘加运算。使用流水线技术对特征图内部的像素计算进行优化,进行运算优化以及定点量化之后,卷积层C1的工作时间由138 796 个时钟周期降低至816 个时钟周期。同理,基于输入特征图的并行性,对于卷积层C2实现进行流水线以及循环展开操作,进行优化之后,卷积层C2的工作时间降低为1 644个时钟周期。
图8 S1层生成电路
(2)池化层优化
池化层S1在未被优化之前需要8 652个时钟周期,相比于卷积以及全连接层,池化层大约占整个神经网络计算时间的3%。本文对于输出特征图之间的并行性进行探索,图8 所示为生成的S1 层电路,使用流水线技术对特征图内部的像素计算进行优化,S1 层的执行时间降低为199个时钟周期。同理,S2层的执行时间降低为29个时钟周期。
(3)全连接层优化
本设计采用300 个神经元与8 个神经元进行全连接,对于最外层循环,使用“#pragma HLS PIPELINE”指令进行流水线优化,内部循环由系统自动展开,循环展开后能够并行执行8次乘加操作,重叠执行不同循环的循环体能够使用更少的硬件资源来提高整个系统的吞吐量,进一步降低系统计算时延。经过运算优化后的结果如表2所示。
3.2.4 加速器算法接口设计
本设计所实现的CNN加速IP核如图9所示。
在ZC706 平台中,CNN 加速器与主存储器之间通过AXI4-Stream接口连接,使得图像数据通过流数据的方式完成传输。AXI4-Stream接口与FIFO基本一致,在进行数据传输时不会牵扯到地址问题,因而主从设备之间能够进行数据的不间断传输。主设备之间通过握手的方式保持通信,当主设备端将发送的数据准备就绪后,主设备向从设备发出VALID 信号且一直保持该信号有效,当从设备做好接收准备时,向主设备发出READY信号,当VALID 以及READY 两个信号同时存在时,数据开始进行传输,当这两个信号一直有效时,主从设备之间将会进行数据的不间断传输,当主从设备任何一端撤销信号时,数据传输中断。在Vivado HLS中,通过定义C/C++结构体来实现AXI-Stream流接口,通过结构体中的不同变量对流结构中的信号完成模拟[7]。外部IP与CNN IP 之间的数据传输过程通过操作不同的信号进行控制。本设计系统验证的结果如图10 所示,由验证结果可知,数据的传输结果正确。
表2 CNN各层进行运算优化结果
图9 CNN加速IP核
图10 系统验证结果
图11 硬件连接示意图
3.2.5 高层次综合
在HLS中,将输入的C/C++代码验证功能完整性之后,HLS 工具会将其转化为RTL 代码。使用HLS 优化指令对设计进行并行优化,进而得到设计回路的RTL描述以及等价的RTL模型[8]。待整个综合结束之后,会输出相关设计文件,同时也会产生脚本、各种日志以及测试集等,在综合过程完成之后,通过HLS工具将RTL进行打包实现为IP 核的形式,以便后续在Vivado 设计工具中进行调用。
图像数据采用AXI4-Stream 方式读入,通过AXI4接口协议互联的方式将数据传输到IP核并用CPU接收网络的输出值,对于Vivado内部封装的IP核实现互联,能够使得与直接存储器访问(Direct Memory Access,DMA)的通信更加简单快速。在HLS 中完成CNN IP核封装之后将生成的IP核导入Vivado工具中完成数据通路设计[4]。本设计主要由ZYNQ 处理系统、2 个AXI互联、AXI DMA、CNN IP 核以及处理器系统复位构成,其硬件连接示意图如图11所示。
图像数据存储于PS 端的外设DDR 中,PS 端与PL端通过芯片内部的AXI_HP高性能接口进行通信,经过AXI 互联模块将数据从DDR 存储器传输到DMA 核的M_AXIS_MM2S接口,再通过M_AXI_S2MM接口连接到CNN加速IP核的streamIn接口,CNN IP核计算完成之后通过streamOut 接口将数据传输到DMA 核的S_AXI_S2MM 接口,之后再通过互联传回到Zynq 处理系统,完成数据的传输。AXI4-Stream 包含两部分:S2MM(写通道)和MM2S(读通道)。CNN IP核是挂载在AXI 总线上的逻辑设备,因此需要为其分配地址空间,这样ARM 端便可通过地址寻找到PL 端的逻辑设备,在编写ARM程序时可以对该地址进行读写,实现对IP核的控制。本设计CNN IP核以及DMA核地址分配结果如图12所示。
图12 IP核地址分配结果
根据Address Editor的地址分配结果,CNN IP核以及DMA 核均分配了64 KB 长度的地址,未造成地址冲突,因此在PS端可以对其地址进行读写操作,实现对该IP核的正确控制。
在本文设计中,将自制的40 张人脸图像加入到ORL人脸识别数据库中,形成了具有440张人脸图像的数据集,其部分人脸图像如图13所示。
图13 人脸识别数据集部分人脸图像
表3 FPGA加速器性能对比
将每个样本的人脸图像按照4∶1 的比例对数据集进行划分,即在Matlab R2019a 上将352 张人脸图像用于训练,88张人脸图像用于测试。Matlab训练结果和收敛曲线如图14所示。
图14 Matlab训练结果及收敛曲线
由Matlab 训练结果可得,当迭代次数达到7 000 次时,识别率约为98.33%并且趋于稳定。根据收敛曲线可得,当训练迭代次数大约为2 000次时,均方误差开始无限向0 逼近,说明该训练过程效果较好,网络权值趋于稳定。
加速器IP 核使用Vivado HLS 工具实现,在Xilinx ZC706 开发板上进行板级验证,其验证结果如图15 所示。表3为本文FPGA加速器与其他文献的性能对比。
图15 板级验证结果示意图
根据实验结果,本文设计的CNN 加速器识别一幅图像仅需要0.021 ms,系统的工作频率是200 MHz,且功耗仅为2.62 W。由于加速的CNN 网络使用的FPGA平台以及并行策略不同,因而不能够直接进行性能对比。文献[4-7]与本文的设计比较类似,均探索了在FPGA开发平台上实现小型LeNet网络的加速方案。通过比较,文献[4]的能效比相对较高,但是本文在系统工作频率以及加速器峰值性能方面优于文献[4];文献[5]的并行度虽然较高,但是只加速了网络的前5 层,网络参数较少且神经网络规模较小,需要使用Matlab对FPGA端输出的数据进行全连接和分类,本文设计的峰值性能为22.04 GMACS,文献[5]的峰值性能为16.58 GMACS。文献[8-9]只对AlexNet网络的卷积层完成了加速,其设计的加速器峰值性能分别为61.62 GOPS和19.20 GMACS,耗时较长且FPGA资源占用率太高。
表4为本文实现的采用Xilinx嵌入式设备实现的人脸识别结果与同等网络规模下CPU和GPU实现的结果对比。本设计通过在Matlab 平台上对识别一幅图像所需时间进行统计的方法来衡量CPU性能。由表4可知,在CUDA 上实现CNN 所需时间为0.646 ms,在Caffe 以及CPU上实现CNN所需时间分别为0.240 ms、2.650 ms。FPGA 加速器相比CPU 实现CNN 速度提升了126 倍,相比GPU 加速比在10 倍以上,且GPU 平台的功耗为33 W,而本设计实现的基于FPGA 的加速器功耗仅为2.629 W。
表4 人脸识别加速器结果对比
由表4 的对比结果可知,本设计在Xilinx 嵌入式设备上所实现的人脸识别加速器识别速度更高且功耗较低,并且识别率误差不超过1%,相对于其他平台的设计结果呈现出较为明显的优势,能够满足实际应用需求。
随着计算机视觉以及嵌入式技术的不断发展,对于机器学习算法的可实现性要求越来越高[11-13],嵌入式产品本身就十分关注系统的功耗问题,功耗的高低直接决定了系统性能的好坏。本文在Xilinx 公司的嵌入式设备上完成了人脸识别加速器设计,相对于其他文献设计成果,在功耗以及系统识别时间方面占据优势,且识别误差率不足1%,对于该技术的产品化提供了理论以及技术支撑[14-15]。本文所实现的基于FPGA的人脸识别加速器系统能够应用于如机场、车站等许多人脸识别的场合,具备一定的硬件可实现性[16-17]。
本文提出了一种基于FPGA 的卷积神经网络加速器的设计方法。首先针对与加速器设计有关的HLS 工具及其提供的优化指令进行介绍,结合ZC706异构开发平台的特性,主处理器由PS部分实现,网络加速模块由PL部分实现。在HLS工具中运用存储优化、定点量化、运算优化、接口设计等优化技术对LeNet-5 网络进行优化,通过C 仿真、高层次综合实现了7 层CNN 加速器设计,与该领域其他卷积神经网络的CPU、GPU 和FPGA实现的结果进行对比,本设计实现的人脸识别神经网络加速器的加速比在10倍以上,且所需功耗仅为2.629 W,识别一幅人脸图像仅需0.021 ms,实现了较高的系统性能。