鞠虎,高營(yíng),田青,周穎
(中國(guó)電子科技集團(tuán)公司第五十八研究所,江蘇無(wú)錫 214035)
近年來(lái)人工智能(AI)算法不斷取得突破性進(jìn)展,各種復(fù)雜的深度學(xué)習(xí)算法已滲透到人類社會(huì)生活的諸多方面,如智能交通、無(wú)人駕駛、智慧醫(yī)療等[1]。目前大多數(shù)深度學(xué)習(xí)算法采用圖形處理器(GPU)進(jìn)行訓(xùn)練與推理,相比中央處理器(CPU),GPU 極大地提升了深度學(xué)習(xí)算法的訓(xùn)練與推理速度。盡管GPU 計(jì)算資源豐富,但是存在極大的功耗開銷,在硬件資源和功耗受限的條件下,GPU 不是一個(gè)很好的計(jì)算加速平臺(tái)。國(guó)內(nèi)外公司都在積極推動(dòng)AI 芯片的研發(fā),英偉達(dá)推出了基于NVIDIA Volta 架構(gòu)的NVIDIA Tesla V100GPU[2],可實(shí)現(xiàn)每秒120 萬(wàn)億次的峰值運(yùn)算能力。谷歌面向云業(yè)務(wù)推出脈動(dòng)陣列架構(gòu)[3],峰值計(jì)算能力達(dá)到每秒92 萬(wàn)億次計(jì)算操作,增加了浮點(diǎn)計(jì)算單元和高帶寬內(nèi)存。國(guó)內(nèi)在GPU 和現(xiàn)場(chǎng)可編程邏輯門陣列(FPGA)芯片領(lǐng)域基礎(chǔ)相對(duì)薄弱,百度開發(fā)的云端AI芯片“昆侖”的峰值處理速度達(dá)到每秒260 萬(wàn)億次定點(diǎn)運(yùn)算。寒武紀(jì)發(fā)布的云端智能芯片MLU100 的最高峰值速度可達(dá)166.4 萬(wàn)億次定點(diǎn)運(yùn)算,可支持各類深度學(xué)習(xí)和常見機(jī)器學(xué)習(xí)算法。這類處理器大多基于精簡(jiǎn)指令微處理器(ARM)架構(gòu)[4],ARM 架構(gòu)雖具有良好的生態(tài),但存在供應(yīng)鏈不穩(wěn)定、自主可控性弱等缺點(diǎn)。第五代開放精簡(jiǎn)指令集(RISC-V)[5-6]可基于應(yīng)用場(chǎng)景,進(jìn)行指令集的自主修改,因此研究基于RISC-V 的神經(jīng)網(wǎng)絡(luò)加速器[7]架構(gòu)可為后續(xù)AI 芯片的研究和工程實(shí)現(xiàn)奠定基礎(chǔ)。
本文基于RISC-V,生成了Linux 內(nèi)核,構(gòu)建了RISC-V 開發(fā)環(huán)境;定義了深度神經(jīng)網(wǎng)絡(luò)加速器指令集,實(shí)現(xiàn)了數(shù)據(jù)加載、計(jì)算和結(jié)果存儲(chǔ)等操作;基于深度學(xué)習(xí)編譯器,實(shí)現(xiàn)了對(duì)主流深度學(xué)習(xí)開發(fā)框架的支持;基于亞科鴻禹開發(fā)板以及接口擴(kuò)展板,將深度神經(jīng)網(wǎng)絡(luò)加速器和RISC-V CPU 集成,并通過(guò)深度學(xué)習(xí)編譯棧,完成了ZFNet 和ResNet20 神經(jīng)網(wǎng)絡(luò)部署,實(shí)現(xiàn)了圖像分類演示的功能。
2.1.1 輕量級(jí)ZFNet 神經(jīng)網(wǎng)絡(luò)
ZFNet 神經(jīng)網(wǎng)絡(luò)在AlexNet 網(wǎng)絡(luò)結(jié)構(gòu)[9]上進(jìn)行微調(diào),提出了一個(gè)新的卷積神經(jīng)網(wǎng)絡(luò)可視化技術(shù)(反卷積),以輔助觀察中間層及分類層的輸出特征。ZFNet是一個(gè)8 層網(wǎng)絡(luò),采用修正線性單元(ReLU)替換Sigmoid函數(shù)作為激活單元,避免了梯度消失問(wèn)題,同時(shí),在計(jì)算上采用重疊的最大池化,以避免池化的模糊效果,提升了特征提取的豐富性。本文對(duì)ZFNet 進(jìn)行輕量化處理以降低網(wǎng)絡(luò)參數(shù)量,修改后的ZFNet(M-ZFNet)網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示,包含6 層卷積和2 層全連接。
圖1 M-ZFNet 網(wǎng)絡(luò)架構(gòu)
2.1.2 神經(jīng)網(wǎng)絡(luò)加速器核心模塊設(shè)計(jì)
神經(jīng)網(wǎng)絡(luò)推理加速器采用可變張量加速器(VTA)架構(gòu)[10]。
VTA 是圍繞通用矩陣乘(GEMM)而構(gòu)建的通用深度學(xué)習(xí)加速器,可進(jìn)行高吞吐量的密集矩陣乘法操作。VTA 硬件架構(gòu)如圖2 所示,主要由獲取、加載、計(jì)算和存儲(chǔ)4 個(gè)模塊組成,4 個(gè)模塊通過(guò)隊(duì)列和單寫入/讀取內(nèi)存塊進(jìn)行通信。
圖2 VTA 硬件架構(gòu)
為支持多種神經(jīng)網(wǎng)絡(luò)的推理任務(wù),本文提出了基于宏操作的指令集。1)加載指令,將內(nèi)存中輸入和權(quán)重加載至緩存區(qū)或者片上寄存器;支持微操作指令加載至微指令緩存;支持動(dòng)態(tài)填零。2)矩陣乘指令,執(zhí)行微指令緩存中微指令序列,在輸入張量和權(quán)重張量組成的矩陣之間計(jì)算矩陣乘積,并將結(jié)果暫存到片上寄存器中。3)算術(shù)邏輯指令,執(zhí)行微指令緩存中的邏輯微指令序列,對(duì)片上寄存器的數(shù)據(jù)執(zhí)行矩陣的算數(shù)邏輯操作。4)存儲(chǔ)指令,將計(jì)算結(jié)果從輸出緩存區(qū)存儲(chǔ)到內(nèi)存中。通過(guò)這4 條指令的組合,可靈活實(shí)現(xiàn)多種主流的深度神經(jīng)網(wǎng)絡(luò)推理任務(wù),實(shí)現(xiàn)智能通用運(yùn)算。
加載模塊負(fù)責(zé)將存儲(chǔ)器的輸入和權(quán)重?cái)?shù)據(jù)加載到加速器內(nèi)專用輸入和權(quán)重?cái)?shù)據(jù)的緩存。加載、通用矩陣乘、算數(shù)邏輯運(yùn)算及存儲(chǔ)指令結(jié)構(gòu)如圖3 所示。加載模塊支持在加載數(shù)據(jù)的同時(shí),在數(shù)據(jù)周圍的X 維度和Y 維度分別動(dòng)態(tài)填零。計(jì)算模塊采用通用矩陣相乘運(yùn)算,將數(shù)據(jù)從存儲(chǔ)器中加載到寄存器中,將微操作指令加載到微指令緩存中,計(jì)算模塊包含兩種類型的計(jì)算微指令:算數(shù)邏輯運(yùn)算和通用矩陣乘。計(jì)算模塊在兩級(jí)嵌套循環(huán)內(nèi)執(zhí)行微指令序列,以減少微內(nèi)核指令的占用空間,適用矩陣乘法和二維卷積。存儲(chǔ)模塊將計(jì)算模塊的輸出數(shù)據(jù)從片上內(nèi)存取出并存儲(chǔ)到動(dòng)態(tài)存儲(chǔ)器中,存儲(chǔ)指令的譯碼執(zhí)行過(guò)程與加載模塊相似,支持從靜態(tài)存儲(chǔ)器到動(dòng)態(tài)存儲(chǔ)器的跨內(nèi)存訪問(wèn)。
圖3 加載、通用矩陣乘、算數(shù)邏輯運(yùn)算及存儲(chǔ)指令結(jié)構(gòu)
本文采用開源RISC-V 處理器[11]作為系統(tǒng)級(jí)芯片(SoC)中的控制單元,并提出共享內(nèi)存的設(shè)計(jì)架構(gòu),基于RISC-V CPU 的SoC 架構(gòu)如圖4 所示,整體架構(gòu)通過(guò)一致性總線(TL)進(jìn)行系統(tǒng)互聯(lián),利用TL 轉(zhuǎn)高級(jí)可擴(kuò)展接口(AXI)模塊進(jìn)行適配。RISC-V CPU 與神經(jīng)網(wǎng)絡(luò)推理加速器之間采用松耦合的互聯(lián)方式,CPU 通過(guò)總線向神經(jīng)網(wǎng)絡(luò)推理加速器的AXI 從接口發(fā)送控制指令,控制加速器開始工作,并通過(guò)輪詢方式檢測(cè)加速器是否計(jì)算完成。針對(duì)如何快速處理在深度神經(jīng)網(wǎng)絡(luò)推理過(guò)程中的數(shù)據(jù),提出共享內(nèi)存架構(gòu),設(shè)計(jì)對(duì)應(yīng)的連續(xù)內(nèi)存分配函數(shù)(CMA),以動(dòng)態(tài)分配較大的連續(xù)空間物理地址。本文將32 位ARM 處理器上的CMA模塊移植到基于64 位RISC-V 的內(nèi)核上,并針對(duì)RISC-V 架構(gòu)調(diào)整虛擬地址到物理地址的映射方式,提高操作系統(tǒng)的內(nèi)存使用效率。圖4 中DDR 為雙倍數(shù)據(jù)速率。
圖4 基于RISC-V CPU 的SoC 架構(gòu)
VTA 各模塊與RISC-V 處理器通過(guò)AXI 總線協(xié)議[12]連接,AXI 互聯(lián)模塊包含AXI InterConnect 模塊和AXI SmartConnect 模塊,可將一個(gè)或多個(gè)AXI 內(nèi)存映射的主設(shè)備連接到一個(gè)或多個(gè)內(nèi)存映射的從屬設(shè)備,更緊密地集成到硬件設(shè)計(jì)環(huán)境中,且能自動(dòng)配置并適應(yīng)所連接的AXI 主模塊和從屬模塊,每一個(gè)被實(shí)例化的AXI 互聯(lián)模塊都包含一個(gè)AXI Crossbar 模塊,用于多個(gè)主接口和從接口的連接。RISC-V SoC 內(nèi)部總線互聯(lián)架構(gòu)如圖5 所示,獲取、加載、計(jì)算和存儲(chǔ)模塊的標(biāo)準(zhǔn)AXI 從屬接口經(jīng)過(guò)AXI InterConnect 模塊與RISC-V 處理器的主接口連接,通過(guò)AXI 總線接收CPU 的控制信號(hào);各模塊的主接口通過(guò)AXI SmartConnect 模塊與處理器經(jīng)過(guò)AXI Crossbar 模塊對(duì)動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)進(jìn)行讀寫指令和數(shù)據(jù)的操作。VTA 內(nèi)部提供了傳輸指令的指令隊(duì)列、執(zhí)行同步并發(fā)任務(wù)的依賴隊(duì)列以及存儲(chǔ)數(shù)據(jù)的片上緩存區(qū)(包含輸入數(shù)據(jù)、權(quán)重值和輸出數(shù)據(jù))。
圖5 RISC-V SoC 內(nèi)部總線互聯(lián)架構(gòu)
SoC 設(shè)計(jì)平臺(tái)包括RISC-V SoC 生成器、編譯工具鏈和系統(tǒng)仿真工具。SoC 架構(gòu)采用共享內(nèi)存的設(shè)計(jì)架構(gòu),并通過(guò)TL 進(jìn)行系統(tǒng)互聯(lián)。CPU 配置方案為單核100 MHz 順序流水線、64 位RISC-V 架構(gòu)CPU、片上獨(dú)立的指令高速緩沖存儲(chǔ)器和數(shù)據(jù)高速緩沖存儲(chǔ)器,并配有Xilinx UltraScale DDR 控制器、安全數(shù)碼卡(SD)控制器和通用異步收發(fā)傳輸器(UART)接口。
VTA 硬件架構(gòu)的環(huán)境搭建主要分成以下幾個(gè)階段:1)構(gòu)建加速器調(diào)用底層函數(shù)接口,用于調(diào)用VTA IP 核,配置傳輸參數(shù);2)獲取控制寄存器映射到用戶空間的虛擬地址,對(duì)加速器的控制寄存器進(jìn)行讀寫;3)獲得各種虛擬地址對(duì)應(yīng)的物理地址,傳遞給加速器的控制寄存器;4)將處理數(shù)據(jù)對(duì)應(yīng)指令長(zhǎng)度和物理地址通過(guò)AXI 接口寫入控制寄存器;5)將加速器的控制信號(hào)通過(guò)AXI 接口寫入其控制寄存器,加速器讀取信號(hào)之后開始計(jì)算;6)CPU 通過(guò)輪詢的方式監(jiān)測(cè)加速器的工作狀態(tài),直至加速器計(jì)算結(jié)束或者用時(shí)超標(biāo);7)統(tǒng)計(jì)VTA 的計(jì)算時(shí)間,釋放內(nèi)存。
深度神經(jīng)網(wǎng)絡(luò)編譯工具鏈?zhǔn)怯糜谏疃葘W(xué)習(xí)系統(tǒng)的編譯器堆棧,面對(duì)不同的深度學(xué)習(xí)框架和硬件平臺(tái),實(shí)現(xiàn)了端到端的統(tǒng)一的軟件棧,能夠高效地把前端深度學(xué)習(xí)模型部署到CPU、GPU 和專用的加速器上,為了實(shí)現(xiàn)對(duì)深度神經(jīng)網(wǎng)絡(luò)的支持,本文設(shè)計(jì)了基于指令包裹的編譯框架,通過(guò)將神經(jīng)網(wǎng)絡(luò)推理運(yùn)算解耦成卷積運(yùn)算和標(biāo)量運(yùn)算,基于所設(shè)計(jì)的指令集,定義卷積運(yùn)算指令打包函數(shù),能夠自適應(yīng)地生成卷積層的指令代碼,同時(shí)用戶可以在C 開發(fā)環(huán)境下,調(diào)用打包函數(shù),進(jìn)行運(yùn)算的靈活分配。深度神經(jīng)網(wǎng)絡(luò)編譯流程如下:1)導(dǎo)入前端基于數(shù)據(jù)流圖的深度學(xué)習(xí)模型,并轉(zhuǎn)換為計(jì)算圖;2)計(jì)算圖優(yōu)化層,重構(gòu)原始計(jì)算圖,包括操作符融合和數(shù)據(jù)布局轉(zhuǎn)換;3)張量?jī)?yōu)化層,包含張量描述、硬件源語(yǔ)調(diào)度優(yōu)化等;4)根據(jù)優(yōu)化目標(biāo)探索搜索空間,找到最優(yōu)解;5)生成對(duì)應(yīng)的硬件平臺(tái)代碼與部署。
CIFAR-10 數(shù)據(jù)集由60 000 張彩色圖像組成,其中有50 000 張訓(xùn)練圖像和10 000 張測(cè)試圖像,共有飛機(jī)、汽車、鳥、貓、鹿、狗、青蛙、馬、船、卡車10 類,每類6 000 張,用作圖像識(shí)別的數(shù)據(jù)集。
在硬件模塊設(shè)計(jì)上,基于開源項(xiàng)目生成SoC 源碼,基于Vivado 綜合工具生成對(duì)應(yīng)的比特流,使用RISC-V 64 位編譯工具鏈生成對(duì)應(yīng)的Linux 操作系統(tǒng),并對(duì)操作系統(tǒng)以及應(yīng)用程序進(jìn)行仿真測(cè)試。在軟件模塊設(shè)計(jì)上,針對(duì)卷積運(yùn)算測(cè)試,按照VTA 硬件配置對(duì)輸入和權(quán)重進(jìn)行循環(huán)拆解、重組補(bǔ)零,同時(shí),在單個(gè)卷積層中,將大矩陣分塊進(jìn)行矩陣乘(分塊大小為64 個(gè)),編譯生成可執(zhí)行的文件并上板驗(yàn)證,卷積運(yùn)算驗(yàn)證結(jié)果如圖6 所示,實(shí)現(xiàn)了3 種不同尺寸矩陣的GEMM 計(jì)算,試驗(yàn)結(jié)果表明,本設(shè)計(jì)能保證卷積運(yùn)算的正確性。
圖6 卷積運(yùn)算驗(yàn)證結(jié)果
為實(shí)現(xiàn)圖像分類演示,首先,基于CIFAR-10 數(shù)據(jù)集完成了M-ZFNet 神經(jīng)網(wǎng)絡(luò)算法訓(xùn)練、權(quán)重量化與分割,量化長(zhǎng)度為有符號(hào)的8 位整數(shù)(INT8),并將權(quán)重和輸入數(shù)據(jù)解碼處理生成bin 文件;其次,基于深度神經(jīng)網(wǎng)絡(luò)編譯工具鏈將深度卷積神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換成加速器運(yùn)行的操作指令,編譯生成可執(zhí)行文件;最后,將bin 文件和可執(zhí)行文件上板驗(yàn)證,依次完成12 張輸入圖像,輸出維度為10×1,對(duì)應(yīng)CIFAR-10 數(shù)據(jù)集中的10 個(gè)類別。同時(shí),驗(yàn)證所設(shè)計(jì)的架構(gòu)是否可靈活實(shí)現(xiàn)多種主流的深度神經(jīng)網(wǎng)絡(luò),選取ResNet20 神經(jīng)網(wǎng)絡(luò),為降低網(wǎng)絡(luò)參數(shù)量,對(duì)開源ResNet20 進(jìn)行微調(diào)(M-ResNet20),具體網(wǎng)絡(luò)結(jié)構(gòu)如下:1~7 層的卷積核大小為16@3×3,步長(zhǎng)為1;8~13 層的卷積核大小為32@3×3,卷積層8 的步長(zhǎng)為2,其他卷積層步長(zhǎng)為1;14~19 層的卷積核大小為56@3×3,卷積層14 的步長(zhǎng)為2,其他卷積層步長(zhǎng)為1;平均池化層和全連接層均為1 層。FPGA 演示步驟同M-ZFNet。
兩種網(wǎng)絡(luò)的圖像分類演示結(jié)果如表1 所示,輸出向量最大值所在位置對(duì)應(yīng)數(shù)據(jù)集中的類別,在本輪試驗(yàn)中,兩種網(wǎng)絡(luò)識(shí)別準(zhǔn)確率均為91.67%(在CPU 端選取的12 張測(cè)試數(shù)據(jù)集和權(quán)重均為浮點(diǎn)型,且測(cè)試準(zhǔn)確率為100%,對(duì)輸入數(shù)據(jù)和權(quán)重進(jìn)行的量化操作導(dǎo)致精度損失)。
表1 兩種網(wǎng)絡(luò)的圖像分類演示結(jié)果
在CIFAR10 測(cè)試集上推理,所提出的架構(gòu)總體準(zhǔn)確率預(yù)測(cè)如表2 所示。在CPU 端統(tǒng)計(jì)的M-ZFNet 和M-ResNet20 的整體準(zhǔn)確率分別為86.36%和91.73%,而在FPGA 端統(tǒng)計(jì)的準(zhǔn)確率分別為78.95%和84.81%。因?yàn)閷?duì)輸入數(shù)據(jù)和權(quán)重進(jìn)行的量化操作導(dǎo)致了精度損失,所以FPGA 端低于CPU 端的統(tǒng)計(jì)結(jié)果;因?yàn)镸-ResNet20 的網(wǎng)絡(luò)層數(shù)較多,所提取特征的抽象程度較高,所以M-ResNet20 的預(yù)測(cè)準(zhǔn)確率比M-ZFNet 高。試驗(yàn)結(jié)果表明,所設(shè)計(jì)的架構(gòu)可實(shí)現(xiàn)主流的深度神經(jīng)網(wǎng)絡(luò)推理任務(wù),實(shí)現(xiàn)智能通用運(yùn)算。
表2 兩種網(wǎng)絡(luò)總體準(zhǔn)確率預(yù)測(cè)
本文探索了基于RISC-V 處理器的神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)與FPGA 實(shí)現(xiàn),所設(shè)計(jì)的架構(gòu)可靈活實(shí)現(xiàn)多種主流的深度神經(jīng)網(wǎng)絡(luò)推理任務(wù),MAC 數(shù)目可達(dá)到1 024,量化長(zhǎng)度為INT8,編譯棧支持主流卷積神經(jīng)網(wǎng)絡(luò)的編譯,最終完成卷積運(yùn)算、ZFNet 和ResNet20 神經(jīng)網(wǎng)絡(luò)算法的部署,并完成CIFAR-10 圖像分類演示,試驗(yàn)選取了12 張測(cè)試集,準(zhǔn)確率均達(dá)到91.67%,且在FPGA端M-ZFNet 整體準(zhǔn)確率達(dá)78.95%,M-ResNet20 整體準(zhǔn)確率達(dá)84.81%。為了支持多種不同的神經(jīng)網(wǎng)絡(luò)推理任務(wù),創(chuàng)新地提出了由4 條指令組成的基于宏操作的指令集,依據(jù)指令類型的不同可以分別完成數(shù)據(jù)加載、計(jì)算和結(jié)果存儲(chǔ)等操作,利用這4 條指令的組合,可實(shí)現(xiàn)智能通用運(yùn)算。
所設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)推理加速器在精度損失和加速性能方面還有一些方面可以進(jìn)一步改進(jìn):1)由于目前的量化方案精度損失較大,后續(xù)工作可考慮將量化和訓(xùn)練相結(jié)合,在量化后通過(guò)微調(diào)訓(xùn)練來(lái)彌補(bǔ)量化的精度損失;2)未對(duì)神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)的數(shù)據(jù)吞吐量、計(jì)算速度、功耗、資源消耗等方面進(jìn)行研究,后續(xù)將主要研究神經(jīng)網(wǎng)絡(luò)加速器的加速效果。