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