APP下载

YOLO检测网络的FPGA加速计算模型的研究

2022-08-24裴颂文汪显荣

小型微型计算机系统 2022年8期
关键词:权值卷积矩阵

裴颂文,汪显荣

1(上海理工大学 光电信息与计算机工程学院,上海 200093)

2(中国科学院 计算技术研究所 计算机体系结构国家重点实验室,北京 100190)

3(复旦大学 上海市数据科学重点实验室,上海 200433)

E-mail:swpei@usst.edu.cn

1 引 言

近年来,深度学习已成为了学术界和工业界的研究热点,基于卷积神经网络(Convolutional Neural Network,CNN)的模型算法在目标检测[1-3]、金融数据分析[4]、交通[5]、医学图像去噪[6]等领域均有应用.

在目标检测领域,单阶段YOLO[1-3]系列的检测网络将目标定位和识别融合在一起,相比于双阶段网络的检测速度更快但精度略低.为了提升检测的精度,YOLO系列网络的结构也逐渐趋于不规则化和复杂化,网络深度也在增大.YOLOv1[1]包含了3种不同卷积核大小的卷积层以及池化层和全连接层;YOLOv2[2]则取消了存储密集的全连接层,通过将重排序后的高维特征图直接传递(Passthrough)到更深的层次实现细粒度特征的提取,但模型结构的不规则化也随之增大;YOLOv3[3]主要引入了残差机制以及通过上采样实现了多尺度预测,但网络深度已超过100层,结构也更复杂,推理过程中的计算量和内存需求更大.因此设计一个适用于该系列目标检测网络的加速计算模型具有广泛的研究意义.

FPGA是一种低成本、低功耗、高并行且可编程的芯片,同时考虑到卷积神经网络模型算法不断更新迭代,且适合应用到各类复杂场景中,因此FPGA成为了神经网络模型推理加速的最佳选择平台[7].FPGA传统设计方法是通过编写硬件描述语言Verilog、VHDL生成特定功能的RTL级电路结构,但对于神经网络这类高密度计算、高频率内存操作和控制逻辑复杂的应用,基于硬件语言的设计方法的复杂度则会变得很大.然而,当前基于高层次综合(High Level Synthesis,HLS)将C/C++实现的神经网络加速计算模型优化综合成知识产权(Intellectual Property,IP)后再进行布局布线,成为了一条更高效的路径,极大减少了传统FPGA的开发周期[8].

本文主要研究了YOLO系列的目标检测网络在FPGA上的加速计算模型,并以典型的YOLOv2为例在Pynq-Z1平台上进行了验证.针对网络模型结构的特点,实现了两种不同的快速卷积算法的计算引擎,最后利用高层次综合工具设计了基于流水线、循环分块和展开、模块融合等策略的加速计算模型.本文的主要工作如下:1)针对3×3的卷积层,实现了基于Winograd快速卷积算法的加速计算引擎,并融合了最大值池化层模块.2)针对的1×1卷积层,实现了基于GEMM快速卷积算法的加速计算引擎,并融合了YOLOv2中的重排序模块.3)采取动态16位定点量化降低数据存储和计算复杂度,双缓存系统提高计算资源的利用率,以及多DMA通道降低数据传输延时.

2 相关工作

当前基于FPGA的神经网络加速计算模型的相关工作主要在3方面.

1)通过对网络模型参数的量化和压缩实现加速.BNN[9]提出了二值神经网络,它将权值和激活输出量化训练成±1,并使用异或操作来代替乘法计算,大大提高了计算速度,但增加了模型精度的损失.Qiu[10]等人提出了动态精度的数据量化,将浮点的权值、偏置和输入输出特征图量化成不同精度的定点数,实现动态精度的定点数模型推理,在较小的性能损失下提高推理速度.

2)针对卷积层加速计算的研究.基于滑动窗口卷积设计的加速器[11,12]主要是通过循环分块、展开等技术对卷积六层循环的计算和访存进行充分优化,并通过选择最优的设计参数实现性能和最小资源的平衡.基于GEMM卷积设计的加速器[12],主要将卷积和全连接层转换成矩阵乘法,再通过访存的优化实现高吞吐量的加速器.基于Winograd和FFT等快速算法的加速器[13-16],在算法层面上实现了卷积的快速计算,Winograd卷积算法适用于小卷积核,通过对特征图和卷积核进行变换后再进行矩阵点乘,减少了乘法次数.FFT卷积则适合大卷积核的模型,通过将输入特征图和卷积核变换到频域后再进行复数乘法实现加速,但存在一定的误差.

3)基于不同硬件执行架构的加速器设计.主要有SIMD架构和脉动阵列架构.SIMD架构主要是根据FPGA的资源配置将输入输出特征图以及卷积核在特定维度上进行展开[11,12],展开的规模会根据不同的网络层参数而有一定的调整.脉动阵列架构的加速器设计主要是利用阵列结构让数据在阵列中流动,通过减少数据的访问次数,提高计算资源的利用率和处理吞吐率,实现加速计算[15,17].但由于该架构需要的硬件资源相应会更多,一般需要中等规模的FPGA.

3 YOLO模型及加速计算方法

针对YOLO系列模型结构的特点,本文提出Winograd、GEMM快速卷积方法,以及融合卷积层和归一化层参数的合并计算方法,从3方面分别提高FPGA加速计算的性能.

3.1 YOLO模型

YOLO系列的模型主要由骨干网络和检测网络组成.图1中显示了YOLOv2的模型结构.它的特征提取骨干网络是由前19个卷积层和5个最大值池化层组成,图1中的Conv1和Conv3分别代表了3×3和1×1两种卷积核的卷积层,Pool则是最大值池化层.YOLOv2引入的重排序层(L27,Reorganize Layer)是将最后一个池化层的输入特征图(L16,通道数为512)先经过1×1卷积层将通道数降到64,即得到L26层的输出特征图;然后将L26层上的每个2×2窗口重排成4通道,最终扩展成256通道的13×13特征图.L28层通过将重排序后的输出特征图L27和卷积输出特征图L24进行拼接叠加,实现了高分辨率的位置信息和低分辨率语义特征信息的融合,提高了模型的检测能力.该特征图拼接叠加的过程,也类似于YOLOv3中的残差机制,不同点在于YOLOv2叠加之前需要先进行1×1卷积和重排序操作.

图1 YOLOv2网络模型结构Fig.1 Structure of YOLOv2

YOLOv2模型的最终输出特征图的大小为13×13,通道数为425.输出通道数与采用的数据集相关,425对应的则是COCO数据集.该输出特征图的含义是将图片划分了13×13个网格,在每一个网格上都预测了5个可能包含物体的边框,每个边框为长度为85的一维向量,其中前80个值对应了数据集中各类物体的概率,后5个值包含了4个边框的位置信息和1个置信度.最后利用非极大值抑制算法从这169个框中提取出包含目标最全的检测框,实现检测.

3.2 Winograd快速卷积计算

针对YOLO系列网络中大小为的3×3的卷积层,采用Winograd[13]快速卷积方法实现卷积计算.Winograd卷积算法首先将输入特征图和卷积核分别变换成相同维度矩阵,再通过矩阵点乘来实现卷积计算.对于大小为m×m的输出特征图,大小为r×r的卷积核,Winograd卷积可记为F(m×m,r×r),其矩阵形式如公式(1)所示:

O=AT[[GWGT]⊙[BTIB]]A=AT[W′⊙I′]A

(1)

公式(1)中的W为卷积核单个通道上大小为3×3的元素;I为输入特征图单通道上大小为4×4的子特征矩阵;O是卷积后大小为2×2的部分输出特征图.故本文采用的Winograd算法规模为F(2×2,3×3).A,B,G及其对应的转置则为Winograd中的转换系数,具体的转换系数如矩阵(2)-矩阵(4)所示.

B=1000
01-11
-1110
000-1

(2)

G=100
1/21/21/2
1/2-1/21/2
001

(3)

AT=1110
01-1-1

(4)

由上述矩阵(2)-(4)可知,转换系数有±1、0、±1/2这5种.在FPGA中的矩阵变换采用手动展开矩阵乘法计算,±1转变成加减法,±12则转变成除以2或4的运算.其中除法运算在将卷积核参数量化成定点整数后可通过右移位操作代替,且乘法运算只发生在转换后的权值矩阵W′与输入特征图I′的矩阵点乘中.因此对于F(2×2,3×3)的Winograd快速卷积算法,每获得4个卷积输出只需16次乘法,而滑动窗口卷积则需要36次乘法.虽然Winogard卷积还增加了加法次数,但减少的乘法次数带来的总体加速性能远大于增加的加法次数造成的性能损失,故采用Winograd卷积算法的理论加速比接近2.25倍.

3.3 Im2col+GEMM快速卷积计算

针对YOLO系列网络中卷积核大小为1×1的卷积层,本文基于通用矩阵乘法GEMM的快速卷积方法实现卷积计算.该方法对于卷积核大小大于1×1的卷积层需要先对输入特征图进行Im2col操作,将输入特征图上的每个卷积窗口滑过的数据扩展成列,然后再与连续存储的卷积核进行通用矩阵乘法GEMM得到卷积结果.由于该卷积计算只需3层for循环,矩阵乘法时对输入特征图的访存是连续性的,所以计算效率非常高.该方法的缺陷也在于它需要提前将输入特征图进行一系列的复制和排列,对于更大的卷积核Im2col的时间会相应更长,传输的数据量也会倍增.而当卷积核大小为1×1时,卷积窗口为1,则无需进行Im2col操作,可直接进行GEMM矩阵乘法.

3.4 卷积层、归一化层的合并计算

在推理计算时,正常情况下需要对卷积层和归一化层依次计算.卷积层的计算如公式(5)所示:

Y=W⊗X+B

(5)

其中W、B、X分别为卷积核的权值、偏置、输入特征图,卷积运算后获得输出Y.归一化层的计算如公式(6)所示:

y=γx-μσ2+eps+β

(6)

公式(6)中的x对应的是公式(5)中的卷积输出Y,μ、σ2分别为特征图的均值和方差,γ、β分别为归一化层的缩放因子和偏置,eps为一个值很小的正数,防止分母为0.通过公式(7)可将卷积层和归一化层的计算进行合并:

y=γ(W⊗X+B)-μσ2+eps+β=γWσ2+eps⊗X+γ(B-μ)σ2+eps+β
=Wnew⊗X+Bnew

(7)

由公式(7)可知,新权值Wnew和新偏置Bnew可由原参数计算得到.故使用新参数对原卷积层的输入特征图X进行卷积后,可直接获得归一化后的输出y.在FPGA推理计算前,则预先进行卷积层和归一化的参数融合,推理时把新参数直接用于卷积计算,减少了模型的计算量和数据传输量,以此实现模型的推理加速.

4 FPGA加速计算

图2为在FPGA上定制化设计的YOLOv2的系统架构图.本文首先通过动态量化技术用16位定点整数计算取代32位浮点计算.实现的加速计算引擎有2个,其中PE1是针对3×3卷积层设计的Wingorad快速卷积计算引擎,并融合了最大值池化计算模块;PE2是针对1×1卷积层设计的GEMM卷积计算引擎,且融合了重排序计算模块.FPGA上的控制逻辑则根据卷积核的大小切换不同的引擎进行计算,并控制片上缓存的读取和写入操作.为进一步提高本文计算模型的整体加速性能,设计了双缓存系统提高计算资源的利用率以及多DMA通道降低片上和片外的数据传输延时.

图2 定制化YOLOv2的系统架构图Fig.2 System architecture of customized YOLOv2

4.1 动态16位定点数量化

本文采用动态16位定点数量化[10]对模型中的权值、偏置以及输入输出特征图进行量化,量化后的定点数格式如图3所示.

图3 16位定点数格式Fig.3 Format of 16 fixed point number

由图3可知,量化后的16位定点数由表示符号的1比特,表示整数部分的(15-fl)比特和表示小数部分的fl比特组成.因此量化后的16位定点数可由公式(8)计算得:

Vfixed16=∑15i=0Bi·2-fl·2i,Bi∈{0,1}

(8)

在静态定点16位数据量化中,各层参数的小数位宽fl是恒定不变的,则限制了小数部分的数据范围为0到∑fli=12-i,整数部分的范围为-215-fl到215-fl-1.如果网络中有不在该范围的数,则量化或计算时将造成数据溢出.动态量化则是计算出各卷积层的权值、偏置、特征图的最优量化位宽fl,减少数据溢出的情况.

fl=MIN{∑|Vfloat32-V′float32(Vfixed16(Vfloat32,fl))|}

(9)

公式(9)中的Vfloat32是未量化的浮点数,V′float32则是先量化成的定点数Vfixed16再转换成32位浮点数,最优位宽则是这两者累计绝对误差的最小值对应的fl值.在卷积计算时则根据各类参数的量化位宽进行相应的移位操作,实现等效的32位浮点计算.将参数定点量化后节省了片上存储资源,数据传输量减半,同时定点数也会比浮点计算执行得更快.

4.2 基于Winograd的卷积计算引擎设计

卷积引擎的设计采用了循环分块策略降低片上卷积规模.循环分块后,每次将从片外读取部分输入特征图和卷积核到片上输入缓存和权值缓存,计算结果写入到输出缓存或片外.故原输入特征图通道数Ncin分成「Ncin/Tcin⎤组,原单通道上的输入特征图Nxin×Nyin分成「Nxin/Txin⎤×「Nyin/Tyin⎤块,原输出特征图通道数Ncout分成「Ncout/Tcout⎤组,原单通道输出特征图Nxout×Nyout将分成「Nxout/Txout⎤×「Nyout/Tyout⎤块输出.其中参数Txin=Tyin,Txout=Tyout分别表示分块后的单通道输入输出特征图的大小,Tcin和Tcout则分别表示了分块后的输入输出通道数量.

卷积循环在分块后被分为了内循环和外循环两个循环组.算法1描述了在3×3的卷积层中采取Winograd卷积的内循环伪代码.外循环负责把内循环卷积需要的数据读取到片上,并控制片上数据复用模式.本文采用输出特征图复用,故当算法1执行结束后,外循环决定输出缓存是继续复用还是输出.由分块参数可知,外循环读取分块的输入特征图和卷积核「Ncout/Tcout⎤×「Ncin/Tcin⎤×「Nxout/Txout⎤×「Nyout/Tyout⎤次到片上,输出到片外「Ncout/Tcout⎤×「Nxout/Txout⎤×「Nyout/Tyout⎤次,即经过「Ncin/Tcin⎤次执行算法1后,结束输出缓存的复用并写入到片外.

算法1.基于Winograd卷积的内循环伪代码

输入:输入特征图缓存InputBuffer[Tcin][Txin][Tyin],偏置BiasBuffer[Tcout]、卷积核缓存WeightBuffer[Tcout][Tcin][K][K];//Txin=Tyin,K=3

输出:输出特征图缓存OutputBuffer[Tcout][Txout][Tyout]//Txout=Tyout

for(x=0; x

for(y=0; y

for(m=0; m

for(n=0; n

getInput(Input44,InputBuffer,n,x,y);

doBTdB(Input44,TransInput44);

getWeight(Weight33,WeightBuffer,m,n);

doGgGT(Weight33,TransWeight44);

doATelementMulA(TransWeight44,TransInput44,WinoOutput);//矩阵点乘和变换

write2OutputBufMaxPool (winOutput,BiasBuffer,OutputBuffer,nextLayer,m,x,y);

}

算法1中的最内层for循环采用了循环展开策略,实现通道上的并行卷积,该过程对应的是图4左框中的卷积模块.在实际执行时,从输入缓存InputBuffer中读取4×4大小的特征图进行矩阵变换的过程与从卷积核缓存WeightBuffer中读取3×3大小的权值进行矩阵变换的过程是并发执行的,其中的TransInput44和TransWeight44即为变换后的矩阵.在完成各通道上矩阵变换后,则进入4个并行的矩阵点乘引擎进行计算和输出变换.最后通过并行加法树结构,获得输出特征图在单个通道上的2×2输出WinoOutput.它的上一层for循环则是控制输出特征图在不同通道上的卷积计算.

本文使用高层次综合HLS指令对算法1进行优化.利用数组分割指令Array_partition对InputBuffer的第1,2维度分割,实现不同通道上的不同行缓存的并行读取;指定Input44、TransInput44、Weight33、TransWeight44、WinOutput为寄存器类型,避免矩阵变换时因为BRAM端口限制造成的访问冲突,也降低了矩阵点乘时的时钟周期数.利用Loop unroll和Pipeline指令在控制输出通道数的for循环上进行循环展开和流水线工作.在综合优化后,矩阵转换只占2个时钟,并在43个时钟周期内可计算出128个卷积输出.

图4 融合Winograd卷积和池化模块Fig.4 Fusion of Winograd convolution and pooling

由于Winograd的卷积输出窗口与池化窗口的滑动规律完全相同,因此将最大值池化计算与卷积计算融合,如图4的右方框所示.在第「Ncin/Tcin⎤次调用内循环并获得卷积输出时将进入激活和池化模块.融合过程对应的是算法1的write2OutputBufMaxPool函数模块,先进行激活,再通过3个比较器获得融合卷积和池化后的最终结果.故采用融合思想后,既实现了快速的卷积加速计算,也避免了单独设计池化引擎引入的传输延时.

4.3 基于GEMM的卷积计算引擎设计

针对模型中卷积核大小为1×1的卷积层,采用了基于GEMM的卷积算法设计.该卷积层也采取循环分块策略,外循环和内循环基本与3×3卷积层的相同,不同的是在内循环的最里层采用了通用矩阵乘法GEMM实现卷积.图5中的左方框为输入特征图与单个卷积核的卷积实现过程,其将卷积核各通道上的唯一权值,与对应通道上的输入特征图的所有元素输入到4个并行的矩阵乘法引擎中计算后,再输入加法树累加即获得卷积结果.

图5 融合GEMM卷积和重排序模块Fig.5 Fusion of GEMM convolution and reorganization

在该引擎中也将第L27层的重排序操作与卷积融合.该融合过程也可用于YOLOv3中的1×1卷积层和上采样过程之间.融合YOLOv2中的重排序层发生在第「Ncin/Tcin⎤次调用内循环的GEMM卷积时并在得到卷积输出时,将进入图5右方框中的重排序模块.它通过一个4路的数据选择器,将特征图上的每2×2窗口中的数据分拆到4个通道上.最终将32通道的输出特征图,扩张成128通道,但单通道上的数据量为原来单输出通道的1/4.

4.4 双缓存存储系统及多DMA端口数据传输

本加速计算模型中采用了双缓存存储系统来重叠数据载入、数据计算、数据输出这3个阶段的时延,原理如图2所示.Phase0为初始化阶段,FPGA从DRAM中并发读取输入特征图和权值到缓存1以及偏置缓存中.在Phase1和Phase2时,将依次从片外读取分块后的特征图和权值到片上缓存,计算结果存储到输出缓存1中.故控制逻辑在Phase1和Phase2之间切换「Ncin/Tcin⎤-1次后,完成了输出缓存1的复用,也实现了数据载入和计算时延的重叠.在Phase3和Phase4时,输出缓存1(2)传输到片外的过程与Phase1和Phase2阶段复用输出缓存2(1)进行计算的过程是并发执行的.故控制逻辑在Phase3和Phase4之间切换「Ncout/Tcout⎤-1次后,实现了3个阶段时延的重叠,且完成了卷积层所有特征图的输出.

本加速计算模型中还采用了多DMA通道数据传输策略进一步降低传输延时.由于卷积循环分块参数中的Tcin=4,Tcout=32,因此采用了4通道DMA并发读取输入特征图各通道上的数据.由于32个卷积核的总数据量与单通道输入特征图相当,因此设计单通道DMA读取权值和偏置参数.由于特征图输出时延与「Ncin/Tcin⎤次的数据载入和处理的总时延重叠,故采用双通道DMA传输,各DMA通道负责16通道特征图的输出.

5 实验评估

5.1 模型量化结果分析

本文首先将YOLOv2模型中的卷积层和归一化层的参数合并,然后再将合并后的参数进行动态16位的定点量化.

图6 卷积层的最优量化位宽Fig.6 Optimal quantification width of convolution layer

最终参数由194.49MB的32位浮点数据,量化成了97.18MB的16位定点数,并获得了各卷积层的权值和偏置对应的量化位宽.

对于各层输入输出特征图的量化位宽,则通过对所有测试集图片进行推理,然后选择出现频率最高的位宽作为该层特征图的最终量化位宽.图6表示的是各卷积层参数量化后的位宽.最下方折线表示的是各卷积层的输入特征图的位宽,将该折线向右平移一个单位后即为该层输出特征图的量化位宽.由该图中这3条折线的差异性也可知,若采用静态的小数位宽,则在卷积后很可能会造成整数部分数据的溢出,或小数部分的数据精度会有损失.

5.2 硬件部署结果分析

实验验证平台选择的是Xilinx PYNQ-Z1.该开发板采用的是FPGA+ARM架构,片上FPGA采用的是ZYNQ XC7Z020-1CLG400C芯片,包含630KB的BRAM,220个DSP,片外是双核ARM Cortex-A9硬核处理器,有512MB的DRAM内存.该开发板基于PYNQ框架,可使用Python语言调用FPGA的硬件资源和部署的YOLOv2 IP核,加快了模型的开发周期.设计的YOLOv2加速计算模型工作频率为150MHz.采用Xilinx Vivado HLS 2019.1进行了YOLOv2的IP设计,并使用Vivado 2019.1进行综合和布局布线.表1为本文设计的YOLO加速计算模型与基于滑动窗口卷积实现的YOLOv2加速模型[11]的资源占用情况的对比,且该工作[11]的验证平台为Zedboard,与本实验采用的PYNQ-Z1开发板的片上总资源基本相同.

表1中的幅度为与文献[11]相比,片上资源占用情况的相差幅度.由该栏的数据可知,在采用Winograd和GEMM两种卷积的加速计算后,片上资源消耗并未有大幅度的上升,反而由于Wingorad卷积减少了乘法的次数,以及通过GEMM矩阵乘法避免了原本滑动窗口卷积需要的复杂逻辑控制,最终导致DSP、LUT等资源占用有一定降低.但触发器FF资源的消耗有了很大幅度的增加,主要是消耗在Winograd卷积时的输入特征图和卷积权值的矩阵变换中.

表1 资源占用情况Table 1 Report of resources utilization

在将卷积、池化、重排序模块融合后,网络层次由原来的23层卷积、5层池化、1层重排序层缩减成14层Winograd快速卷积层,其中有5层融合了池化计算,9层GEMM卷积层,且最后一次的GEMM卷积融合了重排序层.该加速计算模型与不同平台和工作在检测精度和性能等方面的对比情况如表2所示,其中的Baseline为在CPU平台上未量化且采用滑动窗口卷积实现的YOLOv2推理计算模型.

虽然采用的动态定点16位量化对于单一的数值会有一定的精度损失,但从模型的检测精度mAP值看,本文的加速计算模型和Ref[11]都与原32浮点模型的检测精度几乎相同,未有明显的精度损失.从单张图片的推理时延看,由于Ref[11]设计了单独的池化和重排序计算模块,因而会具有更高的数据读取和写入时延.从功率上看,本文计算模型略高于Ref[11],主要是由于设计了4通道并行的Winograd卷积计算,但在处理单张图片的延时减少了一大半,且计算性能是其2.15倍.与基于CPU平台的计算模型相比,性能是其13.32倍,功率仅为其1/60.

表2 与其它相关工作和CPU平台的比较Table 2 Comparison with other related work and CPU

6 小 结

本文研究了目标检测YOLO系列网络的加速计算模型,并以YOLOv2检测网络为例,在FPGA上进行了验证.针对其中3×3和1×1卷积层的特点,分别实现了基于Winograd和GEMM快速卷积算法的加速计算引擎.在将卷积归一化的参数合并和16位定点量化后,降低了数据的存储和传输延时.通过采用多DMA通道传输和非卷积模块的融合计算进一步降低数据传输的延时.为提高FPGA计算资源的利用率,设计了双缓存存储系统,提高了整体性能.本文设计的YOLO加速计算模型能有效工作在PYNQ-Z1 SoC上,片上的系统时钟为150MHz,处理单张图片的时延为454ms,功耗仅有1.4W.未来工作主要研究方向是通过量化训练来实现更低的数据位宽,考虑片上更大粒度的并行和流水线处理以及设计3×3和1×1两种卷积层的融合计算.

猜你喜欢

权值卷积矩阵
基于全卷积神经网络的猪背膘厚快速准确测定
基于图像处理与卷积神经网络的零件识别
基于深度卷积网络与空洞卷积融合的人群计数
多项式理论在矩阵求逆中的应用
卷积神经网络概述
财务风险跟踪评价方法初探
矩阵
矩阵
矩阵
基于洪泛查询的最短路径算法在智能交通系统中的应用