一种基于ARM的嵌入式卷积神经网络加速方法与流程

文档序号:17066083发布日期:2019-03-08 22:55阅读:1002来源:国知局
一种基于ARM的嵌入式卷积神经网络加速方法与流程

本发明涉及嵌入式卷积神经网络加速的技术领域,尤其是指一种基于arm的嵌入式卷积神经网络加速方法。



背景技术:

基于卷积神经网络的深度学习算法在计算机视觉的各个领域都取得了巨大成功。然而,随着深度卷积神经网络的性能的不断提升,网络的参数数量越来越多,计算量也变得越来越大。由于深度卷积神经网络对硬件算力的要求过高,在嵌入式设备等计算资源有限的设备上部署深度卷积神经网络成为了一个挑战。

目前,设计轻量化的卷积神经网络结构并且将该结构部署到商业应用的嵌入式设备上成为一种可行方法。虽然绝大多数物体检测网络都是针对pc设备来设计的,但是也有很多专门为嵌入式设备设计的特征提取网络。

在论文“squeezenet:alexnet-levelaccuracywith50xfewerparametersand<0.5mbmodelsize”中,forrestn.iandola等将网络设计成一个瓶颈的形状,该网络以更少的参数,更小的网络结构在imagenet数据集上达到了与alexnet相同级别的准确率。使用深度可分离卷积的mobilenetv1在论文“mobilenets:efficientconvolutionalneuralnetworksformobilevisionapplications”中被提出,该轻量化高效网络有两个超参数可以用来实现调节准确率和计算复杂度之间的权衡。在论文“shufflenet:anapplicationofgeneralizedperfectshufflestomultihoplightwavenetworks”中,shufflenet使用了通道重排操作和分组卷积来降低计算复杂度,实现了比mobilenetv1更高的准确率。

虽然有这么多的轻量化卷积神经网络,但是直接将它们部署到嵌入式设备上运行并不高效。



技术实现要素:

本发明的目的在于克服arm嵌入式设备硬件计算资源的不足,提出了一种基于arm的嵌入式卷积神经网络加速方法,能够用于终端部署深度卷积神经网络,实现嵌入式设备资源的充分利用。

为实现上述目的,本发明所提供的技术方案为:一种基于arm的嵌入式卷积神经网络加速方法,包括以下步骤:

1)使用深度学习框架训练好轻量化卷积神经网络;

2)把训练好的卷积神经网络结构和权值导出到文件;

3)设计程序导入步骤2)中的权值文件,并根据步骤2)中训练好的网络结构实现神经网络的前向计算;

4)使用neon技术对神经网络运行耗时严重的1×1卷积和3×3深度可分离卷积进行优化;

5)将步骤4)中优化过的1×1卷积和3×3深度可分离卷积替换到步骤3)中的对应操作,加速卷积神经网络的运行。

进一步,在步骤2)中,对于卷积神经网络结构和权值的存储方法:使用自动化工具protocolbuffers来序列化网络结构和权值等结构数据。

进一步,在步骤4)中,对1×1卷积的优化方法:先对1×1卷积的输入特征图和卷积核进行内存重排,使其在1×1卷积计算过程中符合内存的局部性原理,然后使用neon单指令多数据流技术优化计算过程,减少1×1卷积运行时间。

进一步,在步骤4)中,对3×3深度可分离卷积的优化方法,在优化过程中,用neon寄存器来存储输出通道的相邻四个元素,一个neon寄存器的向量化计算过程如下:

记输入特征图特定通道的元素值为im,n,m,n分别为横纵坐标,输入特征图中的寄存器rm,n为:

rm,n=(im,n,im,n+1,im,n+2,im,n+3),n%4≠0

记输出特征图特定通道的元素值为ox,y,x,y分别为横纵坐标,输出特征图中的寄存器outrx,y为:

outrx,y=(ox,y,ox,y+1,ox,y+2,ox,y+3),y%4=1

根据卷积的运算规则有:

其中ki,j表示相应的卷积核,则

得到

其中outrx,y和ri+x-1,j+y-1都是寄存器,即通过向量运算得到了3×3深度可分离卷积的优化结果。

本发明与现有技术相比,具有如下优点与有益效果:

1、本发明克服了arm嵌入式设备计算资源的不足,实现了将卷积神经网络高效部署在嵌入式平台上。

2、本发明对1×1卷积的输入和卷积核进行内存重排,在不增加内存使用的前提下极大提升了1×1卷积的计算效率。

3、本发明避免了内存重排对3×3深度可分离卷积带了额外的内存使用,直接通过向量化来优化3×3深度可分离卷积的计算。

4、本发明在神经网络的嵌入式部署中具有广阔使用空间,向量化优化神经网络的计算可以最大化利用嵌入式设备的硬件资源。

附图说明

图1为本发明的1×1卷积优化方法示意图。

图2为本发明的3×3深度可分离卷积优化方法示意图。

图3为本发明的流程图。

具体实施方式

下面结合附图和mobilenetv1对本发明的优化方法做进一步详细说明,但本发明也适用于其它使用1×1卷积和3×3深度可分离卷积的神经网络。

如图3所示,本发明所提供的基于arm的嵌入式卷积神经网络加速方法,包括以下步骤:

步骤1,使用caffe或其它深度学习框架训练轻量化卷积神经网络mobilenetv1。

步骤2,将训练好的mobilenetv1网络结构和权值导出到文件。

步骤3,设计程序导入权值文件,并根据训练好的网络结构实现神经网络的前向计算。可以把神经网络中的不同层分别用不同的函数表示,函数参数有层的规格参数,输入特征图,层的权值,函数返回值为输出特征图。之后,将各个层的函数串联起来运行就得到了神经网络的输出。

步骤4a,使用neon技术对神经网络运行耗时严重的1×1卷积进行优化。

在mobilenetv1类似的网络结构中,都使用了深度可分离卷积和1×1的卷积来代替普通的卷积操作以达到降低卷积操作计算复杂度的目的。此外,1×1卷积还可以用来对特征图进行升维和降维,如先将原特征图进行降维,在对降维后的特征图进行卷积,之后再用1×1卷积进行升维可以降低网络的计算复杂度。

然而,1×1的卷积计算复杂度也非常大,所以着重对1×1卷积进行优化可以显著提高卷积神经网络的运行速度。

如图1所示,1×1卷积是将1×1的卷积核与输入特征图的特定位置的元素进行乘积再求和得到输出特征图的特定位置的元素值。

而在卷积操作的具体实现中,我们会将特征图和卷积核都存储为一维数组,然后我们会对特征图中的每一个通道都按照一定字节进行对齐,此处我们选择为16字节对齐,因为一个neon寄存器可以存储4个float类型的数据,我们以neon寄存器为单位读取数据的时候,每次会读取16字节的数据,如果以16字节对齐来存储这些数据的话,读取会更加高效。图1中的内存分布部分展示了特征图和卷积核在内存中的分布。

我们对1×1卷积的优化主要是对输入特征图和卷积核的内存分布进行重新排列,使得我们在循环计算输出特征的时候尽量满足内存的局部性原理即时间局部性和空间局部性原理。

具体优化过程为:在每次1×1卷积操作时,我们将输出特征图按照8个每组使用openmp平分给嵌入式设备的各个cpu,以充分利用硬件资源。之后针对每8个输出特征图,我们会以1×8的小块为单位同时进行8个输出特征图的计算。当我们需要计算第一个1×8的小块的时候,我们需要访问输入特征图中的一列,所以我们会将输入通道以4为单位分组,之后第一列的前四个我们会重排到一段连续内存中,这样我们访问的时候便会更为高效。同样地,我们对1×1卷积核也相应的按照访问顺序进行重排会大大提高我们访问的效率。

这样的话,我们计算过程中,8个输出特征图,每个特征图一个1×8分块,共需要16个neon寄存器,4个输入特征图,每个特征图一个1×8分块,共需要8个neon寄存器,再加上8个1×1卷积核的neon寄存器正好是32个neon寄存器,充分利用了aarch64的32个neon寄存器来进行计算。

步骤4b,使用neon技术对神经网络的3×3深度可分离卷积进行优化。

对3×3深度可分离卷积的优化则与1×1的卷积不同,3×3深度可分离卷积的计算过程中,每个输出像素点的计算与周围的3×3个输入像素点都有关系,如果要按照优化1×1卷积的方法,将内存存储重新排列,则会造成额外的内存开销,因为这些3×3的小块会有很大部分重叠。所以可以通过直接对3×3深度可分离卷积的计算过程进行向量化,来达到优化的目的。

如图2所示,3×3深度可分离卷积的过程中,输入特征图和输出特征图的通道数是保持不变的,且输入特征图和输出特征图的通道是一一对应的,即在3×3深度可分离卷积时,第一个卷积核会与输入特征图的第一个通道进行卷积得到输出特征图的第一个通道。

而在3×3深度可分离卷积的优化过程中,我们会用neon寄存器来保存最后计算得到的输出特征图的结果,如图2所示,我们会在输出特征图中用四个neon寄存器来保存一个2×8的分块,之后使用neon寄存器来向量化计算这四个neon寄存器的结果。

一个neon寄存器的向量化计算过程如下:

记输入特征图特定通道的元素值为ix,y,x,y分别为横纵坐标。输入特征图中的寄存器为:

rm,n=(im,n,im,n+1,im,n+2,im,n+3),n%4≠0

记输出特征图特定通道的元素值为ox,y,x,y分别为横纵坐标。输出特征图中的寄存器outrx,y为:

outrx,y=(ox,y,ox,y+1,ox,y+2,ox,y+3),x%4=1

根据卷积的运算规则有:

其中ki,j表示相应的卷积核。则

可以得到

其中outrx,y和ri+x-1,j+y-1都是寄存器,所以我们通过向量运算得到了3×3深度可分离卷积的优化结果。

3×3深度可分离卷积计算过程中,我们会把3×3的卷积核存储到3个neon寄存器中来方便计算。

最后使用openmp将输出特征图按通道平均分配到每个cpu上进行计算加速,提高硬件资源的利用。

步骤5,将优化过的1×1卷积和优化过的3×3深度可分离卷积替换到卷积神经网络中的对应操作,加速卷积神经网络的运行。

下面结合实验对本发明的效果做进一步说明。

本实验使用到的硬件是firefly-rk3399。该主板采用瑞芯微rk33996核心片方案,双cortex-a72大核+四cortex-a53小核,主频2.0hz。软件系统为ubuntu16.04,gcc版本为5.4.0。

实验过程为,首先,使用opencv读取摄像头视频流,从视频中抽取图像帧,然后对载入的图像做预处理,主要是为了使得深度学习模型准确率更高,我们会对图像的缩放和均值处理。之后,我们会使用protocolbuffers将在caffe上训练好的mobilenetv1模型读入到内存,建立一个有向无环图进行神经网络的计算。接着,我们将经过预处理的图像作为神经网络的输入,经过神经网络的前向计算,我们会得到网络的输出,也就是图像中出现各个物体的概率。最后,我们从神经网络的输出中筛选出那些可信度较高的结果展示出来。

在部署mobilenetv1之后,我们可以在firefly-rk3399的嵌入式平台上达到12fps的速度,比直接使用caffe框架运行在嵌入式平台上(约2fps)提高6倍,可以看出我们对1×1卷积和3×3深度可分离卷积的neon优化对于卷积神经网络的运行性能提升明显。

以上所述实施例只为本发明之较佳实施例,并非以此限制本发明的实施范围,故凡依本发明之形状、原理所作的变化,均应涵盖在本发明的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1