葉鈞超,徐 聰,黃 堯,柴志雷,2
(1.江南大學(xué) 人工智能與計算機(jī)學(xué)院,江蘇 無錫 214122;2.江蘇省模式識別與計算智能工程實(shí)驗(yàn)室(江南大學(xué)),江蘇 無錫 214122)
雖然人工神經(jīng)網(wǎng)絡(luò)已被證明在各種應(yīng)用中非常成功,但需要大量的計算能力提供支持。相比之下,脈沖神經(jīng)網(wǎng)絡(luò)(Spiking Neural Network,SNN)可以憑借事件驅(qū)動[1]的特性進(jìn)行節(jié)能計算,并在實(shí)時應(yīng)用中顯示出巨大的潛力[2-5],因此廣泛應(yīng)用于大量任務(wù)中,如圖像[6]和孤立詞識別[7]、目標(biāo)檢測[8]、導(dǎo)航[9]和運(yùn)動控制[10]。
2003 年,IZHIKEVICH[11]引入了 一個基 于映射的模型(稱為Izhikevich 神經(jīng)元模型)。Izhikevich 模型結(jié)合了霍奇金-赫胥黎模型(Hodgkin-Huxley,HH)[12]生物行為多樣性以及帶泄露積分觸發(fā)模型(Leaky-Integrate-and-Fire,LIF)簡單計算的優(yōu)點(diǎn),因此被普遍認(rèn)定為準(zhǔn)確且計算成本較低的模型。文獻(xiàn)[13]指出,在都利用前向歐拉數(shù)值方法求解常微分方程的條件下,在保持頻率誤差在1%以下且膜電位的誤差在0.015 mV 內(nèi)的精確度時,仿真1 ms 時Izhikevich 神經(jīng)元所處理的操作數(shù)為1 400,是LIF 神經(jīng)元的30 多倍。因此,當(dāng)使用Izhikevich 模型在通用CPU平臺上進(jìn)行類腦仿真時,會存在高能耗、低性能的問題。利用GPU[14]多線程的并行屬性對Izhikevich 神經(jīng)元進(jìn)行加速優(yōu)化,以及利用超級計算機(jī)[15]通過確保隨機(jī)訪問發(fā)生在高速緩存中進(jìn)行加速仿真,雖然都能解決通用CPU 平臺的低性能問題,但會造成更高的能耗。如何在大規(guī)模仿真時保持高性能、靈活性以及低功率的設(shè)計成為一項挑戰(zhàn),F(xiàn)PGA 平臺[16]能以極低的能耗獲得較高的運(yùn)算性能,因此,F(xiàn)PGA在類腦領(lǐng)域受到廣泛的關(guān)注。
近年來,針對Izihkevich 神經(jīng)元在FPGA 上的研究逐漸深入。有研究者從簡化計算的角度對Izhikevich 進(jìn)行優(yōu)化,利用旋轉(zhuǎn)坐標(biāo)數(shù)字計算方法(Coordinate Rotation Digital Computer,CORDIC)[17-18]近似替換Izhikevich 神經(jīng)元方程中的計算復(fù)雜的平方項,以提升單個神經(jīng)元的更新計算效率。WANG 等[19]在前者的基礎(chǔ)上消除了冗余迭代和相關(guān)的計算,進(jìn)而提出了一種快速收斂的CORDIC 算法,這有助于縮小誤差與提高平方計算的效率。也有人通過設(shè)計一種新的硬件體系結(jié)構(gòu)[20-21]來縮短單個神經(jīng)元更新方程的流水線階段的時鐘周期,在不失去計算速度的情況下降低功耗。還有從更新方程的求解方法角度對Izhikevich 進(jìn)行優(yōu)化探索,如Moslem[22]通過對比速度、功耗等硬件性能指標(biāo)發(fā)現(xiàn)歐拉方法中的時間步長能線性影響軟件仿真和硬件實(shí)現(xiàn)的性能,而最佳的步長可以通過網(wǎng)絡(luò)中電流輸入的數(shù)量和每個輸入電流的最大權(quán)重來確定。上述這些關(guān)于Izhikevich 神經(jīng)元在FPGA 上的優(yōu)化研究都只注重針對單個神經(jīng)元性能、能耗的研究,沒有考慮不同精度數(shù)據(jù)類型帶來硬件資源、時間上的消耗,也沒有考慮整體網(wǎng)絡(luò)的優(yōu)化手段,而且沒有接入真實(shí)的類腦仿真平臺。如果考慮這些額外因素,則會面臨以下幾個挑戰(zhàn):一是Izhikevich 神經(jīng)元參數(shù)、種類很多,目前較少有針對這些參數(shù)數(shù)值、類別的具體分析;二是針對類腦軟硬件沒有一個通用數(shù)據(jù)接口。
針對上述挑戰(zhàn),本文進(jìn)行以下工作:首先分析Izhikevich 神經(jīng)元模型各參數(shù)的取值范圍,并通過平衡誤差與資源消耗進(jìn)行混合精度定制設(shè)計;然后提出一種定制化的數(shù)據(jù)流式計算架構(gòu),在接口處利用數(shù)據(jù)重排支持后續(xù)多個神經(jīng)元處理單元的同時更新,并使用平衡數(shù)據(jù)路徑的方式優(yōu)化單個神經(jīng)元更新的流水線階段;最后將該架構(gòu)用于NEST 仿真器加速,支持多種基于Izhikevich 的脈沖神經(jīng)網(wǎng)絡(luò)。
Izhikevich 神經(jīng)元是一種計算高效的模型,由兩個耦合的常微分方程組成,雖然計算相對簡單,但可以至少實(shí)現(xiàn)20 種生物尖峰神經(jīng)元的計算特性。下面介紹兩個耦合的常微分方程:
其中:v是膜電位;u是恢復(fù)變量;Ie是外部施加電流;vth是閾值電位;a是恢復(fù)變量u的時間尺度;b是u對v的敏感度;c是神經(jīng)元在發(fā)射脈沖尖峰后v的復(fù)位值;d是神經(jīng)元在發(fā)射脈沖尖峰后u的復(fù)位值。
與Izhikevich 模型相比,LIF 神經(jīng)元模型只涉及到一個微分方程,將神經(jīng)元膜建模為電容為C的電容器與電阻為R的電阻器并聯(lián),然后更新方程如式(4)和式(5)所示:
其中:τm=RC是電路的時間常數(shù);I是刺激電流。一旦膜電位超過閾值電位(vth),膜電位就會被重置成靜止值(vrst)。
分析比較兩者的更新方程可知,LIF 模型更新方程因其過于簡單,所以無法展現(xiàn)出具有生物特征的多種尖峰行為,而Izhikevich 模型不僅計算方程較為簡單,還可以通過調(diào)節(jié)a、b、c、d等參數(shù)的值產(chǎn)生不同的尖峰行為,以表現(xiàn)出神經(jīng)元多樣的生物特征行為。Izhikevich 神經(jīng)元模型結(jié)合了HH 模型的生物學(xué)合理性以及LIF 模型的計算效率,這種神經(jīng)元模型能夠重現(xiàn)許多不同的神經(jīng)元動力學(xué)和可能發(fā)生在生物尖峰神經(jīng)元中的脈沖發(fā)射行為。
相比較四階Runge-Kutta 法和指數(shù)歐拉法這兩種求解常微分的方法,方程經(jīng)過前向歐拉法求解后的計算復(fù)雜度較低,計算成本相對較少。因此,利用前向歐拉法對時間步長(?t=0.1 ms)的常微分方程式(1)和式(2)進(jìn)行數(shù)值求解,可得式(6)和式(7):
SNN 網(wǎng)絡(luò)主要由兩部分組成:神經(jīng)元和突觸。脈沖神經(jīng)網(wǎng)絡(luò)仿真模擬時間開銷主要集中在神經(jīng)元更新和突觸傳遞上,具體的兩部分的時間占比會因突觸、神經(jīng)元、網(wǎng)絡(luò)拓?fù)涞鹊牟煌兴町?。相比較基于LIF 的SNN 網(wǎng)絡(luò),基于Izhikevich 的網(wǎng)絡(luò)因其膜電位更新方程更復(fù)雜,其神經(jīng)元更新計算的時間占比更大。
一個仿生型的脈沖神經(jīng)網(wǎng)絡(luò)的規(guī)模通常達(dá)到幾百萬甚至億級的數(shù)量,使用分布式多節(jié)點(diǎn)的手段,在單節(jié)點(diǎn)上也將達(dá)到幾千到幾萬的規(guī)模。即使選擇最簡單的歐拉法求解常微分方程,單個神經(jīng)元完成一次更新仍需要15 次運(yùn)算操作,最后乘以神經(jīng)元的數(shù)量以及更新的次數(shù),將會達(dá)到一個幾千萬到幾十億的運(yùn)算操作[23]。完成運(yùn)算操作的數(shù)據(jù)是用雙精度浮點(diǎn)數(shù)據(jù)類型表示的,這對計算機(jī)的硬件資源有很高的要求,而且浮點(diǎn)計算的一次操作需要多個時鐘周期才能完成,所以全部操作完成相應(yīng)的時間成本會很高。多節(jié)點(diǎn)的分布式技術(shù)能緩解資源不夠、時間開銷大的問題,但使用浮點(diǎn)計算的單節(jié)點(diǎn)因資源受限無法進(jìn)行較多神經(jīng)元的更新,需要依靠更多的節(jié)點(diǎn)滿足仿真所需。減少位寬表示的定點(diǎn)化數(shù)據(jù)能極大程度上緩解資源受限的問題,在有限的硬件資源內(nèi)支持更多神經(jīng)元的更新,并且還能縮短一定的神經(jīng)元更新時間。定點(diǎn)化操作不可避免地會帶來一定程度的數(shù)值誤差,但神經(jīng)元膜電位在每次發(fā)射脈沖的時候會恢復(fù)到一個固定的值,這個過程將會把之前仿真累計的誤差清零,因而盡管在脈沖數(shù)值上會有細(xì)微差別,但膜電位波形圖、脈沖發(fā)射頻率等并不會受到影響。
NEST 仿真器是由時間和事件混合驅(qū)動的,即神經(jīng)元的更新不僅與輸入電流有關(guān),還與相應(yīng)的脈沖事件有關(guān)。時間驅(qū)動是神經(jīng)元的膜電位因持續(xù)不斷受到輸入電流的刺激而到達(dá)閾值并發(fā)射脈沖,事件驅(qū)動是脈沖事件被分發(fā)給相連的神經(jīng)元以更新后者的膜電位。通常這個事件會有一定的延遲,這是因?yàn)榉抡嫫髟谝粋€固定的時間片內(nèi)會收集延遲內(nèi)出現(xiàn)的所有脈沖事件再分發(fā)到目標(biāo)神經(jīng)元內(nèi)的下一延遲(事件驅(qū)動)。這表明在單個時間片內(nèi),所有神經(jīng)元之間都是數(shù)據(jù)無關(guān)的,理論上是可以完全并行的,這部分可以完全在硬件平臺上進(jìn)行加速優(yōu)化,脈沖事件也在此并行地紀(jì)錄、收集。存儲神經(jīng)元連接情況的數(shù)據(jù)結(jié)構(gòu)需要較大的內(nèi)存,而通常硬件加速平臺片上的存儲資源并不多,因此脈沖事件分發(fā)適合放在片外即依舊由軟件仿真平臺執(zhí)行。另外,優(yōu)化加速的并行度會受限于平臺的硬件資源,可以根據(jù)單個神經(jīng)元更新處理單元在不同平臺上的資源消耗情況實(shí)例化不同的數(shù)量。這就要求程序在并行更新計算前,有一個模塊負(fù)責(zé)把片外串行邏輯的數(shù)據(jù)讀取到片上,并且重排這些數(shù)據(jù)以便后續(xù)的并行更新計算模塊能進(jìn)行并行讀取。
2.1.1 可拓展的整數(shù)位寬
針對基于Izhikevich的SNN 應(yīng)用,Izhikevich神經(jīng)元的a、b、c、d、vth參數(shù)只在生成神經(jīng)元的時候被賦予初值且在整個仿真過程中保持不變,可以針對這些參數(shù)的值進(jìn)行位寬的定制優(yōu)化設(shè)計。文獻(xiàn)[12]中提到的一組Izhikevich模型經(jīng)典的、廣泛使用的參數(shù)值為:
根據(jù)這組值,可以把參數(shù)a、b、c、d、vth的整數(shù)部分位寬分別設(shè)計成2、2、8、3、7 bit,其中還包含1 bit的符號位,那么a的取值范圍為[-1,1],b的取值范圍為[-1,1],c的取值范圍為[-128,128],d的取值范圍為[-4,4],vth的取值范圍為[-64,64]。在類腦領(lǐng)域較為常用的ModelDB 官網(wǎng)上,收集所有出現(xiàn)過的Izhikevich 模型,統(tǒng)計各參數(shù)的值,如圖1 所示。比較統(tǒng)計的參數(shù)值與設(shè)計參數(shù)的取值范圍,設(shè)計的混合數(shù)據(jù)類型不僅適用于經(jīng)典值,還適用于絕大部分的Izhikevich 模型,而對于少數(shù)不在表示范圍內(nèi)的值,可以根據(jù)具體參數(shù)的值修改相應(yīng)參數(shù)的整數(shù)部分位寬以適應(yīng)模型的需要。
生物細(xì)胞膜電位v的值域?yàn)椋?100 mv,60 mv],因此可以設(shè)計該參數(shù)的整數(shù)部分位寬為9bit。方程中v2項的值域?yàn)?~10000,214=16384 能滿足表示范圍,還需要加上一位符號位即整數(shù)部分位數(shù)為15 位。根據(jù)式(7)中a和Δt都小于1,因而恢復(fù)變量u的值域小于v,因此設(shè)計u和v相同的數(shù)據(jù)類型,即整數(shù)位寬也為9 bit。
最后是關(guān)于權(quán)重的值域。并不是所有SNN 模型權(quán)重都能做定點(diǎn)化,可定點(diǎn)化的主要分兩類:一類是機(jī)器學(xué)習(xí)方向上訓(xùn)練好的SNN 模型,其權(quán)重參數(shù)固定,可以定點(diǎn)化;另一類是脈沖發(fā)射率較為平衡的SNN 網(wǎng)絡(luò),這類網(wǎng)絡(luò)最后能平衡下來,其權(quán)重的值域較為恒定,可以定點(diǎn)化。收集上述兩種特征的SNN 模型并運(yùn)行,其權(quán)重的分布情況如圖2 所示。實(shí)驗(yàn)結(jié)果表明,這兩類Izhikevich 神經(jīng)元的權(quán)重集中分布在-100~30 之間,設(shè)置整數(shù)位寬為8 bit 就能滿足多數(shù)SNN 模型。如果是脈沖發(fā)射率較為恒定的SNN 模型,則先在軟件上運(yùn)行并統(tǒng)計其權(quán)重集中的值域,再設(shè)計特定的位寬,實(shí)現(xiàn)更低的資源消耗以及更短的仿真時間。
圖2 Izhikevich 神經(jīng)元權(quán)重值分布Fig.2 Izhikevich neuron weight value distribution
2.1.2 小數(shù)部分的精度設(shè)計
在仿真中,任意神經(jīng)元參數(shù)小數(shù)部分的設(shè)計將直接影響仿真時膜電位的數(shù)值變化進(jìn)而改變神經(jīng)元脈沖的發(fā)射狀態(tài)。以參數(shù)膜電位小數(shù)部分位寬的選取為例,式(9)為膜電位的相對誤差(verr)公式,其中,vfix為各位寬下表示的膜電位數(shù)值,vdouble是用雙精度浮點(diǎn)表示的膜電位數(shù)值,統(tǒng)計不同位寬下的神經(jīng)元在仿真模擬30 步后的膜電位相對誤差,如圖3 所示。
圖3 各位寬下膜電位的相對誤差Fig.3 Membrane potential's relative error with each bit width
隨著小數(shù)部分位寬增加,膜電位的相對誤差不斷減小,在位寬達(dá)到21 bit 以后,該相對誤差減小得很緩慢,更多的位寬會消耗更多的硬件資源。本文實(shí)驗(yàn)選取的模型對于仿真后的膜電位數(shù)值有著較高的精度要求,因而選取小數(shù)點(diǎn)位寬為21 bit,精度達(dá)到10-5。對于膜電位數(shù)值精度需求不高的SNN 模型,可以通過縮小小數(shù)部分的位寬來減少硬件資源的消耗。根據(jù)上述方法對Izhikevich 神經(jīng)元所有參數(shù)定制相應(yīng)小數(shù)部分的位寬,統(tǒng)計結(jié)果如表1 所示,其中,“—”表示沒有相應(yīng)的經(jīng)典值。
表1 各參數(shù)的混合精度設(shè)計Table 1 Mixed precision design of each parameter
在SNN 仿真中,把所有的參數(shù)分為兩類:定量和變量。定量是Izhikevich 的a、b、c、d、vth參數(shù),變量是Izhikevich 的權(quán)重weight、膜電位v、恢復(fù)變量u。對于不同Izhikevich 神經(jīng)元,只需根據(jù)定量的值與變量值域修改相應(yīng)的整數(shù)、小數(shù)部分位寬就能滿足不同類腦模型的仿真。
根據(jù)1.2 節(jié)的分析結(jié)論把一個延遲內(nèi)神經(jīng)元的更新放在FPGA的可編程邏輯(PL)部分并行執(zhí)行,有一個數(shù)據(jù)預(yù)處理單元負(fù)責(zé)對片外的數(shù)據(jù)進(jìn)行讀取、重排以便后續(xù)的并行更新,還有一個單元整理并行更新后的數(shù)據(jù)并傳回給片外。神經(jīng)元間通信則由軟件仿真器執(zhí)行,如此反復(fù)循環(huán)以完成脈沖神經(jīng)網(wǎng)絡(luò)的仿真。
2.2.1 整體架構(gòu)設(shè)計
如圖4 所示,該圖整體是一種ARM+FPGA 的異構(gòu)混合結(jié)構(gòu),主要包括3 個主要組件:片外外部緩存(DDR,頂部),應(yīng)用處理單元(APU,中間),可編程邏輯部分(PL,下部的虛線框部分),其中仿真器的軟件部分運(yùn)行在DDR 上的Linux 系統(tǒng)環(huán)境上,硬件加速部分運(yùn)行在PL 部分。本文實(shí)驗(yàn)提出了一種可定制的數(shù)據(jù)流式架構(gòu),可定制具體體現(xiàn)在兩個方面:1)可以對不同Izhikevich 神經(jīng)元的不同參數(shù)進(jìn)行混合精度的定制;2)可以根據(jù)不同的FPGA 資源確定合適的處理單元的數(shù)目。首先在ARM 端的片外外部緩存(External Memory,EM)內(nèi)準(zhǔn)備好PL 端所需的數(shù)據(jù),PL 端使用AXI 協(xié)議通過HP 口對EM 進(jìn)行訪問讀取。數(shù)據(jù)首先會進(jìn)入重分配的處理單元,該單元主要負(fù)責(zé)為后續(xù)的并行處理單元進(jìn)行數(shù)據(jù)的重組,其中處理單元的數(shù)量隨FPGA 硬件邏輯資源的不同而不同;其次,當(dāng)數(shù)據(jù)進(jìn)入單個處理單元內(nèi),將Izhikevich 神經(jīng)元的更新方程的流水化階段縮減為7 個階段;最后,有一個處理單元專門負(fù)責(zé)數(shù)據(jù)的整合以及脈沖記錄信息,并返回給ARM 端以便后續(xù)的仿真過程。
圖4 可定制數(shù)據(jù)流架構(gòu)Fig.4 Customizable data flow architecture
2.2.2 數(shù)據(jù)重排
在ARM 端會對存儲在神經(jīng)元本地環(huán)形緩沖區(qū)內(nèi)的數(shù)據(jù)進(jìn)行一次重組,充分使用64 bit、128 bit 的HP 端口的數(shù)據(jù)傳輸帶寬,如圖5 所示。在PL 端的數(shù)據(jù)預(yù)處理單元,會對ARM 端重組后發(fā)送過來的數(shù)據(jù)進(jìn)行一次重分配,以滿足在PL 部分各神經(jīng)元更新處理單元的計算所需。重分配分3 步:第1 步按32 bit讀取數(shù)據(jù)到相應(yīng)的參數(shù)內(nèi),第2 步需要把相同的參數(shù)集合在一起,第3 步把這些參數(shù)均勻地分發(fā)給各處理單元。數(shù)據(jù)重分配會帶來額外硬件資源開銷以及時間開銷,開銷的大小與并行度有關(guān)系。
圖5 FPGA 上的數(shù)據(jù)重分配Fig.5 Data redistribution on FPGA
2.2.3 最小化神經(jīng)元更新方程的數(shù)據(jù)路徑
分析式(3)、式(6)和式(7)得知,在vt和0.04 相乘的同時,可以進(jìn)行vt與5 的乘法以及140 與ut的減法,以此類推,就把整個更新公式內(nèi)具備并行運(yùn)算條件的部分都進(jìn)行并行計算,目的是為了平衡數(shù)據(jù)路徑,使流水線階段整體的最小化。經(jīng)過優(yōu)化后的硬件實(shí)現(xiàn)如圖6 所示,其中,thre 是閾值。定點(diǎn)化后使用提供的計算邏輯資源都能在一個時鐘周期內(nèi)完成加、減和乘法等操作,完成單個神經(jīng)元單次更新所需的流水線時間從原先的15 個時鐘周期縮小到7 個,如果是float、double 等浮點(diǎn)類型表示的數(shù)據(jù),則不能在一個周期內(nèi)完成加、減和乘法操作,而且并不會帶來額外電路開銷,這是因?yàn)樵诙际褂昧魉€的情況下,原先串行流水線第一階段的加、減和乘法器并不會給第二階段復(fù)用,而是處理下一個進(jìn)來的數(shù)據(jù)。
圖6 單Izhikevich 神經(jīng)元的硬件設(shè)計Fig.6 Hardware design of a Izhikevich neuron
2.2.4 可定制的并行度
各神經(jīng)元之間更新所需的參數(shù)獨(dú)立,不存在數(shù)據(jù)的依賴關(guān)系,因而可以對神經(jīng)元更新部分進(jìn)行并行化處理。但由于數(shù)據(jù)的吞吐量和FPGA 邏輯資源的限制,更新計算的并行度有一定的局限性,在資源不足的情況下,通過設(shè)計低并行結(jié)合流水化架構(gòu)的方式可以大大提高資源的利用率以及整體的計算性能。假設(shè)并行度為P,則針對Izhikevich 神經(jīng)元的并行流水設(shè)計如圖7 所示,對于不同的FPGA 平臺,所擁有的邏輯資源是不同的,因而在各平臺上并行度的最佳值是可定制調(diào)節(jié)的。在神經(jīng)元更新程序的最外部設(shè)置一個并行度的參數(shù)P,通過觀察系統(tǒng)仿真消耗的各種資源情況調(diào)整合適的數(shù)值。
圖7 多神經(jīng)元更新優(yōu)化前后對比Fig.7 Comparison before and after multi-neuron update optimization
假設(shè)一個神經(jīng)元完成一次更新的3 個階段時間分別為Tr、Tc、Td,其中,Tr為數(shù)據(jù)讀取階段,Tc為數(shù)據(jù)計算階段,Td為數(shù)據(jù)寫回階段,即總時間LLatency=Tr+Tc+Td。那么串行完成N個神經(jīng)元更新所需的時間NLatency=(Tr+Tc+Td)×N,當(dāng)使用流水線結(jié)合并行的架構(gòu)處理時,其總體所需時間如式(10)所示:
其中:P為并行度。
為了解決ARM 和PL 部分之間頻繁的數(shù)據(jù)通信問題,將PYNQ-Z2 的片上內(nèi)存DDR 專門劃分出一部分用于兩者間數(shù)據(jù)通信,避免每次通信時都要申請內(nèi)存。這里以PYNQ 舉例,PYNQ 有512 MB 的DDR,內(nèi)存地址為0x0~0x20000000,PYNQ 在開啟狀態(tài)可用內(nèi)存約為350 MB,留給NEST 的內(nèi)存大小為200 MB,本文將共享內(nèi)存大小設(shè)定為64 MB,滿足式(11)的計算需求:
其中:ppara_num表示神經(jīng)元的參數(shù)數(shù)量;IIZHI_num為神經(jīng)元數(shù)量;ttype_data表示各參數(shù)對應(yīng)的數(shù)據(jù)類型;SSTEP為仿真一個時間片的大小。
SSTEP在NEST 中由式(12)獲得:
其中:ddelay表示最小時延。
如圖8 所示,Host 端通過串口運(yùn)行Processing System(PS)上基于NEST 仿真器的樣例程序,架構(gòu)將NEST 仿真器中突觸、神經(jīng)元的搭建、脈沖分發(fā)等任務(wù)切換較為頻繁的部分運(yùn)行在ARM 上,把重復(fù)計算的神經(jīng)元更新部分放到PL 上進(jìn)行加速。當(dāng)仿真程序運(yùn)行到神經(jīng)元更新時,ARM 會將DDR 上的參數(shù)緩存、脈沖事件等地址信息通過通用的AXI Master 接口傳輸給PL,然后PL 部分的數(shù)據(jù)預(yù)處理模塊根據(jù)地址信息通過AXI HP 口對DDR 進(jìn)行數(shù)據(jù)讀取。HP 端口在PYNQ-Z2 上最大以64 bit讀取一個數(shù)據(jù),而在ZCU102 上則可以達(dá)到128 bit 讀取一個數(shù)據(jù),相當(dāng)于一次能傳送多個數(shù)據(jù)。在PL 上有一個數(shù)據(jù)預(yù)處理單元,首先對讀取到的數(shù)據(jù)塊進(jìn)行解包操作,即還原成32 bit 的數(shù)據(jù)格式,然后把數(shù)據(jù)平均分給后續(xù)實(shí)例化神經(jīng)元更新單元。更新完的數(shù)據(jù)以及脈沖事件等信息會通過數(shù)據(jù)打包發(fā)送處理單元傳回PS,并存儲到DDR 內(nèi)以供后續(xù)的仿真計算。
圖8 基于NEST 的系統(tǒng)結(jié)構(gòu)Fig.8 NEST-based system structure
FPGA 上的PL 部分與ARM 上的共享內(nèi)存進(jìn)行數(shù)據(jù)傳輸會花費(fèi)一定的時間,如果PL 頻繁訪問共享內(nèi)存則會導(dǎo)致數(shù)據(jù)讀取時間增加,因此,應(yīng)盡可能地減少共享內(nèi)存的訪問次數(shù)。所有神經(jīng)元的初值可以在本地存放,把整個時間步長內(nèi)的計算放到FPGA里面,只需在最后完成階段返回發(fā)生改變的膜電位v、恢復(fù)變量u和發(fā)射脈沖的相關(guān)信息,而不是每一小步都寫回v和u,減少了PL 端訪問共享內(nèi)存的次數(shù)。不過考慮到脈沖權(quán)重weight 參數(shù)的數(shù)據(jù)量較大而且不需要寫回,因而選擇不存在本地,而是在讀取本地參數(shù)的同時從共享內(nèi)存處讀入數(shù)據(jù)并參與計算。另外,除了第一個時間步長內(nèi)仿真需要準(zhǔn)備FPGA 加速部分所需的全部參數(shù)數(shù)據(jù)信息,之后的每一個仿真時間步長只需要傳輸發(fā)射脈沖的數(shù)據(jù)量(uup_size)即可,可由式(13)獲得:
使用4 個性能更好的AXI_HP 接口進(jìn)行數(shù)據(jù)傳輸以減少傳輸時間,數(shù)據(jù)通信接口的設(shè)計如圖9所示。
圖9 ARM 與FPGA 數(shù)據(jù)傳輸接口示意圖Fig.9 Schematic diagram of data transmission interface between ARM and FPGA
一個SSTEP內(nèi)所有神經(jīng)元的脈沖信息數(shù)據(jù)量較大,所以使用AXI_HP0 接口專門負(fù)責(zé)這部分輸入。AXI_HP1 接口除了在仿真的第一個SSTEP內(nèi)需要傳入神經(jīng)元更新所需的所有參數(shù),然后返回更新后的膜電位v和恢復(fù)變量u,以后的每一個SSTEP只需要傳入完成更新的v和u即可。最后的兩個AXI_HP 接口分別返回發(fā)射脈沖的神經(jīng)元編號和該神經(jīng)元發(fā)射脈沖的具體時刻,以便后續(xù)的仿真計算。
實(shí)驗(yàn)采用軟硬件結(jié)合的加速開發(fā)方式進(jìn)行實(shí)驗(yàn),其中:軟件環(huán)境為NEST 仿真器2.14.0 版本、PyNN API、Xilinx Vivado 2018.2、PYNQ 環(huán)境;硬件環(huán)境為PYNQ-Z2 開發(fā)板、ZCU102 開發(fā)板、Intel?CoreTMi7-10700 CPU。類腦仿真復(fù)現(xiàn)了經(jīng)典的丘腦外側(cè)膝狀核網(wǎng)絡(luò)模型以及液體狀態(tài)機(jī)模型,這兩個實(shí)驗(yàn)?zāi)P褪褂昧硕喾NIzhikevich 神經(jīng)元,旨在驗(yàn)證設(shè)計方案的適用性以及性能提升的效果。
4.1.1 丘腦外側(cè)膝狀核網(wǎng)絡(luò)模型
丘腦外側(cè)膝狀核網(wǎng)絡(luò)模型(Lateral Geniculate Nucleus,LGN)在傳統(tǒng)上被視為視覺皮層的門戶[24],是控制注意力反應(yīng)增益的看門人,LGN 會把視覺感覺信息映射到初級視覺皮層(V1)。除此之外,在初級視覺皮層受損但仍然可以對某些圖像做出反應(yīng)的盲視行為中,AJINA 等[25]指 出LGN 在繞過V1 的 通路中起到關(guān)鍵性的作用。該模型包含約70%~80%TCR 細(xì)胞和20%~25%IN 細(xì) 胞,表 明TCR 與IN 之比約為4∶1[4],而在TRN 上沒有一個精確可用的相應(yīng)數(shù)據(jù)信息,所以在此模型中任意設(shè)置為單元格數(shù)量的兩倍,即將TCR、IN 和TRN 群體中的細(xì)胞比例設(shè)置為8∶2∶4。本文中LGN 模型的突觸布局如圖10 所示,實(shí)際模型實(shí)現(xiàn)了14 000 個Izhikevich 神經(jīng)元,該模型的突觸布局基于從哺乳動物和嚙齒動物的背外側(cè)膝狀核獲得的實(shí)驗(yàn)數(shù)據(jù)。
圖10 丘腦外側(cè)膝狀核網(wǎng)絡(luò)模型拓?fù)銯ig.10 Topology of the network model of the lateral geniculate nucleus of the thalamus
4.1.2 液體狀態(tài)機(jī)模型
液體狀態(tài)機(jī)(Liquid State Machine,LSM)是一種使用脈沖神經(jīng)網(wǎng)絡(luò)的儲層計算機(jī)。LSM 由大量神經(jīng)元節(jié)點(diǎn)組成,每個神經(jīng)元節(jié)點(diǎn)從外部源(輸入層)以及其他節(jié)點(diǎn)接收隨時間變化的輸入,節(jié)點(diǎn)間彼此隨機(jī)連接,而且連接后就不再改變。這說明兩兩神經(jīng)元之間連接權(quán)值不需要訓(xùn)練,一般可以采用靈活多變的算法來訓(xùn)練輸出層以達(dá)到所需的精度及目標(biāo)任務(wù)。實(shí)驗(yàn)采用文獻(xiàn)[26]中提到的LSM 模型,網(wǎng)絡(luò)拓?fù)涫疽鈭D如圖11 所示(彩色效果見《計算機(jī)工程》官網(wǎng)HTML 版,下同),且中間層取用12 500 個Izhikevich 神經(jīng)元隨機(jī)連接構(gòu)成,輸入層用泊松發(fā)射機(jī)提供輸入信號,因?yàn)橹虚g層是靜態(tài)的權(quán)重,所以神經(jīng)元之間的連接用靜態(tài)突觸來實(shí)現(xiàn)。
圖11 LSM 網(wǎng)絡(luò)拓?fù)銯ig.11 Topology of LSM network
實(shí)驗(yàn)選取參數(shù)為1 400 個Izhikevich 神經(jīng)元、dt=0.1 的LGN 模型進(jìn)行正確性驗(yàn)證。比較一個神經(jīng)元仿真1 000 ms 時間內(nèi)恢復(fù)變量u和膜電位v經(jīng)過混合精度前后的數(shù)值波形變化,如圖12 和圖13 所示,圖中藍(lán)色點(diǎn)表示雙精度浮點(diǎn)(double)數(shù)據(jù)對應(yīng)的數(shù)值,紅色的點(diǎn)表示混合精度(fixed)數(shù)據(jù)類型對應(yīng)的數(shù)值。
圖12 不同數(shù)據(jù)類型下恢復(fù)變量波形圖Fig.12 Waveform diagrams of recovery variable under different data types
圖13 不同數(shù)據(jù)類型下膜電位波形圖Fig.13 Waveform diagrams of membrane potential under different data types
觀察圖12 和圖13 可知,恢復(fù)變量u在加速前后數(shù)值波形變化高度一致,神經(jīng)元膜電位v在脈沖峰值上表現(xiàn)出細(xì)微的誤差,但整體變化波形仍然完全一致。至于峰值出現(xiàn)誤差,這是因?yàn)槎ㄖ苹蟮臄?shù)據(jù)相比較double 浮點(diǎn)表達(dá)盡管只有很輕微誤差(10-5),但隨著仿真時間的推移,該誤差會隨著計算不斷地累積。使用低位寬的優(yōu)化手段,該峰值的誤差必然是會存在的,但可以通過增加小數(shù)部分的位寬來縮小這個峰值的差距,進(jìn)一步提高數(shù)值模擬的精確度。在膜電位v計算達(dá)到閾值恢復(fù)到初始值的同時,也能對這個峰值的誤差完成清零操作,這表明只要定制合適的位寬就能取得與浮點(diǎn)一致的數(shù)值波形變化。在SNN 模型仿真中,研究人員往往并不關(guān)注峰值的高低,反而專注于發(fā)射脈沖的狀態(tài),膜電位的波形變化規(guī)律是關(guān)鍵因素,因而定制的混合精度數(shù)據(jù)類型能滿足LGN 等模型的仿真所需。
為了進(jìn)一步說明仿真結(jié)果的準(zhǔn)確性,比較經(jīng)過相同的仿真時間內(nèi)舊版double 類型和FPGA 定點(diǎn)類型的神經(jīng)元膜電位v以及恢復(fù)變量u關(guān)于時間的平均相對誤差(vMRE/uMRE),結(jié)果如表2 所示。
表2 神經(jīng)元膜電位一段時間內(nèi)的平均相對誤差分析Table 2 Analysis of average relative error over time in neuronal membrane potential
vMRE/uMRE的計算式如式(14)所示:
其中:Ts表示的是該神經(jīng)元在Ts的仿真時間內(nèi)記錄v/u的次數(shù);x取值為膜電位v或者恢復(fù)變量u。分析表2 中的數(shù)據(jù)可知,每1 000 ms 膜電位的平均相對誤差為5%左右,而恢復(fù)變量為2%左右,在可接受的誤差范圍之內(nèi)。
數(shù)據(jù)類型的不同表達(dá),不僅影響存儲單元的使用率,還會影響運(yùn)算器等硬件邏輯單元的開銷。7 000 個神經(jīng)元在并行實(shí)例化2 份神經(jīng)元更新處理單元的情況下,頻率為100 MHz,在PYNQ-Z2 上全部更新一步所需的資源以及單神經(jīng)元更新一步所需的時鐘周期如表3 所示。
表3 PYNQ-Z2 上資源統(tǒng)計Table 3 Resource statistic on PYNQ-Z2
分析資源的使用情況,設(shè)計的混合精度數(shù)據(jù)類型相比較double、float 數(shù)據(jù)類型在BRAM、DSP、FF、LUT 的使用上都減少了很多,意味著在該FPGA 平臺上可以實(shí)例化更多并行的神經(jīng)元更新處理單元以及更多Izhikevich 神經(jīng)元的加速。分析3 種數(shù)據(jù)類型下單神經(jīng)元完成一次更新所需的時鐘周期可知,float 相比較double 只減少了10%的時間,而設(shè)計的混合精度數(shù)據(jù)類型相比較double 減少近83%。產(chǎn)生這種現(xiàn)象的原因是:盡管使用平衡最短數(shù)據(jù)路徑的方法將原先的流水線階段縮短至7 個階段,但是double 與float 數(shù)據(jù)類型在各階段內(nèi)的加減乘法等不能在一個周期內(nèi)結(jié)束,這就使得后期流水階段會進(jìn)入等待狀態(tài)。
表4 所示為7 000 神經(jīng)元仿真一步,在不同并行度下資源以及時間開銷情況。相比較并行度1(即原始串行版本),并行度為2 時存儲BRAM、DSP 資源幾乎成倍增長,F(xiàn)F 和LUT 也有所增加,時間有所降低。這是因?yàn)楫?dāng)使用并行時,相比較原始串行版本,需要額外在本地也存一份數(shù)據(jù)再進(jìn)行數(shù)據(jù)的重分配,此時就會成倍增加存儲的開銷,這也會帶來一定的時間開銷。原先串行版本計算時間占主體,此時計算模塊的時間開銷減半,會對整體膜電位更新整體時間造成很大的影響,所以,盡管重分配會帶來一定的時間開銷,但整體的時間還是降低的。對比并行度2、4、8,除了DSP 依舊成倍數(shù)增長外,別的資源增長并不多且時間降低變得緩慢。這是因?yàn)橛嬎闼璧募?、減和乘法器等DSP 資源會隨著并行度而成比例增長,這過程并不需要大量其他的資源的參與,至于時間減少不多是因?yàn)榇藭r的程序數(shù)據(jù)的重分配、通信等非計算所需的時間占主體,計算占比很小,因而計算時間減半,對整體更新時間的減少效果減弱。
表4 不同并行度下PYNQ-Z2 上資源統(tǒng)計Table 4 Resources statistic on PYNQ-Z2 under different degrees of parallelism
表5 是關(guān)于Izhikevich 所做的其他方法與本文方法對比,其中MPU 表示單個神經(jīng)元膜電位更新一次所需的時鐘周期數(shù)。表中其他方法也使用了定點(diǎn)化的方法,但那是對神經(jīng)元中所有值都進(jìn)行相同的位寬設(shè)計,而本文使用混合精度的設(shè)計能進(jìn)一步降低神經(jīng)元的整體資源開銷,同時縮小膜電位的絕對誤差,盡管所提方法的MPU 時間不是最低的,但也比別的多數(shù)方法小很多。相比較傳統(tǒng)的硬件描述語言VHDL,使用的是開發(fā)更便捷的高層綜合語言(High-Level Synthesis,HLS),同時還進(jìn)行了一定規(guī)模的脈沖神經(jīng)網(wǎng)絡(luò)的仿真模擬。
表5 Izhikevich 模型不同優(yōu)化綜合對比Table 5 Comprehensive comparison of different optimizations of the Izhikevich model
有關(guān)Izhikevich 神經(jīng)元的研究,主要集中在單個神經(jīng)元的性能、能耗,從簡化更新方程中復(fù)雜項、求解方程的時間步長等方向上優(yōu)化加速,但都沒有與經(jīng)典的類腦應(yīng)用對接。本文從數(shù)據(jù)的存儲類型角度,利用混合精度優(yōu)化整體網(wǎng)絡(luò),利用平衡數(shù)據(jù)路徑、并行、流水等手段加速神經(jīng)元更新計算過程,并與開源的NEST 仿真器對接,以下是兩個經(jīng)典的類腦仿真模型在不同平臺上的表現(xiàn)。
選擇數(shù)量大小為14 000 個Izhikevich 神經(jīng)元,仿真6 000 ms、Δt=0.1 的LGN 模型進(jìn)行實(shí)驗(yàn),神經(jīng)元更新模塊實(shí)例化了4 份處理單元,并比較經(jīng)過FPGA 加速部分的Izhikevich 更新部分與舊版本更新部分在不同平臺上的性能與能效,如表6 所示,其中,MOP表示每秒百萬次運(yùn)算(Million Operations Per Second),更新能效比為MOP/功率,加粗?jǐn)?shù)據(jù)表示最優(yōu)值,下同。
表6 不同平臺上LGN 模型更新部分性能對比Table 6 Performance comparison of the update part of the LGN model on different platforms
分析比較表6 可知,雖然PYNQ-Z2 上的更新所需時間最長,但其功率很低,更新部分的能效比是i7-10700 CPU 的7.94 倍,比ZCU102 稍低。使用FPGA 架構(gòu)更好的ZCU102 板卡,首先運(yùn)算性能是PYNQ-Z2 的3.90 倍,是i7-10700 CPU 的2.31 倍,更新能效比是i7-10700 CPU 的8.53 倍。接下來使用12 500 個Izhikevich 神經(jīng)元,仿真20 000 ms 的LSM模型進(jìn)行實(shí)驗(yàn),統(tǒng)計結(jié)果如表7 所示。
表7 不同平臺上LSM 模型更新部分性能對比Table 7 Performance comparison of the update part of the LSM model on different platforms
比較表6 和表7 可以發(fā)現(xiàn),LSM 模型相較于LGN 模型,各平臺更新能效比都有一定程度的降低,潛在的原因是LSM 模型網(wǎng)絡(luò)結(jié)構(gòu)、初始化值的不同以及仿真時長導(dǎo)致網(wǎng)絡(luò)的脈沖發(fā)射率高于LGN 模型,即傳遞脈沖的時間占比多了,導(dǎo)致整體更新能效比下降。在PYNQ-Z2 平臺上盡管更新時間并不比i7-10700 CPU 快,但更新能效比為其11.23 倍,而在ZCU102 上,不僅運(yùn)算性能是PYNQ-Z2 的3.62 倍、i7-10700 CPU 的3.03 倍,還能在更新能效比上取得i7-10700 CPU 的11.20 倍的效果。
相比較計算更簡單的LIF 神經(jīng)元,Izhikevich 神經(jīng)元能表現(xiàn)出更多生物尖峰神經(jīng)元的計算特性,但基于其的研究目前都還只停留在針對單神經(jīng)元的加速上,沒考慮整體網(wǎng)絡(luò)的優(yōu)化。本文在單神經(jīng)元優(yōu)化的基礎(chǔ)上,對大量脈沖網(wǎng)絡(luò)仿真的存儲數(shù)據(jù)進(jìn)行了定點(diǎn)化的優(yōu)化研究,結(jié)合計算、存儲的特性提出一套定制計算方法,從而在有限硬件資源的條件下更高效地完成更多神經(jīng)元的仿真,為大型的類腦模型仿真提供解決思路。
在開源的NEST 仿真器下進(jìn)行設(shè)計的實(shí)現(xiàn),驗(yàn)證定制計算方法的性能與能效比。實(shí)驗(yàn)結(jié)果表明,相比于Intel?CoreTMi7-10700 CPU,經(jīng)典的丘腦外側(cè)膝狀核模型、液體狀態(tài)機(jī)模型神經(jīng)元更新部分的運(yùn)算性能、能效比在FPGA 平臺上都有較大的提升。后續(xù)的工作將從以下方面展開:1)實(shí)踐發(fā)現(xiàn)軟件端數(shù)據(jù)準(zhǔn)備階段所占整體時間比重較大,將探究優(yōu)化NEST 仿真器脈沖的分發(fā)機(jī)制,減少軟件上數(shù)據(jù)的二次搬運(yùn);2)為了驗(yàn)證所提定制計算方法的拓展性,將尋找更多的模型、FPGA 平臺進(jìn)行實(shí)驗(yàn)驗(yàn)證。