石永泉,景乃鋒
(上海交通大學 電子信息與電氣工程學院,上海 200240)
隨著大數(shù)據(jù)、深度學習和云計算的不斷發(fā)展,神經(jīng)網(wǎng)絡需要處理的數(shù)據(jù)量越來越大,對硬件算力的要求也日益提高。傳統(tǒng)馮·諾依曼體系結(jié)構(gòu)中內(nèi)存單元和運算單元之間的大量數(shù)據(jù)流動會導致計算單元的長時間空閑,限制數(shù)據(jù)處理速度并進一步增加系統(tǒng)功耗[1]。相比傳統(tǒng)馮·諾依曼體系結(jié)構(gòu),存算一體(Processing-in-Memory,PIM)體系結(jié)構(gòu)將權(quán)值數(shù)據(jù)的存儲與機器學習和神經(jīng)網(wǎng)絡算法中的向量矩陣乘法(Matrix-Vector Multiplication,MVM)運算在憶阻器件[2]上實現(xiàn),成為解決訪存瓶頸的有效途徑。
盡管存算一體體系結(jié)構(gòu)為解決存儲墻問題提供了新的思路和方法,但是存算一體神經(jīng)網(wǎng)絡加速器的架構(gòu)設計依然面臨很多挑戰(zhàn)。存算一體神經(jīng)網(wǎng)絡加速器架構(gòu)設計需要對加速器進行精確的建模和仿真,模型中需要包含數(shù)據(jù)訪存、指令譯碼等細節(jié)信息[3],并通過軟件模擬器方式實現(xiàn)[4]。然而,對于大規(guī)模深度神經(jīng)網(wǎng)絡,軟件模擬器仿真的時間開銷往往是不可接受的。傳統(tǒng)硬件模擬器雖然仿真時間短,但是僅支持單一的網(wǎng)絡,靈活性較差[5-6]。本文提出一種基于現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)模擬的阻變神經(jīng)網(wǎng)絡加速器評估方法,同時設計硬件資源的軟件分時復用方案,并在DIGILENT ZYBO-Z7 開發(fā)板上進行阻變神經(jīng)網(wǎng)絡加速器評估方法的軟硬件設計。
憶阻器陣列集成計算和存儲功能,一般通過非易失性阻變隨機訪問存儲器(Resistive Random Access Memory,ReRAM)[7]實現(xiàn)。在神經(jīng)元結(jié)構(gòu)中,突觸可以根據(jù)其兩端的神經(jīng)元激勵發(fā)生變化。在憶阻器陣列中,可在ReRAM 器件兩端外加電壓改變電導[8]進行神經(jīng)計算。如圖1 所示,利用ReRAM 器件的特性,可以外加輸入數(shù)字電壓(INP),將電壓進行數(shù)模轉(zhuǎn)換(DAC)得到模擬電壓值,加在器件兩端的模擬電壓和器件預編程的電導通過歐姆定律和基爾霍夫定律計算得到流出器件的電流,將電流值進行模數(shù)轉(zhuǎn)換(ADC)后得到計算的數(shù)字輸出結(jié)果(OUT),實現(xiàn)存算一體的功能。

圖1 ReRAM 陣列向量矩陣乘法運算原理Fig.1 Principle of ReRAM array MVM operation
存算一體神經(jīng)網(wǎng)絡加速器通常進行分層拓撲架構(gòu)設計。文獻[9]對存算一體神經(jīng)網(wǎng)絡加速器進行Chip、Tile、IMA、Crossbar 的四層架構(gòu)設計。Chip 以集中網(wǎng)絡的形式連接多個Tile;Tile 通過共享總線連接多個IMA、累加器等功能單元;IMA 通過共享總線連接多個Crossbar、數(shù)模轉(zhuǎn)換器等功能單元。文獻[10]給出Chip、Tile、VMM、Crossbar 的分層拓撲架構(gòu)設計,數(shù)據(jù)可在Tile 間進行粗粒度的流水,減少Tile 間不必要的數(shù)據(jù)流動。文獻[11]實現(xiàn)Node、Tile、Core 的三層架構(gòu)設計,其中Core 包含多個流水的MVM 運算單元和三級指令流水線,數(shù)據(jù)在Core 和Crossbar 中都可進行流水計算,提升內(nèi)部訪存帶寬[12]。
相較傳統(tǒng)神經(jīng)網(wǎng)絡加速器[13],存算一體神經(jīng)網(wǎng)絡加速器將標量計算盡量放在CPU 上進行,向量計算的向量規(guī)模也無需特殊指定。AMBROSI 等[14]于2018 年提出一種存算一體神經(jīng)網(wǎng)絡加速器的指令集,相較傳統(tǒng)神經(jīng)網(wǎng)絡加速器指令集[15]增加了在不同層次間進行數(shù)據(jù)搬運的指令,ANKIT 等[16]于2020 年又加入了進行外積計算的OPA 指令及轉(zhuǎn)置矩陣和向量乘法運算的MVTM指令,但不支持對ReRAM 陣列的在線編程[17-18]。
2.1.1 架構(gòu)設計
為對神經(jīng)網(wǎng)絡各層運算進行有效的資源分配,提升內(nèi)部帶寬并減少不必要的數(shù)據(jù)移動,神經(jīng)網(wǎng)絡加速器需要進行分層拓撲架構(gòu)設計,基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡加速器支持Core、Tile、Crossbar的三層架構(gòu)。
如圖2 所示,Crossbar 主要進行向量和矩陣的乘法運算,每個Crossbar 包含ReRAM 陣列、保存輸入輸出數(shù)據(jù)的緩存單元、信號轉(zhuǎn)換器等功能模塊。Tile主要進行神經(jīng)網(wǎng)絡的層級運算,包含存放數(shù)據(jù)的SRAM、一定數(shù)量的Crossbar 和用于將Crossbar 的計算結(jié)果進行激活操作的向量運算單元(ALU)。Core中主要進行網(wǎng)絡級別的運算,包含指令譯碼模塊、一定數(shù)量的Tile、加載數(shù)據(jù)到各自Tile 對應SRAM 的數(shù)據(jù)加載單元(LU)、保存數(shù)據(jù)到動態(tài)隨機訪問存儲器(Dynamic Random Access Memory,DRAM)的數(shù)據(jù)回存單元(SU)和進行池化操作的向量運算單元。DRAM 保存編譯產(chǎn)生的指令和數(shù)據(jù),每個Core 通過各自的指令隊列連接在指令發(fā)射模塊上接收指令,數(shù)據(jù)通過直接存儲器訪問(Direct Memory Access,DMA)傳遞給各個Core。

圖2 阻變神經(jīng)網(wǎng)絡加速器架構(gòu)Fig.2 Architecture of resistive neural network accelerator
2.1.2 指令集設計
由于存算一體神經(jīng)網(wǎng)絡加速器的器件和架構(gòu)特點以及神經(jīng)網(wǎng)絡的計算特性,因此存算一體神經(jīng)網(wǎng)絡加速器的指令集也有其特殊性。基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡加速器在傳統(tǒng)神經(jīng)網(wǎng)絡加速器指令的基礎上新增在線編程的LdWGT 指令,用于配置SetTile 等指令,加速器指令集設置如表1 所示。

表1 加速器指令集Table 1 Instruction set of accelerator
在上述架構(gòu)和指令集模型下,基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡加速器的主要計算流程如圖3 所示。

圖3 阻變神經(jīng)網(wǎng)絡加速器計算流程Fig.3 Calculation procedure of resistive neural network accelerator
2.2.1 加速器硬件設計
本文設計的加速器包含了阻變神經(jīng)網(wǎng)絡加速器架構(gòu)的所有主要功能模塊,包括DMA、DRAM、指令發(fā)射模塊、指令隊列、指令譯碼模塊、數(shù)據(jù)加載模塊、數(shù)據(jù)回存模塊、SRAM、向量計算單元和向量矩陣乘法運算單元。由于硬件規(guī)模的限制,各個Core、Tile、Crossbar 的運算任務只能串行進行,阻變神經(jīng)網(wǎng)絡加速器的向量矩陣乘法運算單元主要通過乘累加樹實現(xiàn)。對比圖2、圖4 中的指令隊列接收每個Core 的指令并經(jīng)由指令譯碼模塊發(fā)送到各個功能模塊中執(zhí)行。在指令的執(zhí)行過程中:所有的Tile 都通過同一數(shù)據(jù)加載模塊和數(shù)據(jù)回存模塊執(zhí)行Load、Store 指令和SRAM 進行交互;所有的MVM 指令和ALU 指令分別在向量矩陣乘法運算單元和向量計算單元中串行執(zhí)行。

圖4 阻變神經(jīng)網(wǎng)絡加速器硬件結(jié)構(gòu)Fig.4 Hardware structure of resistive neural network accelerator
ReRAM 陣列的規(guī)模一般很大,但FPGA 存儲和運算資源有限,ALU 和MVM 指令運算能力有限,因此需要將權(quán)值矩陣和輸入矩陣進行分割重組,每次進行小規(guī)模的運算,將運算結(jié)果按照數(shù)據(jù)索引進行相應的累加。通過對FPGA 硬件資源的分時復用完成較大規(guī)模ReRAM 陣列的模擬。
通過修改硬件結(jié)構(gòu)可實現(xiàn)分時復用的硬件調(diào)度,但由于積累全部ReRAM 陣列規(guī)模的輸入數(shù)據(jù)和權(quán)重數(shù)據(jù)計算模塊才能開始計算,且硬件上需要增加Buffer 積累數(shù)據(jù),同時計算單元在運行時也會長時間空等,造成不必要的性能損失,因此為降低硬件設計的復雜度并提升運行效率,本文設計加速器的軟件庫支持分時復用的軟件調(diào)度。
2.2.2 加速器軟件庫設計
由于硬件設計上的差異,表1 所述的指令集不能直接執(zhí)行在阻變神經(jīng)網(wǎng)絡加速器上。設計C++軟件庫將表1 中的指令轉(zhuǎn)換為硬件支持的指令,軟件庫同時支持硬件資源分時復用的軟件調(diào)度。
1)指令重新翻譯編譯器生成的指令是面向ReRAM規(guī)模的指令,其讀寫和運算的數(shù)據(jù)規(guī)模均是ReRAM 規(guī)模,而FPGA 上實現(xiàn)的運算模塊遠達不到該規(guī)模,這樣的指令送到硬件上執(zhí)行僅求得小規(guī)模的部分和,與最終結(jié)果有很大的差距。因此,需要將數(shù)據(jù)切分為適配FPGA 運算模塊的大小進行運算,并對Store、Load、Pooling、Activation 等指令增加index、size 等字段并轉(zhuǎn)換為適配運算模塊的指令,保證轉(zhuǎn)換前后的指令進行等價的操作。此外,由于ReRAM 陣列的器件特性,因此LdWGT 等部分指令無法在FPGA 上執(zhí)行。FPGA 硬件資源有限,多Core 多Tile 的并行計算只能串行進行,Move 等部分指令在串行系統(tǒng)中的功能與在并行系統(tǒng)中的功能有所差異。因此,對上述指令進行如表2 所示的指令轉(zhuǎn)譯。

表2 指令轉(zhuǎn)譯Table 2 Instruction translation
2)軟件分時復用調(diào)度不改變硬件結(jié)構(gòu),而是在運行時對保存在DRAM 上的指令內(nèi)容和數(shù)據(jù)排布方式進行調(diào)整,硬件上執(zhí)行的依舊是與算力相匹配的指令。將ReRAM 規(guī)模的輸入向量和輸出向量切分為n個FPGA 乘累加樹輸入規(guī)模的子向量,ReRAM 規(guī)模的權(quán)值矩陣相應地切分為n×n個FPGA 乘累加樹權(quán)值規(guī)模的子塊矩陣。編譯生成的一條MVM 指令進行ReRAM 陣列規(guī)模的矩陣乘法運算在FPGA 乘累加樹上要分成n×n次實現(xiàn)。如圖5 所示,運算時主要以輸入向量優(yōu)先的方式進行調(diào)度,運行時每次加載一個輸入子向量和相同輸入通道下的n個子塊矩陣,分別進行向量矩陣乘法運算,相應得到n個輸出子向量的部分和。阻變神經(jīng)網(wǎng)絡加速器在一個周期內(nèi)可以獲得一個子向量和子塊矩陣的向量矩陣乘法的結(jié)果,因此一個ReRAM 規(guī)模的向量矩陣乘法運算至少需要n×n個周期才能完成。

圖5 MVM 運算調(diào)度Fig.5 Scheduling of MVM operation
通過指令的重新翻譯和MVM 運算的調(diào)度,可以靈活地將更多的神經(jīng)網(wǎng)絡框架編譯成基于FPGA模擬的阻變神經(jīng)網(wǎng)絡加速器支持的指令集,從而支持更多網(wǎng)絡的性能評估。
選取DIGILENT ZYBO-Z7 開發(fā)板進行基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡加速器的軟硬件設計。DIGILENT ZYBO-Z7 集 成Xilinx ZYNQ-7020 芯 片和ARM Cortex-A9 處理器核。ARM Cortex-A9 處理器上移植Ubuntu 18.04 操作系統(tǒng)對硬件運行時進行控制。FPGA 芯片上實現(xiàn)了主要的運算和控制邏輯,資源使用情況如表3 所示,F(xiàn)PGA 片上存儲(BRAM)和乘累加運算資源(DSP)已被充分利用。

表3 FPGA 資源使用情況Table 3 FPGA resources usage
在實驗環(huán)境的約束下,阻變神經(jīng)網(wǎng)絡加速器工作在100 MHz 主頻的時鐘下,單周期可以獲得1 個1×16 的向量和16×16 的矩陣的乘法運算結(jié)果或1×16 的向量運算結(jié)果。
3.2.1 陣列性能評估
為評估加速器對陣列仿真的加速性能,選取存算一體神經(jīng)網(wǎng)絡加速器軟件模擬器MNSIM[19]進行對比。針對不同規(guī)模的ReRAM 陣列,阻變神經(jīng)網(wǎng)絡加速器的仿真時間和加速比如表4 所示。加速器主要通過提供并行的運算單元和流水運算對MVM 操作進行硬件加速,但由于訪存延遲無法忽略,因此對于不同規(guī)模的陣列,仿真時間并沒有成倍增加。MNSIM 軟件仿真平臺主要通過高主頻的CPU 串行完成MVM,隨著陣列規(guī)模的提升,MNSIM 的仿真時間顯著增加,本文提出的阻變神經(jīng)網(wǎng)絡加速器評估方法可加速40.0~252.9 倍。

表4 加速器對不同規(guī)模ReRAM 陣列仿真的加速效果Table 4 Acceleration effect of accelerators on ReRAM array simulation of different scales
3.2.2 網(wǎng)絡性能評估
為評估加速器對神經(jīng)網(wǎng)絡仿真的加速性能,選取軟件模擬器DNN NeuroSim[20]進行對比,為與本文提出的神經(jīng)網(wǎng)絡加速器的功能相匹配,省略了模擬器對功耗和面積的估算。映射VGG-8、Resnet 等深度神經(jīng)網(wǎng)絡,并在Intel?CoreTMi5-8500 處理器上運行模擬器。圖6 給出了對比結(jié)果,其中縱坐標的執(zhí)行時間已經(jīng)過對數(shù)處理,對于小規(guī)模神經(jīng)網(wǎng)絡,本文提出的神經(jīng)網(wǎng)絡加速器可以獲得129.2 倍的加速比。對于深度神經(jīng)網(wǎng)絡Resnet,隨著網(wǎng)絡層數(shù)的提升,本文提出的阻變神經(jīng)網(wǎng)絡加速器評估方法可以獲得194.7~234.2倍的加速比。

圖6 加速器對神經(jīng)網(wǎng)絡仿真的加速效果Fig.6 Acceleration effect of accelerators on neural network simulation
針對阻變神經(jīng)網(wǎng)絡加速器的軟件仿真速度慢、硬件模擬靈活性差等問題,本文提出一種基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡加速器評估方法,通過軟件庫指令的重新翻譯和MVM 運算調(diào)度,實現(xiàn)多層次存算一體架構(gòu)和指令集的行為仿真以及主流神經(jīng)網(wǎng)絡的快速性能評估。實驗結(jié)果表明,本文評估方法相比MNSIM 和DNN NeuroSim 軟件模擬器在仿真過程中運行速度更快。由于ReRAM 器件的非理想特性,ReRAM 陣列在進行向量矩陣乘法運算時會產(chǎn)生誤差,因此后續(xù)將在基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡加速器評估方法中加入ReRAM 器件的非理想特性模型,以評估其對神經(jīng)網(wǎng)絡預測結(jié)果的影響,提升評估方法的精確度和可靠性。