周?chē)?guó)飛
(上海齊感電子信息科技有限公司 上海市 200120)
自從2012年AlexNet算法發(fā)布以來(lái),深度神經(jīng)網(wǎng)絡(luò)技術(shù)(Deep Neural Networking)在圖像識(shí)別、語(yǔ)音處理、自然語(yǔ)言處理(NLP)等非結(jié)構(gòu)化數(shù)據(jù)處理領(lǐng)域和廣告分類(lèi)、搜索優(yōu)化等結(jié)構(gòu)化數(shù)據(jù)處理領(lǐng)域都得到了廣泛應(yīng)用。 深度神經(jīng)網(wǎng)絡(luò)算法對(duì)于硬件算力的需求也在近幾年以每月翻番的速度遞增,遠(yuǎn)遠(yuǎn)超過(guò)了芯片摩爾定律的增長(zhǎng)速度[1]。本文針對(duì)深度神經(jīng)網(wǎng)絡(luò)的計(jì)算需求,定制設(shè)計(jì)一種新型的深度神經(jīng)網(wǎng)絡(luò)加速器(Deep Neural Networking Accelerator,簡(jiǎn)稱(chēng)DNNA),提高深度神經(jīng)網(wǎng)絡(luò)的計(jì)算效率,提高神經(jīng)網(wǎng)絡(luò)輸入數(shù)據(jù)的復(fù)用率,可集成在SoC芯片上實(shí)現(xiàn)低功耗邊緣推理。
深度神經(jīng)網(wǎng)絡(luò)的算法特征:
(1)包含多層卷積運(yùn)算和矩陣數(shù)據(jù)的后處理計(jì)算;
(2)模型參數(shù)的數(shù)據(jù)量大,各層卷積有數(shù)十到數(shù)千個(gè)輸入通道(Input Channel)和輸出通道(即權(quán)重核數(shù));
(3)卷積計(jì)算是多重循環(huán)的乘法和加法運(yùn)算,輸入數(shù)據(jù)按不同維度被重復(fù)參與計(jì)算;
(4)卷積計(jì)算具備稀疏性,即通過(guò)訓(xùn)練得到的模型權(quán)重可能包含很多的零值。
針對(duì)上述算法特征,本文DNNA的優(yōu)化設(shè)計(jì)一是對(duì)不同尺寸參數(shù)的卷積計(jì)算做動(dòng)態(tài)適配,優(yōu)化計(jì)算的并行度;二是對(duì)稀疏卷積可以節(jié)省零值權(quán)重的計(jì)算時(shí)間,均衡非零權(quán)重的算力,提高計(jì)算單元的利用率。
深度神經(jīng)網(wǎng)絡(luò)的核心計(jì)算負(fù)擔(dān)主要在于網(wǎng)絡(luò)中的多層卷積計(jì)算,每一層卷積是三維輸入特征(Input Feature Map,簡(jiǎn)稱(chēng)IFM)與四維卷積權(quán)重計(jì)算得到三維輸出特征向量(Output Feature Map,簡(jiǎn)稱(chēng)OFM)。
本文DNNA需要將參與計(jì)算的輸入數(shù)據(jù)通過(guò)DMA從片外DRAM載入到全局緩存、再緩存到IFM和權(quán)重的寄存器緩存、然后由乘法和加法器(MAC)陣列取到數(shù)據(jù)和完成計(jì)算。為了提高深度神經(jīng)網(wǎng)絡(luò)的計(jì)算能效,首先對(duì)卷積計(jì)算的并行方式,數(shù)據(jù)流動(dòng)層次給出定量分析,該設(shè)計(jì)過(guò)程也被稱(chēng)為DNNA的數(shù)據(jù)流設(shè)計(jì)。
卷積計(jì)算的各個(gè)變量定義如表1所示。
在神經(jīng)網(wǎng)絡(luò)加速器的一個(gè)時(shí)鐘周期內(nèi),通過(guò)組合邏輯電路的乘法和加法器(MAC)可以得到的相乘和累加的結(jié)果,這是卷積計(jì)算的一個(gè)原子操作。如果沒(méi)有并行計(jì)算,則一個(gè)原子操作只能完成一次乘法和一次加法運(yùn)算。神經(jīng)網(wǎng)絡(luò)加速器的MAC陣列做并行計(jì)算,一個(gè)原子操作最多完成的乘法和累加次數(shù)等于NNA的MAC單元總數(shù)[3] [4]。本文DNNA根據(jù)卷積權(quán)重的尺寸特征,可以動(dòng)態(tài)配置為二維并行卷積計(jì)算或者三維并行卷積計(jì)算。
二維并行卷積計(jì)算是在IFM輸入通道和權(quán)重核數(shù)的兩個(gè)維度上并行,兩個(gè)并行維度相互獨(dú)立,且并行計(jì)算沒(méi)有切割I(lǐng)FM表面(Hi*Wi),因此二維并行卷積并不受卷積步長(zhǎng)(Stride)或者卷積核的空洞(Dilation)的影響。但二維并行卷積的MAC利用率依賴于IFM輸入通道。當(dāng)稀疏卷積的情況,每個(gè)IFM輸入通道的都可能有零值權(quán)重的存在,所以會(huì)影響MAC利用率。
表1:卷積參數(shù)說(shuō)明
三維并行卷積計(jì)算是在IFM輸入通道C、OFM表面(Ho*Wo)和權(quán)重核數(shù)Kn三個(gè)維度上并行,且只采用Dual-MAC設(shè)計(jì),并行計(jì)算兩個(gè)IFM輸入通道[2]。所以一是適合于對(duì)輸入通道較小的卷積計(jì)算場(chǎng)景,如DNN網(wǎng)絡(luò)的圖像輸入層;二是適用于稀疏卷積的情況。
本文DNNA計(jì)算的MAC陣列為8行16列Dual-MAC,即共計(jì)256個(gè)MAC單元。每個(gè)MAC單元完成8bit乘法和相應(yīng)的累加計(jì)算。一次卷積計(jì)算總的乘法計(jì)算個(gè)數(shù)需遍歷卷積權(quán)重的四個(gè)維度和OFM的兩個(gè)維度,一個(gè)單位周期內(nèi)有256個(gè)MAC并行計(jì)算。
綜上可得:二維并行卷積的乘法計(jì)算數(shù)如式(1)所示;三維并行卷積的計(jì)算時(shí)鐘周期數(shù)如式(2)所示。下式中均設(shè)OFM表面(Ho*Wo)足夠大。
式(1)中各因式說(shuō)明如下:
(1)(Kh*Kw)是遍歷輸入權(quán)重一個(gè)表面的循環(huán)。
(3)Ho*Wo是遍歷OFM一個(gè)表面的循環(huán)。
圖1:DNNA的頂層模塊框圖
式(2)中對(duì)三維并行的說(shuō)明如下:
前述兩種并行數(shù)據(jù)流各有適用場(chǎng)景,本文DNNA通過(guò)寄存器配置,硬件模塊中以最合適的并行方式完成計(jì)算。本文DNNA硬件模塊的設(shè)計(jì)框圖如圖1所示,主要模塊描述如下:
(1)APB接口及配置寄存器文件作為軟硬件接口。
(2)專(zhuān)用DMA接口訪問(wèn)外部DRAM存儲(chǔ)的卷積權(quán)重和IFM輸入數(shù)據(jù)。
(3)片上SRAM構(gòu)成全局緩存(Global Buffer),全局緩存可動(dòng)態(tài)劃分存儲(chǔ)空間,存放IFM、權(quán)重、權(quán)重配置信息、寄存器配置信息等。
(4)CONV Dispatcher作為中控模塊,實(shí)現(xiàn)卷積計(jì)算的數(shù)據(jù)流控制和流水線控制。
(5)IFM Buffer和Weight Buffer是從全局緩存到MAC陣列的寄存器緩存,分別存儲(chǔ)IFM數(shù)據(jù)和權(quán)重?cái)?shù)據(jù)。
(6)計(jì)算模塊:MAC陣列、累加器和緩存、單點(diǎn)數(shù)據(jù)的后處理模塊、池化處理模塊。
本文DNNA的層次化存儲(chǔ)設(shè)計(jì)為配置寄存器、DMA和全局緩存三部分,其中完成數(shù)據(jù)流動(dòng)態(tài)配置和流水線控制的CONV Dispatcher設(shè)計(jì)如圖2所示。對(duì)計(jì)算數(shù)據(jù)流的動(dòng)態(tài)配置說(shuō)明如下:
(1)對(duì)深度神經(jīng)網(wǎng)絡(luò)的各層卷積,由寄存器配置各自對(duì)應(yīng)的并行數(shù)據(jù)流。
(2)將一層卷積層分解為多個(gè)獨(dú)立算子,如卷積、池化、激活函數(shù)、矩陣點(diǎn)的算術(shù)運(yùn)算等,將一個(gè)獨(dú)立算子可再分解為DNNA操作和參數(shù)數(shù)據(jù)。該過(guò)程由DMA和寄存器配置協(xié)同完成。
圖2:CONV Dispatcher設(shè)計(jì)框圖
(3)DMA可以自動(dòng)從讀取IFM、權(quán)重和寄存器配置參數(shù)三種數(shù)據(jù)并放入全局緩存,寄存器配置參數(shù)決定計(jì)算過(guò)程。
(4)二維并行和三維并行的數(shù)據(jù)流分別有獨(dú)立的Fetcher模塊和寄存器緩存,根據(jù)數(shù)據(jù)特征自動(dòng)讀入數(shù)據(jù),并且分配到各個(gè)MAC輸入端。
(5)全過(guò)程流水線控制,硬件自動(dòng)完成。
對(duì)于包含了大量零值權(quán)重的稀疏卷積,一是不計(jì)算零值,節(jié)省計(jì)算時(shí)間;二是零值權(quán)重在權(quán)重核可能呈不均勻分布上分布不均勻,需要對(duì)權(quán)重核數(shù)據(jù)做預(yù)處理,并均衡算力,提高M(jìn)AC陣列的利用率。本文DNNA采用軟硬件協(xié)同方式,實(shí)現(xiàn)如下:
(1)軟件工具鏈對(duì)訓(xùn)練后并量化的卷積權(quán)重進(jìn)行壓縮,去掉零值。
(2)再將非零值權(quán)重按照如下順序緊密排序:
(a)連續(xù)2個(gè)輸入通道。
圖3:稀疏卷積的權(quán)重壓縮和排序
(b)連續(xù)8個(gè)權(quán)重核。
(c)權(quán)重行方向Kw。
(d)權(quán)重列方向Kh。
(3)然后均衡每2個(gè)輸入通道和8個(gè)權(quán)重核上的非零值權(quán)重。
(4)經(jīng)過(guò)上述壓縮和排序的預(yù)處理后的權(quán)重,輸入到本文DNNA硬件,Dispatcher模塊控制對(duì)非零值權(quán)重的算力均衡。
(5)本文DNNA對(duì)權(quán)重核數(shù)Kn的并行數(shù)為8,因此對(duì)應(yīng)于(Kh*Kw)*2*8的權(quán)重?cái)?shù)據(jù)量的乘法計(jì)算,MAC陣列共享IFM輸入數(shù)據(jù)。
(6)MAC之間的均衡了算力的MAC中間結(jié)果(Partial Sum)有Accumulator Buffer進(jìn)行緩存。
以一個(gè)尺寸為(Kh*Kw)*2*8=3*3*2*8的權(quán)重?cái)?shù)據(jù)塊為例,壓縮和排序的預(yù)處理效果如圖3所示。圖中空白格表示零值。
要使16*2*8的MAC陣列要達(dá)到100%的利用率,所需IFM和權(quán)重的數(shù)據(jù)帶寬需求(數(shù)據(jù)量/時(shí)鐘周期)如表2所示。
如表2所示,二維并行計(jì)算所需權(quán)重帶寬是IFM帶寬的8倍。本文DNNA采用流水線控制,在每次乘法操作前預(yù)取256 Bytes的權(quán)重?cái)?shù)據(jù)。預(yù)取的權(quán)重?cái)?shù)據(jù)復(fù)用至少8個(gè)時(shí)鐘周期。在當(dāng)前權(quán)重復(fù)用期間,流水線控制從全局緩存預(yù)取下一組256 Bytes的權(quán)重?cái)?shù)據(jù)。所優(yōu)化的二維并行卷積數(shù)據(jù)流如式(3)所示,總的卷積計(jì)算周期數(shù)不變,且未額外增加讀取片上緩存時(shí)間,也未額外增加片上緩存的帶寬。
表2:MAC陣列的數(shù)據(jù)帶寬
表3:FPGA硬件實(shí)現(xiàn)
表4:本文DNNA支持的神經(jīng)網(wǎng)絡(luò)算子
如表2所示,三維并行計(jì)算所需IFM數(shù)據(jù)帶寬大于權(quán)重,且因Stride或Dilation,需要從片上緩存的不同地址讀取IFM數(shù)據(jù)。本文DNNA每次計(jì)算需載入寄存器緩存的最小權(quán)重?cái)?shù)據(jù)量為(Kh*Kw)*2*8。可以配置寄存器使本文DNNA預(yù)取兩個(gè)權(quán)重?cái)?shù)據(jù)塊,同時(shí)預(yù)取對(duì)應(yīng)的IFM數(shù)據(jù),復(fù)用IFM數(shù)據(jù)完成16個(gè)權(quán)重核對(duì)應(yīng)的OFM部分和,所優(yōu)化的三維并行卷積數(shù)據(jù)流如式(4)所示。
本文DNNA基于Verilog HDL語(yǔ)言完成RTL設(shè)計(jì),且均可綜合RTL代碼。RTL設(shè)計(jì)完成后,驗(yàn)證設(shè)計(jì)的仿真方式為:隨機(jī)生成不同卷積尺寸的weight.bin,ifm.bin和配置寄存器的配置文件,并且同時(shí)生成用于比對(duì)的正確OFM數(shù)據(jù)golden.bin,通過(guò)VCS工具仿真和收集該DNNA的計(jì)算結(jié)果,與golden.hex比對(duì)一致。
仿真確認(rèn)的RTL,在Xilinx Zynq-7000 FPGA上實(shí)現(xiàn)。FPGA實(shí)現(xiàn)的硬件模塊配置如表3所示。該FPGA實(shí)現(xiàn)需要27000 LUTs。
所實(shí)現(xiàn)的FPGA DNNA,可以完成如表4所示的神經(jīng)網(wǎng)絡(luò)計(jì)算。
用本文DNNA對(duì)3×3和5×5尺寸的稀疏權(quán)重核進(jìn)行卷積計(jì)算,其中零值權(quán)重的分布完全隨機(jī)。優(yōu)化的稀疏卷積計(jì)算的提升效率如圖4所示。圖中稀疏率是零值權(quán)重占總權(quán)重?cái)?shù)的百分比,節(jié)省的計(jì)算時(shí)間與未優(yōu)化的計(jì)算時(shí)間的百分比,按每種尺寸、每種稀疏率隨機(jī)迭代計(jì)算后,再求平均得到。根據(jù)圖中稀疏優(yōu)化節(jié)省的時(shí)間對(duì)比,可見(jiàn)對(duì)于(Kh*Kw)權(quán)重尺寸越大,稀疏優(yōu)化效果越明顯。且該優(yōu)化設(shè)計(jì)的效果正相關(guān)于稀疏率,與輸入通道和權(quán)重核數(shù)相對(duì)獨(dú)立。
本文針對(duì)深度神經(jīng)網(wǎng)絡(luò)的卷積計(jì)算特征進(jìn)行量化分析和DNNA的數(shù)據(jù)流設(shè)計(jì),根據(jù)數(shù)據(jù)流進(jìn)行DNNA架構(gòu)設(shè)計(jì),并為了提高M(jìn)AC陣列利用率和節(jié)省片上SRAM帶寬所進(jìn)行專(zhuān)門(mén)優(yōu)化。進(jìn)一步說(shuō)明本文DNNA的硬件實(shí)現(xiàn),RTL仿真和FPGA實(shí)現(xiàn)工作,通過(guò)對(duì)稀疏卷積節(jié)省的計(jì)算時(shí)間驗(yàn)證本文DNNA設(shè)計(jì)。下一步工作是將本文DNNA為作為神經(jīng)網(wǎng)絡(luò)專(zhuān)用處理器(DSA),集成到SoC異構(gòu)架構(gòu)中,配合各種外設(shè)接口和輸入設(shè)備,實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)的多種應(yīng)用。