跳到主要内容
起居室老虎
返回

Prosperity: Accelerating Spiking Neural Networks via Product Sparsity

2,080 字约 8 分钟

原文:arXiv:2503.03379 · Wei et al., HPCA 2025

摘要: 脉冲神经网络(Spiking Neural Networks, SNNs)由于其基于脉冲的激活方式而具有高度效率,天然地产生按位稀疏(bit‑sparse)的计算模式。现有的 SNN 硬件实现利用这种稀疏性来避免对零值的浪费性计算,但这种方法仍未能充分发挥 SNN 的潜在效率。本文提出了一种新的稀疏范式——乘积稀疏性(Product Sparsity,简称 ProSparsity),该范式通过挖掘矩阵乘法运算中的组合相似性来重用内积结果,从而减少冗余计算。与传统按位稀疏(bit sparsity)方法相比,ProSparsity 在保持原始计算结果完全一致的前提下显著增强了 SNN 的稀疏性。例如,在 SpikeBERT SNN 模型中,ProSparsity 将密度降低到 1.23 %,计算量减少 11 ×;而传统按位稀疏的密度仍为 13.19 %。为高效实现 ProSparsity,我们提出了硬件架构 Prosperity,能够实时识别并消除冗余计算。与此前的 SNN 加速器 PTB 及 NVIDIA A100 GPU 相比,Prosperity 分别取得了 7.4 × 与 1.8 × 的平均速度提升,以及 8.0 × 与 193 × 的能效提升。Prosperity 的代码已开源于 https://github.com/dubcyfor3/Prosperity。

1. Intro

image.png

核心在于矩阵乘法内积的组合相似性:SNN 的多个脉冲矩阵行往往包含相同的二值子组合,乘以相同权重矩阵时得到相同内积。只需计算一次并在包含此子组合的行间复用,即可消除重复计算。

Challenge:

  1. 直接搜索合适的复用方案耗时特别高
  2. 计算的先后关系对复用效率有影响
  3. Spike Activation 是动态的

Contribution:

2. Background

image.png

3. Product Sparsity

3.1. Definition

image.png

图 2 (a) 展示了一个脉冲 GeMM:给定 M×KM\times K 的脉冲矩阵、K×NK\times N 的权重矩阵及 M×NM\times N 的输出矩阵,其计算可分解为多次基于比特稀疏的内积(图 2 (b))。由于输入为二值,内积可视为对多条权重值的累加;这些权重由脉冲矩阵当前行中值为 1 的位置 “选中”。根据矩阵乘法规则,脉冲矩阵第 ii列始终 “选中” 权重矩阵的第 ii 行。若两行脉冲矩阵在若干列上同为 1,则形成一个公共二值子组合;当它们与同一权重矩阵相乘时,该子组合产生相同的内积结果。例如图 2 (b):第 4 行与第 5 行完全相同(1101),因此可复用同一结果。若仅对一次公共子组合计内积,再将结果复用于包含该子组合的所有行,便可显著减少冗余计算。我们将这种借助内积组合相似性 来跳过计算、复用结果的范式称为乘积稀疏(ProSparsity)。

这种复用式的稀疏提升依赖于计算中的时空关系:

3.2. Spatial Relationship

考虑总共mm行,需要找到一个nn行的 sub-combination,朴素的直接对比方法是𝒪(mn)\mathcal O(m^n)的(假设n=2n=2,找到这种 sub-combination 的计算也需要m×(m−1)2\frac{m\times(m-1)}{2}次。将一行 spike 写作一个集合:

Si={j|M[i,j]=1,j∈Column IDs}S_i=\{j|M[i, j]=1, j\in \text{Column IDs}\}

注意到n≥3n\ge3的时候复杂度是不可接受的,因此这篇文章只讨论n=2n=2的情况,且也已经足够满足 SNN 加速的稀疏度了。

当A=Si∩Sj≠∅A=S_i\cap S_j \ne \empty的时候,有:

  1. A=Sj,A≠SiA=S_j, A\ne S_i,则可以直接复用SjS_j的计算结果之后额外剩余的数值(PM)
  2. A=Sj=SiA=S_j=S_i,直接复用(EM)
  3. A≠Sj,A≠SiA\ne S_j, A\ne S_i,没有包含关系的复用难度太高,本文不考虑。

3.3. Temporal Relationship

用 Prefix 和 Suffix 描述 Spike 串。

3.4. Efficient Design Space Exploration

image.png

将脉冲矩阵的空间‑时间关系建模为有向图(b)的做法开销太大在硬件上不好做,所以退化成单前缀的做法。

image.png

4. Prosperity Overview

image.png

Prosperity 逐层推理 SNN,由 ProSparsity 处理单元(PPU)、脉冲神经元阵列与 特殊功能单元(SFU) 组成。PPU 负责关系检测、修剪、元信息生成与 ProSparsity 计算四阶段;结果进入神经元阵列产生下一层脉冲。SFU 用于 softmax、层归一化中的指数与乘法,使架构兼容各类脉冲 Transformer

5. ProSparsity Processing Unit

image.png

5.1. Spiking GeMM Tiling

分成m×n×km\times n\times k的分块,注意到非常小的mm下前面的复用方法失效,非常大的kk会导致 buffer 开销太大,而

5.2. ProSparsity Detector

利用三态 TCAM 并行匹配子集:

  1. 将 mmm 行脉冲子矩阵加载至 mmm 条 TCAM 表项。

  2. 读取待查询行(如 Row 2),把其 “1” 位掩为 “X”。

  3. TCAM 单周期返回所有子集行索引(Subset Index, SI)。

    总复杂度O(m)O(m)

时间信息先用 popcount 做初步统计。

5.3. ProSparsity Pruner

没有仔细看,大概意思是通过 XOR 判断是 PM 还是 EM 然后根据 ArgMax 和 TCAM 中维护的数据取计算结果。

5.4. ProSparsity Dispatcher

收集空间信息写入 Pro 表,并通过稳定排序 生成执行序:

采用并行 Bitonic Sorter,时间复杂度 O(log2⁡m)O(\log^2 m),与 Detector/Pruner 并行运行。生成的 “虚拟” Product 稀疏树无需存储 Suffix,空间降至O(m)O(m)。随后按序派发指令与数据至 Processor。

5.5. Product Sparsity Processor

行‑并行数据流

按调度序依次处理脉冲行:

  1. 先从输出缓冲读取前缀行结果,置于 PE 阵列部分和寄存器。
  2. 使用 位扫描 找到 Pro 模式中的首个 “1”,解码权重行地址,翻转该位;
  3. PE 阵列累加权重行至部分和;
  4. 重复步骤 2‑3 直至模式全零,把结果写回输出缓冲。

该设计跳过所有零位,天然支持非结构化稀疏。

6. Pipeline Scheduling

image.png

6.1. Intra-phase Pipeline

Detector、Pruner 与 Dispatcher 中的步骤 2–6 完全流水化,构成 5 级流水,吞吐率为 1 行/周期。因此处理 m 行脉冲子矩阵仅需 m + 4 个周期。

6.2. Inter-phase Pipeline

为重叠两阶段,采用双缓冲 Product Sparsity Table:

7. Evaluation

7.1. Methodology

image.png

image.png

7.2. Tiling Exploration

image.png

不同 tile 大小对延迟与密度的影响(延迟相对 BitSparsity 基线)。

7.3. End-to-End Performance Analysis

image.png

7.4. Ablation Study: Speedup Analysis

image.png

7.5. Area and Power Analysis

image.png

7.6. Sparsity Analysis

image.png

ProSparsity 相对位稀疏平均密度 ↓5 ×,相对 FS 神经元 ↓3.2 ×;无论稠密或稀疏模型均 < 5 %。

7.7. Cost Trade-off Analysis in Prosperity

ProSparsity 处理开销主要来源于 TCAM 位运算 O(m2k)O(m^2k)。一次浮点加法≈45 × TCAM 位开销。

8.1. Architecture Scalability

8.2. SNN Accelerators

SpinalFlow, SATO, SATA, MINT, LoAS 等是在 Bit Sparsity 上,而本文的方法与它们正交。

8.3. Efficient DNN

9. Conclusion

本文提出 ProSparsity——一种全新的 SNN 稀疏范式,利用脉冲矩阵的组合相似性,在无精度损失 下比传统位稀疏显著减少计算。为实时、高效地利用 ProSparsity,我们设计了 Prosperity 架构:

Prosperity 拓展了 SNN 加速边界,为多样化 AI 应用提供了高效算力支撑。