劉 彪,陳長林,張宇飛,劉思彤,唐勵勤,于紅旗
(國防科技大學(xué) 電子科學(xué)學(xué)院, 湖南 長沙 410073)
為實(shí)現(xiàn)更強(qiáng)的識別能力和更高的識別精度,現(xiàn)代深度神經(jīng)網(wǎng)絡(luò)(deep neural network, DNN)規(guī)模不斷增大,在推理過程中也需要更加龐大的計(jì)算量和存儲空間。然而通過深入研究深度神經(jīng)網(wǎng)絡(luò)權(quán)重矩陣和各層特征圖像數(shù)據(jù)結(jié)構(gòu)可以發(fā)現(xiàn),神經(jīng)網(wǎng)絡(luò)內(nèi)部存在較大的稀疏度,即有較大比例的權(quán)重系數(shù)和神經(jīng)元輸出為0值[1-2]。DNN的稀疏特性可以分為動態(tài)稀疏和靜態(tài)稀疏[3]:動態(tài)稀疏是由于部分神經(jīng)元輸出經(jīng)激活后變?yōu)榱阒刀a(chǎn)生的,這種稀疏程度隨神經(jīng)元的輸入變化而變化;靜態(tài)稀疏又包括神經(jīng)元稀疏和權(quán)重稀疏,二者在進(jìn)行網(wǎng)絡(luò)訓(xùn)練時,因不影響正確的網(wǎng)絡(luò)識別結(jié)果而被刪除。在神經(jīng)網(wǎng)絡(luò)加速器中,增加對稀疏計(jì)算的支持,能夠大幅減少無效數(shù)據(jù)存儲和計(jì)算,使得推理計(jì)算效率得到大幅提升[4-6]。
近年來,為高效執(zhí)行稀疏DNN,涌現(xiàn)了大量采用定制化架構(gòu)的稀疏DNN加速器[5-12]。通過向乘加陣列加載輸入特征圖像(input feature map, IFM)數(shù)據(jù)和權(quán)重前剔除0值數(shù)據(jù)并實(shí)現(xiàn)二者的正確配對,這些加速器在計(jì)算資源利用效率和推理計(jì)算速度方面均獲得大幅提升。然而現(xiàn)有稀疏神經(jīng)網(wǎng)絡(luò)加速器仍然存在以下問題需要解決:①在加載輸入數(shù)據(jù)時,需引入有效數(shù)據(jù)配對等額外操作,增加了硬件資源設(shè)計(jì)復(fù)雜度,為加速器帶來額外面積和功耗負(fù)擔(dān);②在推理計(jì)算時,因配對效率較低而導(dǎo)致大量乘加資源處于空閑狀態(tài),無法充分利用資源加速推理計(jì)算;③在存儲輸出數(shù)據(jù)時,仲裁單元和輸出緩存單元過于龐大且單一,在面臨較多輸出數(shù)據(jù)時,容易造成數(shù)據(jù)擁塞問題。為解決上述問題,進(jìn)一步優(yōu)化稀疏DNN數(shù)據(jù)處理方式,本文提出了稀疏卷積計(jì)算高效數(shù)據(jù)加載與輸出緩存策略,主要包括:
1)采用全對全數(shù)據(jù)流計(jì)算,將屬于同一輸入通道的非零IFM數(shù)據(jù)與非零權(quán)重進(jìn)行任意兩兩配對計(jì)算,降低了非零數(shù)據(jù)配對難度,提高了乘加資源利用率。
2)采用輸入駐留計(jì)算,以及密集型循環(huán)加載IFM數(shù)據(jù),大幅減少了數(shù)據(jù)片外調(diào)取次數(shù)。
3)優(yōu)化輸出緩存設(shè)計(jì),簡化乘累加中間結(jié)果緩存尋址難度,實(shí)現(xiàn)了輸出數(shù)據(jù)的簡便、快速存儲,避免了數(shù)據(jù)訪問爭用、存儲擁塞等問題。
稀疏IFM數(shù)據(jù)和稀疏權(quán)重導(dǎo)致DNN推理計(jì)算過程中存在大量的無效數(shù)據(jù)存儲和計(jì)算。圖1展示了稀疏卷積計(jì)算特點(diǎn),理論計(jì)算包含了較多0值數(shù)據(jù)所參與的無效計(jì)算,實(shí)際只需較少的有效計(jì)算便可得到結(jié)果,而且0值數(shù)據(jù)的存儲也會造成資源和能量消耗。
針對上述問題,為提高處理稀疏網(wǎng)絡(luò)的性能和效率,研究人員設(shè)計(jì)了多種稀疏DNN加速器。例如,針對特征圖像中存在的稀疏性而被設(shè)計(jì)的加速計(jì)算架構(gòu)Cnvlutin[5]、Cambricon-X[6]等。這類架構(gòu)利用單索引或者偏移量對特征圖像數(shù)據(jù)進(jìn)行篩選配對,隨后配對數(shù)據(jù)被輸送至乘法器完成計(jì)算,再由加法樹實(shí)現(xiàn)累加。由于網(wǎng)絡(luò)的稀疏,需要配對的有效數(shù)據(jù)較少,如要使配對數(shù)據(jù)填滿計(jì)算資源以提高計(jì)算效率,就需要復(fù)雜的配對及控制邏輯,存在較高的設(shè)計(jì)難度。Li[7]、Lu[8]等針對權(quán)重矩陣中的稀疏性進(jìn)行了定制設(shè)計(jì):首先將單個權(quán)重需要計(jì)算的IFM數(shù)據(jù)進(jìn)行全部提取,然后該權(quán)重與所有IFM數(shù)據(jù)乘積得到一個中間結(jié)果圖像,最后對所有權(quán)重進(jìn)行同樣操作并累加中間結(jié)果圖像得到完整的輸出特征圖像(output feature map, OFM)。但在處理淺層DNN時,需要使用較多的緩存空間以提取全部IFM數(shù)據(jù),同時也需暫存每個中間結(jié)果圖像,需要較多硬件存儲資源。Liu等[9]通過判斷乘法器所加載的IFM數(shù)據(jù)是否為0以控制計(jì)算的執(zhí)行,可以阻止無效計(jì)算的產(chǎn)生并減少計(jì)算功耗,但未執(zhí)行計(jì)算的資源處于空閑,存在利用不充分的現(xiàn)象。同時該方法在操作上僅避免了無效計(jì)算并沒有節(jié)省計(jì)算周期,無法有效加速推理計(jì)算。
可以看到,上述加速器由于只考慮到了DNN中的一種稀疏特性,仍存在無效數(shù)據(jù)的加載和計(jì)算,計(jì)算效率提升不夠顯著,數(shù)據(jù)流和硬件架構(gòu)也需優(yōu)化。更多設(shè)計(jì)則把特征圖像中動態(tài)稀疏和靜態(tài)稀疏均納入設(shè)計(jì)考量。
Zhou[3]、Lin[10]等針對IFM數(shù)據(jù)和權(quán)重?cái)?shù)據(jù)稀疏,設(shè)計(jì)了雙索引邏輯實(shí)現(xiàn)有效數(shù)據(jù)配對,這種配對有效數(shù)據(jù)的方式與Cambricon-X相似,不可避免地給加速器設(shè)計(jì)增添了復(fù)雜度和額外功耗。VSCNN[11]通過將輸出數(shù)據(jù)的中間結(jié)果依次傳輸給不同處理單元(processing element, PE)以加速輸出數(shù)據(jù)累加,并通過剔除IFM上規(guī)則分布的0值數(shù)據(jù),實(shí)現(xiàn)稀疏網(wǎng)絡(luò)處理優(yōu)化,但無法加速不規(guī)則網(wǎng)絡(luò)。SCNN[12]直接輸入IFM數(shù)據(jù)和權(quán)重高效完成卷積計(jì)算而不是采取數(shù)據(jù)配對的方式,并根據(jù)輸出數(shù)據(jù)的OFM坐標(biāo)將數(shù)據(jù)存儲在輸出緩存單元,但在存儲輸出數(shù)據(jù)時會面臨同一地址有多個數(shù)據(jù)存儲的爭用問題。文獻(xiàn)[13]設(shè)計(jì)了一個針對稀疏卷積神經(jīng)網(wǎng)絡(luò)的細(xì)粒度脈動加速器(fine-grained systolic accelerator, FSA),利用IFM數(shù)據(jù)沿乘法器陣列水平方向以脈動的方式移動,實(shí)現(xiàn)IFM數(shù)據(jù)復(fù)用。這種脈動方式需花費(fèi)一定周期才能讓IFM數(shù)據(jù)遍歷所有乘法器,在IFM數(shù)據(jù)量較少時,IFM只需水平移動較少的周期便完成了計(jì)算,會導(dǎo)致位于脈動方向較后的乘法器無法接收數(shù)據(jù),因此存在乘法器利用率低的問題。同時,FSA與多數(shù)加速器相似,在利用輸出數(shù)據(jù)的OFM坐標(biāo)為索引存儲數(shù)據(jù)時,需將所有推理計(jì)算結(jié)果輸送至同一個仲裁單元完成數(shù)據(jù)分配。該仲裁單元受密集數(shù)據(jù)的影響,會發(fā)生數(shù)據(jù)擁塞,并不利于數(shù)據(jù)的高效存儲,且在設(shè)計(jì)上需要較大的內(nèi)部數(shù)據(jù)帶寬,導(dǎo)致該單元在加速器中有較大的面積占比。
綜上所述,現(xiàn)有加速器能在稀疏DNN上實(shí)現(xiàn)加速,但存在數(shù)據(jù)流低效、資源利用率不高、硬件設(shè)計(jì)復(fù)雜等問題,因此亟須進(jìn)一步優(yōu)化稀疏DNN加速器設(shè)計(jì)。
為了有效克服上述挑戰(zhàn),使加速器獲取更好的處理性能,提出了稀疏卷積計(jì)算高效數(shù)據(jù)加載與輸出緩存策略,主要研究工作如下。
如圖2所示,DNN的計(jì)算模式表現(xiàn)為:編號為Co的卷積核權(quán)重矩陣與輸入特征圖像矩陣計(jì)算時,相同輸入通道Ci的權(quán)重矩陣與輸入特征圖像矩陣進(jìn)行卷積,得到該輸入通道的中間結(jié)果圖像,然后將所有輸入通道的中間結(jié)果對應(yīng)相加,得到輸出通道Co的完整輸出特征圖像。
圖2 DNN計(jì)算示意圖Fig.2 DNN calculation schematic
通過分析同一輸入通道數(shù)據(jù)的卷積運(yùn)算可知,除位于IFM邊緣的數(shù)據(jù)只需與卷積核中部分權(quán)重進(jìn)行乘積外,IFM中的大部分?jǐn)?shù)據(jù)需要與該輸入通道內(nèi)的所有權(quán)重進(jìn)行乘積。因此為了提高計(jì)算效率,本設(shè)計(jì)選擇采用全對全的方式進(jìn)行卷積運(yùn)算,亦即,將屬于同一輸入通道的所有IFM數(shù)據(jù)與所有權(quán)重均進(jìn)行相乘運(yùn)算,同時根據(jù)二者坐標(biāo)計(jì)算輸出坐標(biāo),根據(jù)輸出坐標(biāo)值確定計(jì)算結(jié)果是否有意義。但這一計(jì)算方式也會導(dǎo)致邊緣IFM數(shù)據(jù)引入部分非必要的冗余計(jì)算。冗余計(jì)算比例可用乘法器利用率進(jìn)行衡量:
(1)
計(jì)算總量是IFM非零數(shù)據(jù)總數(shù)和非零權(quán)重總數(shù)相乘得出;冗余計(jì)算量則是邊緣IFM數(shù)據(jù)多余的計(jì)算量。圖3展示了在不同IFM稀疏度和IFM尺寸下全對全乘積的乘法器利用率??梢钥吹?在IFM不存在稀疏的情況下,IFM尺寸大于14像素×14像素時,全對全數(shù)據(jù)流計(jì)算的乘法器利用率均高于90%。雖然在IFM尺寸較小時,隨著計(jì)算總量的減少,冗余計(jì)算的占比有所增加,導(dǎo)致乘法器利用率下降,但在實(shí)際情況下,受稀疏的影響,位于IFM邊緣的數(shù)據(jù)量有所減少,計(jì)算總量中冗余計(jì)算的占比也因此下降,故乘法器利用率得以提升。在圖3中表現(xiàn)為乘法器利用率隨著IFM稀疏度的增加而增加,因此IFM數(shù)據(jù)的稀疏有利于全對全數(shù)據(jù)流計(jì)算。雖然引入的冗余計(jì)算會降低乘法器利用率,但對整體計(jì)算的影響并不嚴(yán)重。
圖3 不同IFM稀疏度和IFM尺寸下乘法器利用率Fig.3 Multiplier utilization for different IFM sparsity and IFM size
為實(shí)現(xiàn)全對全數(shù)據(jù)流計(jì)算,設(shè)計(jì)了如圖4所示的N×M乘加陣列,其中N和M均應(yīng)為2的整數(shù)次冪以簡化尋址邏輯。以N=8,M=8為例介紹乘加陣列工作過程:乘加陣列的上方接收權(quán)重,每列共享相同權(quán)重;左方接收IFM數(shù)據(jù),每行共享相同IFM數(shù)據(jù)。在進(jìn)行推理計(jì)算時,只要屬于相同輸入通道的IFM數(shù)據(jù)和權(quán)重即需要兩兩乘積,全對全數(shù)據(jù)流可以在每個計(jì)算周期獲取64個不同的乘積結(jié)果。
圖4 乘加陣列Fig.4 Multiplier and accumulator array
累加并存儲輸出數(shù)據(jù)的中間結(jié)果時,本設(shè)計(jì)同步為每個乘加單元(multiply and accumulate unit, MAU)搭配一個獨(dú)立的地址計(jì)算單元。該單元根據(jù)IFM數(shù)據(jù)的行、列坐標(biāo)以及權(quán)重的行、列坐標(biāo)實(shí)時地計(jì)算出輸出數(shù)據(jù)的OFM坐標(biāo),根據(jù)OFM坐標(biāo)將輸出數(shù)據(jù)存儲在輸出緩存單元的不同地址,OFM坐標(biāo)計(jì)算公式[13]如下:
(2)
(3)
其中:O、I、W分別表示輸出、IFM數(shù)據(jù)和權(quán)重;下標(biāo)r、c分別表示行坐標(biāo)和列坐標(biāo);KS表示卷積核窗口尺寸。如果計(jì)算得到的OFM坐標(biāo)超出了OFM實(shí)際尺寸范圍,則標(biāo)記該輸出數(shù)據(jù)為無效以屏蔽其后續(xù)的累加和存儲等操作。
為節(jié)約存儲空間,IFM數(shù)據(jù)和權(quán)重矩陣通常采用稀疏編碼格式進(jìn)行存儲,如按照原始存儲順序加載IFM數(shù)據(jù)和權(quán)重,在形式上雖能得到所有推理計(jì)算的中間結(jié)果,但卷積計(jì)算結(jié)果輸出順序?qū)兊没靵y。比如,壓縮后的數(shù)據(jù)雖然密集但無規(guī)律,在IFM數(shù)據(jù)與權(quán)重相乘時,所有乘積結(jié)果分布在輸出特征圖像的各個位置,從而導(dǎo)致緩存尋址邏輯復(fù)雜。同時,較多未完成累加的中間結(jié)果暫存也給加速器緩存資源帶來極大負(fù)擔(dān)。因此需要在利用全對全數(shù)據(jù)流加速推理計(jì)算的基礎(chǔ)上,設(shè)計(jì)一種數(shù)據(jù)加載方案,以簡化輸出數(shù)據(jù)的累加邏輯,并降低輸出數(shù)據(jù)尋址存儲的復(fù)雜度。該方案主要分為兩部分:①針對數(shù)據(jù)加載順序,通過將IFM數(shù)據(jù)和權(quán)重按照一定先后次序加載到乘加陣列,簡化輸出數(shù)據(jù)的中間結(jié)果累加邏輯,有利于通過一定規(guī)律將輸出數(shù)據(jù)尋址暫存;②針對數(shù)據(jù)復(fù)用,通過減少IFM數(shù)據(jù)從片外存儲單元讀取的次數(shù)以及片內(nèi)暫存的中間結(jié)果數(shù)量,實(shí)現(xiàn)數(shù)據(jù)搬移功耗和輸出緩存需求的減少。
2.2.1 數(shù)據(jù)加載預(yù)處理
加載數(shù)據(jù)前,為了剔除0值稀疏數(shù)據(jù)并減少存儲空間需求,對IFM數(shù)據(jù)和權(quán)重均采用壓縮稀疏行(compressed sparse row, CSR)編碼方式存儲,并在計(jì)算過程中實(shí)時解碼恢復(fù)其原始坐標(biāo)。通過CSR編碼,將得到由非0數(shù)據(jù)組成的密集數(shù)據(jù)向量,以及由非0數(shù)據(jù)間0值數(shù)據(jù)的數(shù)量組成的數(shù)據(jù)偏移量。如圖5所示,IFM數(shù)據(jù)在進(jìn)入輸入緩存單元前,首先由稀疏解碼模塊根據(jù)IFM數(shù)據(jù)偏移量還原出IFM數(shù)據(jù)的行、列坐標(biāo),然后IFM數(shù)據(jù)及其行、列坐標(biāo)組成輸入數(shù)據(jù)加載至數(shù)據(jù)分配單元(demultiplexer, DMUX),最后將不同列坐標(biāo)的IFM數(shù)據(jù)經(jīng)數(shù)據(jù)分配單元分配到不同編號的IFM FIFO(first in first out)中,IFM FIFO的數(shù)量依乘加陣列的行數(shù)N而定。指針控制模塊用于控制多個IFM FIFO并行輸出。
圖5 IFM數(shù)據(jù)加載至輸入緩存單元Fig.5 Loading the IFM data into the input buffer unit
圖6展示了稀疏輸入數(shù)據(jù)存入輸入緩存單元的方式,左圖稀疏輸入數(shù)據(jù)的部分空缺位置是IFM上未被壓縮存儲的0值數(shù)據(jù),由于FIFO的特性,后續(xù)數(shù)據(jù)會頂替其位置,保證了FIFO數(shù)據(jù)的密集性,使得每個計(jì)算周期每個FIFO都能輸送數(shù)據(jù)給乘加陣列處理,有效充分利用乘法器資源,配合全對全數(shù)據(jù)流計(jì)算完成更高效的DNN推理計(jì)算。同時從圖6中可以看到,若稀疏隨機(jī)度較高,則可能會在不同的FIFO中產(chǎn)生非等長的隊(duì)列,進(jìn)而導(dǎo)致在某些周期中乘法器未得到充分利用。這一問題可通過均衡稀疏[14-16]方法減輕其帶來的影響。
圖6 稀疏輸入數(shù)據(jù)存入FIFOFig.6 Sparse input data storage into FIFO
如圖7所示,稀疏編碼存儲的權(quán)重矩陣以相同的方式進(jìn)行稀疏解碼后送入8路FIFO中緩存, FIFO數(shù)量依乘加陣列的列數(shù)M而定。
圖7 權(quán)重緩存單元結(jié)構(gòu)Fig.7 Weight buffer unit structure
當(dāng)權(quán)重緩存單元輸出權(quán)重時,8路FIFO可以輸出不同輸出通道的卷積核權(quán)重到乘加陣列的不同列,便于并行執(zhí)行不同輸出通道的推理計(jì)算。計(jì)數(shù)模塊則用于控制FIFO的權(quán)重讀取。
2.2.2 輸入駐留
在進(jìn)行DNN數(shù)據(jù)處理時,每次需向輸入緩存單元加載具有相同輸入通道編號的IFM數(shù)據(jù)和所需的全部權(quán)重,提高所加載數(shù)據(jù)在推理計(jì)算過程中的復(fù)用率可以極大程度減少數(shù)據(jù)的反復(fù)提取。相較其他數(shù)據(jù)復(fù)用方式,數(shù)據(jù)駐留可以最小化讀取數(shù)據(jù)時所帶來的能耗[17]。
本設(shè)計(jì)采用輸入駐留的數(shù)據(jù)復(fù)用方式,將已加載的IFM數(shù)據(jù)駐留在輸入緩存單元中,待相同輸入通道的IFM數(shù)據(jù)與全部權(quán)重完成計(jì)算后,更換下一個IFM數(shù)據(jù),以此最小化IFM數(shù)據(jù)的讀取和寫入能耗。如果輸出IFM數(shù)據(jù)時單純地保持其完全不變,就需要持續(xù)更新權(quán)重,會導(dǎo)致權(quán)重緩存單元面臨頻繁的數(shù)據(jù)交互。為了避免這種情況,本設(shè)計(jì)選擇一定周期內(nèi)維持權(quán)重不變,如圖8所示,首先,輸入緩存單元的每個FIFO以k個IFM數(shù)據(jù)為一組進(jìn)行周期性循環(huán)輸出,每k個周期為一次循環(huán),每個周期輸出該組的不同IFM數(shù)據(jù);其次,同一個循環(huán)內(nèi),權(quán)重緩存單元并行輸出1個權(quán)重保持k個周期不變;然后,下一次循環(huán)從頭開始輸出該組IFM數(shù)據(jù)并更換下一個權(quán)重;最后,當(dāng)該組IFM數(shù)據(jù)遍歷全部權(quán)重后,更新下一組IFM數(shù)據(jù)開始周期性循環(huán)輸出。在循環(huán)期間,IFM數(shù)據(jù)組一直駐留在FIFO內(nèi),由指針控制模塊控制FIFO讀取指針的變化,以此實(shí)現(xiàn)輸入駐留。維持權(quán)重不變的工作則由計(jì)數(shù)模塊完成,通過計(jì)數(shù)k個周期讀取一次權(quán)重,保證每個權(quán)重在加速器內(nèi)均復(fù)用k次。由于輸入數(shù)據(jù)需要根據(jù)列坐標(biāo)被輸送到不同的FIFO,每個周期只能完成1個輸入數(shù)據(jù)分配,故8個IFM FIFO并行輸出IFM數(shù)據(jù)組時數(shù)據(jù)量k不宜過大,否則會導(dǎo)致輸入數(shù)據(jù)分配時序緊張。而且IFM尺寸隨著網(wǎng)絡(luò)深度的增加而減小,另外存在稀疏性,每列的IFM數(shù)據(jù)也較少。所以本設(shè)計(jì)設(shè)置k為8,在緩解輸入數(shù)據(jù)分配壓力的同時盡可能多地復(fù)用權(quán)重。具體表現(xiàn)為:圖8(a)表示第1個周期輸出下標(biāo)為1的IMF數(shù)據(jù);圖8(b)表示第8個周期輸出下標(biāo)為8的IFM數(shù)據(jù);圖8(c)表示第9個周期重新輸出下標(biāo)為1的IFM數(shù)據(jù),以此循環(huán)往復(fù);圖8(d)表示在連續(xù)的8個周期內(nèi),只有IFM數(shù)據(jù)變化,而權(quán)重不變,用W1替代權(quán)重緩存單元并行輸出的權(quán)重。
(a) 第1周期IFM數(shù)據(jù)輸出(a) IFM data output in cycle 1
(b) 第8周期IFM數(shù)據(jù)輸出(b) IFM data output in cycle 8
(c) 第9周期IFM數(shù)據(jù)輸出(c) IFM data output in cycle 9
(d) 不同周期的數(shù)據(jù)輸出(d) Data output for different cycles圖8 輸入駐留Fig.8 Input stationary
全對全數(shù)據(jù)流計(jì)算用于完成DNN推理計(jì)算加速;輸入駐留用于高效加載數(shù)據(jù)至乘加陣列,減少數(shù)據(jù)搬移。本小節(jié)所介紹的輸出緩存分塊則用于解決乘加陣列計(jì)算結(jié)果的累加、暫存等問題。
通過全對全數(shù)據(jù)流計(jì)算得到的乘積結(jié)果需要被有效存儲,并能方便后續(xù)輸出數(shù)據(jù)中間結(jié)果的累加。如果試圖將乘加陣列每個計(jì)算周期得到的64個計(jì)算結(jié)果輸送至一個輸出緩存單元中暫存,受限于輸出緩存單元每周期只能存儲有限數(shù)據(jù)個數(shù),就會導(dǎo)致存儲的時序無法滿足大量數(shù)據(jù)緩存需求,引發(fā)數(shù)據(jù)擁塞。因此,本設(shè)計(jì)將輸出緩存單元劃分成多塊,為每個乘法器搭配獨(dú)立的緩存模塊,以保證每個乘積結(jié)果能立即存儲,避免時序緊張。
為簡化計(jì)算結(jié)果緩存尋址難度,本設(shè)計(jì)首先限制乘加陣列中不同列的權(quán)重來自不同輸出通道的卷積核,因此乘法器列與列之間的計(jì)算可以互不影響。以單列乘法器輸出結(jié)果的數(shù)據(jù)流傳輸為例介紹所設(shè)計(jì)的輸出緩存架構(gòu):如圖9(a)所示,在密集DNN計(jì)算中,8列IFM數(shù)據(jù)分別加載到不同行的乘法器,與坐標(biāo)為(0,0)的權(quán)重進(jìn)行乘積,得到對應(yīng)輸出數(shù)據(jù)的第一個中間結(jié)果,無須累加可直接存入輸出緩存單元。圖9(b)中更換坐標(biāo)為(0,1)的權(quán)重時,此時8列IFM數(shù)據(jù)與權(quán)重的乘積結(jié)果需要錯位一行傳輸,與上一行輸出數(shù)據(jù)的第一個中間結(jié)果累加,亦即,此時第二行的乘積I(0,1)×W(0,1)需與第一行存儲結(jié)果I(0,0)×W(0,0)累加。由于I(0,0)×W(0,0)存儲在第一行的輸出緩存單元中,故I(0,1)×W(0,1)需向上傳輸至第一行完成累加后并存儲在第一行,第三行的乘積結(jié)果傳輸至第二行,以此類推。圖9(c)中更換坐標(biāo)為(0,2)的權(quán)重時,此時8列IFM數(shù)據(jù)與權(quán)重的乘積結(jié)果需錯位兩行傳輸,同理,第三行的乘積結(jié)果I(0,2)×W(0,2)需要與第一行存儲的中間結(jié)果I(0,0)×W(0,0)+I(0,1)×W(0,1)累加,故I(0,2)×W(0,2)需傳輸至第一行完成累加后并存儲在第一行,第四行的乘積結(jié)果傳輸至第二行,以此類推。根據(jù)權(quán)重列坐標(biāo)的不同,當(dāng)前行的乘積結(jié)果需向上傳輸至不同行。而更改為不同行的權(quán)重時,需要累加的IFM數(shù)據(jù)也會更改,但列坐標(biāo)相同的IFM數(shù)據(jù)會加載至同一行的乘法器,即I(0,0) ×W(0,0)與I(1,0)×W(1,0)均在第一行乘法器完成乘積,故無須錯行傳輸。
(a) 中間結(jié)果直接存儲(a) Intermediate result storage directly
(b) 中間結(jié)果向上傳輸一行并累加存儲(b) Intermediate result transfers up one line to accumulate and store
(c) 中間結(jié)果向上傳輸兩行并累加存儲(c) Intermediate result transfers up two rows to accumulate and store圖9 單列乘法器輸出結(jié)果的數(shù)據(jù)流傳輸Fig.9 Data flow transmission of single column multiplier output results
綜上所述,連續(xù)三行乘法器輸出需匯集到同一行多路選擇器(multiplexer, MUX),由權(quán)重列坐標(biāo)控制數(shù)據(jù)輸出并完成累加,累加結(jié)果存儲在當(dāng)前行的輸出緩存單元,實(shí)現(xiàn)了單周期內(nèi)完成輸出數(shù)據(jù)的累加和暫存,以此解決了數(shù)據(jù)擁塞的問題;同時,不同列的乘加運(yùn)算互不影響,不同行的數(shù)據(jù)存儲相互獨(dú)立,以此解決了輸出數(shù)據(jù)訪問爭用的問題。
基于Verilog HDL語言對設(shè)計(jì)完成了單個PE的寄存器傳輸級(register transfer level, RTL)實(shí)現(xiàn),利用Synopsys Design Compiler工具基于FreePDK 45 nm工藝進(jìn)行了綜合,并完成對設(shè)計(jì)的性能分析:面積評估、數(shù)據(jù)加載效率仿真、乘法器利用率分析。PE架構(gòu)與FSA有較多相近之處,如:①二者都采用了乘法器陣列,且陣列中每行(列)均共享相同的IFM數(shù)據(jù)(權(quán)重);②都在進(jìn)行卷積運(yùn)算的同時計(jì)算OFM數(shù)據(jù)的存儲坐標(biāo);③IFM數(shù)據(jù)和權(quán)重加載前均無須進(jìn)行配對等。同時,相比其他支持稀疏計(jì)算的加速器, FSA在性能和能效等方面均展示了較明顯的優(yōu)勢,其中在性能方面與SCNN、CCR、Cambricon-S[3]相比分別提高了173%、123%、108%,在能效方面分別提高了1 386%、924%、625%,因此將FSA作為實(shí)驗(yàn)的比較基準(zhǔn)。
基于稀疏卷積計(jì)算高效數(shù)據(jù)加載和輸出緩存策略設(shè)計(jì)了圖10所示的處理單元結(jié)構(gòu)。IFM數(shù)據(jù)和權(quán)重偏移量經(jīng)過稀疏解碼單元得到對應(yīng)的行、列坐標(biāo)。IFM數(shù)據(jù)和權(quán)重根據(jù)這些坐標(biāo)經(jīng)數(shù)據(jù)選擇單元輸入至輸入緩存單元和權(quán)重緩存單元。MAU主要由乘法器、選擇器、地址計(jì)算單元、加法器、輸出緩存單元構(gòu)成。輸出緩存單元可根據(jù)不同行數(shù)據(jù)分為4個區(qū)域,每個區(qū)域存儲多個輸出通道的數(shù)據(jù)。
圖10 處理單元頂層結(jié)構(gòu)Fig.10 Processing element top-level structure
由于處理單元在獲取IFM數(shù)據(jù)和權(quán)重時,每次可最多獲取連續(xù)的64個數(shù)據(jù),考慮到最壞的情況,即這64個數(shù)據(jù)均被分配到同一個FIFO,因此FIFO深度至少需要設(shè)置為64。
輸入緩存單元中,每個FIFO不僅要存儲8 bit的IFM數(shù)據(jù),還需要將其行、列坐標(biāo)進(jìn)行存儲。以VGG-16為例,最大行、列坐標(biāo)為224,則需要用8 bit表示行、列坐標(biāo)信息,因此輸入緩存單元實(shí)際存儲空間大小為:
輸入緩存空間=64×8×(8+8+8) bit=12 Kbit
(4)
因此,輸入緩存單元存儲空間大小為1.5 KB。同理,權(quán)重緩存單元也按照需求設(shè)置為1.5 KB。
對于輸出緩存單元,處理單元能存儲4行完整的OFM數(shù)據(jù),在得到完整數(shù)據(jù)后,輸出緩存單元便輸出數(shù)據(jù)以進(jìn)行池化、激活等操作。故輸出緩存空間的大小由實(shí)際運(yùn)行的網(wǎng)絡(luò)決定,以VGG-16為例,第一層卷積的輸出特征圖像尺寸為224 像素×224 像素×64 像素,當(dāng)輸出數(shù)據(jù)位寬為24 bit時,輸出緩存空間為:
輸出緩存空間=4×224×64×24 bit=1 344 Kbit
(5)
因此,輸出緩存單元存儲空間大小為168 KB。
基于FreePDK 45 nm工藝對設(shè)計(jì)完成RTL到電路的實(shí)現(xiàn),并根據(jù)工藝尺寸比的平方等比例縮小,將設(shè)計(jì)參數(shù)等效為28 nm工藝下的參數(shù)并與FSA進(jìn)行比較。表1展示了本設(shè)計(jì)與FSA在單PE上的參數(shù)對比,從整體上看,本設(shè)計(jì)處理單元在設(shè)計(jì)需求上主要集中在緩存單元,但針對不同神經(jīng)網(wǎng)絡(luò)應(yīng)用,所需存儲的輸出數(shù)據(jù)量各不相同,故在實(shí)際應(yīng)用中允許對輸出緩存單元進(jìn)行可配置性設(shè)計(jì)。由于簡化了輸出緩存的邏輯設(shè)計(jì),故不需要對累加緩存單元和仲裁交叉開關(guān)進(jìn)行設(shè)計(jì),PE總體面積相比FSA減少了21.45%。
表1 本文策略與FSA在PE上的參數(shù)比較Tab.1 Parameters comparison between this paper and FSA on PE
數(shù)據(jù)加載效率能反映出PE的處理性能。在進(jìn)行DNN推理計(jì)算時,本設(shè)計(jì)所需的數(shù)據(jù)加載周期與輸入緩存單元內(nèi)數(shù)據(jù)量最大值以及權(quán)重緩存單元內(nèi)數(shù)據(jù)量最大值有關(guān)。這是因?yàn)?受數(shù)據(jù)稀疏的影響,在不考慮FIFO深度的情況下,將單輸入通道的IFM分配到輸入緩存單元時,8個IFM FIFO獲取的數(shù)據(jù)量并不相同,而同一輸入通道的數(shù)據(jù)沒有全部完成處理就無法開始下一個通道的數(shù)據(jù)處理,所以數(shù)據(jù)加載周期與輸入緩存單元內(nèi)FIFO的最大數(shù)據(jù)量有關(guān),令8個FIFO中的數(shù)據(jù)量最大值為MaxI。同理,令權(quán)重緩存單元的數(shù)據(jù)量最大值為MaxW。每個IFM數(shù)據(jù)需要與權(quán)重緩存單元中的所有權(quán)重進(jìn)行乘積,則每個IFM數(shù)據(jù)需要循環(huán)MaxW次,單輸入通道的IFM數(shù)據(jù)加載周期Cyclechannel表示為:
Cyclechannel=MaxI×MaxW
(6)
完成一個輸入通道的數(shù)據(jù)加載后開始其余輸入通道的數(shù)據(jù)加載,則單個卷積層的數(shù)據(jù)加載周期Cyclelayer是所有輸入通道的周期之和:
(7)
其中,Ci表示該層IFM的輸入通道數(shù)。 一幅圖像所需的周期是所有卷積層的周期之和:
(8)
與FSA相比,其PE內(nèi)的數(shù)據(jù)處理是將IFM數(shù)據(jù)根據(jù)乘法器陣列大小分成多組,每個周期依次輸入不同組IFM數(shù)據(jù)并加載不同的權(quán)重。如圖11所示,第1個周期加載第1組IFM數(shù)據(jù)和第1個權(quán)重到乘法器陣列的第1列;第2個周期將第1列的IFM數(shù)據(jù)水平移位到第2列,并加載第2組IFM數(shù)據(jù)到第1列;第1個權(quán)重固定在第1列不動,加載第2個權(quán)重至乘法器陣列的第2列。根據(jù)此數(shù)據(jù)流,對FSA以及本設(shè)計(jì)進(jìn)行數(shù)據(jù)加載效率仿真,分析二者處理相同神經(jīng)網(wǎng)絡(luò)以及網(wǎng)絡(luò)中不同層的數(shù)據(jù)加載所需周期。
圖11 FSA PE數(shù)據(jù)流Fig.11 FSA PE data flow
在對比數(shù)據(jù)加載效率前,對不同網(wǎng)絡(luò)層的數(shù)據(jù)稀疏度進(jìn)行設(shè)定。SCNN[12]展示了VGG-16不同層IFM和權(quán)重的稀疏度,整理數(shù)據(jù)如表2所示。
表2 VGG-16不同卷積層IFM和權(quán)重的稀疏度[12]Tab.2 Sparsity of IFM and weight for different convolutional layers in VGG-16 [12] %
根據(jù)表2設(shè)置不同層的數(shù)據(jù)稀疏度對本設(shè)計(jì)以及FSA處理VGG-16時的數(shù)據(jù)加載周期進(jìn)行仿真驗(yàn)證,圖12展示了二者在處理VGG-16時不同卷積層的數(shù)據(jù)加載周期對比。對于每一個卷積層,本設(shè)計(jì)所需的數(shù)據(jù)加載周期均小于FSA。從總的數(shù)據(jù)加載周期來看,本設(shè)計(jì)所需時間僅為FSA的45.93%。由于數(shù)據(jù)加載至乘加陣列能立即執(zhí)行計(jì)算,故所需數(shù)據(jù)處理周期與數(shù)據(jù)加載周期一致,因此在數(shù)據(jù)處理速度方面提升了117.71%。以上數(shù)據(jù)對比在權(quán)重隨機(jī)分布的情況下實(shí)現(xiàn),即權(quán)重在卷積核的分布完全隨機(jī)且無規(guī)律,實(shí)驗(yàn)結(jié)果驗(yàn)證了本設(shè)計(jì)在任何情況都比FSA更加高效。
圖12 本設(shè)計(jì)與FSA處理VGG-16時不同卷積層的數(shù)據(jù)加載周期對比Fig.12 Comparison of data loading cycles for different convolutional layers with VGG-16 processing in this design and FSA
事實(shí)上,權(quán)重分布可以通過訓(xùn)練和剪枝改變,并根據(jù)處理需求進(jìn)行適當(dāng)調(diào)整,比如Yao等[14]提出了一種均衡稀疏和對應(yīng)剪枝算法,可以均衡不同卷積核的權(quán)重?cái)?shù)量,在保持高計(jì)算精度的同時能夠?qū)崿F(xiàn)卷積核并行處理加速。在完成卷積核訓(xùn)練后,權(quán)重分布基本維持不變,不同卷積核的權(quán)重?cái)?shù)量也實(shí)現(xiàn)均衡,使得每個權(quán)重緩存單元的權(quán)重?cái)?shù)量維持在平均值左右。在此基礎(chǔ)上,稀疏DNN推理計(jì)算時所需的數(shù)據(jù)加載周期會獲得減少,從而提高推理計(jì)算速度。如圖13所示,本設(shè)計(jì)實(shí)現(xiàn)權(quán)重均衡后數(shù)據(jù)加載周期與之前相比,總體減少了約11.87%。
圖13 本設(shè)計(jì)在均衡權(quán)重與隨機(jī)權(quán)重的數(shù)據(jù)讀取周期對比Fig.13 Data read cycles of this design in balanced weights and random weights
乘法器的利用率反映出所設(shè)計(jì)電路實(shí)際的資源使用情況,優(yōu)秀的設(shè)計(jì)應(yīng)充分利用資源,實(shí)現(xiàn)計(jì)算量的最大化以及推理計(jì)算加速。根據(jù)式(1),乘法器利用率是有效計(jì)算量與計(jì)算總量之比,在電路系統(tǒng)中,應(yīng)是有效計(jì)算量與乘法器可使用量之比,如式(9)所示:
(9)
每個數(shù)據(jù)加載周期都有一定數(shù)量的乘法器供計(jì)算使用,處理單元每周期可使用64個乘法器同時計(jì)算,而充分利用資源是實(shí)現(xiàn)計(jì)算加速的途徑之一。圖14展示了在均衡權(quán)重的情況下,本設(shè)計(jì)與FSA單個PE在不同卷積層的乘法器利用率。在層數(shù)較淺時,得益于權(quán)重均衡,乘法器利用率能維持在95%以上;在層數(shù)較深時,由于IFM尺寸的降低,每個通道的待處理數(shù)據(jù)過少而引起乘法器利用率下降。但總的來看,平均乘法器利用率達(dá)到89%。相比之下,FSA的乘法器利用率并不樂觀,但是FSA設(shè)計(jì)了一個混合分區(qū)方案,即層數(shù)較淺時,將IFM按尺寸分成多塊;層數(shù)較深時,將IFM按通道分成多塊,每個PE同時處理不同塊的數(shù)據(jù)。其通過混合分區(qū)可將平均乘法器利用率提高到80%,但本設(shè)計(jì)仍比FSA的乘法器利用率提高了11.25%。
圖14 均衡權(quán)重下本設(shè)計(jì)與FSA的乘法器利用率對比Fig.14 Comparison of multiplier utilization between this design and FSA under balanced weights
本文提出了稀疏卷積計(jì)算高效數(shù)據(jù)加載與輸出緩存策略,通過采用全對全數(shù)據(jù)流計(jì)算,即將屬于同一輸入通道的非零IFM數(shù)據(jù)與非零權(quán)重進(jìn)行任意兩兩配對計(jì)算,降低了非零數(shù)據(jù)配對難度,提高了乘加資源利用率;其次通過采用輸入駐留計(jì)算以及密集型循環(huán)加載IFM數(shù)據(jù),大幅減少了數(shù)據(jù)片外調(diào)取次數(shù);最后優(yōu)化了輸出緩存設(shè)計(jì)并簡化了乘累加中間結(jié)果緩存尋址過程,實(shí)現(xiàn)了輸出數(shù)據(jù)的簡便、快速存儲,避免了數(shù)據(jù)訪問爭用、存儲擁塞等問題。實(shí)驗(yàn)表明,與采用類似架構(gòu)的FSA相比,在處理單元面積上減少了21.45%;在數(shù)據(jù)加載速度方面平均提高了117.71%;在平均乘法器資源利用率方面提高了11.25%,并達(dá)到89%。