武 錚 安 虹 金 旭 遲孟賢 呂國鋒 文 可 周 鑫
(中國科學(xué)技術(shù)大學(xué) 合肥 230022)
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network, CNN)[1]由于感受野、權(quán)值共享和池化等特點,大大降低了神經(jīng)網(wǎng)絡(luò)訓(xùn)練需要的參數(shù)數(shù)目,使得更深層神經(jīng)網(wǎng)絡(luò)的使用成為可能,提高了訓(xùn)練的效率以及收斂的效果,成為了深度學(xué)習(xí)中最為典型且性能優(yōu)越的一種網(wǎng)絡(luò)模型.近年來,CNN更是在多個方向持續(xù)發(fā)力[2],語音處理、文本提取、圖像識別、通用物體識別、運動分析、自然語言理解甚至電腦波分析等方面均具有巨大突破[3-4].同時CNN也推動著人工智能的快速發(fā)展,ImageNet大賽[5]、Facebook圖像自動標(biāo)簽、Google無人駕駛汽車以及第1個戰(zhàn)勝世界圍棋冠軍的人工智能程序AlphaGo,這些無一不彰顯著智能化時代到來的可能.對于CNN,其靈魂就是卷積[6],而卷積不僅僅局限于CNN,在很多其他網(wǎng)絡(luò)模型中也都有涉及.由此可見,卷積性能的好壞對于整個深度學(xué)習(xí)領(lǐng)域有著非凡的影響.對于卷積,當(dāng)前主流的算法有GEMM[7],F(xiàn)FT[8-9],Winograd[10].這3種算法中除了GEMM,其他2種都是以增加一定的操作復(fù)雜度為代價獲取更低的計算復(fù)雜度,從而提升卷積的性能,其中又以Winograd做卷積時計算復(fù)雜度最低[7].
盡管如今對于深度學(xué)習(xí)的探索和創(chuàng)新層出不窮,但是這些研究多數(shù)是基于NVIDIA GPU平臺[11-14].本文另辟蹊徑,選擇Intel平臺作為研究環(huán)境,其主要原因是Intel是高性能計算的支柱之一,但進軍深度學(xué)習(xí)領(lǐng)域時間較短,因而具有更大的潛力和挖掘空間.以卷積舉例,目前Intel平臺僅對于GEMM算法有較高的支持力度.
本次研究選擇Intel第2代Xeon Phi處理器KNL(knigths landing)7250作為研究平臺,結(jié)合該平臺特性對Winograd快速卷積進行實現(xiàn)與優(yōu)化.一方面通過測試VGG19,對比Intel MKL(math kernel library) DNN(deep neural network)中卷積性能,最終取得了2倍多的加速比;另一方面通過測試常用卷積類型,對比Intel MKL DNN和NVIDIA cuDNN[7],證明了本文的Winograd算法對于常用卷積類型具有很好的適應(yīng)性且具有實際使用價值.本次研究,我們并不是要提供一個功能完善的卷積接口,而是借此讓更多的研究者看到Intel平臺在深度學(xué)習(xí)領(lǐng)域的潛力和價值,為Intel平臺在深度學(xué)習(xí)領(lǐng)域的發(fā)展打開一道里程碑式的大門,也期望能夠為深度學(xué)習(xí)領(lǐng)域的蓬勃發(fā)展帶去更多的動力.
20世紀60年代,Hubel和Wiesel在研究貓的大腦皮層中用于局部敏感和方向選擇的神經(jīng)元時發(fā)現(xiàn)其獨特的網(wǎng)絡(luò)結(jié)構(gòu)可以有效地降低反饋神經(jīng)網(wǎng)絡(luò)的復(fù)雜度,繼而提出了卷積神經(jīng)網(wǎng)絡(luò).
CNN相比于其他的神經(jīng)網(wǎng)絡(luò)最大的優(yōu)勢在于局部權(quán)值共享的特征,使其在數(shù)據(jù)量較大的圖像識別、語音處理等方面只需要非常少的網(wǎng)絡(luò)參數(shù),在保證收斂結(jié)果的同時大大降低了網(wǎng)絡(luò)的運行時間,提高了網(wǎng)絡(luò)的運行效率.
卷積是CNN的核心,而卷積的過程就是依據(jù)局部感受野的原理對輸入通過卷積核進行特征提取,最終得到特征總結(jié)后的輸出.
我們將輸入記為INn,c,i nh,i nw(1≤n≤N,1≤c≤C,1≤inh≤Hin,1≤inw≤Win),表示N個圖片、C個通道以及圖片大小為Hin×Win;卷積核記為FLTk,c,r,s(1≤k≤K,1≤r≤R,1≤s≤S),表示K個特征映射、C個通道以及卷積核大小R×S;輸出記為OUTn,k,o uth,o utw(1≤outh≤Hout,1≤outw≤Wout),表示N個圖片、K個特征映射以及圖片大小Hout×Wout.由此,可將卷積公式記錄為[15]
(1)
我們可將式(1)簡寫為
(2)
其中,*表示卷積操作.
Winograd算法是基于1980年Winograd的最小濾波算法(minimal filtering algorithm)提出的一種快速卷積算法[16],適用于小尺寸的卷積核做卷積,主要是通過降低卷積的計算復(fù)雜度從而提升卷積效率.
對于mininal filtering algorithm,以下簡稱為mini-filter算法.一維數(shù)據(jù)的情況下,當(dāng)輸出大小為m,過濾器大小為r,可將該算法記為F(m,r).此時,算法運算需要μF((m,r))=m+r-1次乘法操作[10].
一維的mini-filter算法可以表示成矩陣:
y=AT((Gw)⊙(BTx)),
(3)
其中,⊙表示hadamard乘積;x表示輸入,w表示過濾器,y表示輸出;AT,G,BT表示該算法的系數(shù)矩陣,其值由m和r決定,例如F(2,3)有:
從上述計算過程可以看出,其就是跨度為1的卷積操作.由此,我們可以把一維的mini-filter看成是一維的卷積操作.通過嵌套一維的mini-filter,可以得到特殊情況下的二維mini-filter矩陣:
y=AT((GwGT)⊙(BTxB))A,
(4)
可將此時的mini-filter算法表示成F(m×m,r×r).
將上述計算過程應(yīng)用到CNN中的卷積,也就是算法1[10].
算法1. Winograd快速卷積算法(F(m×m,r×r)).
輸入:
α2是輸入塊的尺寸,α=m+r-1;
相鄰塊之間的覆蓋為r-1;
xc,b是索引為c的通道上索引為b的輸入塊;
XTile是轉(zhuǎn)換后的輸入重新布局得到的對應(yīng)矩陣;
wk,c是索引為k的特征映射上索引為c的卷積核;
WTile是轉(zhuǎn)換后的卷積核重新布局得到的對應(yīng)矩陣;
BT,G,AT分別是輸入、卷積核、輸出的轉(zhuǎn)換系數(shù);
yk,b是k通道上索引為b的輸出塊;
YTile是轉(zhuǎn)換后的輸出重新布局得到的對應(yīng)矩陣;
輸出:yk,b,YTile.
fork=0 toKdo
forc=0 toCdo
wTile=Gwk,cGT;
scatter(wTile)→WTile;
end for
end for
forc=0 toCdo
forb=0 toTdo
xTile=BTxc,bB;
scatter(xTile)→XTile;
end for
end for
forζ=0 toαdo
forν=0 toαdo
end for
end for
fork=0 toKdo
forb=0 toTdo
gather(YTile)→yTile;*收集YTile中對應(yīng)位置的數(shù)據(jù),組成需要的輸出塊yTile*
yk,b=BTyTileB;
end for
end for
對于二維數(shù)據(jù),Winograd的卷積如式(4)所示,其中x表示輸入塊,w表示卷積核,y表示輸出塊,矩陣AT,G,BT則表示轉(zhuǎn)換時的系數(shù)矩陣.由此,本次研究中Winograd設(shè)計原理如圖1所示.
假設(shè)輸入維度為[N,C,Hin,Win],卷積核的維度為[K,C,r,r],填充為0,跨度為1,使用Winograd算法F(m×m,r×r).為了方便描述,設(shè)t=m+r-1.
Fig. 1 The priciple of design for Winograd fast convolution圖1 Winograd快速卷積設(shè)計原理
步驟1. 確定對應(yīng)系數(shù)矩陣AT,G,BT,為了方便后續(xù)說明,我們假設(shè)wTile=GwGT,xTile=BTxB,所以Winograd算法變形為y=AT(wTile⊙xTile)A.
步驟3. 對每個卷積核做GwGT轉(zhuǎn)換,并重排轉(zhuǎn)換后的數(shù)據(jù)成1組矩陣.這組矩陣由t2個K×C的列優(yōu)先的小矩陣組成,每個小矩陣索引為(tflt)(其中1≤tflt≤t2).
出于計算效率的考慮,通過對輸入和卷積核轉(zhuǎn)換后的數(shù)據(jù)進行布局重排,將核心計算⊙轉(zhuǎn)換為矩陣乘,調(diào)用MKL中的矩陣乘接口.
出于內(nèi)存重用的考慮,每層卷積層使用共有的內(nèi)存空間存儲輸入、卷積核和輸出轉(zhuǎn)換后數(shù)據(jù),這樣不僅能夠節(jié)省大量的內(nèi)存空間,同時也有利于提高數(shù)據(jù)的空間局部性.
在深度學(xué)習(xí)中,卷積層進行卷積時,大小為1的零填充是十分常見的現(xiàn)象,因為這樣不僅能夠保留輸入的邊緣特征,同時也能夠防止輸出大小縮減太快以至于神經(jīng)網(wǎng)絡(luò)模型層數(shù)不深.
對于傳統(tǒng)零填充,往往需要開辟出一塊新的內(nèi)存,再將原始數(shù)據(jù)和填充數(shù)據(jù)按對應(yīng)位置賦值給這段內(nèi)存.這種方式不僅訪存代價高,而且會消耗大量內(nèi)存.
為解決這一問題,本文提出了新的數(shù)據(jù)填充方式——虛擬化填充.我們定義2種數(shù)據(jù)類型:實數(shù)據(jù)和虛數(shù)據(jù),其中實數(shù)據(jù)來自原始輸入,虛數(shù)據(jù)為填充時邊緣填充為0的數(shù)據(jù).如圖2所示,在模取輸入數(shù)據(jù)時,假設(shè)輸入數(shù)據(jù)已經(jīng)填充完成,通過對數(shù)據(jù)位置的判斷,決定該位置是虛數(shù)據(jù)置0,還是實數(shù)據(jù)對應(yīng)原始輸入數(shù)據(jù)值.
Fig. 2 Virtualized padding圖2 虛擬化填充
虛擬化填充解決了額外內(nèi)存開銷和填充后數(shù)據(jù)訪存開銷的問題,但是對于Winograd卷積中輸入的轉(zhuǎn)換部分,單純的虛擬化填充需要在最內(nèi)層循環(huán)中使用大量的分支判斷語句來判定該位置是屬于實數(shù)據(jù)還是虛數(shù)據(jù),大大破壞了程序的連貫性.同時,分支預(yù)測失敗會引起流水線空泡,降低程序的IPC(instructions per cycle),影響程序的性能.
Fig. 3 Padding partition圖3 分區(qū)填充
基于上述情況,提出了分區(qū)填充,旨在消除虛擬化填充中分支判斷語句的存在,具體操作如圖3所示.
將輸入數(shù)據(jù)劃分為3個區(qū)域——塊中所有數(shù)據(jù)都是實數(shù)據(jù)組成的區(qū)域、塊中整數(shù)行或列是虛數(shù)據(jù)的區(qū)域、塊中整數(shù)行且列都是虛數(shù)據(jù)的區(qū)域.通過對輸入數(shù)據(jù)進行分區(qū),可以消除分支判斷語句,從而避免分支預(yù)測失敗對程序整體連貫性的影響,提高指令級并行度,保證程序的執(zhí)行效率.
虛擬化填充結(jié)合分區(qū)填充的方式針對大規(guī)模的數(shù)據(jù)填充起到了非常好的效果.但當(dāng)數(shù)據(jù)規(guī)模較小時,由于內(nèi)存空間的需求不是很高,訪存時間比較少,可以嘗試使用傳統(tǒng)填充方法.雖然會造成一定的內(nèi)存浪費和訪存開銷,但是會大大降低操作的復(fù)雜度,反而更為有利.
為了更進一步提升傳統(tǒng)填充的效率,可以從減少頻繁的內(nèi)存空間分配和釋放入手.如圖4所示,在輸入數(shù)據(jù)轉(zhuǎn)換前分配一塊內(nèi)存空間,大小為nt(H+2ph)(W+2pw),并將其通過線程索引進行分塊綁定.對于某個線程,用于存儲轉(zhuǎn)換數(shù)據(jù)的內(nèi)存空間大小為t(H+2ph)(W+2pw),起始地址為initAddr+tIndex(H+2ph)(W+2pw) (其中,nt表示線程數(shù),ph和pw表示橫縱向的填充大小,initAddr表示起始地址,tIndex表示線程索引).
Fig. 4 The strategy for the scale of padding圖4 填充規(guī)模策略
通過引入填充規(guī)模策略,針對不同規(guī)模的輸入數(shù)據(jù)采用不同的填充方式:大規(guī)模數(shù)據(jù)采用虛擬化填充加分區(qū)填充,小規(guī)模數(shù)據(jù)采用優(yōu)化后的傳統(tǒng)填充,從而盡可能實現(xiàn)不同數(shù)據(jù)規(guī)模下的填充最優(yōu)化.
根據(jù)圖1中Winograd快速卷積原理,在進行核心計算時,其本質(zhì)是做t2×N個小矩陣乘,其中每個卷積核的小矩陣會同N個輸入數(shù)的小矩陣相乘,因此可以考慮將這N個輸入數(shù)據(jù)小矩陣合并到一起變成一個大矩陣再同卷積核的小矩陣做矩陣乘,從而增加矩陣乘的規(guī)模,提升矩陣運算的效率.
因為在做核心計算時的矩陣乘是并行執(zhí)行的,一個線程負責(zé)數(shù)個矩陣乘.因此如圖5所示,在做合并時,可以選擇不同尺度的合并.以Merge值為合并尺度,從而將N個輸入小矩陣合并為NMerge個CHout/mWout/mMerge的大矩陣,同對應(yīng)的卷積核小矩陣做矩陣乘.一方面兼顧了并行時的多線程粒度,另一方面也兼顧了MKL矩陣乘接口的性能.
Fig. 5 Merge strategy圖5 合并策略
Winograd快速卷積算法在某種意義上可以看成是傳統(tǒng)卷積的擴展,不同點在于傳統(tǒng)卷積在計算Output數(shù)據(jù)時是一次1個元素(對于二維數(shù)據(jù),可以看成1×1的塊),而Winograd則是一次n個元素(其中n>1,同樣對于二維數(shù)據(jù),可以看成n×n的塊).
通過F(2×2,3×3)同MKL卷積的比較中我們知道,兩者對于不同規(guī)模的卷積各有優(yōu)勢.由此,不難猜想通過擴展Winograd算法的尺度,可以更好地適應(yīng)不同規(guī)模的卷積(對于Winograd算法F(m×m,r×r),m值的大小決定著算法的尺度).
本次研究中使用3種不同尺度的Winograd算法,分別為F(2×2,3×3),F(xiàn)(3×3,3×3),F(xiàn)(4×4,3×3).在混合使用時,可以分為結(jié)構(gòu)級混合和數(shù)據(jù)級混合,前者是指當(dāng)前卷積層選用3種Winograd算法中的一種做卷積,后者是指當(dāng)前卷積層的卷積分成多個部分,每個部分分別使用3種Winograd算法中的一種.
Winograd算法中,對于輸入、卷積核和輸出的轉(zhuǎn)換可以表述為
xTile=BTxB,
wTile=GwGT,
y=ATyTileA,
其中,AT,G,BT為Winograd算法的轉(zhuǎn)換系數(shù),是由F(m×m,r×r)確定的已知數(shù)組.因此,在進行數(shù)據(jù)轉(zhuǎn)換時,可以分為2種轉(zhuǎn)換方式:分離轉(zhuǎn)換和統(tǒng)一轉(zhuǎn)換.
以輸入數(shù)據(jù)為例說明,統(tǒng)一轉(zhuǎn)換是將Winograd算法BTxB轉(zhuǎn)換過程中的2次矩陣乘合并到一起,以輸入模取的數(shù)據(jù)作為未知量x,由此獲取轉(zhuǎn)換后的數(shù)據(jù)xTile關(guān)于x的線性關(guān)系.
以輸入數(shù)據(jù)為例說明,分離轉(zhuǎn)換是將Winograd算法轉(zhuǎn)換過程中的2次矩陣乘分開進行,以輸入模取的數(shù)據(jù)為未知量x,由此獲取第1次矩陣運算后得到的橋數(shù)據(jù)b關(guān)于x的線性關(guān)系;再以b為未知量,得到轉(zhuǎn)換后的數(shù)據(jù)xTile關(guān)于b的線性關(guān)系.
對于統(tǒng)一轉(zhuǎn)換,計算量少,但是所有的線性關(guān)系呈橫向鋸齒形,雜亂無規(guī)律,難以優(yōu)化.對于分離轉(zhuǎn)換,計算量較多,但所有的線性關(guān)系呈平面方形,平整有序,非常有利于向量化操作.
本次研究中,將前期的統(tǒng)一轉(zhuǎn)換用分離轉(zhuǎn)換替換,可以大大提升程序的性能.
隨著batch的變大,處理的數(shù)據(jù)變得越來越多,使用到的內(nèi)存也變得越來越大.當(dāng)該層實際使用到的內(nèi)存超出MCDRAM大小16 GB時,程序性能將會急速下降.
因此,對于大batch的卷積層,可以將batch分塊處理,從而保證程序的性能.依據(jù)此,可以將batch的處理分為2種方式:統(tǒng)一批處理和分塊批處理,前者是一次性處理所有batch,后者是將batch分塊再處理.
分塊的性能并不總是最優(yōu)的,對于小batch,在進行Winograd卷積時,實際使用到的內(nèi)存也會很小,此時如果仍然使用分塊批處理,反而會因為無法發(fā)揮MCDRAM的優(yōu)勢以及多線程的效率,導(dǎo)致程序性能下降.因此,Winograd算法卷積實際使用到的內(nèi)存在不超過MCDRAM大小時,選用統(tǒng)一批處理;實際使用到的內(nèi)存超過MCDRAM大小時,選用分塊批處理.
Intel KNL是Intel第2代MIC架構(gòu)Xeon Phi至強融合處理器[17],是Intel首款專門針對高度并行工作負載而設(shè)計的可獨立自啟動的處理器,可繼續(xù)做協(xié)處理器,也可獨立做中央處理器.
如圖6所示,Intel KNL處理器架構(gòu)衍生于Intel Atom處理器,采用Silvermont架構(gòu)的改進定制版和14 nm工藝,由38個Tile組成(最多有36個Tile處于活動狀態(tài)),核心數(shù)量可達72個,最大支持線程數(shù)為288,雙精度浮點性能超3 TFLOPS,單精度浮點性能超6 TFLOPS.每個Tile包含2個Core,每個Core擁有2個向量化處理單元VPU,相同Tile里面的2個Core共享1塊大小為1 MB的L2緩存.
Fig. 6 The structure of Intel KNL processor[18]圖6 Intel KNL處理器架構(gòu)[18]
Intel KNL相比于第1代Xeon Phi至強融合處理器,為了能夠獲取更高的性能,在架構(gòu)方面有著非常顯著的改變.Intel KNL的核布局不再是傳統(tǒng)的環(huán)形布局,而變成了二維網(wǎng)格狀布局,可以說是從線的布局方式提升到了面的布局方式,在進行核與核之間交互時具備了更高的效率;內(nèi)存分成2部分:1)2個3通道的DDR4,每個通道可承擔(dān)64 GB DIMMs,總?cè)萘靠蛇_384 GB;2)8個2 GB的MCDRAM設(shè)備,共16 GB.其中DDR4的訪存帶寬是90 GBps,MCDRAM帶寬遠超DDR4,可達450 GBps;MCDRAM既可做內(nèi)存也可做緩存,據(jù)此,在啟動設(shè)置時可以有3種模式:1)當(dāng)MCDRAM做內(nèi)存使用時,為Flat模式;2)當(dāng)MCDRAM做緩存使用時,為Cache模式;3)當(dāng)MCDRAM一部分做內(nèi)存使用且一部分做緩存使用時,為Hybrid模式;單節(jié)點KNL可模擬成多節(jié)點,稱之為SNC模式,分別是No SNC(All2All,Heimisphere,Quadrant),SNC-2,SNC-4;支持AVX-512指令集,向量化操作更加完善.
本次研究中使用的是Intel KNL 7250,配置如表1所示:
Table 1 Configure Parameters for Intel KNL 7250表1 Intel KNL 7250配置參數(shù)
為了更好地驗證本文Winograd的實現(xiàn)效果,故將實驗過程分為3個階段:
1) 選擇VGG19作為測試網(wǎng)絡(luò),驗證Winograd各級優(yōu)化方案累加效果.
2) 同樣選用VGG19作為測試網(wǎng)絡(luò),測試Intel KNL不同SNC模式和Memory模式對本文Winograd卷積性能的影響.
3) 抽取典型卷積網(wǎng)絡(luò)模型AlexNet,GoogleNet,ResNet,VGG11,VGG16,VGG19中卷積層的卷積參數(shù),測試本文的Winograd,Intel MKL DNN,NVIDIA cuDNN三者的卷積性能,對比驗證本文Winograd對于常用卷積類型的適用性以及是否具有實際使用價值.
3.2.1 各級優(yōu)化累加
通過測試VGG19中卷積在Winograd算法各級優(yōu)化累加下的運行時間,對比Intel MKL DNN,如圖7所示.其中,柱狀圖顯示的是運行的總時間大小,折線圖顯示的是Winograd的加速比.
由圖7可以看出:虛擬化填充在避免傳統(tǒng)填充方式額外內(nèi)存開銷和訪存弊端的同時引入大量分支判斷,嚴重破壞了程序的連貫性,使得程序的整體性能很差,加速比僅有0.45;分區(qū)填充避免了填充虛擬化造成的大量分支判斷,大大提升了程序的性能,使得加速比達到0.91;填充規(guī)模策略考慮小規(guī)模卷積使用優(yōu)化后的傳統(tǒng)填充方式,此時額外的內(nèi)存開銷和訪存不會對程序性能造成太大的影響,通過該策略加速比達到0.92;合并策略通過配置最佳的合并尺度,充分發(fā)揮了矩陣乘的性能,加速比達到1.15;不同尺度Winograd算法對于不同規(guī)模的卷積具有更好的適應(yīng)性,通過混合F(3×3,3×3),加速比達到1.34.通過混合F(4×4,3×3),加速比達到1.41;分離轉(zhuǎn)換將數(shù)據(jù)轉(zhuǎn)換分成2部分,使得轉(zhuǎn)換過程具有工整對齊的計算公式,向量化得以充分發(fā)揮,加速比達到2.01;理論上,如果將Winograd快速卷積同Intel MKL DNN混合使用,最佳加速比可以達到2.11.
3.2.2 混合模式
Intel KNL新的架構(gòu)特征,在很大程度上提升了訪存的性能.同時,為了進一步提高核與內(nèi)存、核與核之間的交互效率,加入了Memory模式和SNC模式[18].
Memory模式又分為Flat,Cache,Hybrid,取決于MCDRAM在處理器中的角色(memory還是cache).SNC模式又分為No SNC(All2All,Heimi-sphere, Quadrant),SNC-2,SNC-4,取決于KNL處理器NUMA后的節(jié)點數(shù).
通過混合2種模式,我們期望找出Winograd算法的最適情況.如表2所示:
Table 2 The Performance of Winograd with Different Modes表2 不同模式下Winograd性能 ms
SNC-2以及SNC-4模式下,程序性能均有很明顯的下降,其他模式下性能略有差距.對于本文的Winograd算法,Intel KNL的最適SNC模式是Quadrant,對于Memory模式,F(xiàn)lat和Cache差距極小,考慮到誤差的可能,可以認為兩者皆為最佳模式.
3.2.3 常用卷積類型
為了進一步驗證本文的Winograd算法對于常用卷積是否具有實際意義,我們抽取典型卷積網(wǎng)絡(luò)模型AlexNet,GoogleNet,ResNet,VGG11,VGG16,VGG19中卷積層的卷積參數(shù),測試對比本文Winograd,Intel MKL DNN,NVIDIA cuDNN的卷積性能.
在GPU的選擇上,我們選取的是Intel KNL的同代GPU Tesla M40.因此在對比時要綜合考慮硬件平臺本身性能的差距,其中KNL7250的單精浮點性能是6.1 TFLOPS,Tesla M40的單精浮點性能是7 TFLOPS,所以時間計算為
考慮不同卷積運行時間差距太大,可以將Intel MKL DNN的卷積時間作為標(biāo)準(zhǔn),從而直接對比三者間的性能比
PerformanceIntel MKL DNN=
TimeIntel MKL DNN/TimeIntel MKL DNN,PerformanceNVIDIA cuDNN=
TimeIntel MKL DNN/TimeNVIDIA cuDNN,PerformanceWinograd=
TimeIntel MKL DNN/TimeWinograd.
我們總共抽取了46種不同規(guī)模的卷積,并按照計算量從小到大排列,分別就無填充和填充2種情況做測試,結(jié)果如圖8和圖9所示:
Fig. 8 Different convolution performance comparison with no pad圖8 無填充下的不同卷積性能對比
Fig. 9 Different convolution performance comparison with pad圖9 填充下的不同卷積性能對比
從總體卷積來看,無填充和填充情況下,本文的Winograd算法相比Intel MKL DNN有61%和60%的性能提升,相比NVIDIA cuDNN也有13%和8%的性能提升.
從單個卷積來看,無填充和填充情況下,有性能提升的卷積占總數(shù)的67.4%和58.7%,性能相當(dāng)?shù)木矸e占總數(shù)的17.4%和13%;卷積的規(guī)模越大,Winograd算法的性能往往越好.
綜上可得,本文的Winograd快速卷積對于大多數(shù)常用卷積類型具有性能提升,且大規(guī)模卷積性能提升最為明顯.在對比Intel MKL DNN時具有明顯優(yōu)勢,即使對比NVIDIA cuDNN也是略勝一籌,可見本文的Winograd快速卷積具有實際使用價值.
通過在Intel KNL平臺上對Winograd快速卷積的研究與優(yōu)化,一方面以VGG19作為測試網(wǎng)絡(luò),對比Intel MKL DNN,最終提升了1倍多(加速比2.01)的卷積性能;另一方面,測試常用卷積類型性能,對比Intel MKL DNN和NVIDIA cuDNN,證明了本文的Winograd算法對于常用卷積類型具有很好的適用性且具有實際使用價值.但這并不是結(jié)束,相反這僅僅是一個開始,未來仍有許多的路要走,比如:提升算法對于小規(guī)模卷積的適用性;合并策略在進行尺度判斷時,仍需要手動配置,無法自動決定最佳的合并尺度; 統(tǒng)一批處理和分塊批處理的判斷仍然需要進行大量測試以決定最終的邊界,簡單地以MCDRAM的大小作為邊界并不是最合適的方案;Intel MKL DNN和Winograd最適情況的標(biāo)準(zhǔn)仍需研究界定等.同時,基于算法的角度考慮,不同尺度的Winograd算法對于不同規(guī)模的卷積適應(yīng)性更強,可以從這一方面出發(fā),通過進一步擴大Winograd算法的尺度提升性能;基于Intel平臺的考慮,可以從數(shù)據(jù)預(yù)取出發(fā),進一步提升算法性能.未來我們將從這些方面入手,對Winograd算法做進一步的完善.
本文研究工作并不是去優(yōu)化一個完善的快速卷積算法,更多的是彰顯Intel平臺在深度學(xué)習(xí)領(lǐng)域的潛力和價值,為其后續(xù)發(fā)展提供重要的指導(dǎo)意義,借此為人工智能領(lǐng)域的蓬勃發(fā)展貢獻一份力量.