华夏,柴志雷,2,张曦煌
(1.江南大学 人工智能与计算机学院,江苏 无锡 214122;2.江苏省模式识别与计算智能工程实验室,江苏 无锡 214122)
SNN(Spiking Neural Network)作为类脑计算的基础,被誉为第三代人工神经网络。追求卓越性能、探索适合SNN运行的类脑系统结构是SNN研究的主要任务之一。这意味着需要深入研究SNN模型及系统的工作负载特性,以设计高效的类脑计算平台。由于SNN具有分布式计算特点,因此对SNN工作负载的研究需要合适的分布式计算平台。在分布式平台上进行SNN负载特性研究时,通常需要多次改变SNN模型规模,以及SNN工作负载与计算平台之间的映射方式,以获取不同情况下的工作负载数据。
因此,对分布式平台进行内存负载分析能有效提升SNN工作负载研究的效率。一方面,对于特定SNN模型,通过分析满足其内存需求的最小映射节点数,能够帮助研究者确定计算平台的可用映射方式的变化范围。另一方面,通过分析计算平台的网络承载能力,帮助研究者在平台网络承载能力范围内对其SNN模型进行网络规模放缩,以研究不同规模下的SNN模型负载特性。
近年来,专用类脑系统和芯片不断涌现,为SNN工作负载的研究提供了更多可选择的平台。2019年,施路平等人设计了Tianjic芯片,该芯片的采用了多核架构,能承载大约1 000万个突触模型和4万个神经元模型。2020年,英特尔推出了包含768颗Loihi芯片的神经拟态系统Pohoiki Springs,该系统能够承载约1亿个神经元。
与专用类脑芯片一同发展的还有灵活性较强的SNN软件仿真器。部分软件仿真器构建的SNN模型能够灵活地部署到硬件平台中。文献[6-8]研究了使用NEST等仿真器构建的SNN模型在类脑计算平台上的工作负载特性。在这些研究中,使用者需要通过手动试探的方式获取平台的可用映射方式和网络承载能力,这大大降低了SNN负载特性研究的效率。
针对现有的类脑计算平台难以进行高效SNN工作负载研究的问题。本文首先对NEST仿真器进行工作负载特性分析,建立内存负载模型。其次搭建了PYNQ集群,并将NEST仿真器部署到集群中,实现了一种规模可扩展的分布式类脑计算平台。最后设计了集群内存负载分析系统,通过提供内存消耗预测和集群网络承载能力预测功能,帮助用户建立SNN模型内存消耗的初步印象、快速确定集群网络承载能力,以提高在类脑计算平台上研究SNN工作负载的效率。
NEST是一款支持多种神经元、突触模型的SNN仿真器,可以把大规模SNN模型映射到集群或者多核计算机上。
如图1所示,NEST仿真器的运行流程分为三个阶段。在创建和连接阶段,NEST根据用户指定的SNN网络脚本构建神经元并建立神经元间的突触连接。在仿真阶段中,NEST循环执行突触更新、神经元更新、脉冲传递等SNN模型仿真步骤。
图1 NEST仿真器运行流程
NEST能够进行分布式计算,在分布式计算平台的每个节点中运行一个MPI进程,计算节点间使用MPI通信协议进行数据通信。使用NEST在分布式计算平台上进行神经元构建和突触构建时,分别遵循不同
的任务分配方式。
在创建阶段中,NEST使用轮询方式将神经元均匀分配到分布式平台的不同节点上。NEST首先给每个神经元分发了一个全局标识编号(global identifier, GID),然后根据在分布式平台上以循环方式分配神经元。以图2为例,小型分布式计算平台有两个节点,对于共有4个神经元的SNN模型,按照NEST分配机制,平台的每个节点分配2个神经元,IAF表示iaf_psc_alpha类型的神经元。
图2 NEST神经元分配方式
突触的分配与分布式平台上的神经元分布有关,NEST按照突触所对应的连接关系,将突触分配到其连接目标所在的节点中。如图3所示,在网络连接阶段,每个计算节点通过一张稀疏表来记录突触信息。在每个节点中,NEST需要遍历节点分配到的每个神经元,然后对其中作为突触的连接目标(突触后)的神经元,根据突触前后神经元GID在稀疏表对应位置记录突触信息。
图3 NEST突触分配方式
通过上述任务分配机制,NEST能够有效利用分布式计算平台的内存与计算资源,进行大规模SNN模型仿真。
根据1.1节分析,NEST运行时的内存负载消耗集中在建立阶段和连接阶段。这两个阶段中分别进行神经元和突触的创建,其内存负载消耗主要包括神经元的内存占用M和突触的内存占用M。此外,在分布式计算平台上进行SNN模拟时,每个节点还需要为NEST提供初始化内存消耗M。因此,每个计算节点的总内存消耗由M、M和M组成,如式(1)所示:
其中,M包括NEST内核中数据结构初始化的内存消耗,其数值与计算平台的性能有关。
表1 内存负载模型参数说明
每个计算节点的突触内存占用M包括创建突触模型及其基础设施所需内存消耗,如式(3)所示。其中第一项为计算节点创建所有本地突触所需的内存开销,N(tgt)为突触连接目标神经元tgt的数量,代表tgt的平均入度。第二项是计算节点为所有神经元提供的,用于记录其连接关系的数据结构内存开销。m、 分别是突触模型及其基础设施所需内存开销,如表1所示。
为了提供SNN工作负载研究所需的分布式计算平台。本节采用XilinxPYNQ-Z2开发板搭建集群,并在集群中部署了NEST仿真器,形成了一个规模可扩展的分布式类脑计算平台。
PYNQ-Z2开发板采用Zynq-7020作为其主芯片,该芯片通过数据接口将ARM Cortex-A9处理器核心(Processing System, PS)与可编程逻辑FPGA(Programmable Logic,PL)连接。
为了搭建分布式类脑计算平台,本文首先设计了将NEST仿真器部署到单个PYNQ-Z2计算节点的方法。如图4(a)所示,NEST仿真器的主体部分运行在PYNQ的PS端,用户可以在PS端的JupyterNotebook中编辑SNN模型的脚本文件。Jupyter在运行该脚本文件的过程中,利用了PyNN库提供的接口,通过SLI或者PyNEST界面完成对NEST内核中函数的调用。此外,利用PL端FPGA资源可以设计并行计算加速模块,对NEST运行过程中的计算密集点进行加速运算,以提高NEST的运行速度。
图4 PYNQ集群设计
如图4(b)所示,PYNQ集群由三层硬件结构组成:PYNQ节点层、主控节点层和信息交互层。PYNQ节点层根据NEST任务分配机制处理SNN模型仿真过程中的计算任务,该层完全由PYNQ-Z2计算节点组成,每个节点都与信息交互层建立连接。信息交互层包含多台交换机,负责传递计算节点间的信息。主控节点层由集群的主节点构成,主要负责将计算任务分配到每一个节点中。集群具有较强的规模扩展的能力,即计算节点规模可以随着计算需求的不同进行伸缩调整。
为了快速预测PYNQ集群运行SNN模型的内存消耗以及集群的网络承载能力,本文设计了内存负载分析系统。
如图5所示,内存负载分析系统主要包含五个模块:SNN模型与平台信息输入、内存参数获取模块、SNN模型参数采集模块、内存消耗预测模块和网络承载能力预测模块。
图5 内存负载分析系统结构
(1)SNN模型与平台信息输入:将描述SNN模型的脚本文件。
输入系统,同时输入计算节点总数、单节点最大内存M等计算平台信息。
(2)内存参数获取模块:主要负责获取表1所示的所有内存参数。
(3)SNN模型参数采集模块:根据输入的SNN脚本文件使用NEST构建该SNN网络。在网络构建(创建、连接阶段)过程中,针对式(2)(3)中N(tgt)、(tgt)等与SNN模型相关的参数,调用统计功能进行采集。
(4)内存消耗预测模块:根据内存负载模型,将获取的所有内存参数、SNN模型参数转化为内存消耗预测结果。此外,在满足SNN模型内存需求的前提下,基于预测结果,给出计算平台所需投入的最小节点规模。
(5)网络承载能力预测模块:根据内存参数和、M等平台信息,预测计算平台所能承载的最大SNN模型规模。
内存参数几乎不受计算平台和具体SNN模型的影响。采用分析与手动量化方法获取所有内存参数。结果如表2所示。
表2 参数获取结果
如图6所示,SNN模型参数采集模块内嵌在NEST仿真器的内核中,使用NEST构建SNN网络时自动调用该模块。输入系统的SNN脚本文件通过接口nest.Create()和nest.Connect()调用NEST内核函数,进行神经元群落创建和突触连接。同时这两个接口也将各群落神经元规模,突触连接规则等信息传入NEST内核。SNN模型参数采集模块使用2张参数表(群落表v_population和群落入度表v_in)记录这些模型信息。每当调用nest.Create()创建神经元群落时,v_population记录了此次创建的群落神经元数量。每当调用nest.Connect()创建突触连接时,在v_in中记录突触连接目标神经元的入度(tgt)。
图6 参数采集与预测
如图6所示,内存消耗预测模块首先读取内存参数获取、SNN模型参数采集模块所获得的全部参数数值,然后根据1.2节中的内存负载模型设计了负载计算函数,对所获取的全部建模参数进行处理,最终预测出分布式计算平台投入个节点运行SNN模型的总内存消耗()。
完成内存负载预测后,根据式(4)所示的稳定性能标准给出计算平台为满足模型内存需要所需投入的最小节点数,即最小性能稳定点。
其中M是计算平台每个节点能够提供的内存大小,是平台能够提供的最大节点数,所有满足条件()≤M的节点规模均是可行节点规模,即能够满足网络内存需求,保证平台平稳运行。在所有可行节点规模中节点数量最小的即是最小性能稳定点Psteady。
内存消耗预测模块中,预测的是SNN模型规模保持不变的情况下,平台的内存消耗。而网络承载能力预测,则是预测当计算平台的可用内存均被占用时,所能承载SNN模型规模。
在分布式计算平台上构建SNN模型时,若每个节点消耗的总内存都达到节点能提供的最大内存M,则SNN模型的规模达到了平台网络承载能力的极限。而单节点的总内存消耗包含M、M、M三部分,因此上述关系可以用公式(5)描述:
随着投入计算节点数量的增加,分布式平台的网络承载能力也会提升。如公式(6)所示,根据1.2节建立的负载模型,可以将公式(5)转化为平台投入计算节点数与平台网络承载能力之间的关系,其中代表SNN模型的网络规模,即模型中的神经元数量。
基于式(6),网络承载能力预测模块根据前面流程中获取的内存参数、输入系统的M等参数,预测投入个节点时的计算平台能承载的最大SNN模型规模。
本文采用高性能计算机基准测试(HPC_benchmark)作为测试案例。该SNN模型中包含2个神经元群落,神经元群落间共有4组不同的连接关系,连接关系包含多条突触。通过设定比例参数可以成倍调节模型网络规模。本文选用的比例参数为0.5,此时网络模型包含5 625个神经元和3 165万条突触。
为了验证内存负载分析系统的有效性,本实验针对HPC_benchmark,使用内存负载分析系统预测模型内存负载,并与实测数据进行对比。此外,利用系统的网络承载能力预测功能,对分布式平台在投入不同数量节点时的网络承载能力进行预测,并且与实测平台网络承载能力进行了对比。
使用集群内存负载分析系统预测的内存消耗分布如图7所示,由于HPC_benchmark中突触的数量较多,因此突触内存消耗M远大于神经元内存消耗M。此外,随着PYNQ集群投入的计算节点数增加,每个节点上的神经元、突触内存消耗均被稀释,而初始化内存消耗M的数值保持稳定。
图7 内存消耗分布
图8中,实线代表PYNQ集群投入不同数量节点运行HPC_benchmark时实测的内存消耗,虚线代表使用内存负载分析系统预测的数据。通过数据对比可知,使用内存负载分析系统预测的总内存消耗十分接近实测数据,平均而言系统的内存负载预测准确率达到了97.98%。此外,PYNQ集群单节点能提供最大内存约为450 MB,根据内存负载预测推测出的最小性能稳定点Psteady为3个节点,与实测数据相符。
图8 内存消耗预测数据与实测数据对比
在本实验中,首先通过手动反复调整HPC_benchmark网络规模的方式,确定平台投入不同数量节点时的真实网络承载能力。然后将系统预测的平台网络承载能力与实测数据进行了对比。
图9中,实线表示实际测得集群所能承载的网络模型最大规模随计算节点数的变化关系,虚线表示使用内存负载分析系统预测的数据随计算节点数的变化关系。可用看出,预测的与实测数据十分接近。整体而言,内存负载分析系统在网络承载能力预测方面的准确率约为97.19%。
图9 网络承载能力预测结果与实测数据对比
本文针对类脑计算平台难以进行高效的SNN工作负载研究的问题,搭建了规模可伸缩的PYNQ集群类脑计算平台,设计了内存负载分析系统,通过准确预测SNN模型在集群的上内存消耗以及集群的网络承载能力,提高了在PYNQ集群分布式计算平台上进行SNN工作负载的研究的效率。
在后续工作中,可以针对集群运行SNN模型的性能瓶颈进行优化,为SNN工作负载的研究提供高性能的平台。