卷积神经网络的并行优化方法转让专利

申请号 : CN201810021291.0

文献号 : CN110163333B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 黄家豪王铁军朱旭辉魏敏陈海宁杨昊赵长名吴涛黄敏吴锡

申请人 : 成都信息工程大学

摘要 :

本发明涉及一种卷积神经网络的并行优化方法,其包括:用winograd算法f(2x2,3x3)进行卷积神经网络的卷积核运算,以降低时间复杂度并减少乘法运算次数;对不存在循环数据依赖的for循环结构部分,使用OpenMP开辟多个线程进行运算;对模式相同的数据运算部分进行向量化处理,使其能够实现一次指令多次运算。采用本发明的方法改进的卷积神经网络程序能够大幅度提高并行的效率、减少运算的复杂度,从根本上降低运算开销,降低程序的运行时间。

权利要求 :

1.一种卷积神经网络的并行优化方法,其特征在于,包括以下步骤:对输入的数据进行数据预处理;

判断进行卷积神经网络的卷积核运算的滤波器的大小,将大于(3x3)的滤波器转化为小型滤波器;

将每个卷积核的数据进行分块;

逐层进行卷积运算,其中,分块进行并行化卷积运算,然后处理重复部分,进行分块整合;

反馈更改滤波器;

映射到下一层,直至多层卷积计算完成;

其中,用winograd算法F(2x2,3x3)进行卷积神经网络的卷积核运算,以降低时间复杂度并减少乘法运算次数;对不存在循环数据依赖的for循环结构部分,使用OpenMP开辟多个线程进行运算;对模式相同的数据运算部分进行向量化处理,使其能够实现一次指令多次运算;向量化处理包括:对于F(MxM,RxR)框架代码中SIMD部分,将相邻计算矩阵BT,G和AT中同样位置的数据进行组合成一个向量,向量大小和组合个数根据向量寄存器和基本数据单位决定,其计算方法为:N=E/g,其中N为向量中包含数据个数,E为向量寄存器大小,g为单个数据大小;

用winograd算法F(2x2,3x3)进行卷积神经网络的卷积核运算的公式为:Y=AT[(GgGT)⊙(BTdB)]A

由winogard算法的原理推出其矩阵数据:g=[g0 g1 g2]T

d=[d0 d1 d2 d3]T。

2.如权利要求1所述的卷积神经网络的并行优化方法,其特征在于,将数据顺序装入向量寄存器中,使数据连续,以便后续的向量化计算。

说明书 :

卷积神经网络的并行优化方法

技术领域

[0001] 本发明涉及神经网络技术领域,尤其涉及卷积神经网络的并行优化方法。

背景技术

[0002] 卷积神经网络(CNN)是最近发展起来的一种反馈神经网络,其相对高效的的识别率,以及不需要在前期做太多的前期图像复杂的预处理,使得卷积神经网络在图像模式分类中得到了广泛的运用。卷积神经网络(CNN)的基本结构包括特征提取层和特征映射层。在第一层中,每个神经元的输入与上一层的局部接受域相连接,用于获得这个区域的局部特征。进而获得其他地区的局部特征,以及各个局部特征间的位置关系。在第二层中,将每个共享的特征在多个计算层中进行计算,而这一层的每一个特征映射是一个平面,并且其所有神经元的权值相同。共享的特征值以及采用影响函数核小的sigmoid函数作为特征映射结构中的激活函数,使得特征映射的位移具有不变性,而且还减少了网络自由参数的个数。而且第一二层都是交替连接出现,使得卷积神经网络能够更大的降低网络复杂性,减小特征分辨率。
[0003] 现有的卷积神经网络的实现大多都是基于大量的数据(100万条数据以上)训练,通过训练得到的模型特征参数,与新的测试集样本进行匹配,得到匹配的准确率。但通常在训练的时候,需要的数据集是非常庞大的,一般稍微复杂些的数据都需要上万条数据进行训练。然而通常的卷积神经网络都是基于串行的程序,执行效率低下,而在并行的卷积神经网络中,大多是模型上的并行,效率提升不明显。此外,在测试应用的时候,无法运用到实时性较强的场景中。这种方式已经不能满足现在日益增长的数据量和实时性要求,进而需要更加高速的并行计算来实现实时性,并且最大限度的将卷积的速度进行提升,使其更加高效。
[0004] 由于卷积神经网络的计算量非常庞大,为了提高其运算效率,也有许多的学者进行过并行化的尝试,下面简要介绍一些将卷积神经网络进行并行化的研究和应用:
[0005] 王伟凝等(2017)在进行基于多方面深度学习表达的图像感情分类方法的研究中,在卷积神经网络中对相同的卷积神经网络进行了并行化,使得一次模型计算中,不同的输入图像能够在同一类型的卷积神经网络中进行卷积运算及特征映射,到最后进行决策融合。这种模型上的并行化使得效率得到了一定的提升。
[0006] 王馨等(2014)在对基于大规模高性能集群的卷积神经网络并行处理方法的研究中,将要训练的网络模型构建出多个副本,多个副本进行运算,且由一个主节点进行广播和数据收集处理。并且将训练集分为若干子集,每次将训练子集分发给除主节点之外的其余子节点,共同进行参数梯度的计算,并将梯度值累计,累计值用来更新主节点模型参数,将更新后的模型参数广播给各个子节点,直到模型训练终止。这种方法针对于大规模的卷积神经网络的计算速度有一定的提升。
[0007] 刘长征等(2016)为解决卷积神经网络在进行语音识别时通过样本训练神经网络所花费的时间过长的问题,提出了采用分数阶的理论处理卷积神经网络中的节点函数Sigmoid函数,使Sigmoid函数的收敛速度加快,而在不影响卷积神经网络进行语音识别的正确率的前提下,从而达到了减少训练所需时间提高整个神经网络的训练效率的目的。
[0008] 然而,现有的通行技术方案中仍然存在以下不足:
[0009] 1、卷积神经网络的模型并行效率提升较低;2、大规模的集群并行在单个节点上的处理能力还有许多浪费;3、没有对卷积神经网络中的卷积运算进行算法上的优化;4、在针对具体计算时没有考虑数据的连续性,没有更好的利用向量化。

发明内容

[0010] 针对现有技术之不足,本发明提出了一种卷积神经网络的并行优化方法,其包括:用winograd算法f(2x2,3x3)进行卷积神经网络的卷积核运算,以降低时间复杂度并减少乘法运算次数;对不存在循环数据依赖的for循环结构部分,使用OpenMP开辟多个线程进行运算;对模式相同的数据运算部分进行向量化处理,使其能够实现一次指令多次运算。
[0011] 根据一个优选实施方式,用winograd算法f(2x2,3x3)进行卷积神经网络的卷积核运算的公式为:
[0012] Y=AT[(GgGT)⊙(BTdB)]A
[0013] 由winogard算法的原理推出其矩阵数据:
[0014]
[0015]
[0016]
[0017] g=[90 g1 g2]T
[0018] d=[d0 d1 d2 d3]T。
[0019] 根据一个优选实施方式,将数据顺序装入向量寄存器中,使数据连续,以便后续的向量化计算。
[0020] 向量化处理还包括:对于F(MxM,RxR)框架代码中SIMD部分,将相邻计算矩阵中同样位置的数据进行组合成一个向量,向量大小和组合个数根据向量寄存器和基本数据单位决定,其计算方法为:N=E/g,其中N为向量中包含数据个数,E为向量寄存器大小,g为单个数据大小。
[0021] 根据一个优选实施方式,本发明的卷积神经网络的并行优化方法包括以下步骤:
[0022] 对输入的数据进行数据预处理;
[0023] 判断滤波器的大小,将大于(3x3)的滤波器转化为小型滤波器;
[0024] 将每个卷积核的数据进行分块;
[0025] 逐层进行卷积运算,其中,分块进行并行化卷积运算,然后处理重复部分,进行分块整合;
[0026] 反馈更改滤波器;
[0027] 映射到下一层,直至多层卷积计算完成。
[0028] 本发明具有以下有益效果:
[0029] 本发明可以从代码的层面和逻辑的层面同时进行优化,逻辑上调整合适的算法以降低时间复杂度,调整卷积过程中的步长和块的大小;代码上采用多种并行调优方法进行对代码的并行化改造,大量使用向量化,以便于使用最少的指令计算最多的有用数据。本发明改进的卷积神经网络程序能够大幅度提高并行的效率、减少运算的复杂度,最多可以达到30倍的速度提升,能够从根本上降低运算开销。

附图说明

[0030] 图1示意性地示出了本发明的方法流程图。

具体实施方式

[0031] 为使本发明的目的、技术方案和优点更加清楚明了,下面结合具体实施方式并参照附图,对本发明进一步详细说明。应该理解,这些描述只是示例性的,而并非要限制本发明的范围。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明的概念。
[0032] 本发明的卷积神经网络的并行优化方法包括:
[0033] 步骤1:替换winograd算法f(4x4,3x3)为f(2x2,3x3),以降低时间复杂度,减少乘法运算次数。
[0034] 步骤2:对不存在循环数据依赖的for循环结构部分,使用OpenMP开辟多个线程进行运算,从而达到并行改造的目的。
[0035] 步骤3:对大量模式相同的数据运算部分,进行向量化处理,使其能够一次指令多次运算。
[0036] 具体地,关于步骤1:替换算法部分。
[0037] 对于卷积神经网络的卷积核运算可以用如下公式运算:
[0038]
[0039] 根据Winograd的算法描述可知,其针对一维向量中m个输出数据,用r长度的滤波器作卷积,称为F(m,r)。相应地,将其应用到卷积神经网络中,多对应的是二维数据,可将其扩展成F(m*n,r*s)。在本实施方式中使用F(2x2,3x3)作为实例(太过于大型的滤波器,此算法的性能并非最优,3x3的滤波器最好)可求得如下公式:
[0040] Y=AT[(GgGT)⊙(BTdB)]A
[0041] 其中的计算符代表的是元素相乘。
[0042] 由winogard算法的原理可推出对应的矩阵数据:
[0043]
[0044]
[0045]
[0046] g=[g0 g1 g2]T
[0047] d=[d0 d1 d2 d3]T
[0048] 对于共享滤波器的卷积计算来说,可以将M=GgGT,提到卷积计算来计算,可节省大量计算。同时由于winogard算法已经将矩阵乘积的时间复杂度降到了n2.38,故而能大大降低整个卷积的计算时间。
[0049] 同理,可得出得出F(4x4,3x3)的计算矩阵:
[0050]
[0051]
[0052]
[0053] 由于F(4x4,3x3)加加多了加法运算减少乘法计算次数,速度上比F(2x2,3x3)对计算整个卷积核要快,但在误差上也会比F(2x2,3x3)更大,特别是在双精度数据下,其误差针对基本计算有10-3。
[0054] 由于这种计算模式都是小核卷积,因此需要根据每次进行计算数据的大小进行分块,使其在一个节点中并行的cpu核数与每个核的计算量达到较优的匹配程度,分配过程中注意对边缘数据的补齐,最终统一整合起来形成完整的卷积核。
[0055] Winograd算法是一种快速矩阵乘法的算法。一般矩阵的乘法时间复杂度往往都在Θ(n^3),而Winograd算法是通过中国余数定理,将矩阵在相乘前做相应的处理,再通过转换后的矩阵进行对应元素相乘,最后再做转换得到最终的矩阵。Winograd算法增加了加法的数量,但是大大降低了乘法的数量,使得时间复杂度达到了Θ(n^2.38),整体上提升了矩阵乘法的速度。由于卷积神经网络中运算最多的就是矩阵乘法,将此算法运用到其中,将会大幅度的提升运行效率。实际测试中,其效率最高达到了4倍的提升。
[0056] 具体地,关于步骤2:F(MxM,RxR)算法结构及OpenMP并行。
[0057] 可以参考下列代码进行拓展和运用,这里给出的代码为F(MxM,RxR)的一个框架式代码。
[0058]
[0059]
[0060] 关于上述代码,其中,SIMD是针对矩阵运算进行向量化,B代表Batch大小,K是代表卷积核的个数,C是代表通道个数,N是代表单个计算的数据块大小,这里N=x*y(x,y就是对应单个数据的长宽)。
[0061] 此外,添加Openmp编译指示,例如在代码段:
[0062]
[0063]
[0064] 在代码段前添加:#pragma omp parallel for private(i,j,n),使其可以分配到多个线程进行运算。
[0065] 具体地,步骤3:向量化处理。
[0066] 将数据顺序装入向量寄存器中,使数据连续,以便后续的向量化计算。
[0067] 针对F(MxM,RxR)框架式代码中的SIMD部分,将相邻计算矩阵中同样位置的数据进行组合成一个向量。向量大小和组合个数根据向量寄存器和基本数据单位决定,其计算方法为:N=E/g(N为向量中包含数据个数,E为向量寄存器大小,g为单个数据大小。以512向量存器2为例,float为基本数据,N=512/16为32,意味着向量化可以同时计算32个拥有相同计算方式的数据)。这种处理方式就能使我们同时计算32个矩阵的数据,如果矩阵个数不能被32整除,那么最后做单个常规计算处理。
[0068] 下面为一个简单的数据导入向量寄存器代码(具体用法请自行参考intel官网),例如:
[0069] __m512bufB,bufC,bufD;
[0070] bufB=_mm512_load_ps(&dataSrc[(x+0)*nrows+(y+0)]);
[0071] bufC=_mm512_load_ps(&dataSrc[(x+0)*nrows+(y+16)]);
[0072] bufB=_mm512_load_ps(&dataSrc[(x+0)*nrows+(y+2)]);
[0073] bufC=_mm512_load_ps(&dataSrc[(x+0)*nrows+(y+18)]);
[0074] 向量化计算是一种特殊的并行计算方式,相比于一般的程序在同一时间只执行一个操作的方式,向量化计算可以在同一时间执行多次操作,通常是对不同的数据执行同样的一个或一批指令,或者说把指令应用于一个数组或者是一个向量,因此能大幅提高运行效率。
[0075] 更进一步地,如图1所示,对于大型滤波器(卷积核)进行转换,一般较大的卷积核2
为7x7的,它等同于进行3次3x3的卷积核,其计算次数:7x7:C×(7×7×C)=49C ,而3次3x3卷积为:3x3:3×C×(3×3×C)=27C2(这里C是数据通道个数)。而后有多个卷积核,进行分多节点或多计算核心处理。而后进入卷积后,用F(MxM,RxR)算法进行卷积运算,再进行激活函数,池化处理,直到多层卷积完成。
[0076] 具体地,验证与测试内容如下:
[0077] 基于Intel Xeon Phi(TM)系列的CPU平台,其中一个CPU有256个核心。核心频率是1.3GHz。在编译过程中,使用ICC编译器,并且使用-openmp,-MKL,-xhost等编译选项进行测试。
[0078] F(4x4,3x3)算法、64计算核心,如表1所示:
[0079] 表1
[0080]num C-H-W-K Gflops Time(ms)
1 1-40-1024-32 80.43 17.80
2 64-20-512-64 1901.09 22.78
3 256-6-512-256 3889.96 39.59
4 256-6-512-512 4436.60 39.59
5 512-6-512-512 4488.06 137.26
6 512-6-1024-2048 6064.27 814.30
[0081] F(2x2,3x3)算法、64个核心,如表2所示:
[0082] 表2
[0083]Num C-H-W-K Gflops Time(ms)
1 1-40-1024-32 63.44 22.56
2 64-20-512-64 1648.86 26.28
3 256-6-512-256 2445.98 62.96
4 256-6-512-512 2754.91 111.81
5 512-6-512-512 2967.14 207.62
6 512-6-1024-2048 3738.14 1321.01
[0084] F(2x2,3x3)算法、1个核心,如表3所示:
[0085] 表3
[0086]num C-H-W-K Gflops Time(ms)
1 1-40-1024-32 2.76 518.19
2 64-20-512-64 57.84 748.92
3 256-6-512-256 87.90 1752.19
4 256-6-512-512 96.55 3190.37
5 512-6-512-512 101.01 6098.92
6 512-6-1024-2048 112.48 43903.76
[0087] 直接计算算法、1个核心,如表4所示:
[0088] 表4
[0089]
[0090]
[0091] 通过本发明的优化方法改进的卷积神经网络程序大幅度提高并行的效率、减少运算的复杂度,能够从根本上降低运算开销,降低程序的运行时间。其中基础算法改到F(2x2,3x3)算法,最好的效率提升了15倍左右;而后算法并行化,最好的效率提升了30倍左右;F(2x2,3x3)更改为F(4x4,3x3)算法,最好效果也提升了1倍左右。这些提升在上百万级数据训练的卷积神经网络来说,有非常大的帮助。
[0092] 需要注意的是,上述具体实施例是示例性的,本领域技术人员可以在本发明公开内容的启发下想出各种解决方案,而这些解决方案也都属于本发明的公开范围并落入本发明的保护范围之内。本领域技术人员应该明白,本发明说明书及其附图均为说明性而并非构成对权利要求的限制。本发明的保护范围由权利要求及其等同物限定。