張新偉,李 康,郁龔健,劉家航,李佩琦,柴志雷,2
1.江南大學 物聯網工程學院 物聯網技術應用教育部工程研究中心,江蘇 無錫 214122
2.數學工程與先進計算國家重點實驗室,江蘇 無錫 214125
深度學習已經在語音識別、物體檢測、自然語言處理、自動駕駛等各個領域中展現出了優異的性能。但高準確率的背后還存在計算代價大、通用智能水平弱等許多局限性[1]。而具有通用智能處理能力的人腦在執行推理、分辨目標、控制移動時,能量消耗不足25 W[2]。因此,各個國家紛紛建立腦研究平臺[3-5],希望通過分析生物大腦的工作機制發展神經形態計算,克服現階段深度學習的不足[6]。
目前,神經形態計算系統實現的方式有軟件模擬和硬件實現兩種。軟件模擬工具主要有NEURON[7]、NEST[8]、SpiNNaker[9]等。NEURON 和 NEST 軟件仿真工具由于支持的神經元和突觸類型多,因此具有很高的靈活性,而且還支持MPI,具有很好的可拓展性。但是在仿真速度和功耗方面表現不佳。硬件實現分為模擬、數字、模數混合三種方式[10]。鑒于模擬電路對環境特別敏感,目前大部分類腦計算系統都使用數字方式,如Intel 的 Loihi[11]、IBM 的 TrueNorth[12]等專用芯片。專用芯片在性能、功耗方面具有很大的優勢,但是神經元和突觸的模型較多,芯片一旦流片完成,將無法仿真其他神經元模型或突觸模型。FPGA作為一種靈活性高、性能強和低功耗的可編程邏輯器件。與開發周期長、成本高、靈活度低的專用芯片和性能強但功耗高的GPU 相比,在開發SNN 仿真器方面更具有優勢。脈沖神經網絡的計算密集點主要分布在神經元和突觸,突觸主要分為靜態突觸(固定權重)和STDP[13]型突觸。一般情況下,對于突觸是靜態的,計算密集點在神經元,而如果突觸為STDP 型,由于突觸數量相對于神經元數量較多,而且STDP型突觸計算量大,突觸計算將成為提高脈沖神經網絡仿真速度的瓶頸[14]。所以目前使用FPGA加速脈沖神經網絡主要關注點在神經元和STDP 型突觸[10]。雖然通過優化公式減少邏輯資源,從而提高神經元和突觸的計算并行度,極大地提高了仿真速度。但是與此同時,由于節點規模不可調,仿真規模將受到限制。因此考慮到以上問題,曼徹斯特大學的SpiNNaker采用軟硬件協同的方式[9],設計了具有百萬核心的類腦仿真平臺。SpiNNaker的每個計算節點包含18個ARM核,節點間通過基于FPGA的高速路由進行通信,具有很高的計算速度和規模可伸縮性。但是當選擇運行的SNN算法特性與硬件平臺不匹配時,會導致其系統還不如通用計算機[15]。
NEST 作為比較流行的脈沖神經網絡仿真器,具有支持神經元和突觸種類多,而且其更加關注于脈沖神經網絡系統的規模、動力學以及結構而不是對單個神經元的仿真。NEST 仿真工具完全開源,使加速NEST 仿真速度成為可能。因此,針對NEST 仿真工具靈活性高、支持大規模仿真,但是仿真速度慢的特點,將NEST 移植到ZYNQ集群。并且Xilinx的ZYNQ 7030是ARM+FPGA的SoC方式,可以很好地支持軟硬件協同設計。
因此本文的主要工作如下:
(1)在ZYNQ集群上基于開源NEST類腦仿真器實現了一套類腦計算系統。
(2)針對STDP 學習算法中冪函數和指數函進行優化。并基于FPGA實現了硬件加速。
(3)為了平衡硬件資源、性能與功耗,采用了多節點協同與節點內部硬件加速相結合的方法。
脈沖神經網絡(SNN)相比于前兩代的神經網絡,有著本質的區別[16]。主要表現在它是以脈沖的形式傳遞信息。而且脈沖以時間相關聯,是時間節點的離散活動,而不是連續的值。
如圖1,脈沖是否能夠激發,與神經元閾值電壓和神經元前突觸強度有關。神經元的微分方程是按照真實生物神經元模型建立。神經元的前突觸權重是否有效,與該突觸前神經元是否發生脈沖有關。權重的累加值通過一定的計算,超過神經元的閾值電壓,神經元將會發出一個脈沖并進入不應期。

圖1 神經元脈沖激發圖
神經元類型主要分為三種:LIF[17]、Izhikevich[18]、HH[19]。突觸分為STDP和靜態突觸兩種。
NEST是一款開源的脈沖神經網絡仿真工具,NEST可以模擬任何規模的脈沖神經網絡。如動物的視覺皮質層和皮質層的平衡隨機網絡。還可以模擬大腦的學習機制以及可塑性突觸模型。NEST本身還支持分布式計算,節點內使用OpenMP和節點間使用MPI進行信息交互。
NEST仿真器仿真SNN分為兩個階段:建立連接和網絡仿真。建立連接是將神經元分配到各個節點后,記錄每個神經元的連接關系。網絡仿真分為神經元計算、突觸計算、脈沖發送三個階段。神經元計算使用時間驅動,即不管神經元前突觸是否有脈沖,都會對神經元進行計算。突觸使用事件驅動的方式,即有脈沖,神經元后突觸才會進行突觸更新。
大腦記憶和學習機制的形成被認為主要取決于神經元之間突觸連接的改變機制。最近的研究表明,脈沖時間依賴可塑性(STDP)是突觸改變的重要機制[20]。基于STDP 的學習機制被廣泛用于無監督學習。Diehl 等人[21]使用完全無監督的SNN學習,在不要大量訓練的前提下,其對圖片的識別精度可以與深度學習相媲美。STDP 雖然有多種運算規則,但都大同小異。設計所涉及到的STDP 運算規則采用NEST 官方給出的運算方法。這種運算規則是由Abigail Morrison在研究真實生物皮質層具有連通性和稀疏性遞歸網絡的突觸權重而提出的改進型STDP[13]。STDP的表達式為:

Δt→∞為突觸后發射脈沖時間和突觸前發射脈沖時間之差。λ為學習率,w0為參照權重,τ為時間常數,α為抑制性增量強度相對于增強性增量強度參數。
ZYNQ集群是基于ZYNQ 7030的分布式FPGA異構平臺。每個節點包含一個ZYNQ 7030的FPGA異構SoC。它包含ARM Cortex-A9處理核心(PS)以及可編程邏輯模塊(PL)。PS提供主框架的運行,而PL實現專用硬件架構。計算節點之間使用MPI通過千兆以太網通信。
圖2 是ZYNQ 平臺的總體架構。每個節點包含一個ZYNQ 7030,節點內部分為處理系統(PS)和可編程邏輯(PL)兩個部分。通過級連擴展,系統可以擴展到更大的規模以適應不同規模的仿真。

圖2 ZYNQ分布式FPGA異構平臺
為了分析NEST 仿真器不同突觸類型的計算密集點,分別選取突觸為靜態突觸和動態突觸(STDP)兩種典型案例分析。
在突觸為靜態突觸的物體識別[22]案例中,分別統計1 050、2 100、4 200、6 300、10 500、21 000 個神經元在各個階段時間消耗情況。由圖3可見,突觸為靜態突觸的案例中,神經元的計算時間占比較大。

圖3 靜態突觸各階段運行時間占比
如果突觸是動態突觸(STDP)。以NEST 官方給出的衡量多節點計算性能的HPC_BenchMark[23]為例子,分別統計1 125、2 250、4 500、6 750、11 250、22 500 個神經元的Poisson更新時間、突觸更新時間和神經元更新時間占比情況。圖4中可以看出,在突觸為動態突觸(STDP)的脈沖神經網絡中,突觸的計算階段在總仿真時間中占比較大。

圖4 NEST仿真器各階段運行時間占比
這是因為在脈沖神經網絡中,突觸的數量要比神經元的數量多的多,突觸總數的計算方法如式(2):

Nneurons為神經元數,Csynapes為平均連接神經元的突觸數。STDP 型突觸一般含有指數運算和冪運算[13],計算相對復雜,這是突觸計算成為提高仿真速度的瓶頸的原因。由于神經元部分的加速已經完成[24],所以本文選擇對STDP型突觸進行加速。
NEST 所使用的STDP 突觸模型[13]含有冪函數和指數運算,在硬件實現時,如果不對冪函數和指數函數進行優化,將會損耗很大的邏輯資源,從而使并行度減小。同時,因為單節點的FPGA 邏輯資源有限,不能實現突觸的全部并行,所以采用并行+流水的方式滿足一定并行度的同時兼顧邏輯資源的使用。
3.2.1 冪函數優化
在NEST仿真器中,STDP學習算法的初始值為45,通過實驗得知,在整個仿真階段,權重值的取值范圍是[40~51]之間。對于冪函數weight0.4,可以使用泰勒公式對其優化。冪函數的泰勒公式如下:

當f(x)為 (1+x)α,有:

由泰勒公式的特性知道,當x→0 時,獲得的誤差最小。由于weight >1,并不符合泰勒公式,需要做一定的轉換,對于取值范圍在[40~51]之間的動態權重,需要在一定范圍內動態的改變x的取值范圍。如果權重的值在[40~40.5]之間,公式weight0.4可以改寫成:


此時的 |x|<1 ,現在,已經滿足泰勒公式。將40.250.4約定成常數C,則原有的公式有:

將其代入泰勒展開公式,有:


最后,利用乘法的分配率和結合律,將公式(9)進行化簡,這樣的目的是減少乘法運算和加法運算。用A、B、C分別代表公式的幾個常數,最終,公式化簡成:

在x的取值方面,如計算[40~40.5]之間的數時,x對應于,當計算[45~45.5]之間的數時x對應于。
圖5 顯示優化前和優化后神經元的膜電位,圖5 可以看出,優化前與優化后神經元膜電位隨著時間的變化并無明顯改變,優化前與優化后神經元的膜電位已經重合,優化后與優化前誤差極小。

圖5 優化前與優化后神經元膜電位
將使用泰勒優化后所損耗的FPGA 資源與未優化情況下FPGA 資源損耗情況進行對比,如表1。其中,Block RAM 減少 100%,DSP 減少 93.9%,FF 減少92.4%,LUT 減少67.9%,時鐘延遲減少56.1%。Block RAM 減少100%的原因是,常數A、B、C被HLS 使用FF+LUT 綜合成了ROM 的形式,從而沒有將數組存儲在Block RAM上。

表1 使用泰勒展開式優化后冪函數資源占用
3.2.2 指數優化
STDP 學習算法除了冪函數運算,還包括指數運算。所包含的指數運算如式(11):

tau為常數,對于tlastspike-tspike,因為仿真精度是0.1(對于仿真精度為1時同樣適用),所以tlastspike-tspike的結果只能是I.(0,1,2,3,4,5,6,7,8,9) ,其中I是整數。通過STDP對脈沖時間存儲的特性分析,tlastspike-tspike的取值范圍在[-70,0]之間。而且每個數的取值之差為0.1,即可能取值數為700個。通過tlastspike-tspike之差的值乘以10,然后轉換成整數的形式進行索引取值。表2顯示了原指數運算和查找表計算指數運算所使用資源的對比。從表中可以看出,DSP、FF、LUT 分別減少100%、97.3%、83.1%的資源損耗,時鐘延遲方面,減少84.6%的時鐘延遲。

表2 使用查找表求解指數函數的資源占用
3.2.3 輸入硬件架構設計
設計的FPGA 加速器架構為ARM+FPGA 的形式。ARM 運行NEST 仿真器的基本結構,如網絡的創建、MPI 通信、脈沖數據收集、各進程之間的信息分配等。ARM 通過AXI-LITE 口控制FPGA 端的突觸計算核,AXI-STREAM 協議由 4 個 DMA 控制器來實現,突觸數據的傳輸通過4根HP口來傳輸數據。
對于計算時的數據,通過AXI-STREAM 的形式將數據傳輸。具體傳輸硬件架構如圖6。
AXI-STREAM的最大數據位寬為1 024 bit,本設計采用的數據位寬為256 bit,4 個輸入口組成1 024 bit。ZYNQ 7030 內存帶寬為2.01 GB/s,本文設計的加速方案,每秒所需的數據帶寬為1.9 GB/s,在數據傳輸方面,并沒有成為整個設計的瓶頸。
3.2.4 加速器整體架構設計
為了節約FPGA資源和提高吞吐率,整個設計采用上層流水+底層并行的設計方式。單個突觸的STDP學習算法加速方案如圖7。

圖6 運行階段數據傳輸硬件架構

圖7 突觸更新硬件架構
單個突觸的加速方案并沒有最大化利用FPGA 資源。對于單個時間片上的NEST仿真,如果為全鏈接,則突觸的STDP算法需要計算的總數為Spikes×NeuronE,NeuronE代表興奮性神經元總個數。突觸總數由外部輸入決定。由于每次更行10個STDP型突觸,在突觸總數未知的情況下設計的上層流水采用向上取整的方式,如公式(12):

X代表需要計算的突觸總數,Y代表每次并行計算的個數,整體架構的流水設計如圖8。

圖8 突觸計算的流水線設計
圖8 中分為讀取數據模塊、計算模塊、寫回模塊三個部分,整個流水線的總時間由以下公式計算:

其中,Latencytotal為所需要的總時鐘,Roun_Div_Upper為Trip count 次數。II(Initiation Interval)為初始化間隔,IL(Iteration Latency)為迭代延遲,即R+C+W一次所需要的總時鐘周期。
如圖9 所示,在集群的硬件架構設計中,對于每個計算節點,NEST 仿真器將神經元和突觸分配到每個節點并記錄神經元之間的連接關系。當進行集群仿真時,每個節點計算每個節點的神經元和突觸。每個節點,ARM端負責任務的分配和系統的運行,FPGA端負責對突觸的計算。在進行仿真之前,NEST 會將神經元和突觸平均分配到每個節點,每個計算節點計算任務不同且無主從關系,當一輪更新完成后,節點之間使用MPI 通過以太網通信。得益于NEST 仿真工具本身就支持MPI,在將 NEST 移植到 ZYNQ 集群上時,NEST 頂層的工作方式沒有改變,只是將底層計算部分移植到了FPGA。所以NEST仿真器本身的支持節點規模可調的優點尚在。在仿真之前,可以根據所要仿真的規模,選擇相對應的節點數量。因為神經元和突觸是平均分配到每個計算節點,在運行大規模任務時,只要所需運行內存未超過ZYNQ內存大小,仿真時節點的規模可以任意調整。

圖9 支持NEST的FPGA集群硬件架構
NEST 2.14.0、Xilinx Vivado 2018.3、Xilinx Vivado HLS 2018.3,實驗平臺如表3。

表3 兩種平臺的環境參數
因目前暫未有適合的X86+FPGA實驗平臺,這里只選擇X86、ARM、ARM+FPGA 三種平臺,下一步將與更多不同特點的平臺進行比較。
HPC BenchMark 是NEST 官方推出的衡量系統性能的基準測試。目前,已經在多個平臺或環境下使用[23,25]。網絡中的神經元由興奮性和抑制性神經元組成,組成比例為4∶1。突觸使用STDP 型突觸。時間步長為0.1 ms,突觸延時為1.5 ms。模擬250+50 ms 生物大腦的活動。測試集中的神經元數量可調,調整的幅度為11 250的倍數。
單節點ZYNQ 7030上FPGA資源損耗情況如表4。

表4 單節點FPGA資源損耗
本文實現基于ZYNQ 7030集群的類腦計算加速器的設計。實驗分為三種運行環境,分別是Xeon E5-2620、ARM A9、ARM A9+FPGA。為了體現仿真平臺的可拓展性,將HPC BenchMark例子神經元規模調整為1 125、6 750、11 250 三種,分別對應于單節點、4 節點和 8 節點。由于篇幅有限,在性能和能效對比時,只選取單節點和8節點與Xeon E5-2620進行比較。
如表5 所示,與其他仿真架構相比,單節點ARM+FPGA 異 構 平 臺 性 能 是 ARM-A9 的 61.79 倍 ,Xeon E5-2620 的4.1 倍。能效比方面,能效是Xeon E5-2620的115倍,是ARM A9的55.5倍。

表5 各節點性能對比
8節點和E5-2620仿真11 250個神經元的數據如表6。

表6 FPGA集群和純CPU參數
圖10 為仿真11 250 個神經元生成的結果圖對比,從圖分析,兩者結果相同。圖10(a)為加速前的脈沖發射率和脈沖發射時間圖,圖10(b)為加速后的圖。

圖10 CPU端結果與集群結果對比
三種平臺運行11 250個神經元,8 100萬個STDP型突觸的能效和運行時間如圖11,突觸部分并行計算,對整個系統的仿真時間減少作用明顯。而且,相比于未經加速的ARM-A9集群,CPU相比于8節點的ARM-A9提升并不明顯。因為脈沖神經網絡的仿真,神經元和突觸的參數較多,造成對內存的頻繁訪問。可見,單純地提升單節點的性能并不是較好的解決方案,而是需要以集群的方式,增加訪問內存的并行度。最終,8節點FPGA集群仿真時間為4.925 s,性能是Xeon E5-2620 的14.7倍,是8個ARM A9的22.68倍,性能功耗比方面,是E5-2620的51.6倍,是8節點ARM A9的20.6倍。

圖11 三種平臺對比
本文設計并實現了突觸的STDP 學習算法加速。通過軟硬件協同的分布式方式,可以更方便地探索體系結構,本文的工作也說明了這種方式的優點。雖然節點數增加縮短了計算時間,通信時間也隨之增加。且隨著節點數增加,通信時間將會成為集群的瓶頸。先前對神經元部分的加速已經開源[26],后續也會將本文涉及的代碼也開源。下一步的工作是擴展更大的規模,研究針對不同案例,提供不同的節點,以實現性能和功耗乃至通信的最佳平衡點。同時,節點數增加帶來的數據同步等待,MPI通信時間變長也是亟需解決的問題。