童 敢,黃立波
國防科技大學(xué) 計(jì)算機(jī)學(xué)院,長沙410073
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)在計(jì)算機(jī)視覺、自然語言處理等任務(wù)上應(yīng)用廣泛。越來越多的研究嘗試加速CNN 的訓(xùn)練和推理,使用快速卷積算子就是其中的重要方法??焖倬矸e算子包括快速傅里葉變換(fast Fourier transformation,F(xiàn)FT)卷積和Winograd 卷積,這類卷積通過把輸入特征映射和卷積核線性變換到相應(yīng)的空間,將原來的運(yùn)算轉(zhuǎn)換為對應(yīng)位相乘,運(yùn)算結(jié)果再經(jīng)過逆線性變換即可得到原特征映射空間的輸出。
在“變換-運(yùn)算-逆變換”的過程中,乘法運(yùn)算的次數(shù)比直接卷積有可觀的減少,而代價(jià)則是加法運(yùn)算次數(shù)的增加。在絕大多數(shù)現(xiàn)代處理器上,加法的執(zhí)行效率遠(yuǎn)高于乘法,因此可以使用快速卷積算子來提高模型執(zhí)行效率。由于FFT 變換是映射到復(fù)數(shù)空間,Winograd 卷積運(yùn)算過程中對內(nèi)存的占用只需FFT卷積的一半,使其迅速成為最流行的快速卷積算子。
但是直接應(yīng)用Winograd 卷積存在很多挑戰(zhàn)。首先,基本的Winograd 卷積適用范圍有限,僅可在單位步長、小卷積核的二維卷積上應(yīng)用,在大卷積核上應(yīng)用則會(huì)有數(shù)值不穩(wěn)定的情況。其次,由于線性變換和逆線性變換的復(fù)雜性,快速卷積算子在特定平臺(tái)上的優(yōu)化難以實(shí)現(xiàn),比如利用并行性和數(shù)據(jù)局部性。此外,Winograd 卷積與以剪枝和量化為代表的網(wǎng)絡(luò)壓縮技術(shù)難以直接結(jié)合,因此不易在算力不足和有能耗限制的平臺(tái)上部署實(shí)現(xiàn)。針對這些問題,研究者做了大量的工作,但至今還未有公開的文章對相關(guān)工作進(jìn)行系統(tǒng)性的總結(jié)。為給后續(xù)研究者提供參考,本文從算法拓展、算法優(yōu)化、實(shí)現(xiàn)與應(yīng)用三方面綜述Winograd 的發(fā)展,并對未來可能的研究方向做出展望。
Winograd 于1980 年提出了有限脈沖響應(yīng)(finite impulse response,F(xiàn)IR)濾波的最小濾波算法。最小濾波算法指出,由拍的FIR濾波器生成個(gè)輸出,即(,),需要的最少乘法數(shù)量((,))為+-1。以(2,3)為例,涉及到的乘法數(shù)量為((2,3))=2+3-1=4,從6 次降低到了4 次。
2015 年,Winograd 最小濾波算法初次被應(yīng)用在CNN 中,利用減少的乘法次數(shù)提升卷積算子性能。如果用矩陣的形式表示W(wǎng)inograd 最小濾波算法,則可以得到:
其中,為濾波器向量,為輸入數(shù)據(jù)向量,為輸出數(shù)據(jù)向量,表示濾波器變換矩陣,表示數(shù)據(jù)變換矩陣,⊙表示矩陣的對應(yīng)位相乘(Hadamard積),表示輸出變換矩陣。通過嵌套一維最小濾波算法(,),可以得到二維的最小濾波算法(×,×):
二維最小濾波算法所需乘法數(shù)為(+-1),而原始卷積算法需要乘法數(shù)為×××。對于(2×2,3×3)而言,乘法次數(shù)從36降低到了16,減少了55.6%。
根據(jù)二維矩陣形式,可以自然地將Winograd卷積分為四個(gè)分離的階段:輸入變換(input transformation,ITrans)、卷積核變換(kernel transformation,KTrans)、對應(yīng)位相乘(element-wise matrix multiplication,EWMM)和輸出變換(output transformation,OTrans),如圖1所示。
圖1 Winograd 卷積的四個(gè)階段Fig.1 Four stages of Winograd convolution
對于二維卷積算子,需要先將卷積輸入劃分為相互重疊的(+-1)×(+-1)的切片,切片之間有-1 的重疊部分。實(shí)驗(yàn)表明,(2×2,3×3)在多個(gè)卷積上的實(shí)現(xiàn)性能超過了NVIDIAcuDNN,而且使用的內(nèi)存大小遠(yuǎn)低于FFT 卷積。
基本的Winograd 卷積僅支持=3 和=2 的二維卷積算子,且切片大小不超過6,無法滿足現(xiàn)代CNN 中豐富的卷積算子類型,需要對其進(jìn)行一般化。Winograd 卷積的一般化主要分為四個(gè)方向,分別是支持任意維度、支持任意切片大小、支持任意常規(guī)卷積、支持特殊卷積。
三維卷積是三維CNN 的主要組件,常用于處理空間相關(guān)的信息。通過對一維Winograd 卷積進(jìn)行嵌套,可以得到其二維形式,重復(fù)進(jìn)行嵌套則可以得到任意維度的Winograd 卷積。Budden 等給出了維Winograd 卷積的一般形式,并將二維Winograd 卷積視為特殊情況在CPU 上實(shí)現(xiàn),但并未實(shí)現(xiàn)三維的情況。其他研究者使用了同樣的嵌套方法,并針對特定平臺(tái)完成了三維Winograd 卷積的實(shí)現(xiàn)。由于不同維度上算法的實(shí)現(xiàn)有統(tǒng)一性,Shen 等提出了二維、三維統(tǒng)一的現(xiàn)場可編程邏輯門陣列(field programmable gate array,F(xiàn)PGA)模板實(shí)現(xiàn)。Deng 等提出了可變分解方法,支持三維卷積的同時(shí)也支持了非單位步長的卷積。
更大的切片大小會(huì)減少切片之間的重疊部分,但同時(shí)也會(huì)帶來更大的數(shù)值誤差,因此在對精度要求不太嚴(yán)格的場合會(huì)直接使用更大的切片尺寸以提升性能。大尺寸的卷積核也在卷積網(wǎng)絡(luò)模型中經(jīng)常出現(xiàn),通常為了保持Winograd 卷積的精度,這里卷積也會(huì)被替換為小尺寸的卷積。Lu 等在FPGA 上評估了大尺寸切片分別在=3 和=5 下的精度情況,實(shí)驗(yàn)表明小的切片尺寸在=3 時(shí)可以保持模型的高精度。Huang 等也完成了類似的工作。Mazaheri等則基于符號(hào)編程構(gòu)建了支持不同硬件后端的實(shí)現(xiàn),同時(shí)也支持不同尺寸的切片。
此類直接實(shí)現(xiàn)的方法會(huì)在大尺寸切片和大尺寸卷積核上顯著損失精度,因此將這類卷積分解為更小的卷積成為了研究者常用的方法。Yang 等使用分解方法統(tǒng)一了常規(guī)卷積、depth-wise 卷積以及分組卷積,而大切片尺寸、大卷積核卷積和非單位步長卷積也都可以通過分解方法轉(zhuǎn)換為基本的Winograd 卷積。常用的分解單元實(shí)現(xiàn)包括(2×2,3×3)、(2×3,3×3)、(3×2,3×3)、(3×3,3×3)等。Liu 等同樣基于分解方法,在FPGA 上實(shí)現(xiàn)了使用相同資源支持任意卷積核大小的Winograd 卷積。利用大卷積核上計(jì)算的對稱性,Sabir 等使用近似計(jì)算技術(shù)支持了=5 大小的卷積核。
包括空洞卷積和轉(zhuǎn)置卷積在內(nèi)的特殊卷積常用于圖像分割、超分辨率等領(lǐng)域。空洞卷積的Winograd形式被提出用于支持?jǐn)U張為2 和4 的情況,原理是擴(kuò)張輸入變換矩陣的規(guī)模。Shi 等通過預(yù)定義的分解和交織操作將轉(zhuǎn)置卷積轉(zhuǎn)換為多個(gè)基本卷積,從而實(shí)現(xiàn)了對轉(zhuǎn)置卷積的支持。
總結(jié)Winograd 卷積一般化研究工作相關(guān)文獻(xiàn)如表1 所示。通過結(jié)合嵌套方法和分解方法,理論上可以實(shí)現(xiàn)CNN 中所有卷積的Winograd 卷積形式。
表1 Winograd 卷積的一般化Table 1 Generalization of Winograd convolution
除了一般化到各類卷積,還有一些研究嘗試拓展Winograd 卷積本身的線性變換。Winograd 算法族首先將輸入的切片和卷積核線性變換到Winograd域,執(zhí)行Hadamard 積之后再逆變換回特征映射域。對于指定的卷積核和切片尺寸,線性變換矩陣、、是給定的。卷積可以表示為多項(xiàng)式乘法,將卷積核和輸入向量的元素分別映射到多項(xiàng)式()和()的系數(shù),則輸出向量(和的卷積)的元素等于多項(xiàng)式()=()()的系數(shù)。Winograd 卷積算法族基于多項(xiàng)式上的中國剩余定理(Chinese remainder theorem,CRT)對不可約且互質(zhì)的多項(xiàng)式同余系統(tǒng)內(nèi)的多項(xiàng)式取余即可得到卷積輸出,對同余方程組進(jìn)行求解即根據(jù)多項(xiàng)式的系數(shù)得到線性變換矩陣的具體解。因此,對Winograd 卷積的拓展可以從兩個(gè)角度入手:一是使用不同的變換,將運(yùn)算映射到不同的域;二是采用不同的變換矩陣生成多項(xiàng)式。
Barabasz 等將Winograd卷積算法中使用的卷積多項(xiàng)式拓展為高階多項(xiàng)式,實(shí)驗(yàn)表明使用二階多項(xiàng)式會(huì)顯著降低誤差,但同時(shí)也會(huì)增加乘法次數(shù),因此需要在乘法次數(shù)和浮點(diǎn)數(shù)精度之間做權(quán)衡。Ju等提出的雙線性多項(xiàng)式與此方法原理相同,保持了大卷積核上的數(shù)值穩(wěn)定性。而Meng 等將多項(xiàng)式乘法拓展到復(fù)數(shù)域,利用共軛復(fù)數(shù)乘法的對稱性可以進(jìn)一步減少乘法數(shù)量。Liu等提出將余數(shù)系統(tǒng)(residual number system,RNS)引入到Winograd 卷積,通過取余的操作實(shí)現(xiàn)Winograd 卷積的量化操作,進(jìn)一步支持更大的輸入切片尺寸而不會(huì)引入顯著誤差。Xu等創(chuàng)新地引入了費(fèi)馬數(shù)變換(Fermat number transformation,F(xiàn)NT),使用這種變換一方面可以確保中間運(yùn)算結(jié)果均為無符號(hào)數(shù),另一方面還將所有的計(jì)算都簡化為移位和加法操作,有利于在FPGA等設(shè)備上實(shí)現(xiàn)。
根據(jù)最小濾波算法的描述,Winograd 卷積已經(jīng)達(dá)到了最少的乘法運(yùn)算次數(shù)。FFT 卷積由于使用了傅里葉變換,在乘法次數(shù)和內(nèi)存占用上遠(yuǎn)高于Winograd 卷積,但保持了很好的精度。探索不同的變換可能會(huì)引入更多的乘法次數(shù),但若能保持模型精度也是可選的實(shí)現(xiàn)技術(shù)。而生成多項(xiàng)式的選擇則是在不增加乘法次數(shù)的前提下減少了精度損失,且無需修改算法,因此在應(yīng)用上更具有現(xiàn)實(shí)意義。
Winograd 卷積還被用于和Strassen 算法結(jié)合。Strassen 算法是一種減少矩陣運(yùn)算次數(shù)的算法。雖然有研究指出Strassen 算法減少的運(yùn)算遠(yuǎn)小于Winograd 算法,但該工作將在Strassen 算法中使用的卷積替換為Winograd 卷積,結(jié)合了兩者帶來的運(yùn)算減少實(shí)現(xiàn)了更進(jìn)一步的優(yōu)化。Winograd 卷積也被應(yīng)用在加法神經(jīng)網(wǎng)絡(luò)上,用加法代替乘法,保持了相當(dāng)?shù)男阅芮医档土斯摹?/p>
剪枝是CNN 優(yōu)化中常用的有效技術(shù)。剪枝主要用于對CNN 中卷積算子的權(quán)值進(jìn)行修剪,對輸出影響很小的權(quán)值會(huì)被置零。剪枝后的卷積核成為稀疏張量,這帶來了兩點(diǎn)好處:一是按照特定的壓縮格式存儲(chǔ)稀疏的卷積核張量權(quán)值可以減少內(nèi)存使用;二是稀疏張量中大量元素為0,因此可以減少卷積的計(jì)算量。對于卷積層和全連接層的卷積可以將參數(shù)減少90%以上。但在Winograd 卷積上直接應(yīng)用剪枝是有困難的,因?yàn)橄∈璧木矸e核在變換到Winograd 域后又會(huì)變回稠密矩陣,這違背了剪枝的初衷。
Liu 等首 先提出 在Winograd 卷積和FFT 卷積上應(yīng)用剪枝,在卷積核變換之后引入剪枝以得到稀疏的Winograd 域卷積核。他們在后續(xù)的研究中又將線性整流單元(rectified linear unit,ReLU)置于輸入變換之后,結(jié)合稀疏的卷積核進(jìn)一步提升了稀疏性,如圖2 所示,Wang 等也使用了相同的剪枝方法。Li等提出在本地學(xué)習(xí)剪枝系數(shù),減少了剪枝帶來的精度損失。Lu 等和Shi 等也分別在卷積核變換后引入了剪枝。Yu 等指出,添加ReLU 的方法改變了網(wǎng)絡(luò)結(jié)構(gòu),重訓(xùn)練的代價(jià)也大,因此他們提出在輸入變換前進(jìn)行結(jié)構(gòu)化剪枝傳遞稀疏性,同時(shí)對卷積核進(jìn)行剪枝。為了兼顧速度和準(zhǔn)確性,Zheng 等在Liu等工作的基礎(chǔ)上,提出了動(dòng)態(tài)學(xué)習(xí)批量的大小。
圖2 在Winograd 卷積中應(yīng)用ReLU 以實(shí)現(xiàn)剪枝Fig.2 Pruning by applying ReLU in Winograd convolution
在對稀疏性的利用上,包括計(jì)算優(yōu)化和模型壓縮兩方面。Park 等提出Zero-Skip 技術(shù),軟硬件上分別實(shí)現(xiàn)在EWMM 階段計(jì)算時(shí)跳過零權(quán)值,是經(jīng)典的計(jì)算優(yōu)化方法。Choi 等首次提出了利用Winograd 卷積剪枝的模型壓縮方法,區(qū)別于Liu 等工作,他們使用池化代替了ReLU。Yang 等提出了一種規(guī)則的剪枝模式,以優(yōu)化模型的壓縮,Wang 等則是提出了一種新的編碼方式來確保壓縮與解壓縮。
Winograd 卷積的剪枝技術(shù)主要相關(guān)工作的總結(jié)與分析如表2 所示。
表2 Winograd 卷積中的剪枝Table 2 Pruning in Winograd convolution
Winograd 卷積也可以與量化結(jié)合,犧牲精度以換取更小的模型和更快的運(yùn)算速度。Zhuge 等首先使用了8 位定點(diǎn)數(shù)的Winograd 卷積,但與16 位定點(diǎn)數(shù)相比誤差顯著。Zhang 等使用的精度與他們一致,但引入了細(xì)粒度調(diào)度,因此在性能上有顯著提升。Meng 等在變換后的卷積核上應(yīng)用量化,使用精度縮放技術(shù)量化到INT8 精度上。Liu 等在把Winograd 卷積拓展到余數(shù)系統(tǒng)的同時(shí)也使得可以將卷積量化到INT8 精度。Ye 等實(shí)現(xiàn)了12 位的混合卷積FPGA 實(shí)現(xiàn),還有一些研究也使用了8 位的量化精度。Han 等還進(jìn)一步探索了ARMCPU 上的2~8位量化精度。Li等直接在Winograd域插入線性量化,對2~8 位的量化精度進(jìn)行了全面評估。他們的實(shí)驗(yàn)表明,8 位以下的量化精度會(huì)帶來不可忽視的模型精度下降。
對于低精度和量化帶來的精度損失,F(xiàn)ernandez等提出通過學(xué)習(xí)訓(xùn)練減少INT8 精度Winograd 卷積的誤差,與剪枝技術(shù)中的重訓(xùn)練原理相同。而Ahmad 等提出對精度損失建模,為特征映射和卷積核使用不同的量化級別。Barabasz用勒讓德基多項(xiàng)式取代Winograd 變換中的規(guī)范基多項(xiàng)式,提出基于基變技術(shù)的9 位量化精度Winograd 卷積,維持了數(shù)值穩(wěn)定性。Sabir 等在特征映射切片上應(yīng)用量化,應(yīng)用粒子群優(yōu)化技術(shù)找到量化的閾值以保持精度??梢愿鶕?jù)他們的工作,總結(jié)緩解量化帶來的精度損失的方法如表3 所示。
表3 緩解量化Winograd 卷積精度損失的方法Table 3 Methods to alleviate accuracy loss of quantization in Winograd convolution
Winograd 卷積在初期只應(yīng)用在3×3 的卷積核和小的輸入切片上,原因在于Winograd 卷積計(jì)算中內(nèi)在的數(shù)值不穩(wěn)定性。在更大的卷積核或輸入切片上,Winograd 變換的多項(xiàng)式系數(shù)呈指數(shù)增長,這種不平衡會(huì)反映在變換矩陣的元素上,造成很大的相對誤差。Vincent 等指出這種數(shù)值不穩(wěn)定性的來源是變換中大尺寸的范德蒙德矩陣,提出精心挑選出最小指數(shù)增長的值相應(yīng)的多項(xiàng)式,同時(shí)對變換矩陣進(jìn)行縮放以緩解數(shù)值不穩(wěn)定性。
Barabasz 團(tuán)隊(duì)從數(shù)學(xué)的角度在Winograd 卷積數(shù)值穩(wěn)定性的維持上做了大量工作。他們首先提出使用超線性多項(xiàng)式來構(gòu)造Winograd 變換矩陣,在運(yùn)算次數(shù)和計(jì)算精度之間進(jìn)行平衡,Ju 等提出的雙線性方法與他們的想法一致;之后他們又提出基變技術(shù),通過額外引入一個(gè)正則化變換矩陣,在實(shí)現(xiàn)了量化的同時(shí)保持了數(shù)值穩(wěn)定性;他們進(jìn)一步的研究表明,線性變換過程中浮點(diǎn)數(shù)乘加的運(yùn)算順序會(huì)影響到結(jié)果的準(zhǔn)確性,這同樣是由于變換矩陣中元素的指數(shù)級不平衡導(dǎo)致的,通過霍夫曼編碼運(yùn)算順序就可以減少這種誤差,從而允許更大的切片尺寸和卷積核尺寸。
在前文提到的工作中,也有很多研究嘗試優(yōu)化Winograd 卷積的數(shù)值穩(wěn)定性,總結(jié)相關(guān)工作的主要思路有四點(diǎn):
(1)將卷積拆分為小切片或小卷積核的Winograd 卷積,如分解方法;
(2)對Winograd 變換作出修改映射到精度更高的空間,如使用超線性多項(xiàng)式;
(3)選擇變換矩陣生成多項(xiàng)式中相對誤差更小的,如使用變換矩陣最大最小元素比值最小的;
(4)更改計(jì)算中乘累加的順序,優(yōu)先累加乘積更小的結(jié)果。
其中分解方法已經(jīng)大量使用于研究中,而選擇變換矩陣的方法由于無需修改Winograd 卷積算法本身也具備直接應(yīng)用的可行性。而超線性變換會(huì)突破現(xiàn)有Winograd 卷積實(shí)現(xiàn)的架構(gòu),在數(shù)學(xué)上論證該方法優(yōu)越性之前距離實(shí)際應(yīng)用還有一定的距離。
Winograd 卷積帶來的高性能使得研究者們迅速將其部署到各類平臺(tái),除了CPU、GPU 等,還包括對效率和功耗有嚴(yán)格要求的FPGA 平臺(tái)、移動(dòng)端和邊緣計(jì)算設(shè)備。對實(shí)現(xiàn)了Winograd 卷積的實(shí)現(xiàn)進(jìn)行統(tǒng)計(jì),得到特定平臺(tái)上的研究占比如圖3 所示。
圖3 Winograd 卷積實(shí)現(xiàn)的平臺(tái)分布情況Fig.3 Platform distribution of Winograd convolution implementation
從圖中可以看到,在FPGA 上的Winograd 卷積實(shí)現(xiàn)幾乎達(dá)到了總數(shù)的一半。這個(gè)具有統(tǒng)治地位的比值一方面說明Winograd 卷積在硬編碼的FPGA 平臺(tái)上更容易實(shí)現(xiàn)并發(fā)揮優(yōu)勢,另一方面也說明越來越多的人工智能應(yīng)用在向低功耗的平臺(tái)上部署。與之類似的是移動(dòng)端和邊緣計(jì)算上的實(shí)現(xiàn),在這類平臺(tái)上計(jì)算資源十分有限,對功耗的要求也更高,因此Winograd 卷積帶來的乘法數(shù)量減少是有重大收益的。CPU 端和GPU 端具備很強(qiáng)的算力,通常用于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,因此相關(guān)工作也集中在對訓(xùn)練速度的優(yōu)化上。而也有部分供應(yīng)商仍在使用云服務(wù)器上的CPU 和GPU 為用戶提供人工智能服務(wù),因此相關(guān)研究也具備一定的市場。GPGPU-Sim 作為模擬GPU 的軟件平臺(tái),可以模擬對GPU 硬件的修改,在GPGPU-Sim 上的研究可以為SIMT 體系結(jié)構(gòu)的設(shè)計(jì)提供方向。
對于上述傳統(tǒng)平臺(tái),部分研究實(shí)現(xiàn)了相應(yīng)的深度學(xué)習(xí)框架,在其中集成了Winograd 卷積以提升模型執(zhí)行效率。Perkins實(shí)現(xiàn)的Cltorch 是基于OpenCL實(shí)現(xiàn)的硬件無關(guān)的后端平臺(tái)。Xiao 等實(shí)現(xiàn)了一個(gè)Caffe 模型到FPGA 映射的工具,基于動(dòng)態(tài)規(guī)劃選擇是否應(yīng)用Winograd 卷積。Dicecco 等設(shè)計(jì)了CPUFPGA 異構(gòu)平臺(tái)上的開源后端框架,但僅支持單位步長的Winograd 卷積。Demidovskij 等還實(shí)現(xiàn)了面向Intel 硬件的、支持Winograd 卷積的軟件棧,面向包括CPU、集顯、神經(jīng)計(jì)算棒等生成高效負(fù)載。
值得注意的是,除了上述傳統(tǒng)平臺(tái),還有一些研究嘗試將Winograd 卷積部署在其他非傳統(tǒng)平臺(tái)上。比如基于內(nèi)存的計(jì)算平臺(tái),Lin 等在ReRAM 上實(shí)現(xiàn)了Winograd卷積,基于切片提高了數(shù)據(jù)重用,而Ghaffar等則基于DRAM 架構(gòu)實(shí)現(xiàn)了8-bit 的量化卷積。隨機(jī)計(jì)算和近似計(jì)算也用于實(shí)現(xiàn)Winograd 卷積。Chen 等實(shí)現(xiàn)了向量DSP(domain specific processor)上的三維Winograd 卷積。而第五代精簡指令集計(jì)算機(jī)(reduced instruction set computer-V,RISC-V)指令集作為新流行的開源指令集,同樣吸引了部分研究者在相關(guān)平臺(tái)上部署人工智能應(yīng)用。Wang 等通過拓展一條(2×2,3×3)的卷積指令并新增計(jì)算模塊,在一個(gè)開源RISC-V框架上實(shí)現(xiàn)了Winograd 卷積。
性能是部署在特定平臺(tái)上必須要考慮的事情,對于不同的平臺(tái),研究者們采用的優(yōu)化方法也大相徑庭,現(xiàn)分平臺(tái)總結(jié)相關(guān)優(yōu)化技術(shù)如下。
Heinecke 等將即時(shí)(just-in-time,JIT)編譯優(yōu)化技術(shù)用于加速x86 CPU 架構(gòu)上直接卷積和Winograd卷積在小卷積核上的實(shí)現(xiàn),在編譯過程中提前計(jì)算卷積核調(diào)用時(shí)的地址偏移量。Ragate依賴編譯器的自動(dòng)向量化,可將計(jì)算階段轉(zhuǎn)換為批量矩陣乘法(batched general matrix multiplication,BGEMM),利用CPU 的高級向量擴(kuò)展(advanced vector extensions,AVX)指令集實(shí)現(xiàn)性能提升。Jia 等提出了CPU 上的自定義數(shù)據(jù)布局,同樣利用CPU 上的向量化指令實(shí)現(xiàn)高效訪存。在數(shù)據(jù)重用方面,Gelashvili 等利用CPU 的L3 Cache 駐留卷積核實(shí)現(xiàn)了對卷積核的重用,但無法支持通道數(shù)過大的卷積,而Wu 等利用Winograd 卷積中的相似性也可以實(shí)現(xiàn)CPU 上的深度數(shù)據(jù)重用。
在GPU 上同樣可以將Winograd 卷積的計(jì)算階段轉(zhuǎn)換為批量矩陣乘法,然后調(diào)用高效的矩陣乘法實(shí)現(xiàn)。Lan 等和Wang 等分別在GPU 上實(shí)現(xiàn)了三維Winograd 卷積,但前者的計(jì)算階段直接調(diào)用了cuBLAS 中的矩陣乘法實(shí)現(xiàn),后者則是手動(dòng)編寫了特定的實(shí)現(xiàn)。Hong 等在大規(guī)模GPU 集群上利用Winograd 卷積的數(shù)據(jù)并行性和切片內(nèi)并行性實(shí)現(xiàn)了多維并行訓(xùn)練。Jia 等利用MegaKernel 技術(shù)將Winograd 卷積的四個(gè)階段融合,同時(shí)利用精心設(shè)計(jì)的任務(wù)映射算法可在GPU 上達(dá)成顯著的性能提升。另外,Yan 等將源代碼和匯編(source and assembly,SASS)級別的匯編器優(yōu)化用于優(yōu)化Winograd 卷積,通過合并全局訪存并使共享訪存無沖突,利用緩存設(shè)計(jì)流水線,提高計(jì)算強(qiáng)度,還利用常規(guī)寄存器填補(bǔ)了謂詞寄存器不足的缺陷。
與CPU和GPU不同的是,F(xiàn)PGA上沒有高效的神經(jīng)網(wǎng)絡(luò)計(jì)算庫可供直接調(diào)用,但可定制的特性給予了FPGA 上進(jìn)行優(yōu)化更多可能性。Cariow 等首先研究了Winograd 卷積硬件實(shí)現(xiàn)的最小需求,并在FPGA 上實(shí)現(xiàn)了Winograd 卷積的基本模塊。在數(shù)據(jù)重用方面,Aydonat 等利用流緩沖區(qū)暫存所有的中間特征映射實(shí)現(xiàn)了高能耗比的FPGA 實(shí)現(xiàn),而Lu等設(shè)計(jì)了線緩存結(jié)構(gòu)來暫存特征映射并重用不同切片的數(shù)據(jù),并在后續(xù)工作中針對稀疏的情況進(jìn)行了優(yōu)化。
由于FPGA 可定制化的特性,對計(jì)算資源的充分利用是優(yōu)化的重點(diǎn)。一些研究統(tǒng)一了二維和三維的Winograd,構(gòu)建了FPGA 上的統(tǒng)一模板。另一些研究聚焦于統(tǒng)一Winograd 卷積和矩陣乘的實(shí)現(xiàn),以最大化模塊的可重用性。對硬件實(shí)現(xiàn)方案進(jìn)行系統(tǒng)評估才能最大化資源利用率并提升計(jì)算效率。Ahmad 等和Liu 等還對FPGA 上實(shí)現(xiàn)Winograd 卷積進(jìn)行了全面的設(shè)計(jì)空間探索。此外,還有其他工作也在FPGA 上實(shí)現(xiàn)了Winograd 卷積并對設(shè)計(jì)空間進(jìn)行了探索,他們還在設(shè)計(jì)高效數(shù)據(jù)布局等方面進(jìn)行了大量研究。
各個(gè)平臺(tái)上的優(yōu)化雖然方法各異,但相互有共同之處。例如,CPU 和GPU 均為多級內(nèi)存層級體系結(jié)構(gòu),因此均可利用各級緩存駐留數(shù)據(jù)實(shí)現(xiàn)數(shù)據(jù)重用。三個(gè)平臺(tái)上的優(yōu)化方法總結(jié)比較如表4 所示。
表4 不同平臺(tái)上的性能優(yōu)化方法Table 4 Performance optimization methods on different platforms
Winograd 卷積提出的初衷是為了實(shí)現(xiàn)高性能卷積,但由于其內(nèi)在的數(shù)值不穩(wěn)定性,初期僅有小卷積核 上應(yīng) 用Winograd 卷積。CPU 上和GPU 上均有對FFT 和Winograd 的性能進(jìn)行的比較,他們的結(jié)論是一致的,即FFT 在大尺寸卷積核的卷積上性能更好,而Winograd 卷積適用于小尺寸卷積。而Zlateski等指出,隨著CPU 的內(nèi)存帶寬越來越大,Winograd 卷積的性能優(yōu)勢也會(huì)減少。不過隨著拓展和優(yōu)化的進(jìn)一步深入,Winograd 卷積也成為了最適合小尺寸卷積核的快速卷積實(shí)現(xiàn),在各神經(jīng)網(wǎng)絡(luò)計(jì)算庫和深度學(xué)習(xí)編譯框架上均有實(shí)現(xiàn)。
Winograd 卷積旨在加速卷積以提高CNN 模型的執(zhí)行效率,對實(shí)時(shí)性有要求的場景都可以嘗試使用。Zhuge 等利用混合卷積實(shí)現(xiàn)了人臉識(shí)別系統(tǒng)。Lou 等基于三維Winograd 卷積實(shí)現(xiàn)了用于動(dòng)作識(shí)別的加速器。Shi 等和Yen 等分別將其用于實(shí)時(shí)超分辨率,但在上采樣上有區(qū)別,前者使用的是轉(zhuǎn)置卷積的Winograd 實(shí)現(xiàn),而后者使用shuffle 層代替了轉(zhuǎn)置卷積。Yao 等還實(shí)現(xiàn)了穿戴設(shè)備上的語音識(shí)別加速器,應(yīng)用了一維的8 bit 整數(shù)Winograd 卷積網(wǎng)絡(luò)。Winograd 卷積的應(yīng)用不止于此,未來還可以有更多對實(shí)時(shí)性有要求的人工智能應(yīng)用Winograd卷積實(shí)現(xiàn),尤其是在移動(dòng)端、物聯(lián)網(wǎng)和邊緣計(jì)算設(shè)備上。
Winograd 卷積是當(dāng)前應(yīng)用最廣泛的快速卷積算子。從引入到CNN 至今,其使用范圍隨著研究的深入逐漸覆蓋了現(xiàn)代CNN 中的各類卷積,與剪枝、量化等技術(shù)的結(jié)合也走向成熟。在各種平臺(tái)深度學(xué)習(xí)框架和神經(jīng)網(wǎng)絡(luò)庫中均已集成Winograd 卷積,可以為各類硬件平臺(tái)生成高效的工作負(fù)載。
這里對未來的研究方向給出幾點(diǎn)展望。在算法本身的優(yōu)化方面,數(shù)學(xué)方法仍然是突破Winograd 卷積局限性的根本方法,由于其內(nèi)在的最小乘法次數(shù)屬性,有望在未來的研究中基本取代現(xiàn)有的基于一般矩陣乘的卷積?,F(xiàn)已有從數(shù)學(xué)角度解決數(shù)值穩(wěn)定性的方法,但由于引入了新的計(jì)算機(jī)制或額外的步驟,在各平臺(tái)上還沒有高效的實(shí)現(xiàn),對硬件友好優(yōu)化方法的研究可能會(huì)是后續(xù)研究的重點(diǎn)方向。在實(shí)現(xiàn)與應(yīng)用方面,F(xiàn)PGA 平臺(tái)上可以輕松為Winograd 卷積定制軟硬件協(xié)同的實(shí)現(xiàn),但現(xiàn)有FPGA 實(shí)現(xiàn)對數(shù)值穩(wěn)定性的關(guān)注太少。FPGA 實(shí)現(xiàn)具備很高的靈活性,可參照相關(guān)優(yōu)化方法率先部署更快更精確的Winograd卷積。由于Winograd 卷積數(shù)據(jù)流的內(nèi)在復(fù)雜性,在CPU、GPU 這類通用計(jì)算平臺(tái)上,如何利用好算力和內(nèi)存層級還有待進(jìn)一步研究。比如Winograd 四個(gè)階段現(xiàn)大多實(shí)現(xiàn)為四個(gè)分離的計(jì)算核,CPU 上已經(jīng)有研究嘗試?yán)肔3Cache 進(jìn)行融合。但GPU 上嘗試的融合屬于任務(wù)調(diào)度層面的融合,利用高速緩存的融合還未有相關(guān)研究。GPU 等設(shè)備近年都引入了類似TensorCore的高性能運(yùn)算單元,但Winograd 卷積相關(guān)研究均未利用這類部件,因此對新硬件特性的利用也可以成為另一個(gè)突破口。此外,在非常規(guī)平臺(tái)的實(shí)現(xiàn)明顯滯后于理論,比如基于內(nèi)存的計(jì)算平臺(tái)、開源RISC-V框架上的實(shí)現(xiàn)還局限于小卷積核,下一步可以嘗試在這類平臺(tái)上實(shí)現(xiàn)更一般化的Winograd卷積。