fangwei123456 / spikingjelly

SpikingJelly is an open-source deep learning framework for Spiking Neural Network (SNN) based on PyTorch.
https://spikingjelly.readthedocs.io
Other
1.35k stars 239 forks source link

使用 CUDA 增强的神经元在 0.0.0.0.6 与 0.0.0.0.4 版本的区别是什么? #87

Closed AptX395 closed 3 years ago

AptX395 commented 3 years ago

最近我注意到 SpikingJelly 稳定版更新到了 0.00006 ,其中使用 CUDA 增强的神经元发生了较大的变化,从 cext 模块转移到了 clock_driven 模块。SpikingJelly 的文档中提供的示例所展示的性能也有一定的区别。

0.0.0.0.6 版本中的性能图示如下:

而 0.0.0.0.4 版本中的性能图示如下:

从运行时间的数值来看,0.0.0.0.6 版本的神经元运行时间比 0.0.0.0.4 版本的略长一点,而两个版本的测试代码似乎是相同的。

请问两个版本的实现有什么区别呢?新版本的运行时间长于旧版本的原因是什么呢?

十分感谢您的解答!

fangwei123456 commented 3 years ago
  1. 04版本中使用cuda代码实现,而06版本使用cupy实现。直接用cuda代码实现,调用开销会稍微小一些;cupy版本要做一些pytorch和cupy的api的转换,但耗时也很少,因此调用速度上的差异可以忽略。
  2. 04版本的多步神经元,输入x[0,1,...,T-1]和v[0],输出s[0,1,...,T-1]和v[T-1];而06版本考虑到中间时刻的电压或许要用到,因而输入x[0,1,...,T-1]和v[0],输出s[0,1,...,T-1]和v[0,1,...,T-1]。06版本会用到grad_v[0,1,...,T-1]计算,而04版本只用grad_v[T-1],因而06版本会略微慢一些。
  3. 再就是04版本的cuda内核包括带梯度和不带梯度,而06版本我偷懒了一下,考虑到不带梯度的推理本身相对于训练耗时很小,就没有单独的写不带梯度的内核。
AptX395 commented 3 years ago
  1. 04版本中使用cuda代码实现,而06版本使用cupy实现。直接用cuda代码实现,调用开销会稍微小一些;cupy版本要做一些pytorch和cupy的api的转换,但耗时也很少,因此调用速度上的差异可以忽略。
  2. 04版本的多步神经元,输入x[0,1,...,T-1]和v[0],输出s[0,1,...,T-1]和v[T-1];而06版本考虑到中间时刻的电压或许要用到,因而输入x[0,1,...,T-1]和v[0],输出s[0,1,...,T-1]和v[0,1,...,T-1]。06版本会用到grad_v[0,1,...,T-1]计算,而04版本只用grad_v[T-1],因而06版本会略微慢一些。
  3. 再就是04版本的cuda内核包括带梯度和不带梯度,而06版本我偷懒了一下,考虑到不带梯度的推理本身相对于训练耗时很小,就没有单独的写不带梯度的内核。

了解了,非常感谢您的解答!