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