應(yīng)三叢,彭 鈴
(1.四川大學(xué) 計算機(jī)學(xué)院,四川 成都 610065;2.四川大學(xué) 視覺合成圖形圖像技術(shù)國防重點學(xué)科實驗室,四川 成都 610065)
卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)的算法模型優(yōu)化,是提升性能的關(guān)鍵。目前,CNN算法的實現(xiàn)平臺主要有中央處理單元(central processing unit,CPU),圖形處理單元 (graphic processing unit,GPU)和可編輯邏輯門陣列(filed programmable gated array,F(xiàn)PGA)。GPU雖然并行度高,但能耗和成本也較高;CPU無法實現(xiàn)高效的并行運算,導(dǎo)致模型計算效率低下;而FPGA的可重構(gòu)、低延時、高吞吐量等特性更適用于人工智能算法加速。但隨著CNN算法日趨復(fù)雜,基于FPGA的軟硬件協(xié)同技術(shù)被廣泛應(yīng)用。
Meloni和Xue等采用軟硬件協(xié)同設(shè)計方法,其通用處理器是基于ARM(advanced RISC machines)架構(gòu),存在定制成本高、靈活性不足等問題。而第五代精簡指令集(reduced instruction sets computing,RISC-V)作為當(dāng)下熱門的開源精簡指令集架構(gòu),是解決上述問題的不二之選。RISC-V指令集由基本指令集和擴(kuò)展指令集構(gòu)成,其中,基本指令集是設(shè)計RISC-V處理器不可或缺的,擴(kuò)展指令集則根據(jù)用戶需求定制。目前,市面上涌現(xiàn)出眾多基于RISC-V指令集的開源處理器,伯克利大學(xué)設(shè)計的Rocket處理器和芯來科技研發(fā)的E203處理器深受廣大科研工作者推崇。Liao和Yang等選用Rocket處理器實現(xiàn)卷積加速,雖然加速效果明顯,但該RISC-V處理器的硬件設(shè)計代碼是由高級語言轉(zhuǎn)換生成,可讀性差,同時,該硬件設(shè)計實現(xiàn)于FPGA,會消耗額外的查找表 (look-up-table,LUT)。而E203處理器代碼均由人工編寫,可讀性強且易于理解,該處理器核的功耗和面積與同級ARM Cortex-M核相比極具競爭力。Wu等利用專用協(xié)處理器接口去設(shè)計擴(kuò)展指令,從而實現(xiàn)CNN加速和物聯(lián)網(wǎng)領(lǐng)域多種算法的配置,但其不適用于配置不同模型的卷積、池化、全連接等單元;且未設(shè)計片外存儲器單元,不適合數(shù)據(jù)量大的CNN模型。Zhang等采用軟硬件協(xié)同技術(shù)設(shè)計CNN加速器,加速效果顯著,但該CNN加速器不可配置。Ayat和英偉達(dá)的NVDLA主要針對卷積層加速,未結(jié)合CNN各個運算單元加速。Ma等結(jié)合理論原理,探索卷積層的循環(huán)展開方法。Cao設(shè)計的CNN加速器在各個運算單元實現(xiàn)了全并行展開,對硬件平臺要求較高。
綜合以上因素,本文進(jìn)行了如下研究:第一,擴(kuò)展協(xié)處理器的控制訪問接口,實現(xiàn)RISC-V對CNN加速器的參數(shù)配置;擴(kuò)展片外存儲器與協(xié)處速器的數(shù)據(jù)訪問接口,實現(xiàn)批量數(shù)據(jù)傳輸。第二,將卷積層的四重循環(huán)展開方法與英偉達(dá)NVDLA的并性設(shè)計方法相結(jié)合,實現(xiàn)多視圖部分并行展開,同時該方法可應(yīng)用于池化和全連接單元。各單元的硬件架構(gòu)決定寄存器組的設(shè)計,由此完成可配置功能。
本文的RISC-V處理器是一款變長兩級流水線的32位處理器。其中:第1級流水線完成取指功能;第2級流水線實現(xiàn)譯碼、執(zhí)行、交付和寫回功能。它的系統(tǒng)總線稱為內(nèi)部芯片總線(internal chip bus,ICB))。該總線沿用高級可擴(kuò)展接口(advanced extensible interface,AXI)的握手機(jī)制,僅兩個通道,易于控制。
本文構(gòu)建的片上系統(tǒng)(system on chip,SoC)如圖1所示,系統(tǒng)包括RISC-V處理器、協(xié)處理器接口單元、CNN協(xié)加速器和片外存儲器。
圖1 SoC系統(tǒng)框圖Fig. 1 Architecture of SoC system
圖1中,協(xié)處理器接口單元由控制訪問接口和數(shù)據(jù)訪問接口構(gòu)成,分別適用AXI-LITE和AXI-FULL總線。RISC-V處理器作為該SoC的配置管理器,控制CNN加速器的寄存器單元。CNN加速器主要完成寄存器單元的信息解析,然后根據(jù)譯碼信息,實現(xiàn)直接存儲訪問(direct memory access,DMA)與片外存儲器的數(shù)據(jù)交互,執(zhí)行卷積層、池化層和全連接層的實時運算。
本文的高速協(xié)處理器接口包括協(xié)處理器控制訪問接口和協(xié)處理器數(shù)據(jù)訪問接口,如圖2所示。
由于ICB通用性弱,不適合直接連接高速模塊,因此,為協(xié)處理器擴(kuò)展高速控制訪問接口,完成RISC-V與CNN加速器的控制訪問總線的銜接,并使其兼具高速特性。具體實現(xiàn)方式是先利用總線橋?qū)CB接口轉(zhuǎn)換為適用于控制訪問單元的AXI接口(兼容AXI-LITE接口);然后為該橋接單元設(shè)計一個專用的異步先入先出(first-in first-out,F(xiàn)IFO)緩沖器,實現(xiàn)硬件加速單元能以高于RISC-V處理器的時鐘獨立工作。實現(xiàn)框圖如圖2(a)所示。
圖2(b)為協(xié)處理器的數(shù)據(jù)訪問接口框圖。由于CNN運算的數(shù)據(jù)量龐大,僅靠片內(nèi)存儲器不僅耗費資源,且無法實現(xiàn)批量傳輸,因此為其開辟適用AXI-FULL的片外存儲接口,以片外存儲器來實現(xiàn)數(shù)據(jù)的高速傳輸。該接口的突發(fā)傳輸參數(shù)包括突發(fā)包首地址和數(shù)據(jù)個數(shù)等,單次突發(fā)傳輸?shù)臄?shù)據(jù)個數(shù)最大為256。CNN加速器的數(shù)據(jù)接口由卷積、池化和權(quán)重對應(yīng)的讀通道和卷積、池化對應(yīng)的寫通道構(gòu)成;其中,讀通道包括讀命令通道和讀數(shù)據(jù)通道。經(jīng)多路仲裁器輪詢仲裁,從3組讀命令通道確定存儲器的讀命令通道,同時根據(jù)讀命令值,將存儲器中待讀取的數(shù)據(jù)分發(fā)給CNN加速器對應(yīng)的讀數(shù)據(jù)通道。而寫命令通道、寫數(shù)據(jù)通道和寫反饋通道共同構(gòu)成了寫通道。為了提升總線資源的利用率,將寫數(shù)據(jù)的最高位作為寫通道數(shù)據(jù)類型的判斷依據(jù),從而實現(xiàn)CNN加速器寫命令通道和寫數(shù)據(jù)通道的復(fù)用。如果是寫命令,則分發(fā)給卷積或池化的寫命令緩存單元,然后再以輪詢仲裁方式發(fā)送給存儲器的寫命令通道,同時存入狀態(tài)緩存器。對于寫數(shù)據(jù),先分發(fā)給對應(yīng)的緩存單元;然后,根據(jù)寫命令值,發(fā)送卷積或池化單元的數(shù)據(jù)到存儲器寫數(shù)據(jù)通道;最后,對寫響應(yīng)通道的數(shù)據(jù)和當(dāng)前狀態(tài)緩存器的數(shù)據(jù)進(jìn)行判決,以判決器的輸出作為存儲器寫響應(yīng)通道數(shù)據(jù)分發(fā)的標(biāo)志。
圖2 協(xié)處理器高速接口框圖Fig. 2 Diagram of coprocessor high-speed interface
K
,其值可配置為8、16、32。2.2.1 卷積設(shè)計與分析
卷積的輸入特征圖和輸出特征圖分別表示為I
和O
,權(quán)重和偏置分別為W
和B
。3維卷積輸出特征圖的相關(guān)計算公式如下:
H
、
H
、H
分別為輸出特征圖、輸入特征圖和權(quán)重卷積核的列大小,W
、W
、W
分別為輸出特征圖、輸入特征圖和權(quán)重卷積核的行大小,P
、
P
為沿行方向和沿列方向的填充行數(shù),S
、S
為沿行方向和沿列方向的滑動步長,x
、y
為 輸出特征圖的坐標(biāo)點,m
和n
分別為輸出通道和輸入通道的參數(shù)值,f
為激活函數(shù)。本文實現(xiàn)的三重循環(huán)并行展開方法,其基本單元由乘累加器和累加器構(gòu)成,有利于提升模塊的資源利用率。以并行度K
實現(xiàn),此時,三重循環(huán)展開可抽象為多個矩陣的并行運算。由于每個視圖的基本運算單元最大并行度為32,因此單個視圖的并行乘累加陣列個數(shù)為32。圖3為卷積并行展開示意圖,其中,N
/K
和M
/K
分別表示特征矩陣沿輸入通道(輸入通道長度為N
)和輸出通道(輸出通道長度為M
),按并行度K
展開的總運算次數(shù)(“/”代表的除法運算,若不能整除,則向上取整,即即 「N
/K
」,下同)。為簡化硬件設(shè)計,對輸入特征圖的列以并行度K
展開,其運算次數(shù)為H
×W
/K
。圖3中序號①表示沿輸入通道方向的K
個大小為1 ×1的特征矩陣參與卷積運算;序號②表示列長為K
,輸入通道長度為K
,大小為1 ×1的特征矩陣參與卷積運算;序號③則是沿輸出通道方向,同時進(jìn)行輸出通道長度為K
的序號②運算過程。M
和M
分別表示輸入特征圖和權(quán)重的運算次數(shù)。圖3 卷積并行展開示意圖Fig. 3 Diagram of convolution parallel expansion
卷積運算的理論計算公式如下:
T
和T
分別為CPU和CNN加速器的卷積運算時間,T
和T
分別為CPU和CNN加速器的單次運算時間,A
為卷積加速比。2.2.2 池化設(shè)計與分析
類似卷積的并行展開算法,對池化矩陣在輸入通道方向上、對輸出池化特征圖在列方向上分別執(zhí)行K
并行度展開,同時將池化單元設(shè)計為行池化和列池化級聯(lián)結(jié)構(gòu)。池化設(shè)計的相關(guān)參數(shù)如下:I
和O
分別為池化的輸入和輸出特征圖,N
為池化的通道數(shù),H
、W
分別為池化輸入特征圖的行大小和列大小,H
、W
分別為池化輸出特征圖的行大小和列大小,H
、W
為池化窗口的高和寬。池化的并行展開過程如圖4所示。針對行池化,其輸出特征圖大小為H
×W
,因此,行池化的通道參數(shù)和特征圖列大小的并行展開次數(shù)可表示為N
/K
和H
×W
/K
。由于只實現(xiàn)了行運算,因此池化窗口的運算次數(shù)為W
×K
,圖4中每個矩形框的大小為1×K
。列池化的展開原理類似。M
和M
是行池化和列池化的運算次數(shù)。圖4 池化并行展開示意圖Fig. 4 Diagram of pooling parallel expansion
池化運算時間的理論計算公式如下:
T
為CPU的池化運行總時間,T
和T
分別為行池化耗時和列池化耗時,T
和T
分別為CPU和CNN加速器的單次運算時間,A
為池化加速比。2.2.3 全連接設(shè)計與分析
為減少額外的資源消耗,全連接模型可經(jīng)處理而映射到卷積運算電路。其轉(zhuǎn)換思想是將維度為N
的輸入向量I
轉(zhuǎn)換為大小為1 ×1, 輸入通道數(shù)為N
+1的卷積輸入特征圖。將偏置矩陣合并到權(quán)重矩陣,矩陣權(quán)重卷積核大小為1 ×1,輸入通道數(shù)和輸出通道數(shù)分別為N
+1和M
。而轉(zhuǎn)換后的輸出特征圖O
的大小為1 ×1, 輸出通道數(shù)為M
。按卷積并行展開法,其運算展開過程如圖3所示。理論計算公式如下:T
和T
分別為全連接運算和CPU的總耗時,T
和T
為 兩者所對應(yīng)的單次耗時,A
為兩者的加速比。通過分析CNN加速器的各運算單元,劃分其硬件單元為寄存器組、定點模塊、通用運算單元和池化單元。根據(jù)設(shè)計的硬件電路結(jié)構(gòu),設(shè)計CNN加速器的寄存器組,它由1個系統(tǒng)控制寄存器,33個通用寄存器和26個池化寄存器構(gòu)成。通過配置寄存器組信息,來完成不同模型在CNN加速器上的部署。其中,通用寄存器組適用于卷積或全連接單元,而系統(tǒng)寄存器決定運算單元開始或結(jié)束。
2.3.1 定點量化
根據(jù)Hubara等的研究,數(shù)據(jù)量化對圖像任務(wù)干擾較小,且對數(shù)據(jù)參數(shù)的精度要求不高,因此為解決CNN主流模型存在的計算量大、存儲占用大等問題,本文將32位單精度浮點數(shù)處理為16位定點數(shù),這樣既可降低數(shù)據(jù)存儲量,又可簡化硬件加速器的設(shè)計。模型的存儲量可降低1倍。
2.3.2 通用運算單元設(shè)計與實現(xiàn)
通用運算單元包括通用寄存器組、卷積讀DMA、權(quán)重讀DMA、卷積緩存器、權(quán)重緩存器、卷積片上存儲器、權(quán)重片上存儲器、卷積控制單元、乘累加單元、累加單元和激活單元。同時,由于卷積與全連接的運算結(jié)構(gòu)相似,因此,僅設(shè)計卷積計算單元來作為通用計算單元,以復(fù)用形式實現(xiàn)卷積與全連接運算。
圖5展示了通用運算單元的結(jié)構(gòu),其卷積運算的具體運算流程為:首先,配置系統(tǒng)寄存器,產(chǎn)生系統(tǒng)控制信號,然后,配置卷積運算參數(shù)寄存器,確定特征圖的行大小、列大小、通道數(shù)、卷積核大小等,并產(chǎn)生卷積單元的控制信號。接著,配置卷積的數(shù)據(jù)訪問寄存器參數(shù),如突發(fā)包的讀地址和讀數(shù)據(jù)長度等,根據(jù)這些參數(shù),將卷積和權(quán)重數(shù)據(jù)經(jīng)DMA從片外存儲器寫入片上存儲器。如此,將所需的運算數(shù)據(jù)準(zhǔn)備好。再根據(jù)卷積單元的運算控制信號實現(xiàn)數(shù)據(jù)的乘累加和累加運算。其中,乘累加單元是由K
路并行乘累加器構(gòu)成,其值在硬件電路設(shè)計中可配置為8、16、32。該運算電路可被復(fù)用在3維視圖并行實現(xiàn)的CNN加速器中,如最大并行度為32,輸入通道為3,則復(fù)用該結(jié)構(gòu)1次;輸出特征圖高為224,復(fù)用7次;輸出通道為64,復(fù)用2次。圖5 通用運算單元結(jié)構(gòu)Fig. 5 Structure of general operation units
對于全連接運算,可通過處理其模型參數(shù),配置通用寄存器組,來實現(xiàn)卷積與全連接模型兼容,同時以運算單元之間的復(fù)用來降低硬件資源消耗和設(shè)計的復(fù)雜度。例如,對全連接結(jié)構(gòu) 4096×1000,按卷積結(jié)構(gòu)處理,可得到結(jié)構(gòu)為 4 096×1×1的卷積輸入特征圖和結(jié)構(gòu)為4 096×1×1×1的權(quán)重特征圖,由此將全連接運算轉(zhuǎn)化為卷積運算,實現(xiàn)卷積與全連接結(jié)構(gòu)復(fù)用。
經(jīng)過乘累加和累加單元運算后,根據(jù)激活函數(shù)寄存器的值,決定該運算結(jié)果是否進(jìn)行激活運算,并將最終結(jié)果存入結(jié)果緩存器。由于該通用運算單元的輸出數(shù)據(jù)將作為下一運算單元的輸入數(shù)據(jù),因此按通用寄存器組配置的輸出數(shù)據(jù)地址、數(shù)據(jù)長度和存儲方式等,將結(jié)果經(jīng)卷積寫DMA寫回片外存儲器,并向寄存器返回運算完成標(biāo)志。
2.3.3 池化運算單元設(shè)計與實現(xiàn)
池化運算單元由池化寄存器組、池化讀DMA、池化寫DMA、池化讀緩存器、池化寫緩存器、池化控制單元、行池化和列池化組成。其運算結(jié)構(gòu)如圖6所示。
圖6 池化運算單元結(jié)構(gòu)Fig. 6 Structure of pooling unit
與通用運算單元類似,系統(tǒng)寄存器配置完成后,池化寄存器組開始對池化運算參數(shù)寄存器(如輸入特征圖大小、輸出特征圖大小、池化窗口大小等)進(jìn)行配置。接著,池化模式寄存器被配置為最大池化、最小池化或平均池化之一,并產(chǎn)生相應(yīng)的控制信號,發(fā)送給行池化和列池化單元。在完成池化運算參數(shù)寄存器配置后,對池化數(shù)據(jù)參數(shù)寄存器進(jìn)行數(shù)據(jù)參數(shù)值寫入。根據(jù)這組寄存器提供的讀地址、讀數(shù)據(jù)長度、讀數(shù)據(jù)形式(如行或面),從片外存儲器讀取與之對應(yīng)的有效數(shù)據(jù),并經(jīng)池化讀DMA存入池化讀緩存單元,然后執(zhí)行池化運算。
池化的實際運算單元包括行池化和列池化。其中,行池化的基本運算電路是由最大池化電路、最小池化電路、平均池化電路和3選1多路選擇器構(gòu)成,池化方法控制信號決定行池化的輸出數(shù)據(jù)來源。對于列池化,其輸入源于行池化的輸出,因此列池化單元可由并行的行池化電路構(gòu)成。
根據(jù)池化運算結(jié)構(gòu)框(圖6),列池化的輸出結(jié)果是池化的最終輸出結(jié)果。該結(jié)果通常作為全連接或卷積的輸入數(shù)據(jù),因此需要根據(jù)池化輸出數(shù)據(jù)參數(shù)寄存器,給定輸出存儲地址、存儲大小、行存儲參數(shù)、面存儲參數(shù)等,將池化輸出結(jié)果寫回片外存儲器的相應(yīng)單元。
使用開發(fā)工具Vivado2018對本文的設(shè)計進(jìn)行綜合和布局布線,其中RISC-V和CNN協(xié)加速器的時鐘頻率分別為16 MHz和110 MHz。表1列出了CNN協(xié)加速器資源消耗情況,CNN協(xié)加速器功耗為1.883 W。
表1 CNN協(xié)加速器資源消耗
Tab. 1 CNN accelerator resource utilization
資源名稱 資源消耗數(shù)目/個 資源占用率/%LUT 61 656 20.31 FF 84 115 13.85 BRAM 912 88.54 DSP 1 095 39.11
本文在相同測試條件下,分別將卷積、池化和全連接模型部署在CPU、GPU和本文設(shè)計的CNN協(xié)加速器,獲取各自的運算時間、能耗等性能指標(biāo)。
表2為相同測試模型分別被部署在3個平臺(頻率2.4 GHz,功耗45 W的英特爾i5-9300處理器;頻率1.15 GHz,功耗235 W的英偉達(dá)GPU K40M處理器;頻率110 MHz,功耗1.883 W的CNN協(xié)加速器)的性能指標(biāo)。測試模型包括3個卷積模型,4個池化模型和3個全連接模型,卷積核大小均為 3 ×3。其中,本文的CNN加速器的卷積算力均值為221 GOPS。表2中的能耗比是GPU與CPU、本文協(xié)加速器與CPU的能耗比值;速度比是GPU與CPU、本文協(xié)加速器與CPU的運算時間之比。
表2 不同平臺不同運算單元性能
Tab. 2 Performance of different kits and different computing units
硬件平臺 運算單元運算時間/ms能耗/(W·s)能耗比速度比CPU i5-9th卷積 8 845.760 398.059 1 1池化 112.515 5.063 1 1全連接 11.960 0.538 1 1 GPU Tesla-K40M卷積 0.973 0.229 1 7429 095池化 0.914 0.215 24 123全連接 1.553 0.365 2 8本文協(xié)加速器卷積 46.676 0.087 4 554189池化 10.279 0.010 491 11全連接 2.184 0.004 131 6
為了更準(zhǔn)確地描述CNN模型的性能,將經(jīng)典模型VGG16的卷積層部署于CNN協(xié)加速器,表3列出了部署VGG16的5個卷積單元組時,本文設(shè)計的加速器的性能。表3中,GOP(giga operations)代表十億次定點運算數(shù),GOPS(giga operations per second)表示每秒執(zhí)行的十億次定點運算數(shù)。
表3 VGG16卷積單元組性能
Tab. 3 Performance of convolution groups for VGG16 network
硬件平臺 卷積組 運算時間/ms運算量 吞吐量本文協(xié)加速器第1組 27.14 3.87 GOP142.59 GOPS第2組 27.14 5.55 GOP204.50 GOPS第3組 45.28 9.25 GOP204.28 GOPS第4組 46.35 9.25 GOP199.57 GOPS第5組 16.26 2.31 GOP142.07 GOPS
表4是本文設(shè)計的CNN加速器與部分前人工作的對比,從表4中可知,本文設(shè)計的CNN加速器的吞吐量為178.6 GOPS,與其他3種加速器相比,吞吐量分別提高94.3 GOPS、44.5 GOPS和55.9 GOPS。
表4 實驗對比
Tab. 4 Comparison with previous implementations
平臺 FPGA型號時鐘頻率/MHz運行時間/ms運算量 吞吐量Angel-eye[28]XC7Z020214364.0030.69 GOP84.30 GOPS ALAMO[29] GXA7 100 9.821.46 GOP134.10 GOPS ConvNets加速器[30]XC7Z045125249.5030.70 GOP123.12 GOPS本文協(xié)加速器VC707 110162.1730.69 GOP178.60 GOPS
本文基于RISC-V擴(kuò)展了控制訪問接口,用于參數(shù)配置,擴(kuò)展CNN加速器的數(shù)據(jù)訪問接口,完成數(shù)據(jù)高速傳輸,然后設(shè)計多視圖并行的卷積神經(jīng)網(wǎng)絡(luò)的協(xié)加速器,最后構(gòu)建包含RISC-V處理器和CNN協(xié)加速器的SoC。將CNN模型部署在本文設(shè)計的CNN協(xié)加速器、CPU、GPU平臺,在測試模型和卷積核大小相同情況下,分別對各平臺的卷積、池化、全連接單元進(jìn)行仿真驗證。其中,CNN的各運算單元運行在本文設(shè)計的CNN加速器的運算速度分別是運行在CPU平臺的189倍,11倍和6倍,但明顯低于GPU。而對比GPU與本文的加速器的能耗,各運算單元運行在GPU平臺的能耗分別是本文設(shè)計的CNN加速器的2.6倍,20.5倍和65.5倍。根據(jù)表3可知,全連接單元的加速比遠(yuǎn)小于卷積單元,其原因是全連接單元需經(jīng)轉(zhuǎn)換才能復(fù)用卷積單元結(jié)構(gòu),而轉(zhuǎn)換生成的卷積輸入特征圖的行和列大小都為1,這將導(dǎo)致訪問外部存儲器的帶寬降低。
為進(jìn)一步驗證本文設(shè)計對具體CNN模型的影響,對VGG16的5組卷積單元進(jìn)行獨立驗證,其卷積的運算性能可達(dá)178.6 GOPS,與其他的CNN加速器相比,性能得以提升。雖然本文構(gòu)建的可配置CNN協(xié)加速器SoC的加速效果顯著,但僅僅是對卷積、池化、全連接單元的單獨測試,未進(jìn)行完整網(wǎng)絡(luò)的性能分析,下一步將搭建完整的CNN網(wǎng)絡(luò)模型進(jìn)行整體性能分析。