劉家航,郁龔健,李佩琦,華 夏,柴志雷,2,陳聞杰
(1.江南大學 人工智能與計算機學院,江蘇 無錫 214122;2.江蘇省模式識別與計算智能工程實驗室,江蘇 無錫 214122;3.華東師范大學軟硬件協(xié)同設計技術與應用教育部工程研究中心,上海 200062)
深度學習在數(shù)據(jù)挖掘、自然語言處理、語音處理、文本分類等諸多領域都取得了突出的成果,但其存在需要海量標注數(shù)據(jù)、通用智能水平弱等局限性[1],難以成為解決人工智能問題的終極手段。人類大腦是由約1011個神經元、1015個突觸構成的復雜的生物體,具有很高的智能水平,但功耗只有25 W左右[2],其計算模式值得借鑒。目前,出現(xiàn)了越來越多的大腦神經計算科學的研究工作,以期通過解析人類大腦工作機理、發(fā)展類腦計算來克服現(xiàn)有深度學習的不足[3]。類腦計算的基礎是脈沖神經網絡(Spiking Neural Network,SNN),與傳統(tǒng)的深度神經網絡(Deep Neural Network,DNN)相比,SNN 的工作機理更接近于生物大腦。
大腦規(guī)模所需的計算資源遠超單個計算節(jié)點或芯片的功能[4],因此,為了獲得最佳的計算能力,構建大規(guī)模集群形成分布式計算平臺成為當前主流[5-7]。然而隨著計算節(jié)點的增多,通信時間所占比例越來越大,有效計算的比例逐漸下降,導致SNN的計算效率下降。
針對通信的優(yōu)化,壓縮、打包尖峰數(shù)據(jù)等[8-10]傳統(tǒng)方法只關注對通信的脈沖數(shù)據(jù)進行優(yōu)化,局限性較大。在神經元映射對通信的影響方面,CARLOS等提出HP-NBX 方法[11],利用超圖分區(qū)和動態(tài)稀疏交換減少進程之間的連接,從而提高通信平衡性,優(yōu)化通信過程。URGESE 等提出SNN-PP方法[12],在SpiNNaker 中使用譜聚類算法將神經元分組成亞群,使亞群中緊密相連的組保持在同一個計算節(jié)點(進程)中,目的是最小化相互的連接并保持高度連接的組件相互靠近。BALAJI 等提出SpiNeCluster 方法[13],根據(jù)尖峰信息將SNN 劃分為局部和全局突觸,最大限度減少共享互連上的尖峰數(shù)量。XIANG等提出一種基于跨層的神經映射方法[14],將屬于相鄰層的突觸連接神經元映射到同一片上網絡節(jié)點,同時為適應各種輸入模式,還考慮輸入尖峰率并重新映射神經元以提高映射效率。
針對大規(guī)模分布式類腦計算的仿真,NEST 仿真器是一款主流的類腦模擬器開源軟件[15]。NEST 仿真器可以模擬任何規(guī)模的脈沖神經網絡,并且支持集成式的MPI、OpenMP 通信協(xié)議,其通過分布式計算大幅提高了仿真速度。NEST 的通信機制采用“緩沖區(qū)動態(tài)相等”的方法,各節(jié)點無需通信,直接動態(tài)保持發(fā)送緩沖區(qū)相等。
雖然NEST 對通信時間進行了一定程度的優(yōu)化,但是由于緩沖區(qū)互相無交流,使得通信數(shù)據(jù)量持續(xù)增加,因此其在能耗方面表現(xiàn)較差。針對這一問題,本文提出基于SNN 子圖跨節(jié)點優(yōu)化的神經元重分布算法ReLOC,通過分析SNN 模型中神經元之間聯(lián)系的緊密性,減少神經元到其他節(jié)點的連接,并以稀疏交換思想對NEST 本身的通信機制進行改進,利用其稀疏性提高通信效率。
脈沖神經網絡(SNN)被譽為第三代人工神經網絡[16],其模擬神經元更加接近實際,并且把時間的影響也考慮在內。脈沖神經網絡中的神經元不是在每一次迭代中都被激活,而是在其膜電位達到某一個特定值時才被激活。當一個神經元被激活時,它會產生一個信號傳遞給其他神經元,并改變其膜電位。
神經科學家通常用SNN 評估理論和實驗結果[17-18]。SNN 仿真分為2 個階段:計算和交換。計算階段包括基于偏微分方程更新神經元模型;交換階段將神經元產生的脈沖發(fā)送到其突觸后神經元處。在分布式系統(tǒng)中,交換涉及到進程間通信過程,而節(jié)點規(guī)模越大,通信所占的比例就越大。
NEST 是一款應用廣泛的SNN 模型仿真器,其大規(guī)模分布式計算特性非常適合用來作為SNN 負載表征的模擬器工具。本節(jié)介紹NEST 的仿真架構、并行分配和通信機制。
1.2.1 NEST 仿真架構
圖1 展示了NEST 的運行過程。首先使用Create在各個節(jié)點上創(chuàng)建神經元;然后Connect 連接神經元,創(chuàng)建突觸;最后Simulate 進行仿真,此過程分為三步,即更新所有神經元變量(Update)、將產生的脈沖發(fā)送出去(Communicate)以及更新本地突觸變量(Deliver)。
圖1 NEST 運行流程Fig.1 Procedure of NEST operation
1.2.2 NEST 并行架構和神經元分配
NEST 并行架構采用支持MPI 節(jié)點間通信和OPENMP 線程通信,并使用虛擬進程(Virtual Process,VP)的概念來統(tǒng)一管理并行系統(tǒng),虛擬進程數(shù)量NVP由進程數(shù)量P和線程數(shù)量T決定,NVP=P×T。
神經元分配采用基于VP 的循環(huán)分配,使得神經元在各個節(jié)點上均勻分布。如圖2 所示,其中:Sg 代表spike-generator 脈沖激發(fā)器,此設備在VP 上是完整創(chuàng)建的;Iaf 代表神經元,是基于虛擬進程的分配。由于這種分配方式不可避免地將聯(lián)系緊密的神經元分配到不同的節(jié)點,導致通信消耗增大,因此神經元分配對于通信的改進是必要的。
圖2 NEST 并行架構和神經元分配方式Fig.2 Parallel architecture and neuron allocation mode of NEST
1.2.3 NEST 通信架構
NEST 采用將單個時間片內的神經元連續(xù)更新的思想:神經元先進行若干次連續(xù)更新,然后一次時間片內產生的脈沖統(tǒng)一進行MPI 通信。
NEST 使用MPI_Alltoall 函數(shù)進行通信,通常的設計是每次通信前先通信一次確保每個節(jié)點的發(fā)送緩沖區(qū)都保持相等,這樣通信兩次的設計毫無疑問會隨著節(jié)點增加造成通信時間劇增,因此,NEST 不使用這種設計,而是采用所有節(jié)點同時自主保持通信緩沖區(qū)相等的策略。
如圖3 所示,在進行每一輪通信時,首先將脈沖放入發(fā)送緩沖區(qū)中,如果緩沖區(qū)的容量小于脈沖數(shù),則將脈沖放滿進行通信,然后擴大發(fā)送緩沖區(qū)的容量,繼續(xù)放入剩下的脈沖,直到脈沖傳輸完成,其中發(fā)送緩沖區(qū)的容量會一直變大。這樣設計提高了通信的可擴展性,但是會導致通信能耗迅速增加,并且NEST 集體通信導致發(fā)送緩沖區(qū)無論有沒有脈沖都需要發(fā)送數(shù)據(jù),這無疑增加了通信消耗,而并行SNN 的通信應當是進程間存在脈沖交換時才會發(fā)生。
圖3 NEST 通信機制流程Fig.3 Procedure of NEST communication mechanism
1.2.4 NEST 負載特性
在使用多節(jié)點仿真時,神經元會被均勻地分發(fā)到每個節(jié)點上,產生跨節(jié)點通信。如圖4 所示,在NEST 上運行平衡隨機網絡模型,隨著節(jié)點增加,通信所占比例逐漸增大,計算效率逐漸下降。
圖4 NEST 各階段時間占比Fig.4 Time proportion of NEST each stage
圖5 顯示了NEST 通信能耗的變化,可以看出,隨著節(jié)點的增加,通信數(shù)據(jù)量迅速上升,NEST 在通信能耗方面可擴展性變差。針對通信能耗可擴展差的問題,本文對NEST 進行稀疏性通信優(yōu)化,以期提高通信效率。
圖5 通信數(shù)據(jù)量Fig.5 Communication data volume
針對NEST 集群的神經元循環(huán)分配帶來的問題,本文實現(xiàn)神經元重分布算法ReLOC。通過對神經元之間連接關系的分析,重新分布神經元,使得跨硬件節(jié)點之間的連接變得更加稀疏。在此基礎上,改進NEST 通信方式,使NEST 集群可以更好地利用稀疏性以減少通信代價。
分布式集群最重要的問題就是節(jié)點間的通信問題,因為突觸前和突觸后神經元總是不可避免地被分布到不同的節(jié)點,最優(yōu)分布是所有神經元都被放入同一個節(jié)點,但是此分布無法體現(xiàn)分布式集群的優(yōu)勢。節(jié)點間通常使用以太網連接,因此,網絡帶寬和延遲直接影響通信速度。除此之外,神經元彼此之間的連接也會對跨節(jié)點通信造成較大影響。
將一個SNN 模型建立為如圖6 所示的SNN 連通圖,圓點代表神經元,中間帶箭頭的線段表示突觸。然后將一個神經元和它的突觸后神經元共同組成這個SNN 圖的子圖,如圖7 所示,假如一個神經元產生脈沖,那么脈沖數(shù)據(jù)會被發(fā)送給所有的突觸后神經元。所有的脈沖傳輸都是基于這樣的SNN子圖。
圖6 并行SNN 連通圖Fig.6 Parallel SNN connected graph
圖7 SNN 子圖Fig.7 SNN subgraph
在NEST 仿真器中,當一個節(jié)點上包含一個神經元的多個突觸后神經元時,這些突觸后神經元會共享一個脈沖數(shù)據(jù)。因此,無論突觸后神經元的數(shù)量如何,此神經元發(fā)出的脈沖傳輸?shù)酱斯?jié)點都只算作一個,即神經元到節(jié)點的連接。每次神經元更新產生的總脈沖總是小于或等于節(jié)點數(shù)乘以神經元數(shù)。因此,如何將一個SNN 子圖中的神經元分布到盡可能少的節(jié)點上,并且改進NEST 通信機制使其更適用稀疏性優(yōu)化成為重要問題,本文設計的ReLOC 算法每次都加入當前匹配集最優(yōu)匹配的神經元,形成新的匹配集。根據(jù)最優(yōu)匹配規(guī)則選取屬于匹配集中的突觸后神經元最多的神經元,將SNN子圖放入盡可能少的節(jié)點,從而減少跨節(jié)點脈沖。在此基礎上,改進NEST 原本的集體通信,利用稀疏交換的思想,在跨節(jié)點脈沖減少的同時,避免多余的進程數(shù)據(jù)交換,從而提高NEST 通信效率。
2.2.1 算法描述
ReLOC 算法描述如算法1 所示,其將神經元按照緊密度的聯(lián)系分布到若干節(jié)點上,通過對節(jié)點神經元容納量的限制,平衡節(jié)點的負載。
算法1ReLOC 算法
ReLOC 算法輸入為節(jié)點數(shù)和神經元連接表。一個SNN 模型可以建立成一張連通圖G=(V,E),V代表所有的神經元集合,E代表神經元之間的突觸連接。而神經元連接表可以表示為圖G的鄰接矩陣A,A是Nn×Nn維的,Nn表示神經元的總數(shù),節(jié)點數(shù)用Nnp來表示。ReLOC 算法輸出為各節(jié)點的神經元分布,表示為一個分布矩陣T,T是Nn×Nnp維的。
首先選取一個節(jié)點,將一個隨機的神經元r分布到此節(jié)點上,k表示當前節(jié)點;然后依次在此節(jié)點上放入未分配的神經元,直到節(jié)點k達到最大容納量max_neurons,規(guī)則是每次放入的神經元都是未分配的神經元集neurons 中神經元的突觸后神經元在節(jié)點k中分布最多的神經元。當神經元按照此方法依次進行匹配時,每次匹配的神經元都是與匹配集聯(lián)系最密切的神經元。ReLOC 算法中的符號定義如表1 所示。
表1 符號定義Table 1 Symbolic interpretation
ReLOC 算法的思想是先選定一個神經元,每次匹配一個和它聯(lián)系最緊密的神經元,形成一個神經元集,然后繼續(xù)循環(huán)匹配和此神經元集聯(lián)系最緊密的神經元,生成新的神經元集。此算法中決定神經元之間密切程度的是神經元集中屬于突觸后神經元的數(shù)量。因為每次匹配都會使一個SNN 子圖(見圖7)最大化分布到同一個節(jié)點上,當所有匹配都是最優(yōu)時,每個子圖都會避免分布在多個節(jié)點上,從而減少通信量。
ReLOC 算法只需要在任意一個節(jié)點上運行,然后將分布結果發(fā)送給其他節(jié)點即可。內存使用按照式(1)計算:
其中:M表示總內存;N表示神經元總數(shù)量;Mint表示整型參數(shù)占用內存。
2.2.2 ReLOC 算法的有效性
ReLOC 算法的核心是匹配過程,每一次匹配都會選擇最優(yōu)的匹配集,最優(yōu)意味著最低代價的SNN子圖切割,即SNN 子圖分布在最少的節(jié)點上。
為了描述SNN 的拓撲,將神經元連接圖用鄰接矩陣A來表示,A[i,j]∈{0,1},當神經元i和j之間存在突觸連接時,A[i,j]=1,否則A[i,j]=0。用T來表示分布矩陣,當神經元i被分布到節(jié)點j時,T[i,j]=1,否則T[i,j]=0。
根據(jù)上文提到的突觸后神經元共享脈沖數(shù)據(jù),衡量跨節(jié)點通信可以用神經元到節(jié)點的連接數(shù)量NNP來表示。首先定義P:
P[i,j]≥0 表示神經元i到節(jié)點j存在連接,那么NNP可以表示為:
2.2.3 基于ReLOC 算法的NEST 性能優(yōu)化
為了利用ReLOC 算法的便捷性,并且與原先的NEST 調用代碼不產生沖突,本文改變了NEST 的基本架構,在Connect 時不創(chuàng)建具體的突觸對象,只是通過所有連接得到一個連接表,然后在調用Simulate函數(shù)初始化仿真時根據(jù)連接表進行神經元的重分布處理,之后再創(chuàng)建突觸和運行仿真過程。重分布具體流程如圖8 所示。其中,Setnod 是系統(tǒng)調用ReLOC 進行神經元重新分配的標志,對于非稀疏性SNN 模型,則無需調用此模塊。Setnod 函數(shù)可以輸入?yún)?shù),根據(jù)參數(shù)選擇不同的重分布算法,此模塊是可擴展的,可以自行添加新的算法。
圖8 重分布流程Fig.8 Procedure of relocation
用戶調用應用重分布稀疏方法的NEST 內核的Python 代碼以如下為例,對比原代碼新增了2 個函數(shù)調用,設置重分布(Setnod)和設置通信方式(Setcomm),兩者都需要在ResetKernel 后進行調用。如果不調用則默認使用原來的NEST 神經元分配和通信方式。
稀疏交換是HOEFLER 等提出的動態(tài)稀疏數(shù)據(jù)交換算法[19],是節(jié)點對節(jié)點通信的模式,即一個節(jié)點只發(fā)送必要的數(shù)據(jù)給另一個節(jié)點,期間需要啟動多次MPI通信,總體效率不如集體通信(MPI_Alltoall)。但是如果減少每個節(jié)點的通信節(jié)點(一個節(jié)點需要向另一個節(jié)點發(fā)送脈沖數(shù)據(jù),即本節(jié)點神經元到其他節(jié)點的連接)的數(shù)量,那么就可以減少啟動MPI 通信的次數(shù),進而提高通信效率。
如圖9 所示,在啟動通信階段,每個節(jié)點都會使用MPI_Reduce_scatter 函數(shù)與其他節(jié)點交流得到源節(jié)點的信息,避免與非相鄰進程交流,以此提高通信效率。然后每個節(jié)點都將脈沖數(shù)據(jù)異步發(fā)送給其所有的目標節(jié)點,并等待接收其源節(jié)點發(fā)送的脈沖,一旦接收完畢,則表明通信階段結束。
圖9 稀疏交換流程Fig.9 Procedure of sparse exchange
每個節(jié)點與其他目標節(jié)點進行數(shù)據(jù)傳輸時使用非阻塞通信,即用MPI_Isend 進行發(fā)送數(shù)據(jù),用MPI_Recv 接收數(shù)據(jù),最后使用MPI_Waitall 等待數(shù)據(jù)全部傳輸完成,然后繼續(xù)仿真操作。此過程不需要等待全部節(jié)點通信結束,通過非阻塞通信、重疊通信與計算階段提高并行計算的效率。
在NEST 上使用稀疏交換之前需要先調用Setcomm(type)函數(shù),其中的參數(shù)可以設置,從而啟用不同的通信機制,如果不調用此函數(shù)則默認通信為NEST 原本通信模式。
在使用稀疏交換之前先進行神經元重分布操作,減少本節(jié)點神經元到其他節(jié)點的連接,由于稀疏SNN 模型每一輪神經元產生的脈沖比較稀少,因此減少了節(jié)點到節(jié)點通信的發(fā)生,并且只需要發(fā)送目標進程所需的脈沖數(shù)據(jù),一定程度上解決了NEST集體通信帶來的通信能耗可擴展性差的問題。
本文選擇以下2 個實驗案例進行分析:
1)皮質微電路SNN 模型
此案例基于POTJANS 等提出的皮質微電路(Cortical Microcircuit,CM)模型[20]。CM 模型網絡包含4層,每層由抑制性和興奮性神經元群組成,分為8個群體,共7.7 萬個神經元和3 億突觸。神經元類型為iaf_psc_exp,所有連接均為靜態(tài)突觸,連接規(guī)則為fixed_total_number,另有8 個泊松和對應的神經元群全連接。此案例在生物學上比較合理地模擬了大腦皮層的神經活動,為了驗證網絡稀疏性對于SNN 分布式計算的好處,將該模型的神經元和突觸縮放至0.1和0.02,以0.1 ms 的時間步長仿真200 ms。
2)平衡隨機網絡模型
在此案例中,平衡隨機網絡模型的神經元被分成2 個種群,分別由400 個興奮性神經元和100 個抑制性神經元構成,每個神經元的固定入度為5,因此,共有2 500 個突觸。神經元類型為iaf_psc_alpha,所有連接均為靜態(tài)突觸,連接規(guī)則為fixed_indegree,1 個泊松和所有神經元連接。將該模型分別在類腦平臺上以0.1 ms 的時間步長仿真200 ms。
本文選取由28 塊PYNQ-Z2 組成的高性能異構類腦平臺,每個節(jié)點包括PS(Process System)端的ARM A9 雙核處理器系統(tǒng)和1 個PL(可編程邏輯)端的FPGA 器件,物理內存512 MB。節(jié)點之間使用1 000 Mb/s 網絡帶寬的以太網進行通信,采用TCP/IP 協(xié)議。
上述2 種模型都是Python 編寫的NEST 案例,本文調用NEST 的內核(C++實現(xiàn))對SNN 進行仿真,主要特征是采用時間步驅動,并行通信使用MPI 庫。
對模型進行時間統(tǒng)計:1)計算時間是指每個節(jié)點所有神經元順序狀態(tài)更新所花時間;2)通信時間是指節(jié)點通信啟動到數(shù)據(jù)接收完成所花的時間;3)仿真時間是指完成仿真所花的全部時間,包括計算時間和通信時間;4)通信數(shù)據(jù)量是指MPI 函數(shù)在200 ms 仿真時間內所有節(jié)點實際發(fā)送的全部數(shù)據(jù)字節(jié)量(unsigned int 型)。
3.4.1 神經元重分布
分別測試應用神經元重分布算法和循環(huán)分布算法的交換數(shù)據(jù)量和神經元到進程的數(shù)量,通信模式均采用NEST 默認通信機制。如圖10(a)所示,在應用ReLOC 算法后,神經元到進程的數(shù)量平均減少約20%,但是由于NEST 的通信機制為集體通信,無法利用稀疏連接帶來的好處,因此交換的數(shù)據(jù)量并未減少,如圖10(b)所示。
圖10 重分布和循環(huán)分布算法實驗結果對比Fig.10 Comparison of experimental results by relocation and cyclic allocation algorithms
3.4.2 神經元重分布和稀疏交換
使用重分布稀疏交換方法(ReL-SE)和原版本NEST 模式運行3.1 節(jié)的2 個實驗案例,這2 個案例對于僅使用靜態(tài)突觸的稀疏性SNN 網絡有比較好的代表性。分別使用4、8、16、28 個節(jié)點進行仿真,運行結果如圖11 和圖12 所示??梢园l(fā)現(xiàn),對于稀疏SNN 模型,在通信數(shù)據(jù)量大幅減少的情況下,通信時間和仿真時間與原版本相差不大,這就使得通信能耗大幅減少。如圖11 所示,在皮質微電路模型中,由于起初神經元脈沖比較密集,導致發(fā)送緩沖區(qū)一開始就會非常大,因此后續(xù)通信數(shù)據(jù)的浪費更加明顯,在28 個節(jié)點上的仿真結果表明,使用重分布稀疏交換方法的通信能耗相比NEST 模式減少約98.63%。由圖11(a)和圖12(a)可以看出,當節(jié)點較少時,NEST 模式的仿真時間少于重分布稀疏交換方法,然而節(jié)點繼續(xù)增加,NEST 模式的仿真時間卻呈快速上升趨勢。與此相應,通信時間也在快速接近,可以預見的是,節(jié)點的擴張有利于稀疏通信。由圖11(c)和圖12(c)可以看出,NEST 原本通信數(shù)據(jù)量隨著節(jié)點的增加呈現(xiàn)快速上升趨勢,而稀疏交換的數(shù)據(jù)量卻緩慢增長,由此可見,同時配后稀疏交換能夠大幅降低通信能耗。
圖11 皮質微電路模型運行結果Fig.11 Running result of CM model
圖12 平衡隨機網絡模型運行結果Fig.12 Running result of balanced stochastic network model
如圖13 所示,隨著節(jié)點的增加,ReLOC 算法花費時間越來越少,這是因為節(jié)點的增加導致每個節(jié)點上所能容納的神經元減少,因此在算法循環(huán)進行神經元匹配時,突觸后神經元位于節(jié)點神經元集的個數(shù)的計算次數(shù)大幅減少。
圖13 ReLOC 算法耗時Fig.13 Time consuming of ReLOC algorithm
由于神經元重分布是仿真前一次性消耗的時間,因此隨著仿真時間的增加,ReLOC 所需代價逐漸降低。所以,節(jié)點和仿真時間與ReLOC 算法的代價成反比,使得代價最終可以忽略不計。
NEST 循環(huán)分配導致聯(lián)系緊密的神經元易產生分離。針對該問題,本文通過實現(xiàn)神經元的重分布,使聯(lián)系緊密的神經元更容易分布到同一節(jié)點,使進程間的通信更加稀疏。同時,對NEST 本身的通信機制進行改進,利用稀疏交換思想大幅減少通信數(shù)據(jù)量,并配合ReLOC 算法提高通信效率。本文在使用重分布稀疏交換方法時只需要調用2 個函數(shù)來啟動使用,與原版本NEST 的用戶交互相比并未發(fā)生很大的變化,此方法的效果隨著節(jié)點增多進一步明顯,而實現(xiàn)代價隨節(jié)點和仿真時間的增加逐漸減少。后續(xù)將通過對神經元進行更有效的分配,進一步縮短通信時間。同時,由于本文算法對于擁有STDP 突觸的案例效果不佳,因此下一步也將考慮2 種突觸的平衡性優(yōu)化神經元重分布算法。