華夏,柴志雷,2,張曦煌
(1.江南大學(xué) 人工智能與計(jì)算機(jī)學(xué)院,江蘇 無錫 214122;2.江蘇省模式識(shí)別與計(jì)算智能工程實(shí)驗(yàn)室,江蘇 無錫 214122)
SNN(Spiking Neural Network)作為類腦計(jì)算的基礎(chǔ),被譽(yù)為第三代人工神經(jīng)網(wǎng)絡(luò)。追求卓越性能、探索適合SNN運(yùn)行的類腦系統(tǒng)結(jié)構(gòu)是SNN研究的主要任務(wù)之一。這意味著需要深入研究SNN模型及系統(tǒng)的工作負(fù)載特性,以設(shè)計(jì)高效的類腦計(jì)算平臺(tái)。由于SNN具有分布式計(jì)算特點(diǎn),因此對(duì)SNN工作負(fù)載的研究需要合適的分布式計(jì)算平臺(tái)。在分布式平臺(tái)上進(jìn)行SNN負(fù)載特性研究時(shí),通常需要多次改變SNN模型規(guī)模,以及SNN工作負(fù)載與計(jì)算平臺(tái)之間的映射方式,以獲取不同情況下的工作負(fù)載數(shù)據(jù)。
因此,對(duì)分布式平臺(tái)進(jìn)行內(nèi)存負(fù)載分析能有效提升SNN工作負(fù)載研究的效率。一方面,對(duì)于特定SNN模型,通過分析滿足其內(nèi)存需求的最小映射節(jié)點(diǎn)數(shù),能夠幫助研究者確定計(jì)算平臺(tái)的可用映射方式的變化范圍。另一方面,通過分析計(jì)算平臺(tái)的網(wǎng)絡(luò)承載能力,幫助研究者在平臺(tái)網(wǎng)絡(luò)承載能力范圍內(nèi)對(duì)其SNN模型進(jìn)行網(wǎng)絡(luò)規(guī)模放縮,以研究不同規(guī)模下的SNN模型負(fù)載特性。
近年來,專用類腦系統(tǒng)和芯片不斷涌現(xiàn),為SNN工作負(fù)載的研究提供了更多可選擇的平臺(tái)。2019年,施路平等人設(shè)計(jì)了Tianjic芯片,該芯片的采用了多核架構(gòu),能承載大約1 000萬個(gè)突觸模型和4萬個(gè)神經(jīng)元模型。2020年,英特爾推出了包含768顆Loihi芯片的神經(jīng)擬態(tài)系統(tǒng)Pohoiki Springs,該系統(tǒng)能夠承載約1億個(gè)神經(jīng)元。
與專用類腦芯片一同發(fā)展的還有靈活性較強(qiáng)的SNN軟件仿真器。部分軟件仿真器構(gòu)建的SNN模型能夠靈活地部署到硬件平臺(tái)中。文獻(xiàn)[6-8]研究了使用NEST等仿真器構(gòu)建的SNN模型在類腦計(jì)算平臺(tái)上的工作負(fù)載特性。在這些研究中,使用者需要通過手動(dòng)試探的方式獲取平臺(tái)的可用映射方式和網(wǎng)絡(luò)承載能力,這大大降低了SNN負(fù)載特性研究的效率。
針對(duì)現(xiàn)有的類腦計(jì)算平臺(tái)難以進(jìn)行高效SNN工作負(fù)載研究的問題。本文首先對(duì)NEST仿真器進(jìn)行工作負(fù)載特性分析,建立內(nèi)存負(fù)載模型。其次搭建了PYNQ集群,并將NEST仿真器部署到集群中,實(shí)現(xiàn)了一種規(guī)??蓴U(kuò)展的分布式類腦計(jì)算平臺(tái)。最后設(shè)計(jì)了集群內(nèi)存負(fù)載分析系統(tǒng),通過提供內(nèi)存消耗預(yù)測(cè)和集群網(wǎng)絡(luò)承載能力預(yù)測(cè)功能,幫助用戶建立SNN模型內(nèi)存消耗的初步印象、快速確定集群網(wǎng)絡(luò)承載能力,以提高在類腦計(jì)算平臺(tái)上研究SNN工作負(fù)載的效率。
NEST是一款支持多種神經(jīng)元、突觸模型的SNN仿真器,可以把大規(guī)模SNN模型映射到集群或者多核計(jì)算機(jī)上。
如圖1所示,NEST仿真器的運(yùn)行流程分為三個(gè)階段。在創(chuàng)建和連接階段,NEST根據(jù)用戶指定的SNN網(wǎng)絡(luò)腳本構(gòu)建神經(jīng)元并建立神經(jīng)元間的突觸連接。在仿真階段中,NEST循環(huán)執(zhí)行突觸更新、神經(jīng)元更新、脈沖傳遞等SNN模型仿真步驟。
圖1 NEST仿真器運(yùn)行流程
NEST能夠進(jìn)行分布式計(jì)算,在分布式計(jì)算平臺(tái)的每個(gè)節(jié)點(diǎn)中運(yùn)行一個(gè)MPI進(jìn)程,計(jì)算節(jié)點(diǎn)間使用MPI通信協(xié)議進(jìn)行數(shù)據(jù)通信。使用NEST在分布式計(jì)算平臺(tái)上進(jìn)行神經(jīng)元構(gòu)建和突觸構(gòu)建時(shí),分別遵循不同
的任務(wù)分配方式。
在創(chuàng)建階段中,NEST使用輪詢方式將神經(jīng)元均勻分配到分布式平臺(tái)的不同節(jié)點(diǎn)上。NEST首先給每個(gè)神經(jīng)元分發(fā)了一個(gè)全局標(biāo)識(shí)編號(hào)(global identifier, GID),然后根據(jù)在分布式平臺(tái)上以循環(huán)方式分配神經(jīng)元。以圖2為例,小型分布式計(jì)算平臺(tái)有兩個(gè)節(jié)點(diǎn),對(duì)于共有4個(gè)神經(jīng)元的SNN模型,按照NEST分配機(jī)制,平臺(tái)的每個(gè)節(jié)點(diǎn)分配2個(gè)神經(jīng)元,IAF表示iaf_psc_alpha類型的神經(jīng)元。
圖2 NEST神經(jīng)元分配方式
突觸的分配與分布式平臺(tái)上的神經(jīng)元分布有關(guān),NEST按照突觸所對(duì)應(yīng)的連接關(guān)系,將突觸分配到其連接目標(biāo)所在的節(jié)點(diǎn)中。如圖3所示,在網(wǎng)絡(luò)連接階段,每個(gè)計(jì)算節(jié)點(diǎn)通過一張稀疏表來記錄突觸信息。在每個(gè)節(jié)點(diǎn)中,NEST需要遍歷節(jié)點(diǎn)分配到的每個(gè)神經(jīng)元,然后對(duì)其中作為突觸的連接目標(biāo)(突觸后)的神經(jīng)元,根據(jù)突觸前后神經(jīng)元GID在稀疏表對(duì)應(yīng)位置記錄突觸信息。
圖3 NEST突觸分配方式
通過上述任務(wù)分配機(jī)制,NEST能夠有效利用分布式計(jì)算平臺(tái)的內(nèi)存與計(jì)算資源,進(jìn)行大規(guī)模SNN模型仿真。
根據(jù)1.1節(jié)分析,NEST運(yùn)行時(shí)的內(nèi)存負(fù)載消耗集中在建立階段和連接階段。這兩個(gè)階段中分別進(jìn)行神經(jīng)元和突觸的創(chuàng)建,其內(nèi)存負(fù)載消耗主要包括神經(jīng)元的內(nèi)存占用M和突觸的內(nèi)存占用M。此外,在分布式計(jì)算平臺(tái)上進(jìn)行SNN模擬時(shí),每個(gè)節(jié)點(diǎn)還需要為NEST提供初始化內(nèi)存消耗M。因此,每個(gè)計(jì)算節(jié)點(diǎn)的總內(nèi)存消耗由M、M和M組成,如式(1)所示:
其中,M包括NEST內(nèi)核中數(shù)據(jù)結(jié)構(gòu)初始化的內(nèi)存消耗,其數(shù)值與計(jì)算平臺(tái)的性能有關(guān)。
表1 內(nèi)存負(fù)載模型參數(shù)說明
每個(gè)計(jì)算節(jié)點(diǎn)的突觸內(nèi)存占用M包括創(chuàng)建突觸模型及其基礎(chǔ)設(shè)施所需內(nèi)存消耗,如式(3)所示。其中第一項(xiàng)為計(jì)算節(jié)點(diǎn)創(chuàng)建所有本地突觸所需的內(nèi)存開銷,N(tgt)為突觸連接目標(biāo)神經(jīng)元tgt的數(shù)量,代表tgt的平均入度。第二項(xiàng)是計(jì)算節(jié)點(diǎn)為所有神經(jīng)元提供的,用于記錄其連接關(guān)系的數(shù)據(jù)結(jié)構(gòu)內(nèi)存開銷。m、 分別是突觸模型及其基礎(chǔ)設(shè)施所需內(nèi)存開銷,如表1所示。
為了提供SNN工作負(fù)載研究所需的分布式計(jì)算平臺(tái)。本節(jié)采用XilinxPYNQ-Z2開發(fā)板搭建集群,并在集群中部署了NEST仿真器,形成了一個(gè)規(guī)??蓴U(kuò)展的分布式類腦計(jì)算平臺(tái)。
PYNQ-Z2開發(fā)板采用Zynq-7020作為其主芯片,該芯片通過數(shù)據(jù)接口將ARM Cortex-A9處理器核心(Processing System, PS)與可編程邏輯FPGA(Programmable Logic,PL)連接。
為了搭建分布式類腦計(jì)算平臺(tái),本文首先設(shè)計(jì)了將NEST仿真器部署到單個(gè)PYNQ-Z2計(jì)算節(jié)點(diǎn)的方法。如圖4(a)所示,NEST仿真器的主體部分運(yùn)行在PYNQ的PS端,用戶可以在PS端的JupyterNotebook中編輯SNN模型的腳本文件。Jupyter在運(yùn)行該腳本文件的過程中,利用了PyNN庫提供的接口,通過SLI或者PyNEST界面完成對(duì)NEST內(nèi)核中函數(shù)的調(diào)用。此外,利用PL端FPGA資源可以設(shè)計(jì)并行計(jì)算加速模塊,對(duì)NEST運(yùn)行過程中的計(jì)算密集點(diǎn)進(jìn)行加速運(yùn)算,以提高NEST的運(yùn)行速度。
圖4 PYNQ集群設(shè)計(jì)
如圖4(b)所示,PYNQ集群由三層硬件結(jié)構(gòu)組成:PYNQ節(jié)點(diǎn)層、主控節(jié)點(diǎn)層和信息交互層。PYNQ節(jié)點(diǎn)層根據(jù)NEST任務(wù)分配機(jī)制處理SNN模型仿真過程中的計(jì)算任務(wù),該層完全由PYNQ-Z2計(jì)算節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都與信息交互層建立連接。信息交互層包含多臺(tái)交換機(jī),負(fù)責(zé)傳遞計(jì)算節(jié)點(diǎn)間的信息。主控節(jié)點(diǎn)層由集群的主節(jié)點(diǎn)構(gòu)成,主要負(fù)責(zé)將計(jì)算任務(wù)分配到每一個(gè)節(jié)點(diǎn)中。集群具有較強(qiáng)的規(guī)模擴(kuò)展的能力,即計(jì)算節(jié)點(diǎn)規(guī)??梢噪S著計(jì)算需求的不同進(jìn)行伸縮調(diào)整。
為了快速預(yù)測(cè)PYNQ集群運(yùn)行SNN模型的內(nèi)存消耗以及集群的網(wǎng)絡(luò)承載能力,本文設(shè)計(jì)了內(nèi)存負(fù)載分析系統(tǒng)。
如圖5所示,內(nèi)存負(fù)載分析系統(tǒng)主要包含五個(gè)模塊:SNN模型與平臺(tái)信息輸入、內(nèi)存參數(shù)獲取模塊、SNN模型參數(shù)采集模塊、內(nèi)存消耗預(yù)測(cè)模塊和網(wǎng)絡(luò)承載能力預(yù)測(cè)模塊。
圖5 內(nèi)存負(fù)載分析系統(tǒng)結(jié)構(gòu)
(1)SNN模型與平臺(tái)信息輸入:將描述SNN模型的腳本文件。
輸入系統(tǒng),同時(shí)輸入計(jì)算節(jié)點(diǎn)總數(shù)、單節(jié)點(diǎn)最大內(nèi)存M等計(jì)算平臺(tái)信息。
(2)內(nèi)存參數(shù)獲取模塊:主要負(fù)責(zé)獲取表1所示的所有內(nèi)存參數(shù)。
(3)SNN模型參數(shù)采集模塊:根據(jù)輸入的SNN腳本文件使用NEST構(gòu)建該SNN網(wǎng)絡(luò)。在網(wǎng)絡(luò)構(gòu)建(創(chuàng)建、連接階段)過程中,針對(duì)式(2)(3)中N(tgt)、(tgt)等與SNN模型相關(guān)的參數(shù),調(diào)用統(tǒng)計(jì)功能進(jìn)行采集。
(4)內(nèi)存消耗預(yù)測(cè)模塊:根據(jù)內(nèi)存負(fù)載模型,將獲取的所有內(nèi)存參數(shù)、SNN模型參數(shù)轉(zhuǎn)化為內(nèi)存消耗預(yù)測(cè)結(jié)果。此外,在滿足SNN模型內(nèi)存需求的前提下,基于預(yù)測(cè)結(jié)果,給出計(jì)算平臺(tái)所需投入的最小節(jié)點(diǎn)規(guī)模。
(5)網(wǎng)絡(luò)承載能力預(yù)測(cè)模塊:根據(jù)內(nèi)存參數(shù)和、M等平臺(tái)信息,預(yù)測(cè)計(jì)算平臺(tái)所能承載的最大SNN模型規(guī)模。
內(nèi)存參數(shù)幾乎不受計(jì)算平臺(tái)和具體SNN模型的影響。采用分析與手動(dòng)量化方法獲取所有內(nèi)存參數(shù)。結(jié)果如表2所示。
表2 參數(shù)獲取結(jié)果
如圖6所示,SNN模型參數(shù)采集模塊內(nèi)嵌在NEST仿真器的內(nèi)核中,使用NEST構(gòu)建SNN網(wǎng)絡(luò)時(shí)自動(dòng)調(diào)用該模塊。輸入系統(tǒng)的SNN腳本文件通過接口nest.Create()和nest.Connect()調(diào)用NEST內(nèi)核函數(shù),進(jìn)行神經(jīng)元群落創(chuàng)建和突觸連接。同時(shí)這兩個(gè)接口也將各群落神經(jīng)元規(guī)模,突觸連接規(guī)則等信息傳入NEST內(nèi)核。SNN模型參數(shù)采集模塊使用2張參數(shù)表(群落表v_population和群落入度表v_in)記錄這些模型信息。每當(dāng)調(diào)用nest.Create()創(chuàng)建神經(jīng)元群落時(shí),v_population記錄了此次創(chuàng)建的群落神經(jīng)元數(shù)量。每當(dāng)調(diào)用nest.Connect()創(chuàng)建突觸連接時(shí),在v_in中記錄突觸連接目標(biāo)神經(jīng)元的入度(tgt)。
圖6 參數(shù)采集與預(yù)測(cè)
如圖6所示,內(nèi)存消耗預(yù)測(cè)模塊首先讀取內(nèi)存參數(shù)獲取、SNN模型參數(shù)采集模塊所獲得的全部參數(shù)數(shù)值,然后根據(jù)1.2節(jié)中的內(nèi)存負(fù)載模型設(shè)計(jì)了負(fù)載計(jì)算函數(shù),對(duì)所獲取的全部建模參數(shù)進(jìn)行處理,最終預(yù)測(cè)出分布式計(jì)算平臺(tái)投入個(gè)節(jié)點(diǎn)運(yùn)行SNN模型的總內(nèi)存消耗()。
完成內(nèi)存負(fù)載預(yù)測(cè)后,根據(jù)式(4)所示的穩(wěn)定性能標(biāo)準(zhǔn)給出計(jì)算平臺(tái)為滿足模型內(nèi)存需要所需投入的最小節(jié)點(diǎn)數(shù),即最小性能穩(wěn)定點(diǎn)。
其中M是計(jì)算平臺(tái)每個(gè)節(jié)點(diǎn)能夠提供的內(nèi)存大小,是平臺(tái)能夠提供的最大節(jié)點(diǎn)數(shù),所有滿足條件()≤M的節(jié)點(diǎn)規(guī)模均是可行節(jié)點(diǎn)規(guī)模,即能夠滿足網(wǎng)絡(luò)內(nèi)存需求,保證平臺(tái)平穩(wěn)運(yùn)行。在所有可行節(jié)點(diǎn)規(guī)模中節(jié)點(diǎn)數(shù)量最小的即是最小性能穩(wěn)定點(diǎn)Psteady。
內(nèi)存消耗預(yù)測(cè)模塊中,預(yù)測(cè)的是SNN模型規(guī)模保持不變的情況下,平臺(tái)的內(nèi)存消耗。而網(wǎng)絡(luò)承載能力預(yù)測(cè),則是預(yù)測(cè)當(dāng)計(jì)算平臺(tái)的可用內(nèi)存均被占用時(shí),所能承載SNN模型規(guī)模。
在分布式計(jì)算平臺(tái)上構(gòu)建SNN模型時(shí),若每個(gè)節(jié)點(diǎn)消耗的總內(nèi)存都達(dá)到節(jié)點(diǎn)能提供的最大內(nèi)存M,則SNN模型的規(guī)模達(dá)到了平臺(tái)網(wǎng)絡(luò)承載能力的極限。而單節(jié)點(diǎn)的總內(nèi)存消耗包含M、M、M三部分,因此上述關(guān)系可以用公式(5)描述:
隨著投入計(jì)算節(jié)點(diǎn)數(shù)量的增加,分布式平臺(tái)的網(wǎng)絡(luò)承載能力也會(huì)提升。如公式(6)所示,根據(jù)1.2節(jié)建立的負(fù)載模型,可以將公式(5)轉(zhuǎn)化為平臺(tái)投入計(jì)算節(jié)點(diǎn)數(shù)與平臺(tái)網(wǎng)絡(luò)承載能力之間的關(guān)系,其中代表SNN模型的網(wǎng)絡(luò)規(guī)模,即模型中的神經(jīng)元數(shù)量。
基于式(6),網(wǎng)絡(luò)承載能力預(yù)測(cè)模塊根據(jù)前面流程中獲取的內(nèi)存參數(shù)、輸入系統(tǒng)的M等參數(shù),預(yù)測(cè)投入個(gè)節(jié)點(diǎn)時(shí)的計(jì)算平臺(tái)能承載的最大SNN模型規(guī)模。
本文采用高性能計(jì)算機(jī)基準(zhǔn)測(cè)試(HPC_benchmark)作為測(cè)試案例。該SNN模型中包含2個(gè)神經(jīng)元群落,神經(jīng)元群落間共有4組不同的連接關(guān)系,連接關(guān)系包含多條突觸。通過設(shè)定比例參數(shù)可以成倍調(diào)節(jié)模型網(wǎng)絡(luò)規(guī)模。本文選用的比例參數(shù)為0.5,此時(shí)網(wǎng)絡(luò)模型包含5 625個(gè)神經(jīng)元和3 165萬條突觸。
為了驗(yàn)證內(nèi)存負(fù)載分析系統(tǒng)的有效性,本實(shí)驗(yàn)針對(duì)HPC_benchmark,使用內(nèi)存負(fù)載分析系統(tǒng)預(yù)測(cè)模型內(nèi)存負(fù)載,并與實(shí)測(cè)數(shù)據(jù)進(jìn)行對(duì)比。此外,利用系統(tǒng)的網(wǎng)絡(luò)承載能力預(yù)測(cè)功能,對(duì)分布式平臺(tái)在投入不同數(shù)量節(jié)點(diǎn)時(shí)的網(wǎng)絡(luò)承載能力進(jìn)行預(yù)測(cè),并且與實(shí)測(cè)平臺(tái)網(wǎng)絡(luò)承載能力進(jìn)行了對(duì)比。
使用集群內(nèi)存負(fù)載分析系統(tǒng)預(yù)測(cè)的內(nèi)存消耗分布如圖7所示,由于HPC_benchmark中突觸的數(shù)量較多,因此突觸內(nèi)存消耗M遠(yuǎn)大于神經(jīng)元內(nèi)存消耗M。此外,隨著PYNQ集群投入的計(jì)算節(jié)點(diǎn)數(shù)增加,每個(gè)節(jié)點(diǎn)上的神經(jīng)元、突觸內(nèi)存消耗均被稀釋,而初始化內(nèi)存消耗M的數(shù)值保持穩(wěn)定。
圖7 內(nèi)存消耗分布
圖8中,實(shí)線代表PYNQ集群投入不同數(shù)量節(jié)點(diǎn)運(yùn)行HPC_benchmark時(shí)實(shí)測(cè)的內(nèi)存消耗,虛線代表使用內(nèi)存負(fù)載分析系統(tǒng)預(yù)測(cè)的數(shù)據(jù)。通過數(shù)據(jù)對(duì)比可知,使用內(nèi)存負(fù)載分析系統(tǒng)預(yù)測(cè)的總內(nèi)存消耗十分接近實(shí)測(cè)數(shù)據(jù),平均而言系統(tǒng)的內(nèi)存負(fù)載預(yù)測(cè)準(zhǔn)確率達(dá)到了97.98%。此外,PYNQ集群?jiǎn)喂?jié)點(diǎn)能提供最大內(nèi)存約為450 MB,根據(jù)內(nèi)存負(fù)載預(yù)測(cè)推測(cè)出的最小性能穩(wěn)定點(diǎn)Psteady為3個(gè)節(jié)點(diǎn),與實(shí)測(cè)數(shù)據(jù)相符。
圖8 內(nèi)存消耗預(yù)測(cè)數(shù)據(jù)與實(shí)測(cè)數(shù)據(jù)對(duì)比
在本實(shí)驗(yàn)中,首先通過手動(dòng)反復(fù)調(diào)整HPC_benchmark網(wǎng)絡(luò)規(guī)模的方式,確定平臺(tái)投入不同數(shù)量節(jié)點(diǎn)時(shí)的真實(shí)網(wǎng)絡(luò)承載能力。然后將系統(tǒng)預(yù)測(cè)的平臺(tái)網(wǎng)絡(luò)承載能力與實(shí)測(cè)數(shù)據(jù)進(jìn)行了對(duì)比。
圖9中,實(shí)線表示實(shí)際測(cè)得集群所能承載的網(wǎng)絡(luò)模型最大規(guī)模隨計(jì)算節(jié)點(diǎn)數(shù)的變化關(guān)系,虛線表示使用內(nèi)存負(fù)載分析系統(tǒng)預(yù)測(cè)的數(shù)據(jù)隨計(jì)算節(jié)點(diǎn)數(shù)的變化關(guān)系??捎每闯?,預(yù)測(cè)的與實(shí)測(cè)數(shù)據(jù)十分接近。整體而言,內(nèi)存負(fù)載分析系統(tǒng)在網(wǎng)絡(luò)承載能力預(yù)測(cè)方面的準(zhǔn)確率約為97.19%。
圖9 網(wǎng)絡(luò)承載能力預(yù)測(cè)結(jié)果與實(shí)測(cè)數(shù)據(jù)對(duì)比
本文針對(duì)類腦計(jì)算平臺(tái)難以進(jìn)行高效的SNN工作負(fù)載研究的問題,搭建了規(guī)??缮炜s的PYNQ集群類腦計(jì)算平臺(tái),設(shè)計(jì)了內(nèi)存負(fù)載分析系統(tǒng),通過準(zhǔn)確預(yù)測(cè)SNN模型在集群的上內(nèi)存消耗以及集群的網(wǎng)絡(luò)承載能力,提高了在PYNQ集群分布式計(jì)算平臺(tái)上進(jìn)行SNN工作負(fù)載的研究的效率。
在后續(xù)工作中,可以針對(duì)集群運(yùn)行SNN模型的性能瓶頸進(jìn)行優(yōu)化,為SNN工作負(fù)載的研究提供高性能的平臺(tái)。