NoC(Network on chip)是连接同构或者异构多核心的重要的系统互联结构,NoC仿真器提供了对NoC中多种性能指标的仿真。下面这篇博客中列出了常用的开源NoC仿真器,https://networkonchip.wordpress.com/2011/02/22/simulators/ ,目前了解到最常用的两种分别是
noxim,基于SystemC语言开发,修改和添加新功能较为灵活。
booksim,基于C++语言开发,是 Principles and Practices of Interconnection Networks 这本书的配套教程。
SNN是第三代人工神经网络,基于脉冲传递数据和信息,由于SNN本身具有稀疏性(连接稀疏性和脉冲稀疏性),因此有许多神经形态硬件(Loihi、SpiNNaker、TianjiC、Darwin等)被开发出来用于SNN加速。这里主要列出一些在通用的CPU和GPU平台上进行SNN加速的一些SNN仿真器。
NEST,可以用于SNN网络信息处理,网络活动动态、学习和突触可塑性等
Brain2,时钟驱动的SNN仿真器
GeNN,GPU加速的SNN仿真器
Carlsim,GPU加速的SNN仿真器
Auryn,RSNN仿真器
ANNarchy
Spike, GPU加速的SNN仿真器
Spice,多GPU、时钟驱动的SNN仿真器
Nengo,基于Python的神经网络仿真
Brain2Loihi,基于brain2实现的Loihi模拟器
NeuroSync
dynapse-simulator,Dynap-SE1神经形态硬件仿真器
提出了一种环形+Mesh结合的NoC结构,同时基于该结构提出了相应的映射算法、广播协议和基于权重稀疏性的通信量减少方案,相较于现有的2D-Mesh的方法有效地减少了通信的延迟和能量消耗。
在packet的header中添加一段标志位用于支持广播协议,标志位长度和Mesh路由的总数目相同;如1->7->9->10中分别广播到9和10,因此将9和10的标志位置为1,经过9后,9的标志位被置为0随后继续传递给10;
在uBrain神经形态核心上拓展实现的神经形态系统(基于分段总线)和映射框架(SentryOS)。
- 使用分段总线,实现核心之间的一对一互联(实际根据运行数据存在分时复用);
- 基于异构大小核,大网络分割后的子网络规模不同,使用异构大小核来减少uBrain核心中的硬件空闲率
分段总线互联
文中使用分段总线连接不同的uBrain核心来完成通信,相较于传统的共享式的总线结构,分段式总线结构可以价格总线分段,不同段之间可以并行通信,互不影响。为了实现同一时刻所有核心之间可以并行通信,需要多条并行总线,基于训练数据获取到同一时刻最大的并行通行量,从而可以确定所需要的最小的并行总线数目。
SentryOS设计
a. SentryC编译器
将大网络分割成多个可以映射到uBrain核心的子网络,具体的映射算法如下,主要分为四个步骤
i. 对于每个输出神经元,根据神经元到其的最长路径计算两者之间的距离;
ii. 根据第一步算出的距离给神经元添加索引,需要确保所有子网络中的神经元具有连续索引(论文中的阐述)
iii. 将所有距离小于2的神经元形成集合,$ S_0 = {N_j | dist(N_j ) ≤ 2} $,产生一个子网络,剩下的神经元递归组成其他子网络,这一步中可能会插入权重为1的神经元(调整阈值每来一个脉冲就发放一个脉冲?);
iv. 融合两个子网络$ S_i $ 和$ S_j $ 当且仅当
$$Area(S_i,j) \lt Area(S_i) + Area(S_j)$$
$$Power(S_i,j)\lt Power(S_i)+ Power(S_j)$$
文中提到可以将SentryOS的方案扩展到基于crossbar的神经形态硬件上,即认为crossbar为两层全连接结构(uBrain是三层)
b. SentryRT运行时
类似于DFSynthesizer,使用Max-Plus Algebras的方式确定自网络之间的执行顺序,这篇文章在DFSynthesizer上进一步改善,一方面使用多流水线来执行一个网络,另一方面使用Batch依次运算多个输入图片提高吞吐量。
实验评估
a. 使用异构大小核设计可以提高突触等资源的利用率,降低能量消耗,提高吞吐量;
b. 使用分段总线可以避免运行整段总线,同时基于训练数据最小化了总线数目,降低了能量消耗;另一方面,uBrain核心之间通信不再需要路由算法,在映射时所有的通信方案已经确定,减少了通信的延迟。
实现步骤:
1. 神经网络表示
类似其他模拟器中常用的方式,将神经网络看成神经元分组和神经元分组之间的连接组成。神经元分组之间都认为使用全连接,不存在的边认为使用权重为0的虚拟边。
2. Training-based transformation(神经网络训练&神经元分组)
a. 使用BP算法训练神经网络
b. 连接稀疏化,通过交换矩阵的行或列来将连接矩阵转换为满足crossbar大小限制的多个子矩阵,并将其余连接权重置为0,目标是最大化剩余的原有连接的绝对值权重之和。
c. 权重量化,将原有的浮点数权重量化为低精度权重,同时使用BP算法微调模型(BP算法中仍然使用浮点数计算)。
d. 在原有的两层中间插入新的全连接层,对于大小为m和n的两个层之间的连接,插入$ \frac{m+n}{2} $的全连接层,重新训练后减少准确度的损失。
e. 对于复杂的神经网络(非顺序连接的/循环的):对于复杂的神经网络,可以通过图2所示的复制和合并的方式,逐层训练神经元分组之间的突触连接;对于循环神经网络,脉冲神经网络需要将循环连接暂时删除,然后记录循环连接中的信息,将上一时刻信息送入连接后神经元并保存当前时刻连接前神经元送入的信息。
3. Mapping
使用Kernighan-Lin(KL)算法进行神经元子块到crossbar上的映射,目标是最小化crossbar之间的脉冲通信量。
4. Cycle-accurate simulator
实验
1. 考察指标:错误率,能量消耗,芯片有效速度(反比于每个仿真周期内的芯片时钟周期数,芯片有效速度的最大值对应于超过该值部分脉冲无法在一个仿真周期内到达目标神经元)。
2. 结论
a. 插入新的全连接层精度损失低于扩展crossbar规模,插入新的全连接层会增加能量损失、降低有效速度;
b. 基于已训练的前神经元节点训练后节点可以避免误差的积累;
c. 连接稀疏化对于精度影响较大,但是后续可以通过微调网络改善;
d. 部分神经元参数可以同步变大或减小,而不影响最终的输出;
e. 网络规模越大,芯片有效速度越小。
PSOPART
Mapping of local and global synapses on spiking neuromorphic hardware
开源代码地址:https://github.com/Jinouwen/Mapping
优化指标:神经元分块之间的脉冲通信量
类脑芯片:CxQuad
基本步骤
1. 使用Carlsim进行脉冲神经网络运行模拟,构建脉冲神经网络图结构;
2. 使用PSO(Partial Swarm Optimization)算法进行脉冲神经网络的分割,产生符合硬件限制的子块,这一步中优化的指标为神经元分块之间的脉冲通信量。
创新点
提出使用进化算法(PSO)用于脉冲神经网络分割。
问题
没有考虑到神经元分块到crossbar的物理映射问题,优化算法映射时间过长。
Mapping spiking neural networks to neuromorphic hardware.
开源代码地址: https://github.com/Jinouwen/SpiNeMap
优化指标:Global spikes,latency,energy consumptions
类脑芯片:DYNAP-SE
步骤分析:
问题
没有提到神经元的扇入突触超过crossbar限制如何解决?
ISI distortion:inter-spike intervals失真,会引起模型精度的下降,定义为
$$ I_j^s\|_{distortion}=I_j^s|_{new}-I_j^s = \delta_j^s-\delta_{j-1}^s $$
,其中$ \delta_j^s $表示第j个脉冲在第s个突触上传播的延迟,当突触位于crossbar上时,可以认为$I_j^s\|_{distortion}=0$,当突触映射到NoC上时,$I_j^s\|_{distortion}\neq 0$。当输入编码方案为速率编码时,ISI distortion可能没有影响,论文中提出了另一种直觉的spike disorder的指标
$$ \sum_{j=1}^{n_i}[(F_j^i-\hat{F}_j^i)^2]/n_i $$
,$F_j^i$和$\hat{F}_j^i$分别表示神经元i中的第j个脉冲到达的频率。