尹震宇,徐光远1,,张飞青1,,徐福龙1,,李兴滢1,
1(中国科学院大学,北京 100049) 2(中国科学院 沈阳计算技术研究所,沈阳 110168)
随着“中国制造2025”的提出,实现智能化生产已成为制造业发展的重要目标.卷积神经网络(Convolution Neural Network,CNN)作为一种应用较广的人工神经网络,能够高精度的实现目标检测[1]、目标识别[2]等任务,已经被广泛应用于智能生产线的产品检测、邮件分拣自动化[3]及物流数字化管理等方面.但是,CNN是以高计算量为代价实现了高精度.为了加快计算速度,开发人员已经为CNN部署采用了专门的硬件加速器,例如SoC[4,5],ASIC[6],GPU和FPGA[7].使用GPU对神经网络进行加速虽然是最常用的加速手段,但是基于GPU的加速平台往往都有着较大的体积和较大的功耗,因此体积更小、功耗更低的硬件平台就成为了神经网络加速的一个热门研究方向[8].
其中,现场可编程门阵列(FPGA)以其灵活性、并行性、集成性、上市时间短和能源效率高等特点成为有效的解决方案.传统的FPGA开发多使用VHDL及Verilog等硬件语言,开发难度大且开发周期长,并且需要开发者具有一定的硬件专业知识背景,这对于软件工程师来说具有一定的困难.然而高层次综合(High-Level Synthesis,HLS)的使用降低了对FPGA进行编程的困难,使得软件工程师也可以较快的进行FPGA开发.因此,基于FPGA的人工神经网络单元设计被广泛研究和应用.
Yunxuan Yu[9]等人设计了一种将卷积和反卷积运算相统一的硬件加速方法,但是其采用硬件语言进行设计,实现难度较大;黄佳凯[10]基于ARM平台和TensorFlow框架实现了嵌入式平台上的手写数字识别,但是运行效率比较低且框架移植有较多限制条件.余子健[11]在vertex-5系列平台上搭建神经网络模型完成了手写数字识别任务,但是他所构建的实验平台并不是嵌入式平台,需要PC机配合FPGA使用.
本文在前人研究基础上,提出了基于Zynq平台的卷积神经网络单元,实现了对手写数字的识别.该设计充分利用了Zynq平台的异构特点,并使用高层综合语言HLS实现并优化卷积层和池化层的IP核设计.实验结果表明,在保证手写数字识别正确率的同时,该设计相比于基于ARM的嵌入式平台神经网络模型运算速度有显著提升.
人工神经网络是机器学习的一个分支,是模拟生物神经网络的数学模型的统称,卷积神经网络作为人工神经网络的一种常见结构,其主要优势在特征提取方面.
卷积神经网络主要结构如图1所示,包括卷积层、池化层和全连接层.其中,卷积层接受上一层的特征图,通过多个卷积核卷积来提取特征,并输出该层的特征图.卷积核每个元素对应一个权重系数和偏移量,卷积的层数越多,输出的特征图代表的特征就越复杂.卷积层的计算方式为:
池化层也被叫做下采样层,用来减小卷积层输出特征图的大小,减少图的维数来防止过拟合.常见的池化层有最大池化和平均池化.全连接层则是将二维图像连接成一个一维向量,用于结果的输出[12].
图1 手写识别任务神经网络结构Fig.1 Neural network structure of handwriting recognition task
FPGA不依赖于指令级架构,而是基于查找表实现的,主要包含查找表、触发器、可编程IO、可编程布线资源、嵌入式存储器以及IP硬核.FPGA具有独特的并行流水线运算方式,使FPGA有着极大的运算带宽以及数据传输速率[13].由于FPGA的可重配置性,使得用户能够自定义算法架构以及接口,将深度学习算法部署在FPGA上,且可以重复修改而不需要更换FPGA芯片,适合于不断迭代更新的深度学习算法的部署和开发.
Zynq平台是Xilinx公司开发的可编程的SoC,不同于传统的FPGA产品,Zynq平台上除了包括了FPGA芯片,还包括了ARM处理器,并且在这两部分之间提供了AXI总线等多种接口.Zynq兼具了基于ARM的嵌入式平台和FPGA的优点,既能够方便的在ARM上部署操作系统及运行软件程序,也可利用FPGA的并行性特点对软件中并行加速的部分进行加速,提高整个平台的运行效率,同时保留嵌入式平台体积小、能耗低、方便部署和迁移的特点.而在神经网络中往往也存在着较多的线性结构,在ARM上运行效率会更高,这正契合了Zynq平台的优势,因此Zynq平台是非常适合搭建嵌入式神经网络单元的硬件平台.
本文选用人工神经网络单元硬件平台为Xilinx的Zynq-7000系列的7020芯片,芯片内同时包含PS部分即ARM核和PS部分即FPGA,部分片上规格如表1所示.
表1 Zynq 7020部分片上规格Table 1 Part of specification on Zynq 7020 sheets
本文选取经典的Lenet-5模型来实现对手写数字的识别[14],包含两个卷积层、两个池化层、两个全连接层[15],虽然与现在更加复杂的神经网络相比,Lenet-5在结构上要简单很多,但是已经包含了神经网络最主要的结构.而如果后期想扩展为更加复杂的神经网络模型,只需对代码做简单修改,可以继续调用已经设计完成的卷积层和池化层IP核.
卷积神经网络单元总体设计如图2所示,由PS部分ARM核完成数据的前期处理及结果输出功能,将神经网络中卷积、池化等运算过程部署在PL(FPGA)上实现,充分利用FPGA进行并行计算的优势,同时减少对于FPGA计算资源的浪费.
图2 手写数字识别流程Fig.2 Handwritten number recognition process
卷积层在神经网络中占用了大量的计算资源,相较于其它层占据了最多的计算时间,因此对卷积层的优化就成为了提高卷积神经网络运行速度的关键.由于FPGA上的计算资源也是有限的,在提升运行速度的同时也应考虑资源使用量,可以通过复用一些加速电路来提高资源的利用率.比如卷积层和池化层的加速电路就能够进行复用,因此对卷积层和池化层设计两个通用的加速电路,对神经网络进行加速.
由于卷积运算过程主要是对应元素的乘加运算,因此计算过程可采用并行处理,从而充分利用FPGA的优势.但是嵌入式平台上FPGA的计算资源是有限的,在设计时也要考虑资源利用情况.
本文使用Xilinx的HLS工具来完成卷积层和池化层的IP核的设计.HLS能够将使用C、C++和System C完成的设计转化成寄存器传输级实现,生成IP核,相比于使用硬件语言,代码量明显减少,编程人员的工作效率得到提升,同时也不需要太多的硬件知识背景,相比于传统的硬件语言更容易上手[16].并且在HLS中进行IP核设计时便于进行优化,加速运算过程.但是需要注意,并不是所有的C、C++语法都被允许在HLS中使用,一些涉及到动态分配内存的指令是不能在HLS中使用的,在使用HLS进行IP核设计时仍然要具有一定的硬件知识以及硬件编程思想,否则可能使得设计的IP核运行效率很低,甚至难以运行.
在HLS中实现卷积层设计的主要过程如下.首先,使用C语言实现卷积函数Conv的编写,在编写过程中要严格避免使用动态分配内存地址的相关代码,否则HLS将无法对代码进行转化.同时,为了对卷积层进行优化,应避免代码中存在过多的线性结构,为验证函数的正确性,需要在Test Bench中编写main函数并调用其Conv函数,进行模拟计算,验证计算结果正确性.然后,定义函数接口,并选取合适的总线.将相关各接口配置为AXI Master,可以在保证高效数据传输的同时,很方便的获取数据、写回结果,之后,运行RTL Cosimulation进行仿真验证,如图3所示,最后生成IP核.池化层实现过程与之类似,池化函数定义为Pool,同样进行接口定义及仿真验证.
图3 卷积层仿真波形图Fig.3 Convolution layer simulation waveform
为了提高卷积层和池化层的运行效率并且发挥FPGA的特点,增加计算的并行程度,在确保资源足够的情况下,将卷积运算中的for循环进行一定程度的展开.展开前一个周期内只能进行一次计算,而展开后同一周期内可进行多次计算,例如5次的for循环,在传统CPU平台上需要5个周期完成的计算,而在FPGA平台上,因为每次for循环的计算不具有相关性,不存在读写冲突,可将5次for循环展开,在FPGA上通过硬件加速电路在一个周期内同时完成5次运算,理论上即可提升5倍的速度.在HLS中可通过在for循环中添加命令:
#pragma HLS UNROLL
来实现循环展开.也可在右侧Directive标签页中添加循环展开的信息,实现效果与直接添加命令相同.
不同于在PC等平台上部署神经网络模型,在Zynq平台部署神经网络模型时还需要对平台硬件进行硬件设计,通过添加IP模块来组成硬件平台设计,其中一些基础功能例如DDR管理使用官方模块,而神经网络模型中的卷积层和池化层的加速电路则使用自定义的IP核来实现,卷积层和池化层的IP核要分别生成,构建结果如图4所示.
FPGA硬件平台构建主要过程如下:首先在HLS中Solution Setting选定SoC型号,选择Export RTL,生成IP核.然后在Vivado中添加卷积层和池化层IP核到IP Catalog,点击Create Block Design添加硬件设计,加入ZYNQ7并双击进行配置,点击PS-PL Configuration勾选S AXI HP0 interface和S AXI HP1 interface.最后加入卷积层和池化层IP核,分别连接到对应接口上,对硬件平台设计进行综合,并分析资源利用情况.
本文实验在Vivado 2018开发环境中进行,首先在HLS中编写卷积层代码,编写代码过程中避免使用动态分配内存代码,尽量简化循环中的结构,以方便对循环进行展开优化.经过对代码的综合及仿真,可验证卷积层计算过程正确.池化层实现方法与卷积层相似,不再赘述.
图4 硬件平台结构Fig.4 Hardware platform structure
然后,对卷积层代码进行优化,将卷积层最内层循环进行展开,如表2所示,优化后的卷积层在资源占用率增加不足1倍的情况下,时钟周期减少了超过70%,即速度提高了3.5倍多,故该优化设计对卷积运算的速度提升是十分明显的.最后,将卷积层和池化层分别生成IP核,等待构建神经网络硬件平台时进行调用.
表2 未优化和优化后卷积层资源占用及时钟周期对比Table 2 Comparison of resource utilization and clock cycle between unoptimized convolution layer and optimized convolution layer
该实验基于米联客的702A开发版进行,开发板上Zynq型号为XC7Z020CLG400-2I,并且该开发板带有SD卡接口,同时底板上配有串口接口.开发板上HDMI接口是连接在FPGA部分的,如果想使用HDMI接口输出图像必须要在FPGA上配置相应IP核,考虑到本实验输出结果较为简单,特别是不需要输出视频图像,因此从减少开发难度和降低资源使用率角度出发,使用串口与PC连接,将神经网络模型运行结果通过串口输出到PC端显示.
表3 硬件资源占用情况Table 3 Hardware resource occupancy
按照第3节所述过程,构建硬件平台,并分析资源占用情况,构建的硬件平台资源占用情况如表3所示.
表4 不同平台手写数字识别速度对比Table 4 Speed comparison of handwritten digit recognition on different platforms
最后,在Zynq平台上进行手写数字识别实验验证.实验过程中先将手写数字图片和神经网络参数存入SD卡,连接好开发板和PC,并且在PC端运行接收端程序.然后开发板上电,运行神经网络模型.经过对表4实验数据分析,相对于只在ARM核上运行的神经网络,基于FPGA的神经网络,在精度损失极小(0.1%)的情况下,运行时间减少67.0%,实现了运行速度的大幅度提升.
本文设计了一种基于Zynq平台的卷积神经网络单元,并完整的介绍了各部分的设计与实现过程,重点介绍了卷积层与池化层的设计与实现及优化的过程.经过测试实现快速准确地识别手写数字,相较于只在ARM核上实现的神经网络,运行时间减少了67.0%.与现有的神经神经网络实现方式相比,本单元采用嵌入式平台设计,具有体积小、能耗低、易于部署的特点,方便在工业生产现场安装配置,能够在智能制造生产线上发挥重要作用,具有实际应用意义.