0 引 言
近年来, 卷积神经网络(Convolutional Neural Network, CNN)因其出色的特征提取能力被广泛应用于目标检测、 目标识别、 视频分类、 语音识别和自然语言处理等数据特征量较大的任务之中
[1‐4]。但是,随着CNN性能的提升, 网络的参数规模也变得越来越大, 这使得模型的推理对硬件的要求越来越苛刻。然而随着现在物联网的发展, 传感器数据量增大, 普通嵌入式设备的计算能力和内存带宽无法满足实时推理的需求。因此, 研究如何加速卷积神经网络的推理, 使其可以部署在功耗更低和体积更小的硬件平台, 并实现资源和速度之间的平衡就具有重要意义。
根据硬件平台的不同, 硬件层面的加速主要分为中央处理器(Central Processing Unit, CPU)、 图形处理器(Graphics Processing Unit, GPU)、 专用集成电路(Application-Specific Integrated Circuit, ASIC)和现场可编程门阵列(Field Programmable Gate Array, FPGA)
[5]。CPU作为通用数据处理器可以进行各种复杂的运算, 但CNN计算的本质是大量重复的乘积累加操作, 这使得并行度有限的CPU难以满足移动应用的实时性要求
[6]。GPU虽然拥有强大的计算能力, 但其较高的功耗和较大的体积不适合在嵌入式平台和边缘计算场景中应用
[7]。ASIC硬件加速器可以通过定制化内存层次结构和分配专用运算资源的方式在较低的功耗下实现优异的计算性能, 拥有极高的能效比。但其开发成本高, 设计周期长且灵活性一般, 需要有针对性地调整输入数据流才能充分发挥其高效的运算能力
[8]。作为一种折中的方案, 基于FPGA的加速器具有高度可定制化和功耗低的优点, 可以在相对有限的内存、 I/O带宽和逻辑资源下, 以合理的成本提供较高的加速性能。
在资源密度较低的FPGA平台上设计加速器, 核心在于提高性能密度和平衡并行度与总线带宽
[9]。包振山等
[10]提出了一种全流水的加速思路, 将整个网络放置到FPGA上进行层间流水处理, 网络各层之间同时运算, 理论上可以充分发挥出板卡的全部性能。为了降低访外总线的带宽需求和片上存储器的需求, Shang等
[11]提出了一种分层调度方案来提高卷积块的性能和灵活性, 保证了所有单元的并行运行。Kang等
[12]设计了一种基于流的线缓冲区结构, 以输入和输出流的流水线方式操作。每个卷积层块都有一个线缓冲区, 只存储几行输入数据。线缓冲器的大小与输入图像的宽度成正比, 因此, 该结构比传统的基于帧的结构所需的中间数据存储量更少。Sang等
[13]利用高层次综合(High-level Synthesis, HLS)技术设计了一种基于DSC的高性能CNN加速器, 并将其用于低密度FPGA上的图像分类。同时, 基于块卷积的自适应数据流调度模式, 最小化了中间结果的芯片外数据传输, 并提高了数据读取的效率。但是, CNN的层间数据依赖会随着深度的提升逐渐增强, 采用全流水结构就使得部署层数较深的网络时, 前期的模型评估和超参数调优变得非常复杂, 各层的资源分配难以平衡。Shang和Kang的团队所使用的VC709和XCKU5P与其所部署的Mobilenet网络结构相比本身就是资源过剩的。Sang采用的高级综合技术对FPGA内部资源的利用很难达到寄存器传输级(Register Transfer Level, RTL)的灵活性, 适合做一些快速验证的工作。
针对以上问题, 本文提出了一种采用“错峰”访存优化策略的低功耗卷积神经网络软硬件协同加速结构。主要的工作如下: 1) 通过分析网络的特点, 提出一种基于“错峰”计算和总线动态分配的访存优化方案。对于网络浅层和深层, 采用不同的计算策略来尽可能减少“高峰”时的访存事务。同时, 设计灵活的直接存储器访问(Direct Memory Access, DMA)模块实现feature_ram和weight_ram访存总线的动态分配, 以提高“高峰”时的总线带宽。2) 重封装双乘法器实现双int9乘法, 且采用固定乘法阵更改数据流的方式复用乘法阵列来最大化数字信号处理(Digital Signal Processing, DSP)器件的利用率。3) 采用软硬件协同的形式, 在ARM端部署ARMNN推理框架来处理输入层计算, 使得ARM与FPGA在时间线上也形成一种流水结构。同时, 开发桌面端C++应用程序, 自动根据不同的输入尺寸生成加速器顶端中枢模块所需的参数。
1 加速器设计
1.1 加速器整体访存结构和数据流设计
访存一直是制约FPGA中加速器设计的一个瓶颈。FPGA的片上高速存储资源有限, 很难完全缓存模型推理过程中产生的中间结果或网络完整的权重信息。硬件的瓶颈是客观存在的, 访存策略的设计思想是尽可能减少访存事务的次数, 并且尽可能释放总线带宽, 以提高加速器可设计的并行度的上限。
1.1.1 数据搬运模块DMA
Zynq MPSOC中PS的Slave端有4条AXI_HP总线, 采用突发读写的形式, 数据位宽设置最大为128 bit。DMA由AXI协议层的实现模块、 ram和控制逻辑组成, 内部结构如
图 1 所示。核心的控制逻辑连接协议层和ram块, 以DMA_feature1为例, 控制逻辑收到读取命令(命令格式: 读取的地址(ADDRR_DDR), 突发次数, 突发长度, 写入地址(ADDRW_ram)和是否使能ram写端口的非DMA操作)时, 每从总线接收到数个数据就拼接成一个256位的数据, 然后从ADDRW_ram顺序写入feature_ram11中。当控制逻辑接收到写命令(命令格式: 读取的地址(ADDRR_DDR), 突发次数, 突发长度, 写入地址(ADDRW_ram)和是否使能ram读端口的非 DMA 操作)时, 控制逻辑从feature_ram22的ADDRR_ram开始顺序读取数据, 并将数据拆分成数个128 bit数据, 然后通过AXI写通道从ADDRW_DDR顺序写入。ram的读写端口非DMA操作使能可以独立决定DMA中的ram块是被AXI 总线占用还是可以被外部模块当作普通ram来访问, 其他的DMA_weight和DMA_res功能与上类似。
feature和weight的输入缓存采用真双端口设计, DMA的控制模块可以动态决定feature_ram和weight_ram占用的AXI总线个数, 最多支持两条总线同时对ram的两个不同地址进行写操作(采用乒乓缓存的操作, 意味着输入缓存的ram不会被同时进行读和写的操作)。feature输出缓存的读端口采用双端512 bit, 且整个系统只有中间feature需要占用AXI的写通道, DMA模块可以动态设置feature的输出缓存占用的总线数(理论上4条总线的写通道都可以由控制输出缓存的DMA控制)。
网络推理过程中, feature和weight访存的“高峰”会出现在不同的阶段, 本文设计的DMA结构可动态分配总线资源, 尽可能释放访存“高峰”期间的总线带宽, 且寻址方式自由, 内部ram可以被外部模块当作普通ram直接访问, 可以大量节省BRAM资源。
1.1.2 “错峰”的访存数据流优化
本文采用一种“错峰”的访存数据流优化方法来尽可能减少“高峰”时的访存事务。Zynq MPSOC中每条AXI_HP总线的最大传输带宽为128/8×300×10
6(时钟)=4 800 MB/s, 正好对应PS端每块DDR4的最大数据速率(美光MT40A512M16LY-062E×4)。本文通过搭建测试平台对三条总线进行读写测试(突发长度为256且突发间的地址并不连续)。由
图 2 可以看出, 两次突发之间会有30个左右的时钟间隔(从发送读写地址到收到回应), 且一次突发内的“毛刺”现象会随着总线使用数量的上升而上升。多次实验表明总线的实际性能只能达到理论值的一半左右, 这也是后续DPU并行度设计的依据。
本文通过分析网络推理的特点发现网络在浅层(PointWise, PW)计算期间的访存压力主要来自于feature(深层(DepthWise, DW)由于其自身计算的特点, feature和weight只需要各读取一遍便可输出所有结果), 而在网络层数加深和采样倍数增加的情况下, 访存的压力会由feature转为weight(浅层时weight较小, 可以整个存在片上ram中供DPU来回读写。深层时feature较小, 可以整个存在片上ram中供DPU来回读写)。根据这一特点, 本文加速结构在浅层PW时采用固定feature循环weight的形式进行计算, 在深层时采用固定weight循环feature的方式进行推理, 以这种“错峰”的方式减少“高峰”时的访存事务, 优化访存数据流, 保证输入尺寸在512以下时, “高峰”时每层计算只从片外存储器中读取一遍数据。
1.2 核心计算单元DPU的设计
本文采用的是一种并行度为128的DSP固定乘法阵列, 通过改变输入数据流和输出数据流的方式来实现多种卷积操作。本文通过重新封装双乘法器
[14]使单个DSP48e2可以实现双int9乘法, 以同时支持对称和非对称量化, 其原理如
图 3 所示。
计算开始时, feature_buffer1和weight_buffer1从feature_ram和weight_ram中读取若干数据(DW卷积时feature_buffer为滑动窗结构), 同时feature_buffer2和weight_buffer2读取下轮计算所需数据; 然后, feature_ buffer与weight_buffer中的数据同时送入乘法阵列; 接着, 乘积的结果与偏置数据进入后处理模块(DW与PW的加法阵); 最后, 后处理模块得到的结果经过量化和四舍五入后送入save_buffer, 由DMA模块按照DW和PW两种模式将结果写入外部缓存。上述数据流采用流水线设计同时进行, 所提到的所有模块也采用块内流水形成全流水形式, 使DPU的计算效率实现最大化。
1.3 软硬件协同设计
本文采用软硬件协同设计的形式, 在ARM端部署ARMNN-C++推理框架处理输入层计算, 使ARM与FPGA在时间线上也形成一种流水结构。同时, 开发桌面端C++应用程序, 自动根据不同的输入尺寸生成加速器顶端中枢模块所需的参数。软件部分更多承担的是辅助性的计算任务、 任务调度、 推理验证和数据预处理等。
2 实验设计
在Windows环境下进行加速器的整体开发, 在Tensorflow框架下进行网络的搭建、 训练和量化。加速器的所有结构在Vivado 2018.3中使用VerilogHDL进行设计。硬件平台为Xilinx的ZYNQ系列MPSoC(部署平台为XCZU3EG FPGA+ARM Cortex-A53, ILA需消耗大量BRAM, 故调试平台采用XCZU15EG FPGA+ARM Cortex-A53)。
2.1 横向对比实验
通过对比加速器与嵌入式ARM CPU、 AMD移动端CPU和NVIDIA移动端GPU的推理速度和能效比来验证本文设计的实用价值。其中, 嵌入式ARM CPU直接使用的是XCZU3EG的PS部分; 桌面级CPU使用的是AMD的 Ryzen 7 6800H with Radeon Graphics, 使用pycharm在Keras- GPU环境下(os.environ[“CUDA_VISIBLE _DEVICES”]=“-1”)计算5 211幅图输入的运算结果; 移动端GPU使用的是NVIDIA GeForce RTX 3060 Laptop GPU, 使用pycharm在Keras-GPU环境下计算5 211幅图输入的运算结果。
2.2 纵向对比实验
通过与国内同样基于FPGA的卷积神经网络加速器的设计方案进行对比来验证本文所设计加速器的优势。由于不同硬件平台间的资源和功耗存在较大差异, 因此通过增加性能密度(GOPs/LUT 和 GOPs/DSP)两个指标来充分验证加速器的性能。
3 性能评估
3.1 横向对比
ARM端的测试环境为Linux+ARMNN-C++, 程序运行时ARM核将一个batch的图片文件和模型的权重文件从SD卡中读入DDR。在ARMNN框架下加速推理100幅输入图片, 测得ARM端的平均运行时间为48 ms, 功耗为2.6 W。
CPU和GPU使用在Keras下修改MoblienetV2输入层为256×256后重训练得到的模型, 是未经量化的版本(float32而非uint8)。由于Tensorflow下量化之后的模型转为tflite, tflite与桌面端GPU兼容性差, 因此其运行结果较差, 其次即使在8 bit量化推理下, 其中间过程的运算依旧是采用float32型, 量化只是减小了原始权重和输入图像在内存或显存中的占用空间, 量化操作对桌面端CPU和GPU的推理效果不理想, 故CPU和GPU使用的模型为Keras下的模型格式(除数据存储格式外, 网络的结构与ARM和FPGA所使用的模型一致)。其次, 本实验关注的重点是加速模型推理, 重训练后的MoblienetV2-float参数不一定为最优解, 正确率不影响本次实验对推理速度的验证, 故不再给出模型训练阶段的详细参数。
CPU平均单帧时间为7.75 ms, GPU在同样输入下得到的单帧时间为1.08 ms。如
图 5 所示, 在CPU执行推理计算任务期间, 设备功耗维持在45 W, GPU的功耗也稳定在95 W左右。
本文加速器的运行环境与ARM端测试时相同, 区别在于增加了FPGA部分的设计。如
表 1 所示, 本文加速器的推理速度为嵌入式ARM CPU的7.50倍, 为高性能CPU速度的1.21倍且功耗仅为其1/10。相比桌面级GPU, 本文加速器在吞吐量上略微落后, 但能效比却达到了桌面级GPU的3.5倍。上述结果证明本文的硬件加速器具有高性能密度和高能效比的优点, 同时4.5 W的低功耗(其中2.7 W来自于ARM核)和125 GOPs的吞吐量, 使其完全满足边缘计算场景的要求。
3.2 纵向对比
由于不同硬件平台间的资源和功耗存在较大差异, 本文将主要从吞吐量(GOPs)、 能效比(GOPs/W)、 性能密度(GOPs/LUT、 GOPs/DSP)和片上RAM资源四个指标来综合验证加速器的性能。
由
表 2 可以看出, 本文所设计加速器在能效比和性能密度方面均有优势。由于本文采用了复用乘法阵列和重封装双乘法器的设计策略, 其GOPs/DSP在对照组中最高。文献[
10]的GOPs/LUT略高于本文, 但其采用的是4bit量化策略且输入尺寸小于本文加速器。文献[
17]的能效比较高是由于ZYNQ7000系列PS部分的动态功耗比Ultra+系列低1.2 W左右, 但其资源消耗量远高于本文所设计加速结构, 且其硬件平台的资源体量对于所部署的网络结构来说是资源过剩的。
4 结 论
本文设计了一种边缘计算场景下采用“错峰”访存优化策略的低功耗卷积神经网络软硬件协同加速结构。较低的DSP和LUT消耗量使其可以部署在大多数的FPGA中, 整个加速器的功耗只有4.57 W。但值得注意的是, 由于采用了软硬件协同的设计方法, PS部分的功耗是计算在总功耗内的。在大多数系统中, CPU或单片机是不可或缺的, 需要承担任务调度与运行嵌入式应用系统的任务, 本文加速器并未全部占用PS部分的四个大核, 所以理论上来说, 在实际应用中富余的PS部分完全可以承担更多其他任务, 这也是基于 ZYNQ 平台的加速方案相比纯FPGA平台的优势, 理论上加速器在实际应用中的功耗应小于标注功耗。本文加速器的推理速度为嵌入式ARM CPU的7.50倍, 能效比达到了桌面级GPU的3.5倍。与其他基于FPGA的同样先进的加速器设计相比, 本文所设计的加速器在能效比和性能密度方面均有优势, 具有较高的应用价值。