李佩琦,郁龔健,華 夏,劉家航,柴志雷,3+
1.江南大學(xué) 物聯(lián)網(wǎng)工程學(xué)院,江蘇 無(wú)錫214122
2.江南大學(xué) 人工智能與計(jì)算機(jī)學(xué)院,江蘇 無(wú)錫214122
3.江蘇省模式識(shí)別與計(jì)算智能工程實(shí)驗(yàn)室,江蘇 無(wú)錫214122
當(dāng)前,以深度學(xué)習(xí)為代表的智能計(jì)算系統(tǒng)仍存在系統(tǒng)能耗高、通用智能水平弱兩個(gè)主要瓶頸,難以成為解決人工智能問(wèn)題的終極手段[1]。而人類(lèi)的大腦是由約1011個(gè)神經(jīng)元、1015個(gè)突觸構(gòu)成的復(fù)雜生物體,不但具有很高的智能水平而且功耗只有20 W 左右[2],其計(jì)算模式非常值得研究借鑒。目前的類(lèi)腦計(jì)算主要基于工作機(jī)理更接近生物大腦的脈沖神經(jīng)網(wǎng)絡(luò)(spiking neural networks,SNN)來(lái)實(shí)現(xiàn)[3]。由于達(dá)到一定規(guī)模的SNN 才能展現(xiàn)出較強(qiáng)的智能水平,類(lèi)腦計(jì)算最具挑戰(zhàn)性的難題之一,就是對(duì)大規(guī)模SNN進(jìn)行仿真時(shí)保持系統(tǒng)的高性能及低功耗。
針對(duì)類(lèi)腦計(jì)算的高能效需求,工業(yè)界和學(xué)術(shù)界嘗試采用專(zhuān)用類(lèi)腦芯片和系統(tǒng)來(lái)實(shí)現(xiàn)脈沖神經(jīng)網(wǎng)絡(luò)。2018 年曼徹斯特大學(xué)推出了SpiNNaker2 神經(jīng)芯片,該芯片相比第一代專(zhuān)門(mén)構(gòu)建了用于指數(shù)和對(duì)數(shù)運(yùn)算的硬件加速器,通過(guò)定點(diǎn)化設(shè)計(jì),在有一定精度損失的情況下提高了芯片能效比[4-5]。2020 年,英特爾推出神經(jīng)擬態(tài)系統(tǒng)Pohoiki Springs,其內(nèi)部由768顆Loihi 神經(jīng)擬態(tài)芯片組成,該系統(tǒng)在低于500 W 功耗的情況下可使用多達(dá)1 億個(gè)神經(jīng)元來(lái)執(zhí)行任務(wù)[6]。“天機(jī)芯”是清華大學(xué)類(lèi)腦計(jì)算研究中心施路平團(tuán)隊(duì)研發(fā)的一款新型人工智能芯片,整個(gè)芯片由156 個(gè)計(jì)算單元(Fcore)組成,包含約4 萬(wàn)個(gè)神經(jīng)元和1 000 萬(wàn)個(gè)突觸,支持機(jī)器學(xué)習(xí)算法和現(xiàn)有類(lèi)腦計(jì)算算法[7]。2020 年浙江大學(xué)推出了類(lèi)腦芯片“達(dá)爾文2”,該芯片由576 個(gè)內(nèi)核組成,每個(gè)內(nèi)核支持256 個(gè)神經(jīng)元,神經(jīng)突觸超過(guò)1 000 萬(wàn),通過(guò)系統(tǒng)級(jí)擴(kuò)展可構(gòu)建千萬(wàn)級(jí)神經(jīng)元類(lèi)腦計(jì)算系統(tǒng)[8]。
專(zhuān)用的類(lèi)腦芯片與系統(tǒng)可以達(dá)到更佳的性能和功耗指標(biāo),但存在面向不同應(yīng)用時(shí)適應(yīng)性差的缺陷。當(dāng)其與應(yīng)用負(fù)載不匹配時(shí),能效表現(xiàn)會(huì)大打折扣。例如,在SpiNNaker 上運(yùn)行一個(gè)全尺寸皮質(zhì)微電路模型時(shí)[9],由于該模型中神經(jīng)元連接的突觸數(shù)量超過(guò)了SpiNNaker 設(shè)定的最優(yōu)值,平臺(tái)無(wú)法運(yùn)行在最優(yōu)狀態(tài),計(jì)算能效還不如基于高性能集群的NEST 軟件模擬方式[10]或單塊GPU(graphics processing unit)方式[11]。
類(lèi)腦計(jì)算的另一種實(shí)現(xiàn)方式是以軟件方式構(gòu)建類(lèi)腦仿真器,目前比較成熟的類(lèi)腦仿真器如Brain[12]、NEST[13]、BindsNET[14]等已得到了大量的應(yīng)用,并且形成了各自的生態(tài)。采用軟件方式實(shí)現(xiàn)具有靈活性強(qiáng)、精度高等優(yōu)點(diǎn),但存在計(jì)算復(fù)雜度高、仿真速度慢、運(yùn)行功耗高等問(wèn)題。
軟件實(shí)現(xiàn)的類(lèi)腦仿真器中,NEST 仿真器生態(tài)完整、用戶(hù)眾多,相比其他類(lèi)腦仿真器,NEST 交互接口完備,可以在Arm、X86 等不同計(jì)算平臺(tái)上運(yùn)行,并且支持并行與分布式計(jì)算。本文首要解決的工程問(wèn)題是如何在保持良好應(yīng)用生態(tài)的前提下追求計(jì)算能效最高,因此本文的工作選擇通過(guò)PYNQ 集群加速NEST,而不是直接做類(lèi)腦芯片或系統(tǒng)。
在基于PYNQ 集群加速NEST 時(shí),需要解決的關(guān)鍵問(wèn)題是如何通過(guò)硬件定制、軟硬件協(xié)同,使得SNN的應(yīng)用負(fù)載和硬件平臺(tái)相互最佳適配,達(dá)到最佳能效。本文提出一種基于PYNQ 集群的高能效NEST類(lèi)腦仿真器PEST,希望以此為類(lèi)腦仿真提供一個(gè)合適的計(jì)算平臺(tái),本文的主要工作如下:
(1)構(gòu)建大規(guī)模PYNQ 集群,實(shí)現(xiàn)基于NEST 仿真器的規(guī)??缮炜s類(lèi)腦計(jì)算系統(tǒng);
(2)針對(duì)單節(jié)點(diǎn)進(jìn)行優(yōu)化,設(shè)計(jì)軟硬件數(shù)據(jù)交互接口,通過(guò)FPGA(field programmable gate array)并行與流水化設(shè)計(jì)、計(jì)算定點(diǎn)化等實(shí)現(xiàn)IAF 神經(jīng)元FPGA硬件加速;
(3)針對(duì)集群整體進(jìn)行優(yōu)化和分析,設(shè)計(jì)集群的網(wǎng)絡(luò)文件系統(tǒng),分析集群性能功耗平衡點(diǎn),通過(guò)消息傳遞接口(message passing interface,MPI)分布式計(jì)算實(shí)現(xiàn)PEST 高能效計(jì)算。
NEST 是一個(gè)可以構(gòu)建大規(guī)模神經(jīng)網(wǎng)絡(luò)模型的脈沖神經(jīng)網(wǎng)絡(luò)仿真器。它包含了50 多種神經(jīng)元模型和10 余種突觸模型[15]。在NEST 中,不同的神經(jīng)元和突觸模型可以共存,任何兩個(gè)神經(jīng)元都可以有不同性質(zhì)的多重連接。NEST的另一個(gè)特點(diǎn)是可以進(jìn)行擴(kuò)展,用戶(hù)可以添加自定義神經(jīng)元、突觸和設(shè)備模型[16]。目前NEST 作為主流的脈沖神經(jīng)網(wǎng)絡(luò)模擬器被廣泛使用。NEST 的應(yīng)用從基礎(chǔ)的單個(gè)神經(jīng)元實(shí)現(xiàn)[17]到復(fù)雜的人類(lèi)小腦網(wǎng)絡(luò)模型仿真[18]都有涉及,并且運(yùn)行在NEST 上的應(yīng)用都可通過(guò)Python 語(yǔ)言進(jìn)行開(kāi)發(fā)。
如圖1 所示,NEST 仿真器在運(yùn)行時(shí)主要包含創(chuàng)建、連接、仿真3 個(gè)階段。在仿真階段中一般又分為發(fā)送、更新和收集3 個(gè)部分。針對(duì)不同的應(yīng)用場(chǎng)景,每部分的仿真時(shí)間所占的比例有一定的差異。
Fig.1 NEST simulator running mechanism圖1 NEST 仿真器運(yùn)行機(jī)制
NEST 仿真器通過(guò)C++進(jìn)行開(kāi)發(fā),在NEST 中包含一個(gè)獨(dú)立的PyNN 后端接口,允許與PyNN 配合使用。PyNN 是一款開(kāi)源的神經(jīng)網(wǎng)絡(luò)仿真器的通用接口,用戶(hù)可以通過(guò)PyNN 將Python 腳本直接運(yùn)行在NEST 仿真器上,實(shí)現(xiàn)通過(guò)Python 對(duì)NEST 的編程和調(diào)試。
NEST 可支持并行與分布式計(jì)算,它通過(guò)自身包含的MPI 通信協(xié)議與多臺(tái)計(jì)算機(jī)進(jìn)行數(shù)據(jù)通信。通過(guò)MPI 的并行編程模式可以建立一個(gè)由多臺(tái)計(jì)算機(jī)構(gòu)成的計(jì)算集群,圖2 展示了NEST 運(yùn)行小型分布式網(wǎng)絡(luò)時(shí)的運(yùn)行機(jī)制。
Fig.2 NEST parallel distributed computing diagram圖2 NEST 并行分布式計(jì)算圖
圖2 中,NEST 運(yùn)行在由2 臺(tái)計(jì)算機(jī)(節(jié)點(diǎn))構(gòu)成的分布式計(jì)算平臺(tái)上,NEST 進(jìn)行分布式計(jì)算時(shí)會(huì)將要計(jì)算的神經(jīng)元平均分配給每個(gè)節(jié)點(diǎn),圖中設(shè)定4 個(gè)IAF 神經(jīng)元,因此每個(gè)節(jié)點(diǎn)分配2 個(gè),Proxy 用來(lái)表示存在于其他節(jié)點(diǎn)上的神經(jīng)元id。Sg 和Sd 分別代表脈沖生成器和脈沖探測(cè)器,這兩部分需要在每個(gè)節(jié)點(diǎn)上進(jìn)行構(gòu)建。
計(jì)算集群采用Xilinx PYNQ-Z2 開(kāi)發(fā)板構(gòu)建。其主芯片為Zynq 7020,該芯片是Xilinx 公司推出的全可編程SoC 芯片(all programmable system on chips,APSOC)。如圖3,它主要由ARM 處理器(processing system,PS)和可編程邏輯FPGA(programmable logic,PL)兩大部分組成[19],兩部分的數(shù)據(jù)主要通過(guò)AXI 總線進(jìn)行傳輸。
Fig.3 Hardware architecture of PYNQ-Z2圖3 PYNQ-Z2 硬件架構(gòu)
PYNQ 框架是在FPGA+CPU 異構(gòu)系統(tǒng)的基礎(chǔ)上引入了Python,其提供了一種更友好、更易用的開(kāi)發(fā)方式,降低了FPGA 開(kāi)發(fā)門(mén)檻。PYNQ 開(kāi)源框架主要包含PYNQ 硬件庫(kù)和Overlay 設(shè)計(jì)兩部分[20]。PYNQ硬件庫(kù)可用于加速軟件應(yīng)用程序,或?yàn)樘囟☉?yīng)用程序定制專(zhuān)用硬件平臺(tái)。Overlay 設(shè)計(jì)由兩個(gè)主要部分組成,一個(gè)是PL 設(shè)計(jì)(生成bitstream),另一個(gè)是Tcl項(xiàng)目框圖文件。PL 設(shè)計(jì)通常是高度優(yōu)化的特定任務(wù),Overlay 通常設(shè)計(jì)為可配置的,可用于不同的應(yīng)用程序中。
圖4 為PYNQ 框架硬件結(jié)構(gòu)圖,用戶(hù)通過(guò)PC 訪問(wèn)ARM 端的Jupyter,在Jupyter 中可以調(diào)用PYNQ 硬件庫(kù)控制FPGA 以實(shí)現(xiàn)各種功能。
Fig.4 Hardware structure diagram of PYNQ framework圖4 PYNQ 框架硬件結(jié)構(gòu)圖
2.3.1 整體設(shè)計(jì)
Fig.5 Cluster hardware structure diagram圖5 集群硬件結(jié)構(gòu)圖
PYNQ 集群的結(jié)構(gòu)設(shè)計(jì)如圖5 所示,整體可以分為三層:第一層為計(jì)算節(jié)點(diǎn)層;第二層為網(wǎng)絡(luò)交互層;第三層為系統(tǒng)控制層。計(jì)算節(jié)點(diǎn)層在PYNQ 集群中負(fù)責(zé)數(shù)據(jù)的處理,該層每個(gè)節(jié)點(diǎn)間沒(méi)有連接關(guān)系,各節(jié)點(diǎn)都通過(guò)以太網(wǎng)連接到網(wǎng)絡(luò)交互層。網(wǎng)絡(luò)交互層主要是由網(wǎng)絡(luò)交換機(jī)組成的,在運(yùn)行時(shí)計(jì)算節(jié)點(diǎn)間會(huì)相互發(fā)送脈沖信息,該層的主要任務(wù)是負(fù)責(zé)節(jié)點(diǎn)間信息傳輸,另外系統(tǒng)控制層的各種指令會(huì)通過(guò)該層發(fā)送到每一個(gè)節(jié)點(diǎn)上,該層還起到連接系統(tǒng)控制層和計(jì)算節(jié)點(diǎn)層的作用。系統(tǒng)控制層由計(jì)算節(jié)點(diǎn)中的主節(jié)點(diǎn)構(gòu)成,任意節(jié)點(diǎn)都可充當(dāng)主節(jié)點(diǎn),用戶(hù)可自行定義,它相比其他節(jié)點(diǎn)最大的不同是要負(fù)責(zé)計(jì)算任務(wù)的分發(fā)和接收其他節(jié)點(diǎn)處理完的計(jì)算結(jié)果,主節(jié)點(diǎn)在系統(tǒng)運(yùn)行時(shí)也要執(zhí)行相應(yīng)的計(jì)算任務(wù),整體上與其他節(jié)點(diǎn)的差異很小。
該集群可擴(kuò)展性強(qiáng),由于在本集群中不涉及到任何的專(zhuān)用電路,可以根據(jù)需要對(duì)集群規(guī)模進(jìn)行相應(yīng)的調(diào)整。如果要對(duì)計(jì)算節(jié)點(diǎn)進(jìn)行擴(kuò)充只需要將新的計(jì)算節(jié)點(diǎn)與網(wǎng)絡(luò)交互層相連并且保證主節(jié)點(diǎn)能夠訪問(wèn)到該節(jié)點(diǎn)即可。PYNQ集群計(jì)算平臺(tái)如圖6所示。
Fig.6 PYNQ cluster computing platform圖6 PYNQ 集群計(jì)算平臺(tái)
2.3.2 集群計(jì)算規(guī)模
單塊PYNQ 開(kāi)發(fā)板的內(nèi)存大小為512 MB[21],通過(guò)實(shí)際測(cè)試,在排除用于運(yùn)行系統(tǒng)和NEST 仿真器初始化所需要的內(nèi)存后,可用的內(nèi)存大小約為200 MB左右。NEST 仿真器運(yùn)行時(shí)每個(gè)神經(jīng)元和突觸所占用的內(nèi)存大小分別約為1 500 B 和50 B[22]。如果NEST 運(yùn)行在單節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)上最多可以支持14萬(wàn)個(gè)神經(jīng)元或者410 萬(wàn)個(gè)突觸的計(jì)算規(guī)模。如果多個(gè)節(jié)點(diǎn)同時(shí)工作,由于NEST 在進(jìn)行分布式計(jì)算時(shí)會(huì)將神經(jīng)元和突觸平分給全部節(jié)點(diǎn)進(jìn)行計(jì)算,在單節(jié)點(diǎn)的計(jì)算規(guī)模不變的情況下,增加節(jié)點(diǎn)數(shù)量,相當(dāng)于成倍擴(kuò)大了計(jì)算規(guī)模,理論上N節(jié)點(diǎn)的集群最大支持14×N萬(wàn)個(gè)神經(jīng)元計(jì)算或者410×N萬(wàn)個(gè)突觸計(jì)算。
2.3.3 網(wǎng)絡(luò)設(shè)計(jì)
集群在運(yùn)行時(shí),位于各節(jié)點(diǎn)上的神經(jīng)元在達(dá)到閾值時(shí)會(huì)發(fā)射脈沖給目標(biāo)神經(jīng)元,如果目標(biāo)神經(jīng)元位于其他節(jié)點(diǎn)上則會(huì)通過(guò)網(wǎng)絡(luò)交互層將脈沖信息發(fā)送到對(duì)應(yīng)節(jié)點(diǎn),在PYNQ 集群中使用了2 個(gè)千兆交換機(jī)通過(guò)橋接的方式構(gòu)建網(wǎng)絡(luò)交互層。NEST 中單個(gè)神經(jīng)元發(fā)送脈沖時(shí)通信數(shù)據(jù)量為4 B,并且單個(gè)神經(jīng)元脈沖發(fā)射頻率通常低于100 次/s[16]。假設(shè)每個(gè)節(jié)點(diǎn)都工作在理論最大神經(jīng)元數(shù)量下,并且全部神經(jīng)元的所有脈沖都發(fā)射到其他節(jié)點(diǎn),那么每個(gè)節(jié)點(diǎn)的通信量為53 MB/s,千兆交換機(jī)的傳輸速度高于該值,可以保證集群物理層的數(shù)據(jù)傳輸需求。
3.1.1 單節(jié)點(diǎn)實(shí)現(xiàn)
單節(jié)點(diǎn)設(shè)計(jì)如圖7 所示,用戶(hù)可以通過(guò)Python 設(shè)計(jì)SNN 計(jì)算模型并運(yùn)行在Jupyter Notebook 上,在Jupyter Notebook 中調(diào)用PyNN 庫(kù),PyNN 通過(guò)PyNEST界面或者SLI 解釋器運(yùn)行NEST 來(lái)實(shí)現(xiàn)相應(yīng)的功能,ARM 端的NEST 仿真器包含有AXI 接口可以實(shí)現(xiàn)與FPGA 部分的數(shù)據(jù)傳輸。由于FPGA 設(shè)計(jì)靈活、可以并行計(jì)算的特點(diǎn),可以將NEST 仿真器上適合并行計(jì)算的步驟(神經(jīng)元更新、突觸更新等)根據(jù)使用需求移植到FPGA 上進(jìn)行計(jì)算,提升NEST 仿真器的整體計(jì)算速度。
Fig.7 Single-node PEST structure framework圖7 單節(jié)點(diǎn)PEST 結(jié)構(gòu)框架
3.1.2 PYNQ-Z2 內(nèi)存分配
在PYNQ 中通常會(huì)通過(guò)CMA 函數(shù)申請(qǐng)一段連續(xù)內(nèi)存來(lái)實(shí)現(xiàn)ARM 與FPGA 之間的信息交互。CMA 函數(shù)申請(qǐng)到內(nèi)存后會(huì)將內(nèi)存的起始地址發(fā)送給ARM 與FPGA,ARM 與FPGA 再將所要相互傳輸?shù)臄?shù)據(jù)寫(xiě)入到這塊內(nèi)存中以供對(duì)方通過(guò)內(nèi)存地址直接讀取。通過(guò)CMA 函數(shù)申請(qǐng)內(nèi)存可以根據(jù)實(shí)際需求申請(qǐng)內(nèi)存大小,但是采用此種方法申請(qǐng)的內(nèi)存起始地址隨機(jī),并且每次使用時(shí)都需要重新申請(qǐng)。
為了方便ARM 與FPGA 之間進(jìn)行數(shù)據(jù)的交互,將PYNQ-Z2 的內(nèi)存空間專(zhuān)門(mén)劃分出一部分用于數(shù)據(jù)交互,避免每次使用時(shí)都要重新申請(qǐng)內(nèi)存,內(nèi)存優(yōu)化如圖8 所示。在PYNQ 中DDR 大小為512 MB,內(nèi)存地址為0x0-0x20000000,劃分的共享內(nèi)存大小由所傳輸?shù)臄?shù)據(jù)量決定,計(jì)算公式為:
其中,ddr_size為內(nèi)存的整體大??;neuron_num為神經(jīng)元的數(shù)量;data_type為數(shù)據(jù)類(lèi)型;para_num為神經(jīng)元的參數(shù)數(shù)量。
Fig.8 PYNQ-Z2 shared memory allocation diagram圖8 PYNQ-Z2 共享內(nèi)存分配圖
根據(jù)公式,本設(shè)計(jì)將每個(gè)節(jié)點(diǎn)的共享內(nèi)存大小設(shè)定為64 MB,起始地址為0x1C000000,該共享內(nèi)存大小可以保證單節(jié)點(diǎn)在最大神經(jīng)元數(shù)量時(shí)每個(gè)神經(jīng)元存儲(chǔ)119 個(gè)4 B 參數(shù),滿(mǎn)足NEST 計(jì)算時(shí)的使用需求。內(nèi)存重新分配后,ARM 與FPGA 進(jìn)行數(shù)據(jù)交互可以直接將數(shù)據(jù)寫(xiě)入共享內(nèi)存中而不需要每次重新申請(qǐng)內(nèi)存。
3.1.3 通用數(shù)據(jù)傳輸接口設(shè)計(jì)
NEST 運(yùn)行時(shí)神經(jīng)元與突觸的類(lèi)型和數(shù)量與計(jì)算模型的需求相關(guān),在運(yùn)行不同的計(jì)算模型時(shí)NEST計(jì)算瓶頸會(huì)有很大的不同,用戶(hù)可以根據(jù)不同的計(jì)算需求將需要被加速的計(jì)算模塊放到FPGA 上進(jìn)行并行和流水化設(shè)計(jì),因此設(shè)計(jì)通用的數(shù)據(jù)傳輸接口非常必要。
ARM 端與FPGA 兩部分?jǐn)?shù)據(jù)傳輸?shù)慕涌谠O(shè)計(jì)如圖9 所示,被加速部分為計(jì)算瓶頸,將該部分在ARM端移除,放到FPGA 部分重新設(shè)計(jì)。當(dāng)ARM 端的NEST 仿真器開(kāi)始運(yùn)行時(shí),首先映射一段共享內(nèi)存用來(lái)存放需要FPGA 計(jì)算的數(shù)據(jù),當(dāng)開(kāi)始仿真時(shí),將計(jì)算所需數(shù)據(jù)存入共享內(nèi)存中。
Fig.9 Software and hardware general data interface structure diagram圖9 軟硬件通用數(shù)據(jù)接口結(jié)構(gòu)圖
當(dāng)數(shù)據(jù)準(zhǔn)備完成后,通過(guò)軟件驅(qū)動(dòng)程序?qū)?nèi)存映射的地址data_address 通過(guò)AXI 控制總線發(fā)送給FPGA,F(xiàn)PGA 根據(jù)data_address 讀取共享內(nèi)存中對(duì)應(yīng)數(shù)據(jù)進(jìn)行計(jì)算。該部分的偽代碼如下所示,其中mem_size為每段數(shù)據(jù)所需要的內(nèi)存大小,fpga_address為FPGA 控制總線的基地址,offset 為控制總線的地址偏移量。
計(jì)算完成后FPGA 會(huì)通過(guò)AXI 控制總線發(fā)送完成信號(hào)到ARM 端,ARM 端接收到完成信號(hào)從共享內(nèi)存的指定位置讀出所需數(shù)據(jù)繼續(xù)運(yùn)行并解除映射,該部分偽代碼如下所示:
3.1.4 IAF 神經(jīng)元的硬件設(shè)計(jì)
在NEST 仿真器中,每個(gè)神經(jīng)元的計(jì)算相對(duì)獨(dú)立,各個(gè)神經(jīng)元在進(jìn)行更新的時(shí)候不會(huì)用到其他神經(jīng)元的數(shù)據(jù)和參數(shù),該種計(jì)算方式非常適合通過(guò)FPGA 進(jìn)行并行計(jì)算。IAF 神經(jīng)元是指數(shù)泄漏積分-觸發(fā)神經(jīng)元模型,其在SNN 中應(yīng)用廣泛,計(jì)算相對(duì)復(fù)雜,很可能會(huì)成為影響計(jì)算速度的瓶頸,對(duì)其進(jìn)行硬件加速十分必要。在不應(yīng)期之前IAF 神經(jīng)元只更新部分參數(shù),只有當(dāng)不應(yīng)期到來(lái)之后,IAF 神經(jīng)元才更新膜電位的值,膜電位的計(jì)算公式如下所示:
式中,Vm(t)為更新后的神經(jīng)元膜電位,Vm(t-1)為更新之前的神經(jīng)元膜電位,P22、P21ex、P21in、P20分別對(duì)應(yīng)膜電位衰減因子、興奮型電流衰減因子、抑制型電流衰減因子和初始化與外部電流的衰減因子,Si_syn_ex和Si_syn_in分別為興奮型電流和衰減型電流,Sie為外部輸入電流,Si0為初始化電流。
針對(duì)上述的計(jì)算方法,IAF 神經(jīng)元的硬件電路設(shè)計(jì)如圖10 所示,整個(gè)硬件電路分為三個(gè)階段:第一階段的主要工作是將單個(gè)神經(jīng)元計(jì)算所需要的衰減值、電流值和更新前的膜電位Vm(t-1)送入計(jì)算單元中進(jìn)行計(jì)算,得到最新的膜電位Vm(t);第二階段的工作是將Vm(t)與門(mén)限值進(jìn)行比較,如果Vm(t)大于門(mén)限值則進(jìn)入第三階段,否則將Vm(t)值暫存用于下一次的計(jì)算;第三階段Vm(t)會(huì)進(jìn)行復(fù)位并將該神經(jīng)元ID存入IDBuffer用于后續(xù)的計(jì)算。
Fig.10 Hardware implementation of IAF neuron圖10 IAF 神經(jīng)元硬件實(shí)現(xiàn)
在NEST 仿真器中神經(jīng)元計(jì)算為串行計(jì)算,正常情況下神經(jīng)元讀寫(xiě)數(shù)據(jù)各需要一個(gè)時(shí)鐘周期,假設(shè)單個(gè)神經(jīng)元的計(jì)算時(shí)間(latency)為N+2 個(gè)時(shí)鐘周期,當(dāng)串行計(jì)算時(shí)整體的計(jì)算時(shí)間為神經(jīng)元數(shù)量與單個(gè)神經(jīng)元計(jì)算時(shí)間的乘積。
由于每個(gè)神經(jīng)元的計(jì)算參數(shù)各自獨(dú)立,神經(jīng)元間的數(shù)據(jù)沒(méi)有相互依賴(lài)性,可以對(duì)神經(jīng)元計(jì)算部分進(jìn)行并行化處理,但由于數(shù)據(jù)吞吐量和FPGA 邏輯資源的限制,計(jì)算并行度有一定的局限性,通過(guò)設(shè)計(jì)流水化的計(jì)算結(jié)構(gòu)可以在資源受限的情況下大幅提高資源利用率,提高整體的計(jì)算性能。
針對(duì)IAF 神經(jīng)元的流水化設(shè)計(jì)如圖11 所示,IAF神經(jīng)元的計(jì)算過(guò)程在圖中簡(jiǎn)化為讀取數(shù)據(jù)(Rd)、計(jì)算(Ex)、寫(xiě)回?cái)?shù)據(jù)(Wr)三部分,其中num代表并行計(jì)算的神經(jīng)元數(shù)量,每個(gè)神經(jīng)元的計(jì)算時(shí)間同樣為N+2 個(gè)時(shí)鐘周期,當(dāng)同時(shí)使用并行處理和流水化操作后,其總體計(jì)算時(shí)間公式如下所示:
式中,all_latancy代表計(jì)算所需要的整體時(shí)間,latency代表單個(gè)神經(jīng)元的計(jì)算時(shí)間,neuron_num為整體的神經(jīng)元數(shù)量,num為神經(jīng)元計(jì)算時(shí)的并行度。
Fig.11 IAF neuron pipelining data processing圖11 IAF 神經(jīng)元流水化數(shù)據(jù)處理
3.1.5 IAF 神經(jīng)元數(shù)據(jù)傳輸優(yōu)化
IAF 神經(jīng)元的膜電位大于門(mén)限值時(shí)會(huì)對(duì)外發(fā)射脈沖,同時(shí)更新計(jì)算參數(shù)和權(quán)重,當(dāng)通過(guò)FPGA 進(jìn)行神經(jīng)元計(jì)算時(shí),每次需要傳輸?shù)臄?shù)據(jù)量如下所示:
其中,spike_num代表發(fā)射脈沖的神經(jīng)元數(shù)量,data_type為數(shù)據(jù)類(lèi)型,para_num為每個(gè)神經(jīng)元需要更新的參數(shù)數(shù)量。IAF 神經(jīng)元計(jì)算參數(shù)較多,并且NEST 仿真器中數(shù)據(jù)大多采用雙精度浮點(diǎn)數(shù),如果每次計(jì)算后對(duì)所有參數(shù)進(jìn)行更新則每個(gè)神經(jīng)元單次更新的數(shù)據(jù)有80 B。通過(guò)對(duì)IAF 神經(jīng)元的參數(shù)和計(jì)算結(jié)果進(jìn)行分析,神經(jīng)元的計(jì)算參數(shù)并不是每次計(jì)算后都需要更新,對(duì)全部計(jì)算參數(shù)根據(jù)不同的更新需求進(jìn)行分類(lèi),每次計(jì)算時(shí)只更新必要的數(shù)據(jù)以減少數(shù)據(jù)傳輸量,減少數(shù)據(jù)傳輸時(shí)間,輸入數(shù)據(jù)的設(shè)計(jì)如圖12所示。
Fig.12 Data input interface diagram圖12 數(shù)據(jù)輸入接口圖
IAF 神經(jīng)元的衰減因子在模型運(yùn)行后初始化,整體的數(shù)據(jù)量不超過(guò)56 B,并且在運(yùn)行階段不會(huì)改變,通過(guò)AXI_LITE 接口傳輸衰減因子可以減少高速接口的使用,節(jié)省資源。
IAF 神經(jīng)元的電流值與電壓值同樣只在模型運(yùn)行的初始化階段進(jìn)行賦值,但由于神經(jīng)元數(shù)量巨大,使用性能更好的AXI_Master 接口進(jìn)行數(shù)據(jù)傳輸,可以減少數(shù)據(jù)傳輸時(shí)間,計(jì)算傳輸時(shí)間的公式如下所示:
式中,ex_time為傳輸時(shí)間,bus_width為總線位寬,clock_frequency為時(shí)鐘頻率,由于AXI_Master 總線最大數(shù)據(jù)位寬為64 bit,在時(shí)鐘頻率為100 MHz 的情況下,總線帶寬高達(dá)763 MB/s,足夠滿(mǎn)足大量神經(jīng)元的數(shù)據(jù)傳輸要求。
IAF 神經(jīng)元的門(mén)限值和復(fù)位電壓等參數(shù)會(huì)在更新訓(xùn)練圖片時(shí)進(jìn)行更新,更新頻率較低,但每次更新時(shí)的數(shù)據(jù)量很大,對(duì)這些參數(shù)通過(guò)同一組AXI_Master接口進(jìn)行數(shù)據(jù)傳輸。
最后單獨(dú)設(shè)計(jì)一個(gè)AXI_Master 接口用于發(fā)出IAF 神經(jīng)元ID 并更新權(quán)重值,神經(jīng)元發(fā)射脈沖時(shí)會(huì)將該神經(jīng)元的ID 發(fā)送到ARM 端,并接收ARM 端發(fā)送過(guò)來(lái)的新權(quán)重值,因此每次FPGA 發(fā)送的神經(jīng)元ID個(gè)數(shù)與接收到的權(quán)重值數(shù)量保持一致,將這兩個(gè)相關(guān)的參數(shù)放到同一個(gè)高速接口上可以節(jié)省接口資源,還可以在每次數(shù)據(jù)傳輸時(shí)檢查數(shù)據(jù)數(shù)量是否一樣,保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性。
3.1.6 IAF 神經(jīng)元計(jì)算定點(diǎn)化
NEST 仿真器中默認(rèn)的數(shù)據(jù)類(lèi)型為雙精度浮點(diǎn)型,如果在FPGA 中使用雙精度浮點(diǎn)型數(shù)據(jù)進(jìn)行乘法或加法運(yùn)算會(huì)大量消耗FPGA 上的DSP 資源,嚴(yán)重影響神經(jīng)元計(jì)算并行度。
IAF 神經(jīng)元計(jì)算時(shí)包含興奮和抑制兩種類(lèi)型的衰減因子,它們?cè)谀P统跏蓟瘯r(shí)生成且都為固定值,其計(jì)算公式為:
其中,P為衰減因子,h為模型分辨率,tau為時(shí)間常數(shù)。由公式可知,衰減因子的數(shù)值主要分布在0~1之間。
NEST中,IAF神經(jīng)元默認(rèn)的閾值電壓為15 mV[23],當(dāng)神經(jīng)元的膜電位超過(guò)閾值電壓時(shí)神經(jīng)元發(fā)射脈沖,膜電位清零,因此,膜電位數(shù)值主要分布在0~15范圍內(nèi)。
IAF 神經(jīng)元的權(quán)重值分為興奮權(quán)重和抑制權(quán)重,它們主要受脈沖發(fā)射率影響,權(quán)重值會(huì)隨著脈沖發(fā)射率的提升而增大。IAF 神經(jīng)元的脈沖發(fā)射率一般低于20 Hz[24],因此權(quán)重值同樣存在一定數(shù)值范圍。通過(guò)運(yùn)行不同計(jì)算模型,統(tǒng)計(jì)IAF 神經(jīng)元數(shù)據(jù)分布情況,結(jié)果如圖13 所示。
Fig.13 Data distribution of IAF neurons圖13 IAF 神經(jīng)元數(shù)據(jù)分布
如圖13 所示,通過(guò)測(cè)試,IAF 神經(jīng)元的權(quán)重值主要分布在-1 400~1 400 之間,其數(shù)值范圍較大并且多為整數(shù),將權(quán)重值轉(zhuǎn)化為定點(diǎn)16 bit 數(shù)據(jù),可以在保證計(jì)算精度的情況下減少數(shù)據(jù)位寬,降低資源消耗,定點(diǎn)與浮點(diǎn)數(shù)轉(zhuǎn)化的計(jì)算公式如下所示。式中x為雙精度浮點(diǎn)數(shù),y為定點(diǎn)16 bit整數(shù),Q為定標(biāo)值。
對(duì)于權(quán)重值,當(dāng)定點(diǎn)數(shù)的數(shù)據(jù)精度為Q4(-2 048 ≤x≤2 047.937 5)時(shí)即可滿(mǎn)足使用需求。
衰減因子和膜電位大多位于0~1 之間,進(jìn)行計(jì)算時(shí)需要較高的精度。由于膜電位整數(shù)部分最少需要5 bit數(shù)據(jù),如果使用定點(diǎn)16 bit進(jìn)行計(jì)算,數(shù)據(jù)精度最多為Q11,會(huì)存在很大的精度損失。為保證更好的數(shù)據(jù)精度,將膜電位和衰減因子轉(zhuǎn)換成半精度浮點(diǎn)數(shù)進(jìn)行計(jì)算,使用半精度浮點(diǎn)數(shù)可以減少數(shù)據(jù)位寬,減少硬件資源的開(kāi)銷(xiāo)。在Xilinx 高層次綜合語(yǔ)言中包含有半精度浮點(diǎn)數(shù)(half)的功能,在硬件設(shè)計(jì)時(shí)可以直接使用half 進(jìn)行硬件設(shè)計(jì)。half 由16 bit 數(shù)據(jù)組成,可以表示6.10×10-5~6.550 4×104范圍內(nèi)的數(shù)值,在滿(mǎn)足整數(shù)范圍的同時(shí)小數(shù)位可以達(dá)到定點(diǎn)數(shù)Q14的精度。對(duì)定點(diǎn)16 bit、half、float 和double 類(lèi)型的資源消耗進(jìn)行對(duì)比,如圖14 所示,相比之下使用定點(diǎn)16 bit和half類(lèi)型的數(shù)據(jù)可以極大節(jié)省硬件資源。
Fig.14 Resource consumption comparison of different data types圖14 不同數(shù)據(jù)類(lèi)型資源消耗對(duì)比
3.2.1 基于PYNQ 集群的實(shí)現(xiàn)
如圖15 所示,整個(gè)集群通過(guò)以太網(wǎng)進(jìn)行連接,集群中的每個(gè)節(jié)點(diǎn)除了包含PYNQ 異構(gòu)計(jì)算單元外,還包含一組receive buffer 和send buffer,其中receive buffer 的作用是接收其他節(jié)點(diǎn)發(fā)送過(guò)來(lái)的脈沖信息供本節(jié)點(diǎn)進(jìn)行計(jì)算;send buffer 作用與receive buffer相反,用于將本節(jié)點(diǎn)內(nèi)產(chǎn)生的脈沖發(fā)送給其他節(jié)點(diǎn)。
Fig.15 Operation mechanism of PYNQ cluster圖15 PYNQ 集群的運(yùn)行機(jī)制
通過(guò)MPI 在多節(jié)點(diǎn)上運(yùn)行NEST 仿真器時(shí),仿真器首先會(huì)將神經(jīng)元與突觸的整體連接關(guān)系記錄下來(lái),再根據(jù)節(jié)點(diǎn)分布情況將神經(jīng)元和突觸平均分配給每一個(gè)節(jié)點(diǎn)進(jìn)行計(jì)算。當(dāng)其中一個(gè)節(jié)點(diǎn)上的某個(gè)神經(jīng)元需要發(fā)送脈沖時(shí),該節(jié)點(diǎn)會(huì)將神經(jīng)元信息放到send buffer 中并通過(guò)以太網(wǎng)發(fā)送給目標(biāo)節(jié)點(diǎn),目標(biāo)節(jié)點(diǎn)通過(guò)receive buffer 接收脈沖信息,進(jìn)行后續(xù)的計(jì)算。計(jì)算結(jié)束后再通過(guò)MPI 將各節(jié)點(diǎn)的神經(jīng)元計(jì)算結(jié)果收集起來(lái)。
3.2.2 PYNQ 集群計(jì)算平衡點(diǎn)分析
在理想情況下,如果運(yùn)行相同的計(jì)算模型,集群每個(gè)節(jié)點(diǎn)分配的計(jì)算量與節(jié)點(diǎn)數(shù)成反比,節(jié)點(diǎn)越多單個(gè)節(jié)點(diǎn)的計(jì)算量越小,整體計(jì)算速度越快。但是隨著節(jié)點(diǎn)增加,集群內(nèi)節(jié)點(diǎn)間通信愈加復(fù)雜,節(jié)點(diǎn)間的通信量增加,通信時(shí)間會(huì)隨著節(jié)點(diǎn)數(shù)增多而逐漸增加,集群整體計(jì)算性能甚至?xí)诠?jié)點(diǎn)數(shù)過(guò)多時(shí)出現(xiàn)下降。
在集群運(yùn)行時(shí)計(jì)算時(shí)間主要分為數(shù)據(jù)更新時(shí)間、通信時(shí)間和其他時(shí)間(運(yùn)行準(zhǔn)備時(shí)間、數(shù)據(jù)收集時(shí)間)這三部分。數(shù)據(jù)更新時(shí)間是集群用于計(jì)算的時(shí)間,它與計(jì)算量高度相關(guān),當(dāng)計(jì)算量一定時(shí),隨著節(jié)點(diǎn)增多該時(shí)間線性減少;其他時(shí)間根據(jù)不同的計(jì)算模型會(huì)有所不同,節(jié)點(diǎn)數(shù)量對(duì)該部分時(shí)間影響相對(duì)較小。影響集群通信時(shí)間的因素有很多,影響最大的分別為通信信息量、通信進(jìn)程數(shù)和網(wǎng)絡(luò)帶寬,MPI通信時(shí)間的計(jì)算公式如下所示:
其中,tmpi(sendbuffer,P)為P規(guī)模下每次發(fā)送sendbuffer內(nèi)數(shù)據(jù)所需要的時(shí)間,Td為整個(gè)計(jì)算的運(yùn)行次數(shù),tbandwidth為帶寬限制所造成的時(shí)間影響。由于設(shè)計(jì)集群時(shí)對(duì)網(wǎng)絡(luò)帶寬需求進(jìn)行過(guò)分析(2.3.3小節(jié)),網(wǎng)絡(luò)帶寬滿(mǎn)足使用需求,tbandwidth可以忽略不計(jì);tmpi(sendbuffer,P)可以通過(guò)時(shí)間統(tǒng)計(jì)函數(shù)進(jìn)行實(shí)際測(cè)量,當(dāng)計(jì)算節(jié)點(diǎn)增多或者計(jì)算規(guī)模增大時(shí),tmpi(sendbuffer,P)所需要的時(shí)間會(huì)相應(yīng)增多。
3.2.3 PYNQ 集群文件系統(tǒng)優(yōu)化
如果對(duì)集群中某一節(jié)點(diǎn)的文件或配置進(jìn)行修改,為保證集群能夠正常運(yùn)行,需要對(duì)所有節(jié)點(diǎn)都執(zhí)行相同的操作。隨著集群節(jié)點(diǎn)數(shù)量的增多,如果對(duì)每個(gè)節(jié)點(diǎn)的文件逐個(gè)修改會(huì)相當(dāng)耗時(shí),將網(wǎng)絡(luò)文件系統(tǒng)(network file system,NFS)引入PYNQ 集群可以方便對(duì)各節(jié)點(diǎn)文件進(jìn)行管理,集群中網(wǎng)絡(luò)文件系統(tǒng)整體設(shè)計(jì)如圖16 所示。
Fig.16 PYNQ cluster network file system structure圖16 PYNQ 集群網(wǎng)絡(luò)文件系統(tǒng)結(jié)構(gòu)
圖16 中,PC 作為服務(wù)器端存儲(chǔ)集群的文件系統(tǒng),不起到對(duì)集群的控制作用,PYNQ 集群的文件系統(tǒng)放在PC 指定的共享文件夾中,各節(jié)點(diǎn)作為客戶(hù)端通過(guò)交換機(jī)將文件系統(tǒng)加載到本地。如果對(duì)各個(gè)節(jié)點(diǎn)添加文件或者進(jìn)行修改,只需在PC 端的文件系統(tǒng)上進(jìn)行修改即可,以此可以提高集群的使用效率。
4.1.1 軟硬件實(shí)驗(yàn)平臺(tái)
軟件環(huán)境:NEST 仿真器2.14 版本,PyNN API,XilinxVivado 2018.2,XilinxVivadoHLS 2018.2,PYNQ鏡像2.4 版本。
硬件環(huán)境:集群每個(gè)節(jié)點(diǎn)為XilinxPYNQ-Z2 開(kāi)發(fā)板(FPGA 部分BlockRAMs 資源140,DSP48E資源220,LUT 資源53 200,F(xiàn)F 資源106 400)。目前集群使用48 塊PYNQ-Z2 開(kāi)發(fā)板構(gòu)建計(jì)算節(jié)點(diǎn)層,48 塊開(kāi)發(fā)板分成兩組連接在2 臺(tái)交換機(jī)上,位于網(wǎng)絡(luò)交互層的交換機(jī)相互橋接將48 塊開(kāi)發(fā)板構(gòu)建成一個(gè)完整的集群。
FPGA 加速部分通過(guò)Vivado HLS 進(jìn)行設(shè)計(jì),通過(guò)Vivado 工具綜合實(shí)現(xiàn)整體硬件電路并生成bitstream,計(jì)算模型運(yùn)行在Jupyter 上并通過(guò)PYNQ 框架進(jìn)行調(diào)用。
對(duì)照組硬件環(huán)境:IntelXeonE5-2620(8 cores,主頻2.1 GHz,128 GB 內(nèi)存)和AMDRyzen5 3600X(6 cores,主頻3.8 GHz,6 GB 內(nèi)存,虛擬機(jī))。
4.1.2 計(jì)算模型介紹
神經(jīng)網(wǎng)絡(luò)模型1:皮質(zhì)層視覺(jué)模型
皮質(zhì)層視覺(jué)模型是一個(gè)無(wú)監(jiān)督的圖像識(shí)別方案,該網(wǎng)絡(luò)架構(gòu)屬于麻省理工學(xué)院提出的HMAX 模型中的一種,它可以模仿生物學(xué)的機(jī)制對(duì)圖像進(jìn)行分類(lèi)[25]。如圖17 所示,該網(wǎng)絡(luò)為5 層網(wǎng)絡(luò),每層都由IAF 神經(jīng)元組成,前4 層網(wǎng)絡(luò)為模型的訓(xùn)練部分,由簡(jiǎn)單和復(fù)雜網(wǎng)絡(luò)層(S1,C1,S2,C2)交替組成;第5層的模型推理部分主要由分類(lèi)器構(gòu)成。
Fig.17 Cortical visual model network structure圖17 皮質(zhì)層視覺(jué)模型網(wǎng)絡(luò)結(jié)構(gòu)
皮質(zhì)層視覺(jué)模型使用Caltech 101 數(shù)據(jù)集進(jìn)行模型訓(xùn)練與結(jié)果驗(yàn)證。實(shí)際使用時(shí),數(shù)據(jù)集中的圖片按照?qǐng)D片尺寸分成128×128、200×200 和300×300 3 個(gè)數(shù)據(jù)集分別進(jìn)行測(cè)試。網(wǎng)絡(luò)中的神經(jīng)元數(shù)量與圖片尺寸成正比,并且逐層遞減(128×128 像素圖像會(huì)生成約13 萬(wàn)IAF 神經(jīng)元)。模型訓(xùn)練階段每個(gè)神經(jīng)元平均更新1 700 次,該時(shí)間占到了整體運(yùn)行時(shí)間的92%以上,神經(jīng)元在計(jì)算時(shí)相互獨(dú)立,沒(méi)有相互依賴(lài)關(guān)系,運(yùn)行該模型時(shí)非常適合通過(guò)大規(guī)模集群并行計(jì)算的方法提升計(jì)算速度。
神經(jīng)網(wǎng)絡(luò)模型2:皮層微電路模型
該模型模擬1 mm2小鼠大腦皮層的運(yùn)行機(jī)制,模型分為5 層,整體結(jié)構(gòu)如圖18 所示,L1 層代表大腦未被建模部分的外部輸入,Th神經(jīng)元群落代表丘腦皮層的輸入,L2/3、L4、L5 和L6 層代表4 層皮質(zhì),每層皮質(zhì)都包含一對(duì)興奮性(三角形)和抑制性(圓形)群落[9]。
Fig.18 Cortical microcircuit model network structure圖18 皮層微電路模型網(wǎng)絡(luò)結(jié)構(gòu)
該模型主要用于推斷局部皮質(zhì)網(wǎng)絡(luò)的連通性與活性的關(guān)系,完整規(guī)模為80 000 神經(jīng)元,但由于實(shí)驗(yàn)對(duì)照組AMD 3600X 平臺(tái)受制于可用內(nèi)存的限制,最多運(yùn)行16 000 神經(jīng)元,因此運(yùn)行該模型時(shí)選擇8 000和16 000 個(gè)IAF 神經(jīng)元進(jìn)行后續(xù)測(cè)試。該模型神經(jīng)元數(shù)量相比皮質(zhì)層視覺(jué)模型有所減少,但每個(gè)神經(jīng)元平均計(jì)算次數(shù)為1 萬(wàn)次,因此同樣存在整體計(jì)算時(shí)間過(guò)長(zhǎng)的問(wèn)題。
運(yùn)行皮質(zhì)層仿真模型的圖片訓(xùn)練部分,對(duì)比原版NEST 與單節(jié)點(diǎn)PEST 的神經(jīng)元脈沖發(fā)射率和脈沖激發(fā)圖,驗(yàn)證計(jì)算結(jié)果正確性,測(cè)試圖片選擇128×128 像素大小,IAF 神經(jīng)元數(shù)量13 萬(wàn),圖片數(shù)量10 張,每張圖片的仿真時(shí)間為170 ms,步進(jìn)值0.1,圖片縮放量分別為1.00、0.71、0.50、0.35。通過(guò)觀察運(yùn)行過(guò)程中脈沖激發(fā)圖可以驗(yàn)證計(jì)算結(jié)果的正確性,運(yùn)行結(jié)果如圖19 所示。
Fig.19 Contrast of cortical visual model results圖19 皮質(zhì)層視覺(jué)模型結(jié)果對(duì)比
圖19 中橫坐標(biāo)代表運(yùn)行時(shí)間,縱坐標(biāo)為神經(jīng)元序號(hào),隨著時(shí)間的推移,當(dāng)某個(gè)神經(jīng)元發(fā)射脈沖時(shí)會(huì)在圖中相應(yīng)位置打點(diǎn)。由于對(duì)比時(shí)采用完全一致的數(shù)據(jù)集和計(jì)算參數(shù),神經(jīng)元發(fā)射脈沖的時(shí)間應(yīng)大致相同,對(duì)比兩張脈沖激發(fā)圖可以發(fā)現(xiàn),單節(jié)點(diǎn)PEST與原版NEST 的脈沖激發(fā)圖基本一致,結(jié)果正確。
在各平臺(tái)運(yùn)行皮質(zhì)層視覺(jué)模型,使用100 張圖片進(jìn)行圖片分類(lèi)測(cè)試,查看最后的圖片分類(lèi)結(jié)果是否正確。如表1 所示,通過(guò)PC 運(yùn)行單精度浮點(diǎn)與雙精度浮點(diǎn)兩個(gè)版本的NEST 進(jìn)行對(duì)比,圖片分類(lèi)準(zhǔn)確率基本一致。在單節(jié)點(diǎn)PEST 上運(yùn)行半精度浮點(diǎn)和定點(diǎn)數(shù)混合的NEST版本圖片分類(lèi)準(zhǔn)確率降低4個(gè)百分點(diǎn)。
Table 1 Comparison of image classification test accuracy表1 圖像分類(lèi)測(cè)試準(zhǔn)確率對(duì)比
皮層微電路模型測(cè)試時(shí)使用8 000 個(gè)神經(jīng)元的模型規(guī)模進(jìn)行測(cè)試,其運(yùn)行結(jié)果以脈沖激發(fā)率的分布情況來(lái)表示。
Fig.20 Comparison of cortical microcircuit model results圖20 皮層微電路模型結(jié)果對(duì)比
圖20 為8 種不同皮層網(wǎng)絡(luò)連接時(shí)的脈沖發(fā)射率分布圖,其中深色矩形塊為脈沖發(fā)射率的主要分布區(qū)間,紅色豎線為脈沖發(fā)射率中位值,紅色加號(hào)為離群點(diǎn)。對(duì)比原版NEST 與單節(jié)點(diǎn)PEST 的運(yùn)行結(jié)果發(fā)現(xiàn),脈沖發(fā)射率的主要分布區(qū)間和中位值結(jié)果完全一致,離群點(diǎn)的結(jié)果由于計(jì)算精度的影響在個(gè)別情況下稍有誤差。
設(shè)計(jì)時(shí),在保證資源開(kāi)銷(xiāo)允許的情況下,最大限度地利用了FPGA 片上資源,資源消耗如表2 所示。
Table 2 FPGA hardware resource utilization表2 FPGA 硬件資源利用率
由于IAF 神經(jīng)元的計(jì)算大量消耗DSP,通過(guò)對(duì)數(shù)據(jù)位寬進(jìn)行優(yōu)化,如將浮點(diǎn)數(shù)轉(zhuǎn)換成16 bit 點(diǎn)或半精度浮點(diǎn),有效減少了DSP 的使用,在提高計(jì)算并行度的同時(shí)提高了整體資源的利用率。
當(dāng)把某個(gè)SNN 工作負(fù)載運(yùn)行到PEST 上時(shí),節(jié)點(diǎn)過(guò)多或過(guò)少都會(huì)影響系統(tǒng)的能效,因此需要對(duì)該工作負(fù)載分配最佳數(shù)量的計(jì)算節(jié)點(diǎn)。在對(duì)PEST 進(jìn)行性能分析時(shí)運(yùn)行皮質(zhì)層視覺(jué)模型,圖片選擇128×128、200×200 和300×300 像素的不同數(shù)據(jù)集進(jìn)行測(cè)試。首先對(duì)不同節(jié)點(diǎn)數(shù)的計(jì)算時(shí)間進(jìn)行實(shí)際測(cè)試,實(shí)驗(yàn)結(jié)果如圖21 所示。
Fig.21 Running time comparison of cortical visual model under different number of nodes圖21 皮質(zhì)視覺(jué)模型在不同節(jié)點(diǎn)數(shù)運(yùn)行時(shí)間對(duì)比
以128×128 數(shù)據(jù)集的運(yùn)行結(jié)果為例進(jìn)行分析,神經(jīng)元更新計(jì)算時(shí)間隨著節(jié)點(diǎn)數(shù)的增加成比例減少,通信時(shí)間隨著節(jié)點(diǎn)數(shù)的增多而逐漸增大,其他時(shí)間包括仿真的準(zhǔn)備和神經(jīng)元更新后的結(jié)果收集,這些工作由于是集群的主節(jié)點(diǎn)獨(dú)自進(jìn)行處理,花費(fèi)時(shí)間較長(zhǎng)。同時(shí)由于這些步驟為主節(jié)點(diǎn)單獨(dú)進(jìn)行,當(dāng)計(jì)算模型一致時(shí),在不同節(jié)點(diǎn)規(guī)模下的處理時(shí)間差異不大。在運(yùn)行128×128 數(shù)據(jù)集時(shí),從2 節(jié)點(diǎn)開(kāi)始計(jì)算性能依次增加,在8 節(jié)點(diǎn)時(shí)達(dá)到最佳性能,當(dāng)超過(guò)8節(jié)點(diǎn)時(shí)其計(jì)算性能受制于通信時(shí)間的增長(zhǎng)反而會(huì)出現(xiàn)下降。
運(yùn)行其他兩個(gè)數(shù)據(jù)集時(shí)由于圖片像素增多,所生成的神經(jīng)元數(shù)量也隨之增多,計(jì)算時(shí)間隨之增加。由于神經(jīng)元計(jì)算規(guī)模增大,通信時(shí)間和神經(jīng)元更新時(shí)間都相應(yīng)增加,其分布特性與運(yùn)行小數(shù)據(jù)集時(shí)類(lèi)似,運(yùn)行200×200 和300×300 數(shù)據(jù)集時(shí),PEST 仿真器的最佳計(jì)算節(jié)點(diǎn)數(shù)分別為16 節(jié)點(diǎn)和24 節(jié)點(diǎn)。
在PEST 上運(yùn)行8 000 和16 000 兩種神經(jīng)元規(guī)模的皮層微電路模型進(jìn)行測(cè)試,測(cè)試結(jié)果如圖22 所示。
Fig.22 Running time comparison of cortical microcircuit model with different number of nodes圖22 皮層微電路模型在不同節(jié)點(diǎn)數(shù)運(yùn)行時(shí)間對(duì)比
皮層微電路模型整體神經(jīng)元數(shù)量相對(duì)較少,因此不同節(jié)點(diǎn)數(shù)下神經(jīng)元更新所占的計(jì)算時(shí)間差別較小。但由于整體計(jì)算次數(shù)很多,節(jié)點(diǎn)間的通信時(shí)間和其他時(shí)間受節(jié)點(diǎn)數(shù)量的影響很大。8 000 與16 000神經(jīng)元規(guī)模分別在16 節(jié)點(diǎn)和20 節(jié)點(diǎn)時(shí)性能最佳。
目前已有研究自動(dòng)地為工作負(fù)載分配合適的計(jì)算節(jié)點(diǎn),限于篇幅在此不再展開(kāi)介紹。
實(shí)驗(yàn)選擇PEST 和其他的PC 平臺(tái)進(jìn)行對(duì)比,測(cè)試時(shí)使用不同的計(jì)算模型和規(guī)模進(jìn)行測(cè)試,PEST 的節(jié)點(diǎn)數(shù)量選取了最佳數(shù)。由上文所述,在PEST 上運(yùn)行計(jì)算模型時(shí),數(shù)據(jù)準(zhǔn)備和數(shù)據(jù)收集是由集群中主節(jié)點(diǎn)單獨(dú)運(yùn)行,受制于PYNQ-Z2ARM 端的性能,該部分處理時(shí)間過(guò)長(zhǎng),極大影響整體運(yùn)行時(shí)間。數(shù)據(jù)準(zhǔn)備工作只在模型初始化時(shí)運(yùn)行,并且不受節(jié)點(diǎn)數(shù)量的影響,因此它可由性能更好的計(jì)算平臺(tái)處理,集群主節(jié)點(diǎn)在運(yùn)行時(shí)可將處理好的數(shù)據(jù)分發(fā)給各節(jié)點(diǎn)進(jìn)行計(jì)算。數(shù)據(jù)收集與準(zhǔn)備工作類(lèi)似,主節(jié)點(diǎn)可以只負(fù)責(zé)收集各節(jié)點(diǎn)的計(jì)算結(jié)果,而將數(shù)據(jù)處理工作交給性能更強(qiáng)的計(jì)算平臺(tái)進(jìn)行處理。因此在進(jìn)行性能與能效評(píng)估時(shí),本實(shí)驗(yàn)只針對(duì)集群與其他平臺(tái)神經(jīng)元更新部分進(jìn)行對(duì)比。表中PEST 括號(hào)中的數(shù)字為測(cè)試時(shí)的節(jié)點(diǎn)數(shù)量,各平臺(tái)之間的性能對(duì)比如表3~表5所示。
Table 3 Performance comparison of cortical visual models of different platforms(128×128 data set)表3 不同平臺(tái)皮質(zhì)視覺(jué)模型性能對(duì)比(128×128數(shù)據(jù)集)
通過(guò)表3~表5 可知,PEST 的運(yùn)算性能與功率隨著計(jì)算節(jié)點(diǎn)的增多而線性增加,而Xeon 2620 和AMD 3600X 的運(yùn)算性能和功率在運(yùn)行皮質(zhì)層視覺(jué)模型時(shí)基本維持不變。
在運(yùn)行皮質(zhì)層視覺(jué)模型128×128 數(shù)據(jù)集時(shí),PEST 集群在8 節(jié)點(diǎn)時(shí)計(jì)算性能最佳,神經(jīng)元更新時(shí)間相比3600X 提升16 倍,比Xeon 2620 快23.8 倍。在300×300 數(shù)據(jù)集下24 節(jié)點(diǎn)PEST 集群神經(jīng)元更新時(shí)間相比3600X 提升44 倍,是Xeon 2620 的62.9 倍。整體計(jì)算量越大,PEST 在計(jì)算速度上的優(yōu)勢(shì)越明顯。
Table 4 Performance comparison of cortical visual models on different platforms(200×200 data set)表4 不同平臺(tái)皮質(zhì)視覺(jué)模型性能對(duì)比(200×200數(shù)據(jù)集)
Table 5 Performance comparison of cortical visual models on different platforms(300×300 data set)表5 不同平臺(tái)皮質(zhì)視覺(jué)模型性能對(duì)比(300×300數(shù)據(jù)集)
PEST 在節(jié)點(diǎn)數(shù)較少時(shí)能效比較高,隨著節(jié)點(diǎn)增多更新能效比逐漸下降,而Xeon 2620 和3600X 的更新能效比整體變化不大。運(yùn)行128×128 數(shù)據(jù)集時(shí),最佳性能的PEST(8)集群相比3600X 更新能效比提升36.9 倍,相比Xeon 2620 提升49 倍。在運(yùn)行300×300數(shù)據(jù)集時(shí),性能最優(yōu)的PEST(24)更新能效比相比3600X 提升34.5 倍,相比Xeon 2620 提升42.2 倍。
如表6、表7 所示,運(yùn)行皮層微電路模型時(shí),PEST在神經(jīng)元更新部分相比其他兩個(gè)平臺(tái)依然優(yōu)勢(shì)明顯,在模型規(guī)模為8 000 神經(jīng)元時(shí),PEST 在16 節(jié)點(diǎn)時(shí)計(jì)算性能最佳,神經(jīng)元更新時(shí)間相比3600X 提升4.6倍,比Xeon 2620 快7.5 倍。在16 000 神經(jīng)元計(jì)算規(guī)模下20 節(jié)點(diǎn)PEST 的神經(jīng)元更新時(shí)間相比3600X 提升14.3 倍,是Xeon 2620 的24.5 倍。神經(jīng)元數(shù)量越大時(shí),PEST 運(yùn)行皮層微電路模型的性能優(yōu)勢(shì)越明顯。
Table 6 Performance comparison of cortical microcircuit models on different platforms(8 000 neurons)表6 不同平臺(tái)皮質(zhì)微電路模型性能對(duì)比(8 000神經(jīng)元)
Table 7 Performance comparison of cortical microcircuit models on different platforms(16 000 neurons)表7 不同平臺(tái)皮質(zhì)微電路模型性能對(duì)比(16 000神經(jīng)元)
更新能效比方面,PEST 相比其他兩個(gè)平臺(tái)依然具有優(yōu)勢(shì),在8 000 神經(jīng)元規(guī)模下,16 節(jié)點(diǎn)的PEST 更新 能效比相比3600X 提升5.3 倍,比Xeon 2620提升7.9 倍。在16 000 神經(jīng)元規(guī)模下,PEST 的更新能效比相比3600X 提升13.4 倍,比Xeon 2620 提升20.2 倍。
通過(guò)4.4 節(jié)可知,PEST 在節(jié)點(diǎn)最佳數(shù)時(shí)的計(jì)算性能與運(yùn)行在其他節(jié)點(diǎn)數(shù)時(shí)性能差距并不明顯,用戶(hù)可以根據(jù)需求選擇適當(dāng)?shù)墓?jié)點(diǎn)數(shù)進(jìn)行模型計(jì)算,在損失一定計(jì)算速度的情況下使用更少的節(jié)點(diǎn)數(shù)進(jìn)行計(jì)算可以在能效比方面達(dá)到更好的效果。
本文以PYNQ-Z2 開(kāi)發(fā)板為基礎(chǔ),結(jié)合PYNQ 框架和NEST 類(lèi)腦仿真器等軟硬件設(shè)備,搭建了一套異構(gòu)類(lèi)腦計(jì)算系統(tǒng)。通過(guò)對(duì)集群中IAF 神經(jīng)元更新部分進(jìn)行優(yōu)化,增加FPGA 并行計(jì)算模塊,優(yōu)化集群文件系統(tǒng)等方式,提升了整體計(jì)算性能,簡(jiǎn)化了操作復(fù)雜度,實(shí)現(xiàn)了高性能、低功耗、規(guī)模可伸縮的PEST 類(lèi)腦計(jì)算集群,為類(lèi)腦計(jì)算提供了一種新的計(jì)算平臺(tái)。
后期工作可以從以下幾方面進(jìn)行研究:(1)繼續(xù)針對(duì)不同神經(jīng)元或突觸類(lèi)型設(shè)計(jì)FPGA 并行優(yōu)化方案;(2)探索計(jì)算性能與功耗的最佳平衡點(diǎn),設(shè)計(jì)自動(dòng)確定性能最佳節(jié)點(diǎn)的方法;(3)優(yōu)化仿真過(guò)程中的非主要性能瓶頸,進(jìn)一步提升集群整體的計(jì)算性能。