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

NeuroFlex: Lossless Element-Level ANN-SNN Co-Execution for Efficient Sparse Inference

4,764 字约 18 分钟

原文arXiv:2511.05215 · Manjunath et al., 2025

摘要: 稀疏 DNN 加速器要么专做 ANN 执行、要么专做 SNN 执行,当负载特征在一层之内发生变化时,就会在能耗或延迟上留下浪费。在 layer 或 tile 粒度上切换模式的混合加速器,则受困于 PE 利用率低,因为一种 core 工作时另一种只能空闲。NeuroFlex 是第一个能在零精度损失下、把每个输出元素独立分配到 ANN 或 SNN 执行模式的加速器。我们把 integer-exact 的 ANN-SNN 等价性从 layer 扩展到单个输出元素,从而使模式切换不引入任何转换误差。一个离线的 cost-guided scheduler 按每个元素的边际 energy-delay 权衡给它打分,并把任务打包分配到各个 PE 上,PE 利用率达到 97-99%,而 layer-wise 的混合方案只有 40-45%。相比一个强 ANN-only baseline,NeuroFlex 把 EDP 降低了 57-67%;相比 dual-sparse 的 SNN-only baseline,最高加速 2.5×。在视觉、语言和 transformer 负载上,我们的 cost-guided scheduler 相比随机的元素分配,把吞吐提升了 16-19%。

1. Intro

稀疏加速器中,dual sparsity(weight 和 activation 两侧都跳零,只算两边都非零的 operand 对)已经做了很多,代表是 SparTen、Gamma 这一批。SNN 侧也有 LoAS 这样的 dual-sparse 加速器。作者的出发点是两边各有短板:ANN 的 MAC 快但功耗高;SNN 的 AC 省能量,但一个 activation 要在 TT 个 timestep 上串行累加出来,延迟随 TT 增长。 文章最主要的观察是 Fig.1。VGG-16 的 conv3_3 经过 im2col 变成 3136×2563136\times256 的 GEMM。在 63% 的 activation 稀疏度和 80% 的全局 weight 剪枝下,作者统计了每个输出元素 (i,j)(i,j) 在 bitmap inner-join 之后剩下的有效 operand 对数(后面记作 ri,jr_{i,j})。这个数在层内能差好几倍,沿空间和 channel 两个方向都有结构,一个 16×1616\times16 的 tile 里同时有工作量大和小的元素。

作者据此认为 match 多的元素适合 ANN,match 少的适合 SNN。现有的混合加速器只能按 layer(NEBULA、EPHA)或者按 tile(C-DNN、C-Transformer)选模式。layer level 切换时总有一种 core 闲着,tile 内部的差异也利用不到。C-DNN 用的转换还是有损的,送去 SNN 的部分要掉精度。

之前没人做到 elementwise,作者给的理由是 ANN-SNN 转换一直是近似的,layer 级还能靠大量神经元把误差平均掉,单个元素没有这个余地。同组去年的 PASCA 证明了 QCFS 激活的 ANN 和转换后的 SNN 在整数运算下严格等价。证明只依赖每个输出元素自己的局部整数运算,所以等价性对单个元素也成立,层内混用两种模式不会掉精度。

Contribution:

2.1. ANN-SNN Conversion

QCFS 激活:

hˆ(zl)=λl,clip!(1LzlLλl+12,0,1)\hat h(z^l)=\lambda^l,\mathrm{clip}!\left(\frac1L\left\lfloor\frac{z^lL}{\lambda^l}+\frac12\right\rfloor,0,1\right) LL 是量化级数,λl\lambda^l 是可训练的阈值。PASCAL 的神经元分三个阶段,阈值 θ=λl/L\theta=\lambda^l/L,初始膜电位 θ/2\theta/2

  • Phase 1(t=0,,L1t=0,\dots,L-1):正常的 IF,接收输入、soft reset,记录发放总量 C1C_1
  • Phase 2(t=L,,2L2t=L,\dots,2L-2):不再有输入,膜电位高于 θ\theta 发正脉冲,低于 0 发负脉冲,净值记为 C2C_2
  • Phase 3(t=2L1,,3L2t=2L-1,\dots,3L-2):把膜电位置为 C1+C2C_1+C_2,再用 IF 发放出去,作为下一层的输入。 一共 3L13L-1 步,输出的脉冲数和 QCFS 的输出严格相等。Phase 2 做的事情是修正 Phase 1 里因为输入到达顺序造成的多发和少发。11

2.2. Sparsity Exploitation in DNN Accelerators

SparTen 是 bitmap inner-join,每个元素 1 bit metadata。Gamma 是 Gustavson + CSR 类编码,metadata 是多字节的,访存更重。LoAS 用 FTP dataflow 把所有 timestep 并行掉,但 laggy prefix-sum 每个 chunk 要 8 个周期,还需要 correction accumulator 对齐快慢两路 prefix。这几个都是单模式的。

2.3. Hybrid ANN-SNN Algorithms and Hardware Architectures

算法侧有 slow-fast(低频 ANN 给 SNN 初始化膜电位)和 layer-wise 交替的混合模型。硬件侧 NEBULA 和 EPHA 是 layer 级切换,没利用稀疏。C-DNN 是 tile 级,转换有损,也没做 dual sparsity。

3. Lossless ANN-SNN Conversion and Dataflow

3.1. Element-level Extension of PASCAL Equivalence

两个 Corollary 给的是 INT8 下要满足的条件。输入层要求 θn/(2Ln)\theta_n/(2L_n) 是整数,且 θn\theta_n 在 INT8 范围内。MatMul + BN 的层要求 b/Lb/Lμ/L\mu/Lβ/L\beta/Lγ/σ2+ϵ\gamma/\sqrt{\sigma^2+\epsilon} 都是 INT8 范围内的整数。Theorem 1 说对任意输出元素 (i,j)(i,j),SNN 实现和 ANN 实现等价。证明只有一个 sketch:integrate、threshold、reset 只涉及该元素自己的输入和权重,和其他输出元素无关,所以 PASCAL 的 Thm 3.3–3.6 可以逐元素套用。

这个定理基本是显然的,IF 神经元的动力学本来就是每个神经元各管各的。真正让层内混用成立的是下一节的设计:层与层之间传的永远是整数,脉冲只存在于 PE 内部。

3.2. Unified INT8 Dataflow and On-the-Fly Mode Switching

所有 activation 和 weight 都以 INT8 存储,数据本身不带任何模式信息。模式是调度的属性,由离线 scheduler 给出的 per-element binary mask 决定。

这个设计本身挺干净的。不过这样一来,SNN 模式和一般说的 SNN 已经没什么关系了:没有跨层传递的脉冲,没有事件驱动,时间维度在 PE 内部产生,又在 PE 内部消掉。

T=L=8T=L=8λ=1\lambda=1 的配置下,activation 的取值是 0,1,,8{0,1,\dots,8}。SNN core 做的事情是:

ANN core 里,同一个 clamp 是两个比较器加一个 mux(4.3)。两种 core 算的是同一个 QANN,区别只在乘法是用乘法器做,还是用 unary 的 bit-serial 累加做。

从这个角度看,AC 替代 MAC 的收益要打折扣。ANN core 的 “INT8 MAC” 实际乘的是一个 8-bit weight 和一个不超过 8 的数,有效位宽不到 4 bit。unary 编码下数值 aaaa 次加法,普通的二进制 shift-add 只要 popcount(a)\mathrm{popcount}(a) 次,a8a\le8 时最多 3 次。按 Horowitz 45nm 的数,8-bit 乘法 0.2 pJ,8-bit 加法 0.03 pJ,一个 4×84\times8 的乘法器量级上相当于三次多的加法,aa 取 3 左右的时候两边就打平了。如果 ANN PE 用的是完整的 8×88\times8 乘法器,对 ANN 侧是不太公平的。

4. NeuroFlex Architecture

4.1. Overview & Core Organization

两种 core 各是一组 PE,共享 HBM 后面的 FiberCache。输出统一经过一个 compressor 再写回片上 SRAM。中心 scheduler 分发任务,core 内空闲的 PE 贪心地填。

4.2. Processing-Element Microarchitecture

每个 PE 收到的是一个 chunk(128-bit bitmap + 打包好的非零值),每周期处理一个非零元素,chunk 之间插一个 bubble。 ANN PE 来自 SparTen:

SNN PE 是三级流水。前端有两套 prefix-sum:fast prefix 单周期给出对齐用的早期偏移;laggy prefix(16 个加法器 + 128-bit buffer)用 8 个周期算完有效 match。只有 match 上的 activation 才往后送。三个 stage:

  • Stage 1 Spike Generation:纯组合逻辑,INT8 → 8-bit 脉冲串,只对 inner-join 之后留下的对生成;
  • Stage 2 Spike Count:硬件上展开 L1L-1 步,每步把脉冲 × weight 加到膜电位寄存器,和 θ\theta^* 比较,超过就记一个脉冲并 soft reset。带权输入 11-bit signed,膜电位 14-bit signed,计数器 4-bit unsigned;
  • Stage 3 Membrane Potential Reinitialization:最多 8 步,没有新输入。膜电位 θ_\ge\theta^\_ 就补一个正脉冲并减 θ_\theta^\_,为负就发一个负脉冲并加 θ\theta^*。计数器变成 5-bit signed,结果送 compressor。22

4.3. Memory Hierarchy and Interconnect

FiberCache 每个 cache line 存一个 bitmap 和一个 continuation pointer。它分了很多 bank 支持 PE 并发访问,替换策略按 reuse。swizzle-switch crossbar 每次传 128-bit 的 bitmap + data chunk,用 single-credit 反压。scheduler 通过统一的命令队列,给每个元素下发 mode token 和 PE 分配。

5. Cost Function and Scheduling

对 core aS,Aa\in{S,A},元素 (i,j)(i,j) 的能耗和延迟是 match 数的线性函数:

ea(i,j)=ϵarˆi,j+ζa,a(i,j)=βarˆi,j+δae_a(i,j)=\epsilon_a\hat r_{i,j}+\zeta_a,\qquad \ell_a(i,j)=\beta_a\hat r_{i,j}+\delta_a

(ϵa,βa)(\epsilon_a,\beta_a) 是 RTL microbenchmark 测出来的 per-match 系数,(ζa,δa)(\zeta_a,\delta_a) 是每个元素的固定开销。rˆi,j\hat r_{i,j} 取 128 个校准样本上 match 数的 P90,用来防 makespan 的尾延迟。

𝐗0,1M×N\mathbf X\in{0,1}^{M\times N} 是分配矩阵。能耗对元素可加。延迟是两种 core 各自 PE 上 makespan 的最大值 D=maxTS,TAD=\max{T_S,T_A}。目标是 EDP=ED\mathrm{EDP}=E\cdot D。因为 makespan 的耦合,这是 NP-hard 的。求解用模拟退火:

这里有两个地方我没太想明白。

第一,在这个线性模型下,“哪些元素去 SNN” 其实没有看上去那么重要。

第二,mask 是离线定死的,但 activation 的稀疏 pattern 随输入变。

  • 元素 (i,j)(i,j)ii 在 CNN 里是空间位置,在 Transformer 里是 token 位置。这一维上的 match 数基本由输入决定。
  • 能离线确定的,只有 jj 这一维上 weight 列的密度。
  • P90 校准对 CIFAR 这种物体居中的数据也许还行,对 token 维度很难说有意义。序列长度变了之后,M×NM\times N 的 mask 怎么用,文章也没讲。33

6. Experimental Methodology

setup:

LLM 的部分基本没有交代:

另外,ResNet-34 出现在硬件实验里,但不在这张表里。各模型硬件评估用的剪枝率和 activation 稀疏度没给,精度是不是在剪枝后的模型上测的也没给。44 artifact 只覆盖 Table IV,不包含硬件模拟器。

7. Experimental Results

7.1. End-to-End Performance & EDP

SparTen 仍然是最快的。LoAS 能耗最低,但 EDP 比 NeuroFlex 高 57.1-69.5%。NeuroFlex 相比 LoAS 最高加速 2.5×。

能耗口径。 文章里有一句话:三个设计共享 bitmap 编码、FiberCache 和存储层级,所以 memory subsystem 在归一化比较里 “cancels out”。一个相同的加项,在比值里是消不掉的。所以我的理解是,Fig.7/8 的能耗只算了计算侧。7.2 和 Gamma、Prosperity 比的时候,专门强调了 end-to-end、计入访存能耗,也印证了这一点。

而 Fig.12 里 global cache 占系统功耗的 63.9%。粗算一下 VGG-16:

几个 headline 数字放在一起对不上。 先只看 per-match 的线性部分。

ENF=a+es,DNF=2max(a,ρs)a+ρs,E_\text{NF}=a+es,\qquad D_\text{NF}=2\max(a,\rho s)\ge a+\rho s,

EDPNF(a+es)(a+ρs)=a2+(e+ρ),as+eρ,s2.\mathrm{EDP}_\text{NF}\ge(a+es)(a+\rho s)=a^2+(e+\rho),as+e\rho, s^2 .

m=min(1,eρ)m=\min(1,e\rho),也就是两个单模式 baseline 里较好的那个 EDP。由 e+ρ2eρ2me+\rho\ge2\sqrt{e\rho}\ge2m,上式三项的系数,分别不小于 m(a+s)2=ma2+2m,as+ms2m(a+s)^2=ma^2+2m,as+ms^2 的对应系数,所以 EDPNFm\mathrm{EDP}_\text{NF}\ge m

也就是说,线性代价下,16+16 的混合在 EDP 上赢不了 32 个 ANN PE 和 32 个 SNN PE 里较好的那一个。而文章报告的是两个都被明显超过:比 SparTen 低 57-67%,LoAS 又比 NeuroFlex 高 57-70%。另外 2.5× 的加速在均衡分配下对应 ρ=4\rho=4,此时 NeuroFlex 应该比 SparTen 慢 60%。

所以收益只能来自线性部分之外,有两种可能:

我比较怀疑后者。NeuroFlex 的元素是离线按 rˆ\hat r 打包到各个 PE 上的,利用率 97-99%。SparTen 和 LoAS 如果用的是各自原本的调度,层内 rr 差好几倍带来的空转,就会同时算进它们的延迟和能耗里。

random 分配具体怎么做的,文章没细说,但它已经能拿到 43-58% 的 EDP 降幅。BERT 上 random 的 57.6% 和 cost-guided 的 57.4% 基本没有区别。吞吐高 16.7% 而 EDP 持平,等于能耗也高了 17% 左右。这说明大部分收益和 ”给元素选对模式” 关系不大。

7.2. Comparison with Gamma and Prosperity

end-to-end 口径(含访存):

文章把 Prosperity 的 product sparsity 描述成 ”输出元素的点积为零时整体跳过”,这个不对。Prosperity 做的是在脉冲矩阵的行之间找相同的二值子组合,复用已经算过的内积(之前读过),和跳零是两回事。Prosperity 跑的是真正的多 timestep 脉冲输入,在这个理解下的 12× 是怎么比出来的,我不太确定。

7.3. Scheduling Granularity & PE Utilization

Element-wise 的利用率:VGG-16 99.3%,ResNet-34 98.9%,GoogleNet 98.6%,BERT 97.5%。Tile-wise 在 60-84% 之间。

LayerWise 是跑在 16+16 的 NeuroFlex 硬件上的。一层只用一种模式的话,另外 16 个 PE 必然空闲,利用率上限就是 50%。40-45% 这个数,更多是 baseline 的构造方式决定的。按 Related Work 自己的描述,EPHA 的 PE 可以配置成 ANN 或 SNN 模式,真正的 layer 级混合加速器不会有一半硬件闲着。

这几个数字在文中也不太一致:

利用率本身也不是目标。SNN PE 花 23 步迭代算一个 clamp 的时候,同样算 busy。

7.4. Scalability

7.5. Power Analysis

QCFS 比 ReLU 贵(ReLU 是 QCFS 的 0.8×),PASCAL 神经元比 LIF 贵(LIF 是 PASCAL 的 0.4×),但两种激活单元加起来不到系统功耗的 1%。作者自己的结论是,后续优化应该放在存储层级上。55

MAC 占系统功耗的比例是 23.1%×28.88%6.7%23.1\%\times28.88\%\approx6.7\% ,AC 换 MAC 这件事能碰到的也就是这几个点。

另外同样是 16 个 PE,SNN core 的功耗只有 ANN core 的 1/4,而 MAC 只占 ANN core 的 23%。这个 4× 显然不全是 AC 带来的。我的理解是,SNN PE 每个 chunk 要等 8 个周期的 laggy prefix,单位时间里翻转少,功耗自然低。换算成每个 match 的能耗,差距没有这么大。

8. Conclusion

作者自己写的局限是方法只对 activation 能用 QCFS 表示的模型成立。

感觉的优点:

缺点:

脚注

  1. 用负脉冲修正 overfiring,从而让 QANN 和 SNN 严格等价,这个思路在 SpikeZIP-TF 的 ST-BIF 里就有了,本文的 related work 里没有提。区别是 ST-BIF 边收边发、随时修正,PASCAL 是等 LL 步输入全部收完,再统一修正、统一输出,每一层天然要多等 2L12L-1 步。

  2. 硬件的三个 stage 和 PASCAL 的三个 phase 对应得不太清楚。算法里带输入的累加是 LL 步,Stage 2 写的却是展开 L1L-1 步,而脉冲串有 8 个 slot。第 8 个 slot 的输入在哪里加进去的,没看明白。

  3. 文章里 element 和 column 两个词是混用的。Related Work 里写 column granularity 是 inner-product dataflow 能独立分配的最细粒度,Algorithm 1 的标题也还是 Column-Wise。估计早期版本是按输出列调度的。列的工作量主要由 weight 决定,离线调度在那个粒度上反而更说得通。

  4. Fig.1 的 conv3_3 是 3136×2563136\times256,对应 56×5656\times56 的 feature map,也就是 224 分辨率的输入。但 Table IV 里 VGG-16 是在 CIFAR-10 上测的。

  5. 一些小问题:core 配比那节的 SNN/ANN = 10/8 应该是 10/6。EDP 那节引的 Figure 7 应该是 Figure 8。和 Gamma 比的那节里,Gamma 引成了 [8](Spada)。Fig.12B 三项加起来是 102%,12C 加起来是 95.7%。