石永泉,景乃鋒
(上海交通大學(xué) 電子信息與電氣工程學(xué)院,上海 200240)
隨著大數(shù)據(jù)、深度學(xué)習(xí)和云計(jì)算的不斷發(fā)展,神經(jīng)網(wǎng)絡(luò)需要處理的數(shù)據(jù)量越來(lái)越大,對(duì)硬件算力的要求也日益提高。傳統(tǒng)馮·諾依曼體系結(jié)構(gòu)中內(nèi)存單元和運(yùn)算單元之間的大量數(shù)據(jù)流動(dòng)會(huì)導(dǎo)致計(jì)算單元的長(zhǎng)時(shí)間空閑,限制數(shù)據(jù)處理速度并進(jìn)一步增加系統(tǒng)功耗[1]。相比傳統(tǒng)馮·諾依曼體系結(jié)構(gòu),存算一體(Processing-in-Memory,PIM)體系結(jié)構(gòu)將權(quán)值數(shù)據(jù)的存儲(chǔ)與機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)算法中的向量矩陣乘法(Matrix-Vector Multiplication,MVM)運(yùn)算在憶阻器件[2]上實(shí)現(xiàn),成為解決訪存瓶頸的有效途徑。
盡管存算一體體系結(jié)構(gòu)為解決存儲(chǔ)墻問題提供了新的思路和方法,但是存算一體神經(jīng)網(wǎng)絡(luò)加速器的架構(gòu)設(shè)計(jì)依然面臨很多挑戰(zhàn)。存算一體神經(jīng)網(wǎng)絡(luò)加速器架構(gòu)設(shè)計(jì)需要對(duì)加速器進(jìn)行精確的建模和仿真,模型中需要包含數(shù)據(jù)訪存、指令譯碼等細(xì)節(jié)信息[3],并通過(guò)軟件模擬器方式實(shí)現(xiàn)[4]。然而,對(duì)于大規(guī)模深度神經(jīng)網(wǎng)絡(luò),軟件模擬器仿真的時(shí)間開銷往往是不可接受的。傳統(tǒng)硬件模擬器雖然仿真時(shí)間短,但是僅支持單一的網(wǎng)絡(luò),靈活性較差[5-6]。本文提出一種基于現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器評(píng)估方法,同時(shí)設(shè)計(jì)硬件資源的軟件分時(shí)復(fù)用方案,并在DIGILENT ZYBO-Z7 開發(fā)板上進(jìn)行阻變神經(jīng)網(wǎng)絡(luò)加速器評(píng)估方法的軟硬件設(shè)計(jì)。
憶阻器陣列集成計(jì)算和存儲(chǔ)功能,一般通過(guò)非易失性阻變隨機(jī)訪問存儲(chǔ)器(Resistive Random Access Memory,ReRAM)[7]實(shí)現(xiàn)。在神經(jīng)元結(jié)構(gòu)中,突觸可以根據(jù)其兩端的神經(jīng)元激勵(lì)發(fā)生變化。在憶阻器陣列中,可在ReRAM 器件兩端外加電壓改變電導(dǎo)[8]進(jìn)行神經(jīng)計(jì)算。如圖1 所示,利用ReRAM 器件的特性,可以外加輸入數(shù)字電壓(INP),將電壓進(jìn)行數(shù)模轉(zhuǎn)換(DAC)得到模擬電壓值,加在器件兩端的模擬電壓和器件預(yù)編程的電導(dǎo)通過(guò)歐姆定律和基爾霍夫定律計(jì)算得到流出器件的電流,將電流值進(jìn)行模數(shù)轉(zhuǎn)換(ADC)后得到計(jì)算的數(shù)字輸出結(jié)果(OUT),實(shí)現(xiàn)存算一體的功能。
圖1 ReRAM 陣列向量矩陣乘法運(yùn)算原理Fig.1 Principle of ReRAM array MVM operation
存算一體神經(jīng)網(wǎng)絡(luò)加速器通常進(jìn)行分層拓?fù)浼軜?gòu)設(shè)計(jì)。文獻(xiàn)[9]對(duì)存算一體神經(jīng)網(wǎng)絡(luò)加速器進(jìn)行Chip、Tile、IMA、Crossbar 的四層架構(gòu)設(shè)計(jì)。Chip 以集中網(wǎng)絡(luò)的形式連接多個(gè)Tile;Tile 通過(guò)共享總線連接多個(gè)IMA、累加器等功能單元;IMA 通過(guò)共享總線連接多個(gè)Crossbar、數(shù)模轉(zhuǎn)換器等功能單元。文獻(xiàn)[10]給出Chip、Tile、VMM、Crossbar 的分層拓?fù)浼軜?gòu)設(shè)計(jì),數(shù)據(jù)可在Tile 間進(jìn)行粗粒度的流水,減少Tile 間不必要的數(shù)據(jù)流動(dòng)。文獻(xiàn)[11]實(shí)現(xiàn)Node、Tile、Core 的三層架構(gòu)設(shè)計(jì),其中Core 包含多個(gè)流水的MVM 運(yùn)算單元和三級(jí)指令流水線,數(shù)據(jù)在Core 和Crossbar 中都可進(jìn)行流水計(jì)算,提升內(nèi)部訪存帶寬[12]。
相較傳統(tǒng)神經(jīng)網(wǎng)絡(luò)加速器[13],存算一體神經(jīng)網(wǎng)絡(luò)加速器將標(biāo)量計(jì)算盡量放在CPU 上進(jìn)行,向量計(jì)算的向量規(guī)模也無(wú)需特殊指定。AMBROSI 等[14]于2018 年提出一種存算一體神經(jīng)網(wǎng)絡(luò)加速器的指令集,相較傳統(tǒng)神經(jīng)網(wǎng)絡(luò)加速器指令集[15]增加了在不同層次間進(jìn)行數(shù)據(jù)搬運(yùn)的指令,ANKIT 等[16]于2020 年又加入了進(jìn)行外積計(jì)算的OPA 指令及轉(zhuǎn)置矩陣和向量乘法運(yùn)算的MVTM指令,但不支持對(duì)ReRAM 陣列的在線編程[17-18]。
2.1.1 架構(gòu)設(shè)計(jì)
為對(duì)神經(jīng)網(wǎng)絡(luò)各層運(yùn)算進(jìn)行有效的資源分配,提升內(nèi)部帶寬并減少不必要的數(shù)據(jù)移動(dòng),神經(jīng)網(wǎng)絡(luò)加速器需要進(jìn)行分層拓?fù)浼軜?gòu)設(shè)計(jì),基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器支持Core、Tile、Crossbar的三層架構(gòu)。
如圖2 所示,Crossbar 主要進(jìn)行向量和矩陣的乘法運(yùn)算,每個(gè)Crossbar 包含ReRAM 陣列、保存輸入輸出數(shù)據(jù)的緩存單元、信號(hào)轉(zhuǎn)換器等功能模塊。Tile主要進(jìn)行神經(jīng)網(wǎng)絡(luò)的層級(jí)運(yùn)算,包含存放數(shù)據(jù)的SRAM、一定數(shù)量的Crossbar 和用于將Crossbar 的計(jì)算結(jié)果進(jìn)行激活操作的向量運(yùn)算單元(ALU)。Core中主要進(jìn)行網(wǎng)絡(luò)級(jí)別的運(yùn)算,包含指令譯碼模塊、一定數(shù)量的Tile、加載數(shù)據(jù)到各自Tile 對(duì)應(yīng)SRAM 的數(shù)據(jù)加載單元(LU)、保存數(shù)據(jù)到動(dòng)態(tài)隨機(jī)訪問存儲(chǔ)器(Dynamic Random Access Memory,DRAM)的數(shù)據(jù)回存單元(SU)和進(jìn)行池化操作的向量運(yùn)算單元。DRAM 保存編譯產(chǎn)生的指令和數(shù)據(jù),每個(gè)Core 通過(guò)各自的指令隊(duì)列連接在指令發(fā)射模塊上接收指令,數(shù)據(jù)通過(guò)直接存儲(chǔ)器訪問(Direct Memory Access,DMA)傳遞給各個(gè)Core。
圖2 阻變神經(jīng)網(wǎng)絡(luò)加速器架構(gòu)Fig.2 Architecture of resistive neural network accelerator
2.1.2 指令集設(shè)計(jì)
由于存算一體神經(jīng)網(wǎng)絡(luò)加速器的器件和架構(gòu)特點(diǎn)以及神經(jīng)網(wǎng)絡(luò)的計(jì)算特性,因此存算一體神經(jīng)網(wǎng)絡(luò)加速器的指令集也有其特殊性?;贔PGA 模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器在傳統(tǒng)神經(jīng)網(wǎng)絡(luò)加速器指令的基礎(chǔ)上新增在線編程的LdWGT 指令,用于配置SetTile 等指令,加速器指令集設(shè)置如表1 所示。
表1 加速器指令集Table 1 Instruction set of accelerator
在上述架構(gòu)和指令集模型下,基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器的主要計(jì)算流程如圖3 所示。
圖3 阻變神經(jīng)網(wǎng)絡(luò)加速器計(jì)算流程Fig.3 Calculation procedure of resistive neural network accelerator
2.2.1 加速器硬件設(shè)計(jì)
本文設(shè)計(jì)的加速器包含了阻變神經(jīng)網(wǎng)絡(luò)加速器架構(gòu)的所有主要功能模塊,包括DMA、DRAM、指令發(fā)射模塊、指令隊(duì)列、指令譯碼模塊、數(shù)據(jù)加載模塊、數(shù)據(jù)回存模塊、SRAM、向量計(jì)算單元和向量矩陣乘法運(yùn)算單元。由于硬件規(guī)模的限制,各個(gè)Core、Tile、Crossbar 的運(yùn)算任務(wù)只能串行進(jìn)行,阻變神經(jīng)網(wǎng)絡(luò)加速器的向量矩陣乘法運(yùn)算單元主要通過(guò)乘累加樹實(shí)現(xiàn)。對(duì)比圖2、圖4 中的指令隊(duì)列接收每個(gè)Core 的指令并經(jīng)由指令譯碼模塊發(fā)送到各個(gè)功能模塊中執(zhí)行。在指令的執(zhí)行過(guò)程中:所有的Tile 都通過(guò)同一數(shù)據(jù)加載模塊和數(shù)據(jù)回存模塊執(zhí)行Load、Store 指令和SRAM 進(jìn)行交互;所有的MVM 指令和ALU 指令分別在向量矩陣乘法運(yùn)算單元和向量計(jì)算單元中串行執(zhí)行。
圖4 阻變神經(jīng)網(wǎng)絡(luò)加速器硬件結(jié)構(gòu)Fig.4 Hardware structure of resistive neural network accelerator
ReRAM 陣列的規(guī)模一般很大,但FPGA 存儲(chǔ)和運(yùn)算資源有限,ALU 和MVM 指令運(yùn)算能力有限,因此需要將權(quán)值矩陣和輸入矩陣進(jìn)行分割重組,每次進(jìn)行小規(guī)模的運(yùn)算,將運(yùn)算結(jié)果按照數(shù)據(jù)索引進(jìn)行相應(yīng)的累加。通過(guò)對(duì)FPGA 硬件資源的分時(shí)復(fù)用完成較大規(guī)模ReRAM 陣列的模擬。
通過(guò)修改硬件結(jié)構(gòu)可實(shí)現(xiàn)分時(shí)復(fù)用的硬件調(diào)度,但由于積累全部ReRAM 陣列規(guī)模的輸入數(shù)據(jù)和權(quán)重?cái)?shù)據(jù)計(jì)算模塊才能開始計(jì)算,且硬件上需要增加Buffer 積累數(shù)據(jù),同時(shí)計(jì)算單元在運(yùn)行時(shí)也會(huì)長(zhǎng)時(shí)間空等,造成不必要的性能損失,因此為降低硬件設(shè)計(jì)的復(fù)雜度并提升運(yùn)行效率,本文設(shè)計(jì)加速器的軟件庫(kù)支持分時(shí)復(fù)用的軟件調(diào)度。
2.2.2 加速器軟件庫(kù)設(shè)計(jì)
由于硬件設(shè)計(jì)上的差異,表1 所述的指令集不能直接執(zhí)行在阻變神經(jīng)網(wǎng)絡(luò)加速器上。設(shè)計(jì)C++軟件庫(kù)將表1 中的指令轉(zhuǎn)換為硬件支持的指令,軟件庫(kù)同時(shí)支持硬件資源分時(shí)復(fù)用的軟件調(diào)度。
1)指令重新翻譯編譯器生成的指令是面向ReRAM規(guī)模的指令,其讀寫和運(yùn)算的數(shù)據(jù)規(guī)模均是ReRAM 規(guī)模,而FPGA 上實(shí)現(xiàn)的運(yùn)算模塊遠(yuǎn)達(dá)不到該規(guī)模,這樣的指令送到硬件上執(zhí)行僅求得小規(guī)模的部分和,與最終結(jié)果有很大的差距。因此,需要將數(shù)據(jù)切分為適配FPGA 運(yùn)算模塊的大小進(jìn)行運(yùn)算,并對(duì)Store、Load、Pooling、Activation 等指令增加index、size 等字段并轉(zhuǎn)換為適配運(yùn)算模塊的指令,保證轉(zhuǎn)換前后的指令進(jìn)行等價(jià)的操作。此外,由于ReRAM 陣列的器件特性,因此LdWGT 等部分指令無(wú)法在FPGA 上執(zhí)行。FPGA 硬件資源有限,多Core 多Tile 的并行計(jì)算只能串行進(jìn)行,Move 等部分指令在串行系統(tǒng)中的功能與在并行系統(tǒng)中的功能有所差異。因此,對(duì)上述指令進(jìn)行如表2 所示的指令轉(zhuǎn)譯。
表2 指令轉(zhuǎn)譯Table 2 Instruction translation
2)軟件分時(shí)復(fù)用調(diào)度不改變硬件結(jié)構(gòu),而是在運(yùn)行時(shí)對(duì)保存在DRAM 上的指令內(nèi)容和數(shù)據(jù)排布方式進(jìn)行調(diào)整,硬件上執(zhí)行的依舊是與算力相匹配的指令。將ReRAM 規(guī)模的輸入向量和輸出向量切分為n個(gè)FPGA 乘累加樹輸入規(guī)模的子向量,ReRAM 規(guī)模的權(quán)值矩陣相應(yīng)地切分為n×n個(gè)FPGA 乘累加樹權(quán)值規(guī)模的子塊矩陣。編譯生成的一條MVM 指令進(jìn)行ReRAM 陣列規(guī)模的矩陣乘法運(yùn)算在FPGA 乘累加樹上要分成n×n次實(shí)現(xiàn)。如圖5 所示,運(yùn)算時(shí)主要以輸入向量?jī)?yōu)先的方式進(jìn)行調(diào)度,運(yùn)行時(shí)每次加載一個(gè)輸入子向量和相同輸入通道下的n個(gè)子塊矩陣,分別進(jìn)行向量矩陣乘法運(yùn)算,相應(yīng)得到n個(gè)輸出子向量的部分和。阻變神經(jīng)網(wǎng)絡(luò)加速器在一個(gè)周期內(nèi)可以獲得一個(gè)子向量和子塊矩陣的向量矩陣乘法的結(jié)果,因此一個(gè)ReRAM 規(guī)模的向量矩陣乘法運(yùn)算至少需要n×n個(gè)周期才能完成。
圖5 MVM 運(yùn)算調(diào)度Fig.5 Scheduling of MVM operation
通過(guò)指令的重新翻譯和MVM 運(yùn)算的調(diào)度,可以靈活地將更多的神經(jīng)網(wǎng)絡(luò)框架編譯成基于FPGA模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器支持的指令集,從而支持更多網(wǎng)絡(luò)的性能評(píng)估。
選取DIGILENT ZYBO-Z7 開發(fā)板進(jìn)行基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器的軟硬件設(shè)計(jì)。DIGILENT ZYBO-Z7 集 成Xilinx ZYNQ-7020 芯 片和ARM Cortex-A9 處理器核。ARM Cortex-A9 處理器上移植Ubuntu 18.04 操作系統(tǒng)對(duì)硬件運(yùn)行時(shí)進(jìn)行控制。FPGA 芯片上實(shí)現(xiàn)了主要的運(yùn)算和控制邏輯,資源使用情況如表3 所示,F(xiàn)PGA 片上存儲(chǔ)(BRAM)和乘累加運(yùn)算資源(DSP)已被充分利用。
表3 FPGA 資源使用情況Table 3 FPGA resources usage
在實(shí)驗(yàn)環(huán)境的約束下,阻變神經(jīng)網(wǎng)絡(luò)加速器工作在100 MHz 主頻的時(shí)鐘下,單周期可以獲得1 個(gè)1×16 的向量和16×16 的矩陣的乘法運(yùn)算結(jié)果或1×16 的向量運(yùn)算結(jié)果。
3.2.1 陣列性能評(píng)估
為評(píng)估加速器對(duì)陣列仿真的加速性能,選取存算一體神經(jīng)網(wǎng)絡(luò)加速器軟件模擬器MNSIM[19]進(jìn)行對(duì)比。針對(duì)不同規(guī)模的ReRAM 陣列,阻變神經(jīng)網(wǎng)絡(luò)加速器的仿真時(shí)間和加速比如表4 所示。加速器主要通過(guò)提供并行的運(yùn)算單元和流水運(yùn)算對(duì)MVM 操作進(jìn)行硬件加速,但由于訪存延遲無(wú)法忽略,因此對(duì)于不同規(guī)模的陣列,仿真時(shí)間并沒有成倍增加。MNSIM 軟件仿真平臺(tái)主要通過(guò)高主頻的CPU 串行完成MVM,隨著陣列規(guī)模的提升,MNSIM 的仿真時(shí)間顯著增加,本文提出的阻變神經(jīng)網(wǎng)絡(luò)加速器評(píng)估方法可加速40.0~252.9 倍。
表4 加速器對(duì)不同規(guī)模ReRAM 陣列仿真的加速效果Table 4 Acceleration effect of accelerators on ReRAM array simulation of different scales
3.2.2 網(wǎng)絡(luò)性能評(píng)估
為評(píng)估加速器對(duì)神經(jīng)網(wǎng)絡(luò)仿真的加速性能,選取軟件模擬器DNN NeuroSim[20]進(jìn)行對(duì)比,為與本文提出的神經(jīng)網(wǎng)絡(luò)加速器的功能相匹配,省略了模擬器對(duì)功耗和面積的估算。映射VGG-8、Resnet 等深度神經(jīng)網(wǎng)絡(luò),并在Intel?CoreTMi5-8500 處理器上運(yùn)行模擬器。圖6 給出了對(duì)比結(jié)果,其中縱坐標(biāo)的執(zhí)行時(shí)間已經(jīng)過(guò)對(duì)數(shù)處理,對(duì)于小規(guī)模神經(jīng)網(wǎng)絡(luò),本文提出的神經(jīng)網(wǎng)絡(luò)加速器可以獲得129.2 倍的加速比。對(duì)于深度神經(jīng)網(wǎng)絡(luò)Resnet,隨著網(wǎng)絡(luò)層數(shù)的提升,本文提出的阻變神經(jīng)網(wǎng)絡(luò)加速器評(píng)估方法可以獲得194.7~234.2倍的加速比。
圖6 加速器對(duì)神經(jīng)網(wǎng)絡(luò)仿真的加速效果Fig.6 Acceleration effect of accelerators on neural network simulation
針對(duì)阻變神經(jīng)網(wǎng)絡(luò)加速器的軟件仿真速度慢、硬件模擬靈活性差等問題,本文提出一種基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器評(píng)估方法,通過(guò)軟件庫(kù)指令的重新翻譯和MVM 運(yùn)算調(diào)度,實(shí)現(xiàn)多層次存算一體架構(gòu)和指令集的行為仿真以及主流神經(jīng)網(wǎng)絡(luò)的快速性能評(píng)估。實(shí)驗(yàn)結(jié)果表明,本文評(píng)估方法相比MNSIM 和DNN NeuroSim 軟件模擬器在仿真過(guò)程中運(yùn)行速度更快。由于ReRAM 器件的非理想特性,ReRAM 陣列在進(jìn)行向量矩陣乘法運(yùn)算時(shí)會(huì)產(chǎn)生誤差,因此后續(xù)將在基于FPGA 模擬的阻變神經(jīng)網(wǎng)絡(luò)加速器評(píng)估方法中加入ReRAM 器件的非理想特性模型,以評(píng)估其對(duì)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)結(jié)果的影響,提升評(píng)估方法的精確度和可靠性。