洪起润,王 琴
(上海交通大学 电子信息与电气工程学院,上海 200240)
近年来,随着人工智能研究的热潮兴起,卷积神经网络(Convolutional Neural Network,CNN)凭借其强大的特征提取和表征学习能力,在图像识别领域占据了主导地位,并在视频监控、目标检测、目标追踪等视频应用中也得到了广泛的应用。然而,CNN模型计算复杂度高、参数过于冗余的特点极大增加了计算规模和存储需求。研究表明,面向视频应用的CNN 模型具有数十亿级的计算量以及数百万级的参数[1-3]。
视频应用对实时性要求较高,这对CNN 模型在资源受限的计算平台上进行前向推理提出了巨大挑战。为了得到紧凑、高效的网络模型,研究人员已经在神经网络量化领域展开了大量的研究。线性量化使用量化后的数据直接进行计算,是低精度量化的主要方法。文献[4-6]通过量化感知训练(Quantization Aware Training,QAT)来对模型进行线性量化,并且都使用了直通估计器(Straight-Through Estimator,STE)来近似梯度,解决因四舍五入运算梯度为零导致反向传播的梯度为零而无法训练的问题。文献[7]提出逐元素梯度缩放(Element-Wise Gradient Scaling,EWGS)来替代STE,优化STE 近似梯度存在的问题。
目前对单帧图像的前向推理计算进行加速的神经网络加速器研究取得了很大的进展[8-10],这些工作在视频应用中只对单帧图像空间维度上的数据进行了复用,而没有对连续帧时间维度上的数据进行复用。近年来,一些研究利用帧间数据的相似性来解决现有的加速器对视频应用加速效果差的问题。文献[11]通过对输入激活进行线性量化来增加差分帧的稀疏性,从而减少计算量和访存次数。文献[12]提出使用混合精度来表示帧间数据的处理器架构,分别使用4 bit 和8 bit 来表示值比较小的密集数据和值比较大的稀疏数据。上述工作都是基于ASIC 实现利用帧间数据复用来对视频任务进行加速处理。目前基于现场可编程门阵列(FPGA)实现的研究较少。文献[13]基于FPGA 平台,使用Winograd 算法来减小卷积算子的计算复杂度,利用帧间数据的相似性,跳过差分帧中小于所设置阈值的数据块计算来加速计算。然而,该计算方式中阈值的存在限制了加速器的加速效果,阈值设置过高将导致模型精度损失较大。
目前已有不少基于FPGA 平台利用数据稀疏性来加速CNN 处理的研究工作[14-16]。Winograd 快速卷积算法可以降低卷积运算的复杂度,文献[17-19]使用Winograd 快速卷积算法来替代直接卷积算法,并且将稀疏性应用于Winograd 算法,在FPGA 平台上进行了实现。
本文对CNN 的低精度量化方法进行分析,研究视频应用中基于帧间数据复用的稀疏化数据流方案,提出一种输入通道位图压缩的方案来同时利用激活和权重的稀疏性。在此基础上基于FPGA 平台设计一个高能效的稀疏CNN 加速器,并以YOLOv3-tiny 网络为例进行实验验证。
卷积神经网络基本结构由卷积层、池化层和全连接层组成,其中卷积层是卷积神经网络的最关键模块,也是计算量最大、时间消耗最多的部分。卷积层包括卷积、批归一化(Batch Normalization,BN)和激活函数。卷积运算过程如式(1)所示:
卷积运算参数定义如表1 所示。
表1 卷积运算参数定义Table 1 Definition of convolution operation parameters
为了复用帧间数据,加速器同时对批次为B的连续帧进行运算,需要对前后两帧进行差分运算,得到差分帧,然后用差分帧进行卷积运算。因此除了第1 帧使用原始数据进行卷积运算外,该批次后续帧都使用差分帧数据进行卷积运算。传统计算方式与帧间数据复用计算方式对比如图1 所示。由于卷积运算为线性运算,因此在运算前先进行差分运算得到差分帧激活ΔXb,然后对差分帧ΔXb进行卷积运算,再将差分帧运算结果ΔYb与上一帧结果Y(b-1)进行累加恢复得到当前帧的卷积运算结果Yb,该结果与直接使用当前帧的原始数据进行卷积运算得到的结果是等价的。而激活函数如ReLU 等为非线性运算,因此需要在非线性激活函数运算前恢复得到当前帧的卷积结果。
图1 帧间数据复用计算方式Fig.1 Inter-frame data reuse computation mode
帧间数据复用卷积计算过程如式(2)所示:
使用Winograd 算法可以降低卷积算子的计算复杂度,从而加速卷积运算[20]。定义F(m×n,r×s)为输出尺寸为m×n、卷积核尺寸为r×s的卷积运算过程,该卷积运算过程使用Winograd 算法计算需要的乘法次数μ如式(3)所示:
以F(2×2,3×3)为例,二维Winograd 算法的矩阵形式如式(4)所示:
其中:向量矩阵g和d分别为3×3 的卷积核权重以及4×4 的输入图像块。Winograd 转换方程的参数矩阵BT、G、AT如式(5)所示:
本文采用F(2×2,3×3)来计算3×3 的卷积核,由式(4),对4×4 的输入图像块和3×3 的卷积核分别进行BTdB参数转换计算和GgGT参数转换计算,矩阵维度都变成4×4。因此,进行一次二维Winograd运算过程,即两个4×4 大小的矩阵点乘运算所需乘法次数为16。对于3×3 的卷积核运算,一个输出所需乘法次数为9 次,因此使用直接卷积的计算方式计算2×2 大小的输出所需乘法次数为3×3×2×2=36。使用Winograd 算法来计算3×3 卷积的乘法次数由36 次减少到16 次,计算复杂度降低了2.25 倍。
BN 层用来缓解数据分布在训练中出现的偏移问题,可以加快训练的收敛速度并且提高模型的泛化能力[21]。BN 层的计算过程如式(6)所示:
其中:xi为i输出通道的卷积结果;yi为i输出通道的BN层输出结果;μ和σ2分别为当前批次的均值和方差;γ和β分别为尺度因子和偏置;ε为防止分母为0所添加的很小的正数。
本文将卷积层与BN 层进行了融合操作,减少了前向推理时BN 层计算的延时和硬件资源消耗。卷积层与BN 层融合后的权重和偏置如式(7)所示:
其中:W和B分别为融合前卷积层的权重和偏置。
使用更低位宽来表示激活数据可以显著增加差分帧的稀疏度。因此,对神经网络进行低精度量化可以更充分地复用帧间数据。线性量化公式及反量化公式如式(8)所示:
其中:v是待量化的浮点数据;是量化后的数据是反量化后的数据;s是量化因子;QN和QP分别是量化的最小值与最大值;clip(x,cmin,cmax)函数截取超出[cmin,cmax]的值;round(x)函数返回最靠近x的整数。
本文基于可学习的步长量化(Learned Step size Quantization,LSQ)[6]方法对网络模型进行量化,实现了一个硬件更友好的全整形量化方法,将激活和权重位宽都量化到了4 bit。与其他量化方法根据先验数据的最大最小值来确定量化因子s不同,LSQ 量化将s当作可学习的参数加入到网络训练中,通过训练来寻找最合适的量化因子。量化因子s的梯度如式(9)所示:
直接使用LSQ 方法得到的量化因子需要在硬件实现中使用乘法器或者DSP 来进行量化和反量化操作,不利于硬件执行。因此,本文提出了对量化因子进行2 的幂次(Power-of-Two,PoT)约束来优化量化方法,在硬件实现时直接使用移位器来完成量化和反量化操作,对硬件执行更友好。
本文提出的对量化因子进行PoT 约束的计算如式(10)所示:
其中:sPoT为PoT 约束后的量化因子。
对量化因子进行PoT 约束优化后,本文使用的量化和反量化公式如式(11)所示:
由于∇lbssPoT=sPoTln 2,经过优化后,本文在量化感知训练中所使用的量化因子的梯度如式(12)所示:
对三维卷积计算按照不同的循环顺序进行展开决定了加速器的数据流方案。文献[22]基于空间上的数据复用对不同数据流方案进行了讨论,目前在结合帧间数据复用和Winograd 算法的稀疏数据流方案上的研究工作很少。文献[13]提出了结合帧间数据复用和Winograd 算法的稠密数据流方案,本文在其基础上提出了针对本文稀疏压缩方案的稀疏数据流。本文提出的结合帧间数据复用和Winograd 算法的稀疏数据流简化示意图如图2 所示,采用F(2×2,3×3)的Winograd 算法来计算3×3 卷积,因此式(3)中的矩阵点积运算的维度为4×4,一个Winograd 块的乘法数量为16。一个Winograd 块要求的输入特征图尺寸为4×4,对于3×3 卷积,输入特征图的移动步长为2,因此重叠区域为2。由于1×1 卷积就是点积计算,因此对于1×1 卷积,一个卷积块的输入特征图块大小为4×4,并且移动步长为4,不存在重叠区域。由图2 可知,在3×3 卷积的输入特征图块进行Winograd 转换之后与1×1 卷积的输入特征图块一样都是无重叠区域的4×4 大小的块,因此3×3 卷积和1×1 卷积在计算单元中的数据维度相同,可以使用相同的稀疏数据处理路径和同一个计算单元完成乘累加运算。但是3×3 卷积运算结果进行Winograd 转换后输出维度为2×2,而1×1 卷积运算输出维度为4×4,它们的输入输出数据路径不完全相同,因此在运行时需要根据配置的卷积核尺寸参数选择相应的输入输出路径。
图2 稀疏数据流简化示意图Fig.2 Schematic diagram of sparse data flow simplification
由于FPGA 的片上硬件资源和存储资源有限,本文对输入特征图进行分块处理。一个块内的输入特征图可以共享权重数据,实现对权重数据的复用,从而减少权重数据的多次搬运。每个特征图块的宽度和高度分别为Wt和Ht,每个特征图块中Winograd块的数目分别为TW和TH。在并行方式上,一个Winograd 块中的矩阵点积操作并行计算,并行度为16。为了充分复用输入特征图数据,本文在输出通道上进行了并行展开,并行度设置为OC。为了压缩输入通道方向上的稀疏数据以及充分利用部分和累加结果,本文在数据加载时并行载入多个输入通道的数据,并行度设置为IC。对输入通道进行压缩之后,计算时仍然按照单个输入通道进行计算,因此计算单元的并行度为16×OC。单层一个批次输入特征图的Winograd 块的数量计算公式如式(13)所示:
稀疏数据常用的表示格式有压缩稀疏行/列、坐标(Coordinate,COO)和位图(Bitmap,BM)等。其中位图格式相比其他方式只使用单比特来表示数据是否有效,存储资源更少,索引效率更高。本文使用位图格式来表示权重数据和激活数据是否有效,同时利用权重和激活的稀疏性来最大化跳过无效的零值计算。假定二维矩阵的大小为Wb×IC,稀疏数据表示格式如图3 所示。
图3 位图稀疏数据的表示格式Fig.3 Representation format of bitmap sparse data
对于3×3 卷积,本文的位图稀疏针对的是Winograd 转换之后的数据,对于1×1 卷积则是对原始数据使用位图稀疏。激活数据在计算时动态生成,因此激活位图在片上动态生成,权重数据在训练完成之后就已经固定,则权重位图离线生成。为了索引方便,权重数据和激活数据的存储仍然按照稠密格式存储。由于Winograd 块的大小为4×4,因此Wb=16。本文提出了针对并行度为IC 的输入通道位图压缩稀疏方案,通过跳过无效输入通道的计算来加速卷积运算。假设Wb=2、IC=8、OC=2,稀疏方案示意图如图4 所示。
图4 输入通道位图压缩方案Fig.4 Bitmap compression scheme of input channel
激活位图与对应的权重进行相与后得到激活和权重同时有效的位图矩阵,之后通过索引电路找到有效输入通道的索引。
加速器整体架构如图5所示。加速器与主存通过AXI 接口进行数据传输,通过AXI-Lite 接口来配置加速器的工作模式以及获取加速器的工作状态。加速器的关键模块包括控制器、缓存单元、Winograd 转换单元、数据预处理单元、计算单元、帧数据恢复单元和差分帧计算单元等。Winograd转换单元在计算3×3卷积时完成激活数据从原始域到Winograd域的转换以及完成结果数据从Winograd 域到原始域的转换,在计算1×1卷积时则跳过Winograd转换过程。帧数据恢复单元将计算出的当前差分帧卷积结果与缓存的上一帧卷积结果进行累加运算恢复出当前帧的卷积结果。差分帧计算单元将当前帧输出特征图与缓存的上一帧输出特征图进行差分运算,计算下一层网络所需要的差分帧特征图以便复用帧间数据进行加速处理。
图5 加速器整体架构Fig.5 Overall architecture of accelerator
3.3.1 缓存单元
加速器中的缓存单元包括权重位图缓存、权重缓存、输入激活缓存、偏置项缓存、部分和缓存、参考帧数据缓存以及输出缓存等多个缓存单元。其中权重位图缓存一次性缓存了当前层的所有权重位图数据,偏置项缓存存储了所有层的偏置数据。权重缓存、输入激活缓存和输出缓存都使用了乒乓结构来提高数据传输的效率。所有的缓存单元都使用了FPGA 上的BRAM 资源来实现。
3.3.2 稀疏处理单元
稀疏处理单元用来实现所提出的输入通道位图压缩的稀疏方案。激活数据的位图生成模块根据Winograd 转换后的数据或者原始数据生成16 个长度为IC的激活位图数据,并将激活位图与权重位图进行与运算后得到16×OC个长度为IC的位图,将这些位图送入到有效项数目计算模块中求出16×OC个有效输入通道的数目,然后将这些数据送入到求最大值电路中求出有效输入通道的最大值。前导1 位置检测电路(Leading One Position Detector,LOPD)对长度为IC的位图进行检测,找到有效输入通道的位置并将位置索引送入到激活和权重选择模块,由激活和权重选择模块选择有效的激活数据和权重数据送入计算单元中进行计算。
由于需要求出有效输入通道的最大值之后才能确定何时更新下一次输入通道的数据,因此即使输入数据全部为无效数据,仍然需要消耗一定的时钟周期来完成判定。
3.3.3 计算单元
计算单元为PE 并行单元的阵列,每个PE 单元完成4×4 的点积操作,因此每个PE 单元包括16 个乘累加(Multiply-Accumulate,MAC)单元和1 个部分和缓存单元,MAC 完成激活和权重的点积运算以及在输入通道方向上的累加运算,部分和缓存单元缓存一个特征图分块的中间结果。PE 单元每个时钟周期完成一个Winograd 块的计算,并行MAC 数量为16,计算单元的并行PE 单元数量为OC,因此加速器总的并行MAC 数量为16×OC。
本文算法实验基于PyTorch 框架在RTX3090 GPU 上进行,使用的网络为YOLOv3-tiny,网络量化使用的数据集为ILSVRC2015 VID 部分数据集和DAC2020 数据集,使用平均精度均值(mean Average Precision,mAP)作为准确率的指标。分块大小设置为Wt=Ht=12,输入图像大小设置为384×384 像素。硬件平台为Xilinx KC705,加速器在Vivado 2020.2软件平台上完成综合与实现。设置参数batch 为16,OC=16、IC=16,加速器消耗的FPGA 资源如表2 所示。由于激活和权重位宽都量化到了4 bit,因此为了降低功耗,计算单元直接使用LUT 表来实现乘累加运算,而不是使用DSP 实现。
表2 加速器消耗的FPGA 资源Table 2 FPGA resources consumed by accelerator
4.2.1 网络低精度量化
使用所提出的低精度量化方法对YOLOv3-tiny网络进行量化,ILSVRC2015 VID 部分数据集和DAC2020 数据集在4 bit 整形量化后的mAP 损失结果分别如表3 所示。
表3 4 bit 全整形量化后的mAP 损失结果Table 3 mAP loss with 4 bit full integer quantization %
表3 中的数据表明使用所提出的低精度量化方法将权重和激活位宽都量化到了4 bit,所使用的数据集的mAP 损失都小于2%。
使用ILSVRC2015 VID 数据集进行分析,输入特征图量化为4 bit 后各个卷积层差分帧与原始帧的稀疏度变化如图6 所示。从图6 可以看出,差分帧的整体稀疏度为80%,与原始帧的整体稀疏度相比有23%的提升。
图6 4 bit 差分帧与原始帧的稀疏度Fig.6 Sparsity between 4 bit diff-frame and raw-frame
4.2.2 加速器性能
本文使用ILSVRC2015 VID 数据集来验证加速器的性能。本文的加速器设计结合了Winograd 算法、帧间数据复用、利用数据的稀疏性跳过无效数据的计算等多种优化方法,因此对不同优化方法的组合对性能的提升效果进行了探究,结果如图7 所示。由图7 可知,使用Winograd 算法后性能相比Baseline提高了2.14 倍,接近2.25 倍的理论性能提升。采用所提方案设计的加速器性能与原始方法的性能相比具有6.4 倍的提升。
图7 不同优化方案的性能Fig.7 Performance of different optimization mchemes
输入通道并行度IC的大小决定了对稀疏数据的利用率,对加速器的性能具有很大的影响。本文对不同输入通道并行度下的性能和稀疏度进行了探究,结果如图8 所示。对IC设置的过小则无法充分利用数据的稀疏性,导致性能受限。同时,IC受到数据传输带宽的限制无法设置过大,虽然在IC为32 时具有更高的稀疏度和性能,但是受限于加速器带宽,本文设置IC为16。
图8 不同输入通道下的性能和稀疏度Fig.8 Performance and sparsity with different input channels
本文所设计的加速器的性能和功耗及其与目前基于FPGA 的其他加速器对比结果如表4所示。本文方案在运行频率为200 MHz 的条件下实现了814.2×109operation/s 的性能以及201.1×109operation/s/W 的能效 比。与其他使用YOLOv3-tiny 网络的加速器相比,本文提供了1.77~8.99 倍的性能提升以及1.91~5.56 倍的能效比提升。
表4 基于YOLOv3-tiny 的加速器性能比较Table 4 Performance comparison with accelerators based on YOLOv3-tiny
本文设计一个基于帧间数据复用的高能效稀疏卷积神经网络加速器。该加速器通过量化感知训练的方式对网络进行低精度量化,使用Winograd 算法降低CNN 的计算复杂度,并通过差分帧的方式增加输入特征图的稀疏度,在此基础上提出输入通道位图压缩方法跳过无效输入通道的计算。实验结果表明,本文所设计的高能效稀疏CNN 加速器在性能和能效上都优于同类型的加速器。后续将进一步研究如何提高激活的稀疏度,并提出相应的方法优化负载平衡及提高计算单元的利用率,进一步提升加速器的性能和能效比。