毛海宇 舒繼武
(清華大學計算機科學與技術(shù)系 北京 100084)
近年來,基于憶阻器的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算加速器倍受學術(shù)研究者和工業(yè)界的關(guān)注[1-4].研究表明,數(shù)據(jù)在CPU和片外存儲之間的傳輸消耗的能量比一個浮點運算所消耗的能量高2個數(shù)量級[5].基于憶阻器的內(nèi)存加速器將計算與存儲緊密結(jié)合,從而省去傳統(tǒng)的馮·諾依曼體系結(jié)構(gòu)的中心處理器和內(nèi)存之間的數(shù)據(jù)傳輸,進而提升整體系統(tǒng)的性能并節(jié)省大部分的系統(tǒng)能耗[6].此類加速器通過在憶阻器陣列外部加入一些功能單元,使憶阻器陣列能在幾乎一個讀操作的延遲內(nèi)完成一次向量乘矩陣操作(matrix-vector-multiplication, MVM)[7],它是神經(jīng)網(wǎng)絡(luò)計算中的主要操作.
雖然基于憶阻器的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算加速器有著很高的性能和很低的能耗,但是當它用于神經(jīng)網(wǎng)絡(luò)訓練任務(wù)時,憶阻器陣列的外圍電路利用率很低.這是因為:1)當執(zhí)行前向傳播時,用于反向傳播的憶阻器陣列的外圍功能單元都處于空閑狀態(tài); 2)當訓練的批大小(batch_size)較小時,無論是在前向還是反向的傳播過程中,都有一些憶阻器陣列的外圍功能單元處于空閑狀態(tài).不僅如此,憶阻器陣列的外圍功能單元還占據(jù)了極大的面積.例如一個8-bit ADC(模擬轉(zhuǎn)數(shù)字的原件)的面積就是一個128×128的憶阻器陣列的面積的48倍[2].由于目前的基于憶阻器的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算加速器的外圍電路存在上述2個問題,使得整個芯片的面積大且利用率低.
因此,本文針對上述問題提出了一種基于3D憶阻器陣列的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算架構(gòu):基于功能單元池的憶阻器立方體(function-pool based memristor cube, FMC)通過提供一個功能單元池給多個堆疊在其上的憶阻器陣列共享,而不是為每一個憶阻器陣列配備所有的功能單元電路,從而達到減小芯片面積并提高功能單元利用率的目的.這種通過3D堆疊的方式進行功能單元共享的結(jié)構(gòu)不僅減小了所有功能單元的占用面積,還極大地縮短了互聯(lián)線,使得整體的互聯(lián)面積減小.與此同時,由于互聯(lián)線路的縮短,F(xiàn)MC還減少了數(shù)據(jù)的傳輸,從而使得整體加速器結(jié)構(gòu)的性能提高且能耗降低.
為了更好地利用FMC,本文用軟硬件協(xié)同設(shè)計的方式,進一步提出了基于FMC的計算數(shù)據(jù)排布策略——功能單元池感知的數(shù)據(jù)排布(function-pool aware data mapping, FDM).FDM通過配合FMC工作,使得數(shù)據(jù)移動更少,功能單元的利用率更高,進而提高整體架構(gòu)的性能.
實驗結(jié)果表明:在單個訓練任務(wù)的情況下,我們提出的FMC能使功能單元的利用率提升43.33倍,在多個任務(wù)的情況下能提升高達58.51倍.同時,和有相同數(shù)目的Compute Array及Storage Array的2D-PIM比較,F(xiàn)MC所占空間僅為2D-PIM的42.89%.而且,F(xiàn)MC相比于2D-PIM有1.5倍的性能提升,且有1.7倍的能耗節(jié)約.
本文的主要貢獻有3個方面:
1) 分析并發(fā)現(xiàn)基于憶阻器的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算加速器的外圍電路存在占用面積大且在神經(jīng)網(wǎng)絡(luò)的訓練過程中外圍電路存在利用率極低的問題.
2) 提出了一種基于3D憶阻器陣列的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算架構(gòu),通過將憶阻器陣列3D堆疊在根據(jù)系統(tǒng)結(jié)構(gòu)配置設(shè)計的功能單元池上來共享外圍功能電路資源,從而達到減小芯片面積的占用、提高資源利用率的目的.
3) 提出了一種基于3D憶阻器陣列的計算數(shù)據(jù)排布策略,通過設(shè)計基于3D憶阻器陣列的硬件架構(gòu)的數(shù)據(jù)排布策略來更好地利用此架構(gòu),使得數(shù)據(jù)移動盡可能少且資源利用率盡可能高.
由于神經(jīng)網(wǎng)絡(luò)的計算(推理和訓練)受限于傳統(tǒng)的馮·諾依曼體系結(jié)構(gòu)中片上處理器到片外的存儲之間有限的帶寬,研究者們提出了內(nèi)存計算,即將計算單元和存儲單元相結(jié)合,從而避免兩者間大量的數(shù)據(jù)傳輸.現(xiàn)在的內(nèi)存計算可分為兩大類:基于憶阻器的內(nèi)存計算(processing in memory, PIM)[1-4,8-10]和基于DRAM的內(nèi)存計算——近數(shù)據(jù)計算(near data computing, NDC)[11-16].PIM通過直接利用憶阻器的特性,將存儲資源直接用于做計算,取得計算存儲相融合的效果.而NDC則是通過將計算資源靠近存儲單元擺放,并通過一些高帶寬的連接使得計算資源能快速地訪問存儲資源,例如混合記憶立方體(hybrid memory cube, HMC).
圖1描述了基于憶阻器的PIM的基本電路結(jié)構(gòu)和計算原理[2].如圖1(a)所示,每個憶阻器單元的阻值代表一個數(shù)值,每個電壓代表一個輸入值,根據(jù)Kirchoff定律,通過模擬電路域的電流加,能得到一個代表輸出的電流值,如圖1(a)中公式所示.因此,在憶阻器陣列外圍加上一些功能單元,如圖1(b)所示,一個4×4的憶阻器陣列能夠用來存儲一個4×4的矩陣,然后加上代表4個1×4的向量的輸入電壓,就能在幾乎一個讀延遲內(nèi)完成一次向量乘矩陣的運算.而向量乘矩陣的運算是神經(jīng)網(wǎng)絡(luò)計算中的主要運算,因此,基于憶阻器的PIM加速器能極大地提升神經(jīng)網(wǎng)絡(luò)計算的性能.
NDC最常用的硬件結(jié)構(gòu)就是HMC.HMC通過在邏輯晶粒(計算單元)上堆疊一些DRAM晶粒(存儲單元),然后用一些垂直貫穿DRAM的穿過硅片通道(through silicon vias, TSV)使它們相連,從而使得計算單元到存儲單元擁有很高的訪存帶寬.但是其本質(zhì)上還是計算和存儲相分離的,不同于基于憶阻器的PIM,NDC中用于存儲的DRAM晶粒并不能直接用來做計算.因此,PIM的性能通常優(yōu)于NDC.
目前對于PIM的研究更多地針對推理,因為推理的計算以及數(shù)據(jù)流要比訓練簡單得多,但是它們所用到的硬件功能單元基本一樣.文獻[1]提出了用具有高存儲密度、低讀寫延遲、相比于其余NVM有較長壽命的ReRAM[17-20]來作為PIM的基礎(chǔ)硬件單元,并設(shè)計ReRAM陣列可被配置為3種模式:計算、存儲和緩存,再通過加上支持其余神經(jīng)網(wǎng)絡(luò)計算的硬件單元來做神經(jīng)網(wǎng)絡(luò)的推理計算.文獻[2]通過使用ReRAM陣列做向量乘矩陣的計算單元,并利用eDRAM作為其存儲單元,再通過設(shè)計推理的流水線計算,從而提高用PIM來做神經(jīng)網(wǎng)絡(luò)推理的效率.文獻[3]通過復制多份計算單元,減少當PIM用來做神經(jīng)網(wǎng)絡(luò)訓練時流水線計算中的空閑,從而提升PIM用來做神經(jīng)網(wǎng)絡(luò)訓練任務(wù)的效率.文獻[4]使用比ReRAM有更接近于線性電阻值更新的PCM[21-23]加上CMOS作為PIM的基礎(chǔ)硬件單元[24],在同一個陣列中完成神經(jīng)網(wǎng)絡(luò)訓練時的前向傳播和反向傳播操作.但是文獻[4]只能支持僅有全連接層的神經(jīng)網(wǎng)絡(luò)的訓練,不能夠支持卷積神經(jīng)網(wǎng)絡(luò)的訓練,而文獻[3]可以支持.文獻[7]提出了一種用來支持生成對抗網(wǎng)絡(luò)的基于ReRAM的PIM,它通過軟硬件結(jié)合的設(shè)計,省去生成對抗網(wǎng)絡(luò)中的冗余計算和存儲,并通過運行時可重配的互聯(lián)提升PIM支持復雜訓練數(shù)據(jù)流時的性能.
然而目前針對PIM的研究都以提高PIM的計算效率為目的,并沒有關(guān)注PIM的芯片面積以及其中的資源利用率.本文考慮了PIM芯片中的功能單元的面積占用問題及其利用率問題.還需說明的是:本文提出的基于憶阻器的3D結(jié)構(gòu)不同于HMC的結(jié)構(gòu),其存儲本身能夠用來做計算,且最下層的邏輯晶粒(本文中的資源池)不僅僅是計算資源,還有用來支撐憶阻器做計算的功能單元(例如圖1中的DAC和ADC).
下文首先介紹設(shè)計的FMC架構(gòu),然后介紹基于FMC的數(shù)據(jù)映射,再后給出FMC的功能單元資源利用率、空間占用情況和FMC+FDM的性能和能耗等實驗結(jié)果及相應(yīng)的分析,最后給出本文總結(jié).
在本節(jié)中,我們首先給出了FMC的架構(gòu)概要圖,如圖2所示,然后我們分別介紹FMC的憶阻器陣列、互聯(lián)結(jié)構(gòu)、共享資源池.
Fig. 2 Outline of the function-pool based memristor cube圖2 基于功能池的憶阻器立方體的概要圖
Fig. 3 Intra-connections of 2D memristors圖3 憶阻器陣列的平面互聯(lián)
FMC架構(gòu)主要分成3個部分:憶阻器陣列、3D互聯(lián)結(jié)構(gòu)和共享資源池(如圖2的中部所示).共享功能單元池放置于最下方,其上堆疊若干個憶阻器陣列晶粒層.每一層有若干個憶阻器陣列晶粒,一部分用來做普通的存儲(本文中稱為Storage Array),一部分既可以通過配置用來做存儲也可以設(shè)置其用來做計算(本文中稱為Compute Array).每一層均通過垂直的連接和共享資源層相連.其層數(shù)以及每層憶阻器陣列的數(shù)目受限于工藝大小以及資源池的資源多少.
FMC使用cross-bar結(jié)構(gòu)的ReRAM作為其基礎(chǔ)硬件單元,如圖2左部所示,保留了作為存儲器時的外圍電路單元,例如寫驅(qū)動(未在圖2中標出).每一個正方形表示一個ReRAM cell.當這個憶阻器陣列被配置成Compute Array時,每個ReRAM cell用來存儲一個神經(jīng)網(wǎng)絡(luò)中權(quán)重的值或者存儲值的一部分(即用多個cell存儲一個值,每個cell存儲多個位);當這個憶阻器陣列被配置成Storage Array時,整個陣列就被當做普通存儲器使用,一個cell存儲一個位.
FMC中的每層憶阻器陣列Storage Array中的憶阻器陣列通過H-tree的方式進行連接,Compute Array中的憶阻器陣列通過基于H-tree的可重配的連接方式進行連接(與文獻[7]的平面連接方式相同).Storage Array和Compute Array之間通過一個高速的共享線路進行連接.
圖3給出了憶阻器陣列的平面互聯(lián)結(jié)構(gòu).左邊是Storage Array的互聯(lián)結(jié)構(gòu).和普通存儲一樣,Storage Array用H-tree的連接方式:灰色圓圈代表merging node,連接的父節(jié)點的線路寬是連接子節(jié)點線路寬的2倍;灰色方塊代表multiplexing node,連接的父節(jié)點的線路寬和連接子節(jié)點線路寬一樣.右邊是Compute Array的連接方式:我們保留原來的H-tree的連接方式(圖3中灰色線條),并在同一層連接節(jié)點中不共父節(jié)點的節(jié)點(如圖3中黃色節(jié)點所示)之間加上一條電路線(如圖3中綠色線條所示).新加的這條電路線的寬度與其連接其父節(jié)點的線路寬度相同.由于接口有限,圖3中每個黃色節(jié)點被增加了一個轉(zhuǎn)換接口,使得它們能選擇連到它們的父節(jié)點或者相鄰節(jié)點.這種能夠在網(wǎng)絡(luò)訓練時的動態(tài)配置的連接方式不僅能夠支持快速的Compute Array之間的數(shù)據(jù)傳輸(開關(guān)撥到橫向連接線上,跨過H-tree結(jié)構(gòu)進行通信),還能支持快速的權(quán)重更新,即Compute Array的讀寫(開關(guān)配置成H-tree的連接方式).圖3中間藍色部分表示的是Compute Array和Storage Array之間的共享高速連接,這部分并不是將它們直接相連,而是經(jīng)由共享資源池將它們相連(如圖2中藍色部分所示).
Compute Array中每一個憶阻器陣列(橘黃色方塊)都配備有一個轉(zhuǎn)換接口,能控制每個憶阻器陣列是垂直連接(連向共享資源池或者不同平面的憶阻器陣列)還是平面連接(連向同平面的憶阻器陣列).如果一個憶阻器陣列連接到下一個憶阻器陣列,那么我們稱這2個憶阻器陣列是在同一個模擬電路域的,反之則不是.我們把一個模擬域內(nèi)的所有連向共享資源池的陣列連接叫做這個模擬域的出入口,入口連接共享資源池的DAC分池,出口連接S+H池.
當有多個FMC時,各個FMC之間通過C-mesh的連接方式進行互聯(lián),每個FMC的共享資源層能夠訪問其他FMC的Storage Array,但是不能使用其他FMC的Compute Array,即FMC之間只在數(shù)字域進行通信而不用模擬信號通信,這樣確保了模擬信號的穩(wěn)定性和計算的準確性.
共享資源池由六大部分組成(如圖2右部所示):DAC池、S+H池、ADC池、S+A池、MP(Max Pool)池和激活函數(shù)單元池.每個分池由若干個功能單元組成.表1給出了這些功能單元的名稱及其對應(yīng)的釋義.
圖4給出了各個分池之間的互聯(lián)結(jié)構(gòu).DAC池連接模擬電路域的入口,S+H池連接其出口.S+H池和ADC池相連接,ADC池可選擇連接S+A池、MP池、激活函數(shù)單元池和Storage Array部分.S+A池可選擇連接MP池、激活函數(shù)單元池、DAC池和Storage Array部分.激活函數(shù)單元池可選擇連接MP池、DAC池和Storage Array部分.MP池可選擇連接DAC池和Storage Array部分.每個分池內(nèi)的計算資源通過C-mesh進行連接,分池之間通過高速共享線路進行連接.
Table 1 Notations of Function Units表1 功能單元的參數(shù)表示
Fig. 4 Intra-connection of sub-pools in function unit pool圖4 共享資源池各個分池之間的互聯(lián)結(jié)構(gòu)
表2提供了共享資源池中功能單元的各個配置參數(shù)表示,我們將使用這些配置參數(shù)來介紹共享資源池的具體設(shè)計方法.
Table 2 Configurations of Function Units表2 功能單元的配置參數(shù)
表2是各個單元的相關(guān)配置參數(shù)表示,F(xiàn)MC的功能單元池的面積AFUP可表示為
AFUP=ADACNDAC+AADCNADC+ASHNSH+
ASANSA+AMPNMP+ASNS,
即功能單元池的總面積等于各個功能分池的面積和,各個分池的面積又取決于單個功能單元的面積以及其個數(shù).為了節(jié)省FMC總體占用空間,其功能單元池的面積AFUP需滿足:
其中,0≤θ≤0.1.即功能單元池的面積既不能小于其上堆疊的ReRAM陣列的面積,否則無法充分利用功能單元池的空間;也不能過分大于ReRAM陣列的面積,否則會導致3D堆疊時的連接線路過長,不高效.同時,為了使得模擬電路域到數(shù)字電路域的順暢轉(zhuǎn)換,ADC和DAC單元的參數(shù)需滿足:
x×NDAC=n×m
(1)
(2)
其中,latencyPIM是每個憶阻器陣列一次模擬域向量乘矩陣運算的延遲,單位是ns;NSubCom是在一個共享線路上的所有用于計算工作的憶阻器陣列的數(shù)目.式(1)主要使得DAC轉(zhuǎn)換的位數(shù)和一個陣列中一行的位數(shù)相等,避免計算延遲.式(2)主要使得ADC轉(zhuǎn)換的位數(shù)不能小于計算速度,防止計算出來的數(shù)據(jù)阻塞在ADC之前;且ADC轉(zhuǎn)換速率不能大于傳輸速度,否則算出的數(shù)據(jù)會被阻塞在ADC之后.
Fig. 6 An example of FDM圖6 FDM策略的一個示例
有了這些公式的限制,我們就能根據(jù)實際系統(tǒng)情況的限制以及任務(wù)的需求,很好地制定出我們所需的功能單元池中每個功能單元的數(shù)目,從而設(shè)計高效的功能單元池.
在本節(jié)我們介紹FDM策略,配合FMC的硬件結(jié)構(gòu),使得存儲與計算資源分配合理、數(shù)據(jù)傳輸盡可能少、共享資源池的資源利用率盡可能高.由于FMC中有多層PIM陣列層,每層只有有限個PIM陣列,所以在神經(jīng)網(wǎng)絡(luò)的訓練過程中可能需要多個PIM層的多個陣列.每一層中PIM陣列的數(shù)據(jù)傳輸要比每層間的數(shù)據(jù)傳輸延遲小,并且神經(jīng)網(wǎng)絡(luò)的每個層之內(nèi)、每個層之間已經(jīng)訓練的不同階段都會有數(shù)據(jù)依賴.因此FDM的核心思想是將有數(shù)據(jù)依賴的數(shù)據(jù)塊盡量存在一個PIM陣列層上,將沒有數(shù)據(jù)依賴的計算塊放置于不同PIM層以方便它們共享資源池中的資源.圖5給出了在PIM中訓練一個神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)存儲和數(shù)據(jù)流圖.正方形表示數(shù)據(jù)存儲在Compute Array中,直接用來做計算;圓角矩形表示數(shù)據(jù)存儲在Storage Array中,用來暫存數(shù)據(jù)供給Compute Array做計算.圖5中的W表示W(wǎng)eight,E表示Error,O表示Output.訓練時的前向傳播和反向傳播是串行的,而反向傳播包含2部分:誤差傳播和權(quán)值計算,二者是并行的.因此,當只有一個訓練任務(wù)時(訓練一個網(wǎng)絡(luò)),我們盡量把串行的部分切割排布到同一個FMC中,使得它們能夠時分復用共享資源池;把并行的部分排布到不同的FMC中,避免它們對資源池的訪問造成沖突.
Fig. 5 Data graph of training a neural network圖5 訓練一個神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)圖
如果一層的權(quán)值需要多個憶阻器陣列進行存儲,那么我們把它們均勻地分布到一個FMC中的所有憶阻器陣列層上(圖6中從第1層到第n層進行循環(huán)分配,直到分配結(jié)束),因為它們之間不需要進行通信,所以不必在同一個平面層中,其余各層按照這個方式進行分配.這樣做還為了使得所有神經(jīng)網(wǎng)絡(luò)層能有幾乎一樣的計算效率,能夠有幾乎相等的訪問共享資源池的延遲(避免如將第1層神經(jīng)網(wǎng)絡(luò)權(quán)值分配到FMC的第1層憶阻器陣列、最后一層神經(jīng)網(wǎng)絡(luò)分配到FMC的最后一層憶阻器陣列,從而導致因最后一層訪問共享資源池的延遲大而造成性能差的問題).當有多個訓練任務(wù)時,我們將多個訓練任務(wù)均勻分配到所有的FMC中.
FDM的整體流程如圖7所示.首先將多個網(wǎng)絡(luò)分配到多個FMC中,每個網(wǎng)絡(luò)可能在一個或多個FMC里;然后將每個網(wǎng)絡(luò)的不同層部分分配到FMC中;最后把網(wǎng)絡(luò)每個層的各個部分分配到FMC的各個PIM陣列層中.
Fig. 7 Flow chart of FMC圖7 FMC的流程總體流程
本節(jié)首先介紹實驗環(huán)境、參數(shù)配置以及實驗方法,并簡要介紹所用的對比實驗的結(jié)構(gòu)和參數(shù)配置;接著給出實驗結(jié)果和相應(yīng)的分析,包括FMC的功能單元資源利用率、空間占用情況和FMC+FDM在訓練各個神經(jīng)網(wǎng)絡(luò)時的性能和能耗比較.
表3給出了實驗環(huán)境和具體的基于ReRAM的主存參數(shù)配置.整個系統(tǒng)將CPU作為中心任務(wù)處理器,統(tǒng)計好訓練任務(wù)的數(shù)量以及每個任務(wù)所占空間大小后,按照FMD的策略將訓練任務(wù)發(fā)布到整個PIM中.發(fā)布完任務(wù)后CPU不再參與整個訓練工作,所有的訓練工作包括計算和數(shù)據(jù)存取都在基于ReRAM的主存中進行.本系統(tǒng)不考慮DRAM和ReRAM的混合主存,所有用來支持訓練的數(shù)據(jù)都存放在基于ReRAM的主存中.
Table 3 Hardware Configurations表3 硬件配置
我們使用CACTI 6.5[25]對所有FMC中的連接進行建模;使用CACTI-IO[26]來對FMC之間的連接進行建模.關(guān)于ReRAM的參數(shù)配置,我們使用DESTINY[27]進行模擬獲取.需要說明的是,我們的模擬系統(tǒng)中使用的基于憶阻器的主存包含2個chip;每個chip包含16個tile,通過H-tree方式連接;每個tile包含16個FMC.
如2.4節(jié)所述,F(xiàn)MC的資源池里各個資源的數(shù)目在不同的系統(tǒng)限制下會有不同的取值;同時,在同一個系統(tǒng)配置下,F(xiàn)MC的資源池的配置也可能會有多種可能.該實驗部分測試了在表3的系統(tǒng)配置情況下的所有配置可能,并選取了FMC的資源池的資源利用率最高的一種配置來做性能和能耗的相關(guān)實驗.
表4給出了FMC的單元配置參數(shù),其中憶阻器陣列給出的參數(shù)是一層的配置,每個FMC有4層憶阻器陣列(考慮到傳輸線路長度和共享資源池的資源利用率).共享資源池中每個單元的占用面積直接使用ISAAC中的配置[2];每個單元的數(shù)目根據(jù)2.4節(jié)中的限制條件給出.
Table 4 Parameters of Units in FMC表4 FMC單元的實驗配置參數(shù)
我們將配備如表4所示的FMC結(jié)構(gòu)和2D的PIM進行實驗比較,用PipeLayer[3]的結(jié)構(gòu).即一個PIM由多個PIM陣列組成,它們之間采用H-tree的連接方式進行連接,并且每個PIM陣列周圍都配備有表4中的功能單元,這些功能單元之間互相不能共享,屬于每個陣列私有.我們使用LeNet[28],ConvNet[29]和Caffe Model Zoo[30]中的6個流行的網(wǎng)絡(luò)來作為實驗的測試網(wǎng)絡(luò),包含: AlexNet,NiN,GoogLeNet,VGG_M,VGG_S和VGG_19.它們中既有大網(wǎng)絡(luò)也有小網(wǎng)絡(luò),既有全連接層也有卷積層,數(shù)據(jù)集也涵蓋了用來做圖像分類的黑白MNIST手寫數(shù)字集[31]和著名的用來做圖像分類、目標定位和檢測、場景分類的彩色圖片集ImageNet[32].我們使用1,8,16,32,64和128六種batch_size來訓練測試網(wǎng)絡(luò)集,每個單獨的網(wǎng)絡(luò)分別執(zhí)行1 000次訓練迭代(用來測試單個任務(wù)時的架構(gòu)性能),并將所有網(wǎng)絡(luò)同時執(zhí)行1 000次訓練迭代(用來測試多個任務(wù)時的架構(gòu)性能).
我們首先將2D的PIM的外圍電路資源利用率和FMC的共享資源池中的功能單元利用率在訓練單個神經(jīng)網(wǎng)絡(luò)的情況下進行比較,結(jié)果如圖8所示.我們將訓練8個測試網(wǎng)絡(luò)時2D-PIM的外圍電路資源利用率歸一化成1,給出在每個測試網(wǎng)絡(luò)下FMC的資源利用率與2D-PIM的倍數(shù)比較.圖8中FMC-x的x表示訓練時所用的batch_size,所有網(wǎng)絡(luò)測試結(jié)果呈現(xiàn)按照名稱首字母降序排序.
Fig. 8 Utilization of function units in FMC compared with 2D-PIM when training a single network圖8 單個網(wǎng)絡(luò)訓練時FMC中功能單元的資源利用率和2D-PIM的比較
我們可以從圖8中看到,F(xiàn)MC的資源利用率要比2D-PIM的高(所有的資源利用率的提升均在1倍以上),且在batch_size=1時有非常顯著的利用率提升(如圖8中FMC-1的柱形所示),最高能達到43.33倍(訓練GoogLeNet時).另外FMC的資源利用率隨batch_size增大而減小.這是因為當batch_size增大時,2D-PIM中整個傳播過程可以很好地利用管道并行(pipeline)起來,從而提高功能單元的資源利用率.因此FMC在batch_size較大時,資源利用率的提升相比于2D-PIM不是很明顯,但仍然有一定提升.例如用batch_size=128來訓練GoogLeNet時,資源利用率有1.33倍的提升.這樣的提升來源于pipeline時候的氣泡部分以及前向傳播和反向傳播的中斷部分.圖8還顯示出訓練不同深度的網(wǎng)絡(luò)時FMC資源利用率提升的差別:當訓練深度大的網(wǎng)絡(luò)(GoogLeNet,VGG_19)時,F(xiàn)MC的資源率提升相對大;當訓練深度小的網(wǎng)絡(luò)(LeNet,ConvNet)時,F(xiàn)MC的資源利用率提升較小.這是因為網(wǎng)絡(luò)的深度越大,處理后面的網(wǎng)絡(luò)層需要等待的時間就越長,進而導致處理后面網(wǎng)絡(luò)層的2D-PIM的功能單元空閑時間過長,最終使得2D-PIM的資源利用率低,而FMC通過使前后層共享功能單元的方式提高了資源利用率,因此FMC的資源利用率相比較于2D-PIM的提升會隨著網(wǎng)絡(luò)層數(shù)的增大而更高,反之亦然.
圖9展示了多個神經(jīng)網(wǎng)絡(luò)同時訓練時在FMC中的資源利用率和在2D-PIM中的資源利用率的比較結(jié)果.其中,L代表LeNet,C代表ConvNet,G代表GoogLeNet,V19代表VGG_19,ALL代表所有8個測試網(wǎng)絡(luò)的組合.
Fig. 9 Utilization of function units in FMC compared with 2D-PIM when training multiple networks圖9 多個網(wǎng)絡(luò)訓練時FMC中功能單元的資源利用率和2D-PIM的比較
從圖9中我們可以看出,當同時訓練的網(wǎng)絡(luò)越多且網(wǎng)絡(luò)深度越大時,F(xiàn)MC相比較于2D-PIM的資源利用率提升更大.這是因為,當同時訓練多個網(wǎng)絡(luò)時,2D-PIM的資源利用率取決于最小網(wǎng)絡(luò)訓練時的資源利用率,而FMC因為能夠使得多個網(wǎng)絡(luò)共享功能單元,從而在訓練網(wǎng)絡(luò)任務(wù)多時,由于各個網(wǎng)絡(luò)之間不存在依賴關(guān)系可以并行,因此它們可以通過pipeline的方式共享功能單元,從而提升FMC的資源利用率,進而使得FMC相比較于2D-PIM的資源利用率的提升更為明顯.但是這樣的提升速率并不會隨著網(wǎng)絡(luò)大小和網(wǎng)絡(luò)深度的增長速率而增長,這是因為,當網(wǎng)絡(luò)的大小和數(shù)目大到一定程度時,共享資源池的資源利用率趨近于100%(不能到達100%,因為訓練起步時會有一定的氣泡).
圖10給出了FMC中的各個功能單元和一層憶阻器的面積占用的比較.其中,一層憶阻器的面積占用為總共面積占用的49.97%,也就意味著一層憶阻器的面積稍稍小于功能單元池的面積.在功能單元池中,DAC和ADC是占主要面積的分單元池,分別為21.24%和18.74%.
Fig. 10 Area breakdown of FMC(one layer of memristor) 圖10 FMC中各個單元的空間占用比率(包含一層憶阻器陣列)
FMC中新加的開關(guān)和連接線占總空間的6.79%,而一個FMC所占空間僅是具有同等數(shù)目的Compute Array及Storage Array的2D-PIM所占空間的42.89%.
由于batch_size對FMC的性能和能耗與2D-PIM的比較幾乎沒有影響,因此我們選取batch_size=64(常用的batch_size)作為FMC的性能和能耗測試結(jié)果呈現(xiàn),具體如圖11和圖12所示.
Fig. 11 Performance of FMC compared with 2D-PIM圖11 FMC與2D-PIM的性能比較
Fig. 12 Energy consumption of FMC compared with 2D-PIM圖12 FMC與2D-PIM的能耗比較
從圖11中我們可以看出,相比于2D-PIM,使用FMC訓練越大的神經(jīng)網(wǎng)絡(luò)取得的性能加速要大.這是因為FMC各層憶阻器陣列之間是3D堆疊的,并通過3D堆疊的方式共享資源池.這使得憶阻器陣列之間的連接充分縮短,而網(wǎng)絡(luò)越大需要的憶阻器陣列就越多,因此FMC相比于2D-PIM的優(yōu)勢就更為明顯.而用FMC訓練LeNet時幾乎沒有性能上的提升,這是因為LeNet很小,從而使得FMC的3D堆疊的連接方式相比較于2D-PIM的優(yōu)勢小,且數(shù)據(jù)傳輸?shù)难舆t被計算的延遲隱藏.總體來看,F(xiàn)MC相比于2D-PIM有1.5倍的性能提升.
圖12展示了用FMC和2D-PIM訓練單個神經(jīng)網(wǎng)絡(luò)時能耗比較.FMC在訓練神經(jīng)網(wǎng)絡(luò)時能比2D-PIM有明顯的能耗節(jié)省,也是因為FMC的3D堆疊的結(jié)構(gòu)比2D-PIM的平面結(jié)構(gòu)大大減少數(shù)據(jù)傳輸?shù)木€路長度.因此,所訓練的神經(jīng)網(wǎng)絡(luò)越大,F(xiàn)MC相比于2D-PIM的能耗節(jié)省就更加明顯.當訓練GoogLeNet時,能耗節(jié)省能達到2.47倍.而當訓練LeNet時,F(xiàn)MC也比2D-PIM有1.2倍的能耗節(jié)省.總的來看,F(xiàn)MC平均比2D-PIM節(jié)省1.7倍的能耗.
現(xiàn)如今,基于憶阻器的內(nèi)存計算(PIM)如火如荼,但是它存在著除憶阻器陣列之外的電路單元面積過大且利用率低的問題.本文提出了一種基于3D憶阻器陣列的神經(jīng)網(wǎng)絡(luò)內(nèi)存計算架構(gòu),將功能單元抽取出來形成一個資源池提供給憶阻器陣列共享,并通過3D堆疊的方式縮短各個憶阻器陣列的連接以及憶阻器陣列和功能單元池之間的連接.同時,我們還提出了一種基于3D憶阻器陣列的計算數(shù)據(jù)排布策略,配合上3D憶阻器陣列的結(jié)構(gòu),使得訓練神經(jīng)網(wǎng)絡(luò)時的數(shù)據(jù)移動盡可能小.實驗結(jié)果顯示,我們提出的基于3D憶阻器陣列加共享資源池的架構(gòu)能使功能單元的利用率在單個訓練任務(wù)的情況下提升43.33倍,在多個任務(wù)的情況下最高提升58.51倍.同時,我們提出3D架構(gòu)所占空間是有相同數(shù)目的Compute Array及Storage Array的2D-PIM所占空間的42.89%.此外,我們提出3D架構(gòu)相比于2D-PIM有平均1.5倍的性能提升,且有平均1.7倍的能耗節(jié)約.