謝曉燕,杜卓林+,胡傳瞻,楊 坤,王安琪
(1.西安郵電大學 計算機學院,陜西 西安 710121;2.西安郵電大學 電子工程學院,陜西 西安 710121)
隨著CNN在人工智能領域的廣泛應用,層數(shù)越深、精度越高的深度卷積神經(jīng)網(wǎng)絡(deep convolutional neural network,DCNN)成為發(fā)展趨勢。然而,DCNN在訓練過程中會產(chǎn)生大量的中間數(shù)據(jù),過擬合幾率也會增加,計算復雜度隨之攀升[1,2],使得CPU的時間成本和GPU的功耗成本成為其部署在資源受限的嵌入式設備上的主要瓶頸。近年來,由于輕量級網(wǎng)絡架構(gòu)的涌現(xiàn),學術界一直嘗試在保證DCNN計算精度的前提下降低網(wǎng)絡的復雜度。例如,Christian Szegedy提出了GoogLeNet[3],參數(shù)量減少到了6.8 M,并采用平均池化代替全連接層,將網(wǎng)絡準確率提高了0.6%,增強了網(wǎng)絡的表達能力,從而使得在有限資源的硬件平臺上實現(xiàn)神經(jīng)網(wǎng)絡成為可能。通用處理器技術成熟、編程模型完善、人機接口友好,但隨著深度學習網(wǎng)絡模型的運算量越來越大,通用處理器對向量運算支持程度低、不支持張量運算等不足,與深度學習在計算效率、能量消耗和響應延遲上的需求日漸不相適應,執(zhí)行效率偏低,運算功耗大。專用處理器在計算一些特定任務時很快,但是無法計算其之外的其它應用?,F(xiàn)場可編程門陣列(field programmable gate array,F(xiàn)PGA)具有規(guī)則的并行結(jié)構(gòu)且可以靈活配置,十分利于CNN硬件加速的研究與開發(fā)??芍貥?gòu)陣列處理器作為一種高效的體系結(jié)構(gòu),兼顧專用硬件的高效性和通用處理器的靈活性,本文基于項目團隊提出的動態(tài)可重構(gòu)陣列處理器(DPR-CODEC)來研究Inception網(wǎng)絡的并行重構(gòu)計算模型。通過分析網(wǎng)絡中潛在并行性,挖掘卷積、池化等操作之間的數(shù)據(jù)依賴關系,提出了一種重疊窗口的數(shù)據(jù)組織方案,從而降低了片外存儲訪問開銷。基于4×4 PE陣列,設計了同時支持1×1、3×3、5×5大小卷積核的28×28和32×32圖像的重構(gòu)并行計算方案。實驗結(jié)果表明,在連接到BEE4平臺的Virtex-6現(xiàn)場可編程門陣列上,提出的可重構(gòu)方案在資源利用率和算法運算效率上都有了很大的提高。
在Inception Module的多個版本中Incepetion V1是組成GoogLeNet[3]的主要模塊,如圖1所示。
圖1 Inception結(jié)構(gòu)
Inception結(jié)構(gòu)作為一個規(guī)格化的模塊網(wǎng)絡,經(jīng)過反復堆疊構(gòu)建大規(guī)模網(wǎng)絡,在該結(jié)構(gòu)中,不同大小的卷積核作用在同一輸入圖上。Inception V1使用較少的參數(shù)就可以達到傳統(tǒng)模型中更深層數(shù)、更強表達能力的效果。通過采用全局平均池化層來取代了全連接層,大大降低了中間計算的參數(shù)量(在傳統(tǒng)CNN網(wǎng)絡中全連接層參數(shù)量幾乎占到90%),使得模型訓練更快并減輕了過擬合。此外,Inception Module提高了參數(shù)的利用效率,一方面使用1×1的卷積替換巧妙地實現(xiàn)了降維,另一方面可以在多個尺寸上同時進行卷積及聚合。通過構(gòu)建密集的塊結(jié)構(gòu)來近似最優(yōu)的稀疏結(jié)構(gòu)達到了提高性能而又不大量增加計算量的目的。
由于FPGA的硬件資源有限,通常很難將整個DCNN映射到單個芯片上。因此大多數(shù)基于FPGA的實現(xiàn)都是采用基于層間串行執(zhí)行的逐層映射[1,4,5]方案。這類方案通常將FPGA資源劃分為多個層處理器(convolutional layer processors,CLPs),將不同卷積層進行分組并使用CLP進行加速。其主要問題是所有層使用同一種計算模式進行加速,如果網(wǎng)絡中不同卷積核的數(shù)據(jù)局部性差異較大,如Inception架構(gòu),它們的資源需求將不能同時得到滿足,導致資源利用不足以及訪存帶寬等問題。為提高資源利用率,文獻[6]利用聚類思想將網(wǎng)絡層進行分類并在FPGA不同分區(qū)中對不同類進行加速。文獻[7]提出的Escher模型利用片上緩沖器最大程度地降低總體加速器帶寬需求,但增加了各層的資源消耗。文獻[8]使用高層次綜合進行自定義DCNN模型加速,但其成本較高,不利于通用模型加速。文獻[9]針對傳統(tǒng)DCNN設計了一個可重構(gòu)通用體系架構(gòu)。盡管取得了進步,但這些加速器仍然缺乏對全連接層和卷積層之間通信的優(yōu)化?;谒惴▋?yōu)化后設計的專用電路[10-12],雖然可以提高效率,但又會造成新的硬件開銷并缺乏靈活性。因此,考慮到通用硬件及專用硬件的優(yōu)缺點,采用項目組提供的可重構(gòu)陣列處理器作為開發(fā)平臺對神經(jīng)網(wǎng)絡中的Inception架構(gòu)進行加速。
卷積層的基本計算模式是圖像-內(nèi)核的卷積,計算公式請參見文獻[8]。卷積神經(jīng)網(wǎng)絡算法底層處理的數(shù)據(jù)量較大,但運算過程相對簡單。卷積操作會對輸入圖像進行高度抽象以便提取出圖像特征,即特征圖(feature map)。對于卷積操作來說,原圖中所有像素點都進行相同的卷積運算,此過程會耗費大量的資源。因此,結(jié)合可進行同樣卷積運算的像素點和卷積計算內(nèi)部具有的并行特性,卷積計算模式適用于硬件加速。例如,卷積層接收n個特征映射圖作為輸入,并生成m個輸出特征圖。如算法1所示,卷積層的運算過程包含四層循環(huán)。神經(jīng)元所連接到的上層特征圖和大小為k×k的卷積核進行卷積操作的過程中,由于多個無數(shù)據(jù)相關性的卷積核可以在同一幅特征圖中做卷積運算,生成多個卷積輸出通道,因此可以分別采用卷積窗口內(nèi)部并行、輸入特征圖內(nèi)部卷積窗口間并行、輸入特征圖間并行和輸出特征圖間并行等設計對k×k個乘累加操作并行處理[13]。
算法1:卷積算法
輸出:卷積計算后的第l層網(wǎng)絡:xl
(1)卷積計算
(2)whilei≤ndo
(3)LOOP1:遍歷m張輸出特征圖;
(4)LOOP2:遍歷n張輸入特征圖;
(5) LOOP3:卷積窗口在XI×YI大小的輸入特征圖中滑動;
(6) LOOP4:一個卷積窗口內(nèi)k×k次乘累加操作;
(7)endwhile
(8)returnxl
在卷積神經(jīng)網(wǎng)絡進行前向傳播時,浮點乘累加運算產(chǎn)生的中間結(jié)果需要耗費大量內(nèi)存,使用傳統(tǒng)的CPU或GPU加速時往往不能充分挖掘其內(nèi)部并行性。
具有規(guī)則結(jié)構(gòu)的FPGA由于其低能耗、高性能以及可編程的特性,有利于上述4種并行計算的硬件加速。然而,伴隨著對卷積層數(shù)和計算精度的支持,需要計算資源也會成倍增加,而且在加速過程中還會產(chǎn)生大量的中間數(shù)據(jù)。因此,在有限的資源中同時滿足計算和存儲的密集需求一直是AI芯片設計的痛點??芍貥?gòu)陣列處理器使用重構(gòu)機制可以靈活配置PE(processing element)的邏輯功能和PE間的數(shù)據(jù)通路,既具有通用處理器的編程靈活性,又具有專用硬件的高效性。
本文基于項目組提出的一種可重構(gòu)陣列處理器[14],設計了一種可重構(gòu)的卷積神經(jīng)網(wǎng)絡陣列結(jié)構(gòu),如圖2所示。包括指令、全局控制器、分層編程網(wǎng)絡和PE陣列的一部分(僅顯示4×4PE)。預處理的圖像存儲在外部存儲器中。PE間通過4個共享寄存器(RE,RS,RW,RN)與相鄰東、南、西、北4個方向的PE通信。每個PE都可以直接訪問相鄰PE的這些寄存器。PE陣列的可重構(gòu)功能通過加載預先存儲在指令RAM中固定指令或由全局控制器傳遞并存儲在RAM中的實時指令實現(xiàn)。在運行時,可以根據(jù)不同層的計算需求靈活調(diào)用相對應的計算方式使PE陣列可以運行在數(shù)據(jù)流模式下,從而使電路兼具靈活、硬件資源可復用、并行計算、低功耗等優(yōu)良性能。
全局控制器主要用于指令調(diào)用、指令廣播以及收集狀態(tài)信息。上層是指令存儲器,下層是陣列處理器。主要功能是在主機接口和陣列處理器之間形成H樹型的配置網(wǎng)絡HCN,如圖2中的加粗線所示。為了獲得簡單的尋址,可以逐步減少尋址過程的位寬度,并確保每個指令同時到達PE。HCN旨在通過H樹網(wǎng)絡加載指令。主處理器負責將任務指令和待處理的數(shù)據(jù)地址發(fā)送到全局控制器,全局控制器通過HCN將接收到的指令分配給不同的計算PE。HCN是全局控制器和PE陣列之間的數(shù)據(jù)傳輸路徑。全局控制器從指令存儲器接收總線信息。PE通過數(shù)據(jù)輸入存儲器(DIM)將數(shù)據(jù)從外部存儲器DDR3加載到本地數(shù)據(jù)存儲器中,計算掩碼的類型并將其反饋給全局控制器。
圖2 可重構(gòu)的卷積網(wǎng)絡陣列結(jié)構(gòu)
針對Inception模塊的特點,在映射過程中利用重構(gòu)機制對不同大小的卷積操作和池化操作進行計算。PE陣列的計算功能重構(gòu)切換設計如圖2所示,使用片外存儲DIM對原始數(shù)據(jù)進行存儲,DOM則對處理的中間結(jié)果數(shù)據(jù)進行存儲。PE中事先存儲好不同操作的指令,控制器通過下發(fā)CALL指令對其功能進行配置。首先分析算法,并對輸入數(shù)據(jù)進行重新組織,減少對外存的訪問次數(shù),以提高數(shù)據(jù)利用率;其次將不同的計算模式配置在計算單元的指令存儲中,在進行計算的過程中,根據(jù)不同標志位下發(fā)不同配置,執(zhí)行不同大小的卷積計算。當一種配置完成計算時,由存數(shù)PE發(fā)送握手信號給PE00,進行下一塊數(shù)據(jù)下發(fā),其中每種配置模式內(nèi)部并行執(zhí)行。
使用該結(jié)構(gòu)就可以利用不同大小卷積操作的相似性和特征圖之間數(shù)據(jù)無關性把3×3和5×5大小的卷積核初始化在不同的配置存儲中,通過在同一個PEG中調(diào)用不同的配置,實現(xiàn)對不同大小的卷積核計算的切換,就可以大大減少卷積計算所占用的資源。圖3表示重構(gòu)切換流程圖,當PE內(nèi)部在進行功能重構(gòu)計算時,控制器只需要發(fā)送任務指令和必要的數(shù)據(jù)或數(shù)據(jù)存儲地址,進而控制指令傳輸網(wǎng)絡分配指令給不同PE執(zhí)行相應的操作。針對不同的卷積核大小設置不同的計算配置,默認配置為PC1,執(zhí)行3×3卷積計算,在計算過程中將PE進行分組并行執(zhí)行。當3×3卷積計算完成后,通過CALL調(diào)用指令將PE功能切換到PC2配置執(zhí)行5×5的卷積計算,此時的并行計算過程與3×3并行過程相同。等到所有卷積計算結(jié)束之后,將結(jié)果保存在DOM中。池化操作通過PE33從DOM中取出卷積計算的中間結(jié)果進行池化計算。此時,當前簇中的PE13、PE23為空閑PE,可以解決PE01、PE10、PE11、PE12因重構(gòu)帶來的存儲溢出問題。
圖3 卷積算法重構(gòu)切換流程
圖4給出了一個在4×4陣列上卷積算法的并行重構(gòu)映射方案。以3×3卷積的過程為例,首先將預處理后的數(shù)據(jù)存放在DIM中,PE00從DIM中加載數(shù)據(jù)并進行下發(fā);其次,各計算PE在接到數(shù)據(jù)后進行并行卷積計算,最終在DOM中保存結(jié)果,以便后續(xù)計算。具體算法執(zhí)行過程如下。
圖4 卷積并行重構(gòu)功能映射
算法2:卷積并行重構(gòu)算法
輸入:預處理數(shù)據(jù):conv_xl-1;卷積核:k
輸出:卷積計算結(jié)果:
(1)PE00從DIM中加載預處理數(shù)據(jù):將原始圖像分塊保存。
(2)whilei≤ndo
(3)LOOP:
(4) 數(shù)據(jù)下發(fā):當PE00加載完數(shù)據(jù)后向PE01、PE10、PE11、PE12按塊下發(fā)數(shù)據(jù)。下發(fā)完數(shù)據(jù)后,PE00分別向各PE發(fā)送握手信號。
(5) 乘/加法計算過程:當PE00接收到握手信號后,各PE同時開始計算。通過左移加操作實現(xiàn)兩數(shù)據(jù)相乘,計算出最終的結(jié)果。
(6) 結(jié)果保存過程:當所有卷積操作結(jié)束之后,PE02、PE20、PE21、PE22將計算結(jié)果傳入PE33中,最后PE33將所有結(jié)果寫入DOM中。
(7)指令調(diào)用進行卷積計算重構(gòu)切換。
(8)endLOOP
(9)endwhile
(10)return在DOM中存儲卷積計算結(jié)果
池化操作在卷積操作之后,主要作用是對特征圖進行降維,以減少網(wǎng)絡中的參數(shù)和計算量,同時會保留特征圖中的重要信息,防止在后續(xù)的計算中出現(xiàn)信息丟失。池化操作通過對特征的二次提取來控制過擬合,使模型具有較高的容錯能力,但不改變特征圖的數(shù)目。輸出圖像的每個元素由池化公式計算得出,計算公式請參見文獻[8]。池化操作主要用于減少網(wǎng)絡計算量并且在不改變特征的前提下轉(zhuǎn)發(fā)卷積操作提取的與分類特征相關的特征。
池化操作的功能指令預先通過配置指令在PE的存儲中,待卷積操作完成后通過PE33從DOM中取出卷積計算的中間結(jié)果進行計算。PE13、PE23為空閑PE,其共享存儲可以解決PE01、PE10、PE11、PE12因重構(gòu)帶來的存儲溢出問題。具體算法執(zhí)行過程如下。
算法3:池化并行算法
輸入:預處理數(shù)據(jù):conv_xl;池化核:k=2×2;塊總數(shù):n
輸出:卷積計算結(jié)果:
(1)PE33從DOM中加載卷積結(jié)果數(shù)據(jù):并對該結(jié)果進行分塊。
(2)whilei≤ndo
(3)LOOP:
(4) 數(shù)據(jù)下發(fā):當PE33加載完數(shù)據(jù)后向PE11、PE12、PE13、PE31按塊下發(fā)數(shù)據(jù)。下發(fā)完數(shù)據(jù)后,PE33分別向各PE發(fā)送握手信號。
(4)通過對過程數(shù)據(jù)及結(jié)果的分析,發(fā)現(xiàn)該地下水源熱泵系統(tǒng)在節(jié)能上和實際使用中存在著節(jié)能效果不足,故需要通過進一步的研究使節(jié)能效果有所改善。
(5) 池化計算過程:PE13加載0號、1號、27號、28號地址通過比較操作實現(xiàn)數(shù)據(jù)最大池化計算,將最終的結(jié)果存放PE13的100號地址。PE31、PE11、PE12也是同樣操作。
(6) 結(jié)果保存過程:當所有池化操作結(jié)束之后,將PE21、PE22、PE23、PE32的計算結(jié)果重新傳入PE33中,最后PE33將所有結(jié)果寫入DOM中。
(7)endLOOP
(8)endwhile
(9)return在DOM中存儲池化計算結(jié)果
在卷積核進行計算的過程中,由于卷積核是按照縱向或橫向順序移動,因此卷積核與輸入圖像的像素點會出現(xiàn)一個高度重合的區(qū)域,稱為像素重疊窗口。如圖5所示,以3×3卷積核為例,在像素窗口以步長S=1水平移動的過程中,由黑色框線標出的重疊區(qū)域共兩列,每列包含3個像素點,這會導致兩次卷積運算對應的像素窗口中有2/3的重疊區(qū)域,意味著每次卷積計算過程中的數(shù)據(jù)重疊率超過65%。當卷積核為5×5運算且步長S=1時,重疊區(qū)域共有4列,每列包含5個像素點,這會導致兩次卷積運算對應的像素窗口中有4/5的重疊區(qū)域,即兩次卷積運算數(shù)據(jù)重疊率高達80%。在進行卷積操作的過程中,由于片上存儲資源的限制,這些重疊部分的數(shù)據(jù)需要反復從外存加載,帶來很大的訪問延遲,影響計算效率。并且在進行卷積操作的過程中,由于輸入圖像是二維矩陣,很難直接在硬件上對其進行數(shù)據(jù)復用。因此,對輸入圖像及卷積核進行預處理是十分必要的。首先將原始圖像按照卷積核的大小分塊并按列存儲在一維數(shù)組中,同時將卷積核也按列存儲在一維數(shù)組中。經(jīng)過這樣的預處理后,卷積核在原始輸入圖像上進行卷積的計算過程就被簡化為兩列對應位置相乘并相加的過程。進行下一次卷積時,也只需要將卷積核列向量向后滑動k個元素。這樣就避免了多次訪問相同的輸入,從而降低了訪存開銷。
圖5 數(shù)據(jù)組織
本文在可重構(gòu)陣列處理器上驗證該并行方案的可行性。首先將測試圖片轉(zhuǎn)換成陣列可以識別的二進制序列,然后將其存儲到片外存儲DIM中,其次將并行方案的指令初始化到對應PE指令存儲其中,最后在ModelSim上進行仿真驗證。FPGA使用Vertex-6系列XC6VLX760器件,工作頻率可以達到123 MHz。實驗基于4×4陣列結(jié)構(gòu)實現(xiàn)了Inception模塊中1×1、3×3和5×5大小卷積運算的并行重構(gòu)映射方案。功能評測數(shù)據(jù)集選擇Minist(28×28像素的灰度手寫數(shù)字圖片),該數(shù)據(jù)集包含60 000個用于訓練的示例和10 000個用于測試的示例和Cifar-10數(shù)據(jù)集(32×32的彩色圖像),其中包含10個類別的RGB彩色圖片。相比于手寫字符,Cifar-10含有的是現(xiàn)實世界中真實的物體,不僅噪聲很大,而且物體的比例、特征都不盡相同,這為識別帶來很大困難。Minist數(shù)據(jù)集中的數(shù)據(jù)做了預處理,將其變?yōu)?9×29大小的灰度圖像,對Cifar-10將按照原始數(shù)據(jù)進行處理。表1給出了使用本文設計方案對兩個數(shù)據(jù)集的識別的結(jié)果??梢钥闯霰疚牡脑O計方案達到了Inception網(wǎng)絡的功能要求,且識別率達到99%左右。
表1 數(shù)據(jù)集
表2給出了本文和文獻[5,9]的處理時間對比。本文和文獻[5,9]都是基于FPGA實現(xiàn),本文的Inception V1輸入3張?zhí)卣鲌D,3×3卷積輸入96張?zhí)卣鲌D,輸出128張?zhí)卣鲌D;5×5卷積輸入16張?zhí)卣鲌D,輸出32張?zhí)卣鲌D。而文獻[5]第一層輸入7張?zhí)卣鲌D,輸出64張?zhí)卣鲌D,第二層輸入8張?zhí)卣鲌D,輸出19張?zhí)卣鲌D。如表2所示,文獻[5]的處理速度比本文方法快,但是處理的數(shù)據(jù)量只有本文的60%。文獻[9]與本文網(wǎng)絡模型相同,但本文的處理速度是它的0.76倍。相比之下,本文提出的可重構(gòu)方法能夠支持不同大小的卷積核計算,結(jié)構(gòu)更靈活,計算速度有了明顯提升。
表2 卷積層計算時間
表3給出了本文的FPGA芯片資源使用情況??梢钥闯觯c文獻[7、9]相比,本文提出的方法使用的資源更少。綜合結(jié)果顯示本文方法的綜合頻率為125 MHz,運行功耗只有6.395 W。開發(fā)板上的資源足夠充足,僅從硬件資源消耗比率來看,本文相比于文獻[7、9]有明顯的進步。但由于不同方法使用了不同并行策略和FPGA平臺,考慮硬件和便攜性方面的差異,文獻[8、12]指出使用能效比(Efficiency)等指標可以提供一個有效的對比,該值由式(1)得出
表3 FPGA邏輯資源利用統(tǒng)計
(1)
其中,Performance per Watt指能效比,Operations為操作數(shù),Time和Power分別代表時間和功耗。
根據(jù)式(1),表4對能效比和每秒操作數(shù)進行了對比。在功耗方面,相比于文獻[1]和文獻[12]來說,本方法功耗僅占其6%和36%。雖然文獻[8]功耗低于本方法,但其使用高層次綜合進行自定義DCNN模型加速,成本較高,不利于通用模型加速。文獻[1]通過CPU優(yōu)化CNN代碼得到的結(jié)果,能效比可以達到0.037,與文獻[1]的CPU實現(xiàn)相比,本方法能效比是其4.75倍。文獻[8、12]都是基于FPGA實現(xiàn),與本文設計相比,文獻[12]具有更高的每秒操作數(shù)和功耗,但在能效比上本文是其2.2倍,在每秒操作數(shù)是文獻[8]的1.5倍,能效比是其1.3倍。由此可知,本方法在加速CNN方面具有一定優(yōu)勢。
表4 性能對比
本文針對卷積神經(jīng)網(wǎng)絡在硬件加速中面臨的訪存和功耗問題,提出了一種兼顧計算高并行性和片上資源占用開銷的可重構(gòu)陣列實現(xiàn)方案,通過可重構(gòu)機制在相同陣列上完成不同卷積核大小以及池化操作的計算,提高了片上資源的利用率。通過分析網(wǎng)絡中卷積、池化等操作間的數(shù)據(jù)依賴關系,將輸入圖像轉(zhuǎn)換成一維數(shù)組進行存儲,減少了卷積計算過程中外部存儲訪問頻次,并提出了一種重疊窗口的數(shù)據(jù)組織方案,將外存加載的像素數(shù)減少了30%。該方案在Minist和Cifar-10測試集中進行測試,結(jié)果表明在123 MHz的工作頻率下,F(xiàn)PGA的運行功耗為6.395 W,性能是CPU版本的4.75倍;相比于其它FPGA平臺實現(xiàn),所提出的可重構(gòu)實現(xiàn)方式具有明顯優(yōu)勢。該方案也可以用來實現(xiàn)同類計算架構(gòu)的神經(jīng)網(wǎng)絡。