阅读导航
- 先补基础:Mamba 与 SSM 是什么
- 一张图看懂 Mamba 块的内部结构
- eMamba 整体设计框架
- 硬件友好的 Range Normalization
- 近似 SiLU 激活函数
- 硬件感知的 SSM 层近似
- 逐层流水线策略
- 近似感知的神经架构搜索 NAS
- 量化优化
- 实验结果:精度与硬件收益
- 消融实验:每个优化到底值不值
- 总结
这一篇在干嘛?
这篇论文叫 eMamba,发表在 ACM 旗舰期刊 TECS(ACM Transactions on Embedded Computing Systems)2025 年 9 月刊上。它回答一个问题:怎么把 Mamba 这种新型序列模型真正部署到算力有限、电池供电的边缘设备上? 作者们没有只做软件层面的剪枝量化,而是从数学近似、模型架构搜索、量化方案、硬件流水线一路设计到 FPGA 原型和 22nm ASIC 版图,给出了一套端到端的方案。如果你对”深度学习模型怎么跑在芯片上”感兴趣,或者听说过 Mamba 但不知道它和 Transformer 的本质区别,这篇非常适合入门——不需要芯片设计背景,也不需要读过原论文。
先补基础:Mamba 与 SSM 是什么
在看 eMamba 之前,必须先把两个名词搞清楚:SSM(State Space Model,状态空间模型) 和 Mamba。
SSM:用”状态”来记忆历史
SSM 本身不是新东西,它是一个来自控制理论的老数学框架,几十年来一直用来描述动态系统——比如电路、机械系统、信号处理中的滤波器。它的核心思想很简单:系统在任意时刻都有一个内部状态(state),这个状态由上一时刻的状态和当前输入共同决定,而系统的输出又由当前状态和当前输入决定。
把它搬进机器学习里,SSM 就变成了一个处理序列数据(一段文字、一帧帧图像、一段语音)的模型。你可以把它想象成一个”带记忆的读卡器”:它逐个 token(词元,序列中的最小单位)地读入数据,不断更新自己的记忆(状态向量),并随时输出结果。这和 RNN(Recurrent Neural Network,循环神经网络)很像,但 SSM 的数学形式来自一阶微分方程,训练起来更稳定、更高效。
和 Transformer 比:复杂度从平方降到线性
那为什么大家突然对 SSM 感兴趣?关键在计算复杂度。
Transformer 是目前主流大模型的基础架构,它的核心是注意力机制(Attention):每生成一个输出,都要让序列里的每两个 token 之间互相计算相关性。如果序列长度是 ,计算量就是 ——序列长度翻倍,计算量翻四倍。这在云端 GPU 上还好,但在边缘设备上就是灾难:内存放不下、算不完、电量扛不住。
SSM 系的模型(包括 Mamba)则是逐 token 顺序处理的:读完第 1 个 token 更新状态,再读第 2 个……每个 token 的计算量是固定的,总复杂度是 线性。序列再长,计算量也只是按比例增长。这就是论文反复强调的”线性时间复杂度”。
而且 Mamba 不是纸上谈兵:它在多种任务上的精度能和 Transformer 打平,同时训练更快、推理更省。甚至有工作证明了 SSM 与 CNN、RNN 在数学上的等价性,说明它是通用性很强的架构。
为什么 Mamba 特别适合边缘设备
边缘设备(Edge Device)指手机、可穿戴设备、传感器节点、无人机这类资源受限的终端。它们的特点是:算力弱、内存小、功耗预算可能只有几百毫瓦。Transformer 类模型动辄需要几百瓦的 GPU,不仅在边缘跑不动,在数据中心的能耗和碳足迹也成了大问题。
Mamba 的线性复杂度 + 较小参数量,让它天生就是边缘 AI 的好苗子。但问题在于:在 eMamba 出现之前,没有任何一套硬件加速框架是专门为”边缘场景的 Mamba”设计的。已有的两个 Mamba 加速器研究(MARCA 和一篇 DATE 2025 的工作)都瞄准大语言模型(LLM),评估的是 28 亿参数级别的模型——和边缘场景完全不是一个世界。eMamba 就是来填这个空的。
一张图看懂 Mamba 块的内部结构
Mamba 模型由若干个**Mamba 块(Mamba block)**堆叠而成,就像 Transformer 由多个 Transformer 层堆叠一样。每个 Mamba 块内部长什么样?论文的 Figure 1 画得很清楚。
图 1:Mamba 架构总览,高亮的模块是论文重点改造的对象。
我们顺着数据流走一遍:
- Layer Normalization(层归一化):把输入特征的数值范围拉平,稳定训练过程,防止梯度爆炸或消失。可以理解为”先给数据做个体检和标准化”。
- 两个并行的线性层:把特征维度扩展(expand)到更大维度,为后面的门控和 SSM 计算做准备。
- SiLU 激活 + 门控:上路经过 SiLU(Sigmoid Linear Unit)激活函数后,与下路的输出逐元素相乘,构成门控机制(gating)——控制哪些信息该放行、哪些该压制。
- 一维卷积(1D Conv):下路先经过 1D 卷积混合局部特征,为时序建模做准备。
- SSM 层:Mamba 的灵魂模块,用离散化的状态空间方程建模序列依赖,替代 Transformer 的注意力机制。
- 线性投影 + 残差连接:把扩展后的特征投影回原维度,再加上输入本身(残差连接),既保留原始信息又稳定训练。
这张图还有第二个作用:它预告了 eMamba 要动刀的地方。图中被高亮的模块——Layer Normalization、SiLU 激活、SSM 内部的非线性函数(Softplus 和指数函数)——恰恰是硬件实现中最贵、最头疼的部分。eMamba 的全部工作,就是把这几块换成硬件友好的近似版本,同时尽量不掉精度。
eMamba 整体设计框架
图 2:eMamba 端到端加速器设计框架总览。
eMamba 不是一个单点技巧,而是一条完整的流水线式设计流程(见图 2),覆盖从算法到芯片的全链路。它分两大步:
第一步:基于 Mamba 特性的硬件优化。 先找出 Mamba 模型里计算瓶颈和资源大户,然后逐个替换:
- 用 Range Normalization(范围归一化) 近似 Layer Normalization,算术更简单、并行更容易;
- 用分段线性函数近似 SiLU 激活;
- 为 SSM 计算设计定制流水线,把递归运算展开(unroll),并用轻量替代品近似 Softplus 和指数函数。
这些近似都带有可学习参数(后面会讲),不是拍脑袋定的。
第二步:应用驱动的参数与硬件配置调优。 根据目标应用的数据分布微调近似中的可学习参数;用逐层流水线(layer-wise pipelining)和神经架构搜索(NAS,Neural Architecture Search)决定模型超参数,在资源成本和精度之间找平衡;最后做系统的量化分析,确定量化的缩放因子、位宽和截断策略。
设计完成后还有一条多阶段验证链:先用 Python 写高精度仿真器快速验证功能正确性和精度,再做周期精确(cycle-accurate)的 RTL 实现,然后上 FPGA 做功能测试和性能评估,最后走完物理设计流程生成 ASIC 版图。这套”软件仿真 → RTL → FPGA → ASIC”的验证路径,是论文可信度的重要来源——不是仿真器上跑个数字就完事,而是真的流了片(用 GF 22nm 工艺完成了版图级评估)。
下面这张图给出了 eMamba 实际实现的 Mamba 块硬件架构,也标注了哪些部分被替换成了什么。
图 3:eMamba 中硬件实现的 Mamba 块整体架构,蓝色和绿色高亮部分是被近似替换的模块。
硬件友好的 Range Normalization
Layer Normalization 为什么”贵”
先看原版。Mamba 块的入口是 Layer Normalization,公式是标准的:
其中 和 是输入的均值和方差, 是防止除零的小常数, 和 是可学习的缩放和平移参数。
这个公式在 GPU 上跑毫无压力,但放到边缘设备硬件上就是”三宗罪”:要算标准差(先求方差再开平方根),要算平方根,最后还要做除法。平方根和除法在数字电路里都是出了名的贵操作,要占很多面积、耗很多周期。
换成 Range Normalization
eMamba 借用了”范围归一化”(Range Normalization)的思想来近似。观察发现:分母里那个 ,本质上是在度量数据的波动范围。那能不能用一个更便宜的度量来替代?答案是极差——最大值减最小值:
其中 。这样,平方根和标准差计算全部消失,只剩下比较器(找最大最小值)——比较器在硬件里几乎是最便宜的逻辑单元之一。
不过有个问题:原始的 Range Normalization 概念(来自之前的研究)用极差近似方差,捕捉数据动态的能力弱,直接用会掉精度。eMamba 的改进是给近似加上可学习参数(就是公式里的 和 ),让训练过程自动补偿近似带来的偏差,做到”硬件简化但精度不掉”。
除法怎么办:并行度设计空间探索
公式里还剩一个除法。除法在硬件里依然不便宜,如果想提高吞吐量,可以把除法操作展开并行化到多个计算单元上——但并行单元越多,芯片面积越大。这是一个典型的性能-面积权衡问题。
eMamba 的做法是把归一化层的运算拆成独立步骤(求最大值、求最小值、减法、除法、乘加、位移动),让处理单元数量成为可配置参数,然后在真实 FPGA 上逐一测试不同的并行度,找到最佳设计点。具体结果在实验部分详讲(10 或 20 个计算单元最划算)。这种”把每个算子都拆开做设计空间探索”的工程化思路,贯穿了整篇论文。
常见坑:别把"近似归一化"当成免费的午餐
有同学可能会想:Range Normalization 又简单又好,那是不是所有模型都该直接换?注意两点:第一,原始 Range Normalization(不带可学习参数的版本)会明显掉精度,因为它用极差替代方差时丢失了数据分布的细节信息,必须靠可学习的 、 重新训练来补偿;第二,eMamba 是针对边缘推理场景设计的,如果你的模型部署在云端 GPU 上,Layer Normalization 根本不是瓶颈,换近似纯属白折腾。
近似 SiLU 激活函数
SiLU 为什么难算
Mamba 块的门控分支用 SiLU 激活函数,定义为:
这一下就踩了两个硬件雷区:指数运算()和除法。而且你没法简单地把 SiLU 换成硬件最爱的 ReLU——虽然两者形状相似,但 SiLU 不是单调递增函数(它在负数区间先下降再回升),训练时直接替换成 ReLU 会导致精度大幅下降,论文实验验证了这一点。
分段线性近似:化曲为直
eMamba 的思路是分段线性近似(Piecewise Linear Approximation):把一条平滑曲线切成若干小段,每段用一条直线段代替。硬件实现上,直线段只需要一次乘法和一次加法,成本几乎为零。
关键在于切哪里、切多少段。作者先对训练数据做了画像(profiling),发现激活值近似服从均值为零的高斯分布——也就是说,绝大多数输入都聚集在零附近。再看 SiLU 曲线的形状:在 区间内非线性最强(先降后升),区间外基本就是线性或饱和。
于是近似策略定为:
- 输入小于 :输出直接置零(SiLU 在这一侧趋近于零);
- 输入大于 :输出等于输入本身(SiLU 在这一侧近似恒等函数);
- 区间内:切分成 17 段直线,保证每段的近似误差不超过 3%。
图 4(a) 对比了原始 SiLU 和分段近似版的曲线,肉眼几乎看不出差别。
图 4(a):SiLU 函数与分段线性近似版本的对比,误差极小。
这里体现了一个重要的设计哲学:近似不是均匀的,而是数据感知的。哪里数据多、哪里曲线弯得厉害,就在哪里下功夫;数据到不了的地方,粗暴处理也无所谓。这种”先画像再近似”的方法论,在下面的指数函数近似里还会再用一次。
硬件感知的 SSM 层近似
现在轮到 Mamba 的核心——SSM 层。这一节公式最多,我们慢慢拆。
SSM 的递推方程
SSM 层的职责是”结合历史和当前输入,产生新的状态和输出”。它的离散化递推方程是:
解读一下符号: 是当前时刻的输入, 是 维状态向量(“记忆”), 是 维对角矩阵, 和 是 维向量。特别之处在于,这些状态空间矩阵都是当前输入 的函数——它们由输入经过线性层动态生成(这就是 Mamba 所谓的”选择性”机制,Selective SSM),而不是像经典 SSM 那样固定不变。步长参数 与连续时间的 A、B 相乘后得到离散化的 和 。
这套机制的效果是:SSM 把”当前输入”和”历史状态”有选择地编码进状态向量里,用一种完全不同于注意力机制的方式实现了”记住重点、忘掉细节”。而且它只用了乘法器和加法器——比注意力的矩阵-矩阵乘法便宜得多。
为了方便后文阅读,先给一张符号表(论文 Table 1 的整理版):
| 符号 | 含义 |
|---|---|
| 模型维度 / token 大小 | |
| 序列长度 | |
| 扩展因子( 为块内部维度) | |
| 状态维度 | |
| patch(图像块)大小 | |
| Mamba 块数量 | |
| 归一化输入的均值和方差 | |
| 稳定性常数 | |
| Range Normalization 的可学习缩放/平移 | |
| 时间步,从 0 到 | |
| SSM 在时刻 的输入和输出 | |
| 大小为 的状态向量 | |
| 依赖输入的状态空间矩阵 | |
| 依赖输入的离散化参数 |
硬件流水线怎么跑 SSM
eMamba 用流水线方式实现 SSM,一次处理一个 token(大小为 ,因为输入 已被线性层扩展到 )。为什么不并行处理整个序列?因为并行需要把 、 的数据从 扩展到 ,序列一长资源直接爆炸。所以 eMamba 用 规格的乘法器阵列(论文示例中是 40×8),迭代 次(示例为 16 次)来完成计算:先逐元素相乘( 乘 , 乘 ),再相加得到 ,最后用 与 的点积加上 得到输出 。
SSM 主体只需要乘法器和加法器,很友好。真正的麻烦在预处理:生成 和 的过程中需要两个非线性函数——Softplus 和指数函数。这就是图 3 中高亮的部分,也是 eMamba 下一轮”动刀”的地方。
Softplus 直接换成 ReLU
第一个近似最简单粗暴:计算离散化参数 需要 Softplus 激活函数。Softplus 平滑、可微,但对硬件来说资源开销大。既然 Softplus 和 ReLU 都是单调递增函数、形状接近,eMamba 就直接用硬件实现几乎零成本的 ReLU 替换。实验证明这样换掉之后精度几乎不受影响——因为两者在大部分输入范围内的行为本来就很像。
指数函数的分段近似
第二个近似处理指数函数 (计算 时需要)。指数函数同样是硬件杀手。eMamba 沿用”先画像再分段”的套路:
图 4(b):指数函数与分段线性近似版本的对比。
对训练数据画像后发现:绝大多数输入值小于 1。于是策略是——输入大于 1 时输出恒定( 在这里增长已经很快,直接饱和处理);输入小于 时输出近似为零( 已经小到可以忽略); 区间用 11 段直线近似。图 4(b) 显示近似曲线与原曲线几乎重合,精度损失极小。
常见坑:分段近似只能在推理期用,训练期会翻车
这是一个非常容易踩的坑:SiLU 和指数函数的分段线性近似只在推理(inference)阶段启用,训练(training)阶段不可以用。原因是分段线性函数在切点处的导数会发生跳变,即函数的梯度(gradient)形状被改变了,而反向传播恰恰依赖梯度来更新参数——用被扭曲的梯度训练,模型参数会学歪。所以 eMamba 的做法是:训练时用 Range Normalization 和 ReLU(它们本身就是可导的结构性替换),推理时再叠加分段近似。如果你复现这篇论文,一定要把”训练用哪些近似、推理用哪些近似”分清楚。
逐层流水线策略
算子层面的优化做完后,还要解决架构层面的问题:怎么让这些计算块高效地协同工作?答案是逐层流水线(Layer-wise Pipelining)。
为什么 SSM 特别适合流水线
Transformer 的注意力机制有个先天缺陷:它需要整个序列的所有 token 都到位才能开始计算(因为每个 token 要和所有其他 token 交互)。这意味着流水线的第一级必须等很久。而 SSM 是逐 token 顺序处理的,读到一个 token 就能开始算一个,天然适配”流水线不停流动”的模式,也完全不需要缓存整个长度为 的序列。
怎么组织流水线
eMamba 把 Mamba 的每个计算层当作流水线的一个”站台”(stage),token 像产品一样依次穿过各个站台。图 5 展示了这个调度过程:每一行是一个 token,每一列是一个抽象时钟周期(从 Cycle A 到 Z),彩色块表示各层的关键操作。
图 5:eMamba 跨抽象时钟周期的逐层流水线调度。每行对应一个输入 token,每列是一个流水线级。
流水线组织中有几个工程细节值得注意:
- 各层执行时间不同:不同层的计算复杂度和维度不一样,快的层会提前干完活。eMamba 用 ready/valid 握手协议同步各站——先完成的层停下来等下一站准备好接收 token,形成一个”不均匀但协调”的流水节奏。
- 严格的逐 token 处理:每个 token 都是一个固定维度的完整向量,半个 token 或者交叠输入会破坏这些数学运算的约束,所以必须一个 token 处理完才放行下一个。
- 不需要等整个序列:每个层只要上游的 token 一就绪就开工,数据在网络里连续流动,硬件利用率因此很高。
以 MARS 数据集为例:每帧输入被切成 16 个不重叠的图像块(patch),每个 patch 当作一个 token,量化后逐个送进 eMamba。这种做法处理第一个 token 的完成时间确实比全异步流水线长一点,但换来的是控制逻辑大幅简化、时序收敛(timing closure)更容易保证——对实际芯片设计来说,这笔买卖非常划算。
近似感知的神经架构搜索 NAS
前面的近似手段都就位了,但模型本身的”体格”——有多少层、每层多宽——还没定。这就是 NAS(Neural Architecture Search,神经架构搜索)的任务。
搜什么:五个关键超参数
eMamba 对五个超参数做搜索:,对应符号表里的定义——
- (token 大小)和 (扩展因子)决定 Mamba 块的内部维度,直接影响模型的表达能力和容量;
- (patch 大小)决定数据怎么被空间切分,进而决定序列长度 ;
- (状态维度)决定状态空间矩阵 、、 的形状;
- (Mamba 块数量)越多,误差通常越小,但参数量也越大。
“近似感知” 的含义是:搜索是在近似已经开启的条件下进行的——训练时使用 Range Normalization 和 ReLU(前面说过,分段 SiLU 和分段指数只在推理时用)。这样搜出来的架构,其精度评估反映的就是真实部署时的状态,不会出现”搜索时很美、部署后翻车”的错位。
搜索结果长什么样
图 6 展示了 MARS 数据集上的 NAS 结果:横轴是参数量,纵轴是相对于真值的平均均方根误差(RMSE,Root Mean Square Error)。棕色点是各种近似感知 Mamba 架构的精度-大小组合,它们和 CNN、ViT 的实现点画在同一张图里比较。
图 6:MARS 数据集上的近似感知 NAS 结果,红星标出最终选定的配置。
图中呈现清晰的权衡曲线:参数越多精度越好,但收益递减。eMamba 在帕累托前沿(Pareto front,即”不增加参数就无法提升精度”的最优边界)上,选了红星标记的那个配置——参数量最小、同时精度与 CNN 基本持平的点。这种”精度够用就不再加料”的克制,正是边缘部署该有的价值观。
量化优化
最后一道工序是量化(Quantization):把模型里的浮点数运算全部换成整数运算。整数运算在硬件上更快、更省电、占内存更少,是边缘部署的标配。
全整数量化:对称均匀量化
量化的基本公式是:
其中 是零点(zero-point), 是缩放因子(scale,决定相邻量化值的间隔), 和 由位宽 决定:
eMamba 对模型数据分布画像后发现:绝大多数激活值和权重都集中在零附近。于是采用对称均匀量化——零点直接取 0,浮点乘法因此可以用整数乘法加位移动(bit shift)实现,硬件成本极低。
位宽怎么选?作者系统测试了权重、偏置、激活值分别为 8-bit、16-bit、32-bit 的所有组合,发现:权重和偏置的位宽对精度影响可以忽略,激活值的位宽有一些影响但降幅也不大。于是干脆全模型统一 8-bit,不为不同参数设计复杂的混合位宽方案——位宽方案越复杂,硬件架构越复杂,得不偿失。
Scale-aware 量化的 SSM 层:唯一例外的 24-bit 状态
但有一个地方 8-bit 搞不定:SSM 层的中间隐藏状态 。
问题出在 SSM 的递归本质上。计算 时,上一时刻的状态 要乘以 。在整数运算中,两个量化数相乘,它们的缩放因子也要相乘。由于递归会在整个序列上不断重复,缩放因子和位宽会一步步累积爆炸——不加处理的话,几个时间步之后位宽就溢出了。
eMamba 的解法是给 SSM 层做”特殊照顾”——scale-aware(缩放因子感知)量化:
- 中间隐藏状态 用更高的位宽(避免截断误差),并配合**再量化(re-quantization)**控制位宽增长;
- 但再量化会丢失 的信息,而 马上还要用来算当前 token 的输出 。聪明的处理顺序是:先用完整的 24-bit 算出 ,然后再对 再量化存储,供下一步当 用;
- 存储之前, 会除以 的缩放因子,从源头上防止位宽跨时间步累积。
落到 MARS 数据集的具体实现上: 的缩放因子固定为 ,所以 INT24 的结果右移 7 位后存成 INT17;24-bit 的 用于计算 , 再量化到 INT8。SSM 块中除 以外的所有输入、输出和参数全部限制在 INT8,控制面积成本。
通关标准一:能自己讲清楚"为什么 8-bit 全量化会卡在 SSM 上"
学到这里,建议你合上资料自测一次:能否不看原文,把下面这条因果链完整讲出来——SSM 是递归的 → 递归中量化数相乘会累积缩放因子 → 位宽随时间步爆炸 → 所以 需要 24-bit + 再量化 → 但再量化丢信息 → 所以先用完整 算输出再降位宽存储。能讲清楚这条链,说明你真正理解了 scale-aware 量化的设计逻辑;讲不清楚的话,建议回到上一节再读一遍。
实验结果:精度与硬件收益
方法讲完了,该验收了。实验在四个数据集上展开:
- Fashion-MNIST:70000 张 28×28 灰度服装图片,10 分类任务,指标是分类准确率;
- CIFAR-10:60000 张 32×32 彩色图片,10 类物体,50000 训练 / 10000 测试,指标是分类准确率;
- MARS:基于毫米波雷达的人体姿态估计开源数据集,40083 帧 3D 点云,每帧输出 19 个人体关节的 3D 坐标(57 个值),指标是 MAE(平均绝对误差)和 RMSE,单位厘米;
- WikiText2:维基百科文章构成的词级语言建模数据集,约 200 万 token,指标是困惑度(Perplexity,越低越好)。
精度与模型大小对比
先看 ViT 对比(下表整理自论文 Table 3):
| 精度 | 模型 | Fashion-MNIST 大小 | 准确率 | CIFAR-10 大小 | 准确率 | MARS 大小 | RMSE (cm) |
|---|---|---|---|---|---|---|---|
| FP32 | ViT | 3.04M | 87.6% | 1.95M | 77.5% | 110K | 7.38 |
| FP32 | eMamba | 157K | 90.2% | 988K | 78.3% | 67.3K | 7.85 |
| INT8 | ViT | 778K | 86.4% | 499K | 75.6% | 27.4K | 9.05 |
| INT8 | eMamba | 39.1K | 86.5% | 247K | 72.6% | 16.8K | 8.83 |
亮点非常多:
- Fashion-MNIST 上,eMamba 在 FP32 下参数量只有 ViT 的 1/19.9(157K vs 3.04M),准确率反而更高(90.2% vs 87.6%);
- CIFAR-10 和 MARS 上精度持平(78.3% vs 77.5%;7.85 vs 7.38 cm),模型分别缩小 2.02 倍和 1.63 倍;
- INT8 量化后,两者都有轻微精度下降,但相对格局不变,Fashion-MNIST 和 MARS 上 eMamba 依旧占优;
- 唯一的小挫折是 INT8 下的 CIFAR-10(72.6% vs 75.6%),原因是 eMamba 对逐通道统计变化的量化噪声更敏感。
语言任务也能打:WikiText2 长序列稳定性
为了证明 eMamba 不是只会做小玩具,作者又在 WikiText2 上做了语言建模测试。所有对比模型(RNN、LSTM、ViT、无近似的参考 Mamba、eMamba)都被配置成约 600 万参数的同等体型,序列长度从 512 一路拉到 8192。
图 7:WikiText2 数据集上不同模型困惑度随序列长度的变化。
结果差异非常戏剧化:RNN 的困惑度从 163.91(长度 512)恶化到 246.45(长度 8192),LSTM 从 99.99 恶化到 168.42——传统循环网络记不住长程依赖。而 ViT、参考 Mamba、eMamba(FP32)的曲线几乎是平的,eMamba 甚至从 95.61 微降到 94.69。INT8 量化版的 eMamba(100.8 → 102.4)和自己的 FP32 版几乎重合,说明量化对它几乎没有伤害。这验证了 SSM 架构在长序列上的天然优势,eMamba 的各种近似并没有破坏这种优势。
MARS 上的详细对比(论文 Table 4)
| 指标 | CNN (FP32) | ViT (FP32) | Ref. Mamba (FP32) | eMamba (FP32) | CNN (INT8) | ViT (INT8) | eMamba (INT8) |
|---|---|---|---|---|---|---|---|
| 模型大小 | 4.14M | 110K | 67.3K | 67.3K | 1.03M | 27.4K | 16.8K |
| 平均 MAE (cm) | 5.93 | 5.14 | 5.49 | 5.66 | 6.67 | 6.59 | 6.63 |
| 平均 RMSE (cm) | 8.24 | 7.38 | 7.67 | 7.85 | 9.08 | 9.05 | 8.83 |
关键观察:
- 对比 CNN:eMamba 的 MAE 更好(5.66 vs 5.93 cm),但模型小了 63 倍(67.3KB vs 4.14MB);INT8 下同样精度更好(6.63 vs 6.67 cm)且小 63 倍;
- 对比 ViT:eMamba 的 MAE 略差(5.66 vs 5.14 cm),但小 1.63 倍,而且——这是决定性的一点——eMamba 的计算复杂度是线性的 ,ViT 是平方级的 。对实时边缘计算来说,这个复杂度差异会直接转化为下面这些硬件性能数字。
Range Normalization 的设计空间探索
上 FPGA 之前,作者先单独探索了 Range Normalization 层的并行度设计空间。实现平台是 AMD Zynq UltraScale+ MPSoC ZCU102 开发板。除法无法用标准 DSP48E2 算术块完成,所以每个计算单元需要一个 DSP 加一个专用除法器。由于 MARS 的 token 维度是 20,作者测试了 1、2、4、5、10、20 个计算单元的配置。
图 8:Range Normalization 延迟和帧延迟随计算单元数量的变化,超过 10 个单元后收益递减。
一个计算单元处理每个元素需要 25 个周期(2 周期算均值和极差,23 周期做除法、乘法、加法和移位)。结果(见图 8 和下表):
| Range Norm. 计算单元数 | 1 | 2 | 4 | 5 | 10 | 20 |
|---|---|---|---|---|---|---|
| LUT [%] | 0.07 | 0.13 | 0.26 | 0.33 | 0.66 | 1.32 |
| FF [%] | 0.01 | 0.02 | 0.04 | 0.04 | 0.09 | 0.18 |
| DSP [%] | 0.08 | 0.16 | 0.32 | 0.40 | 0.79 | 1.59 |
从 1 个单元加到 10 个,Range Normalization 延迟和帧延迟几乎线性下降——说明这一层就是瓶颈本身。超过 10 个之后收益递减,因为流水线里其他级(每 token 约 40 周期)和最后的投影层(58 周期)成了新瓶颈。资源占用则随单元数线性增长,但绝对值小得可怜:即使用满 20 个单元,也只占整个 ZCU102 平台的 1.32% LUT、0.18% FF、1.59% DSP。最终 eMamba 选择了 20 单元全并行配置——换来 Range Normalization 延迟降 1.92 倍、帧延迟降 1.08 倍,代价几乎可以忽略。
通关标准二:会算"瓶颈转移"这笔账
Range Normalization 这个案例教会我们一件事:优化一个模块之前,先确认它真是瓶颈;优化之后,要重新确认下一个瓶颈在哪。10 个单元之后继续加并行之所以无效,是因为瓶颈转移到了其他流水线级。做系统优化的人如果只盯着单一模块猛堆资源,很容易钱花了速度没上去。这是硬件工程(其实也是软件性能工程)里最朴素也最容易被忽略的道理。
FPGA 性能与资源对比
正式的硬件对比在 ZCU102 上进行,所有设计跑在 100MHz 时钟。对比对象包括:用 FINN 框架实现的量化 CNN 加速器、基于 I-ViT 的 ViT 加速器、以及一个”朴素 Mamba”(Naïve Mamba,用 I-ViT 的 I-layer normalization 和移位指数近似、MARCA 的分段 SiLU 拼出来的硬件基线)。eMamba 实现了两个版本:可重构版(权重可在运行时更新)和嵌入式版(权重固化)。下表整理自论文 Table 6:
| 指标 | CNN | ViT | Naïve Mamba | eMamba | vs CNN | vs ViT | vs Naïve Mamba |
|---|---|---|---|---|---|---|---|
| 帧延迟 [周期] | 9,235 | 8,130 | 10,220 | 1,643 | 5.62× | 4.95× | 6.22× |
| 吞吐量 [Mb/s] | 26.4 | 118 | 49.4 | 263 | 9.95× | 2.22× | 5.32× |
两个 eMamba 版本处理一帧都只要 1,643 个周期,折合 16.43 微秒的推理时间——比 CNN 快 5.62 倍、比 ViT 快 4.95 倍、比朴素 Mamba 快 6.22 倍。吞吐量 263 Mb/s,分别是 CNN 的 9.95 倍、ViT 的 2.22 倍、朴素 Mamba 的 5.32 倍。
资源利用率方面(图 9):
图 9:8-bit 量化 CNN、ViT 和 eMamba 的资源占用对比。
- LUT:可重构版 eMamba 用 68.5%,嵌入式版 40.0%,CNN 用 71.0%,而 ViT 需要的 LUT 达到 ZCU102 容量的 246%——ViT 根本放不下这块板子,不做大改架构就无法部署;
- DSP:两个 eMamba 版本只用 11.8%,CNN 用 24.8%,ViT 用 87.3%;
- BRAM(片上存储块):两个 eMamba 版本一块都没用,CNN 用 247 块、ViT 用 50 块——eMamba 的流水线设计完全靠寄存器和 LUT 撑起数据通路,内存效率碾压;
- FF:可重构版用 39.1%(它用触发器存权重,所以高一些),嵌入式版 10.8%。
ASIC 级对比:GF 22nm
FPGA 之外,作者还用 GlobalFoundries 22FDX FDSOI 22nm 工艺把 eMamba 和 ViT 做成了 ASIC 版图级设计(eMamba 的版图见图 10,核心尺寸 0.5913mm × 0.5917mm,也就是说整个加速器还不到 0.36 平方毫米)。
图 10:eMamba 的 ASIC 版图布局。
| 模型 | 门数 (NAND2 等效) | 面积 [mm²] | 功耗 [mW] |
|---|---|---|---|
| ViT | 8,880,532 | 1.669 | 750.1 |
| eMamba | 1,863,608 | 0.350 | 76.20 |
具体数字:ViT 需要 888 万个 NAND2 等效门,eMamba 只要约 186 万个,面积小 4.77 倍;在 300MHz 下,eMamba 总功耗 76.10mW 动态 + 95.27μW 漏电,ViT 是 746.95mW 动态 + 3.19mW 漏电,总功耗低 9.84 倍;处理第一张图,eMamba 耗能 1.254μJ,ViT 耗能 60.99μJ,能耗低 48.6 倍——这主要得益于 1,643 周期 vs 8,130 周期的延迟差。对电池供电的边缘设备来说,48.6 倍的能耗差就是”能用一星期”和”半天就没电”的区别。
消融实验:每个优化到底值不值
最后用消融实验(Ablation Study)回答一个尖锐的问题:eMamba 的每个近似技术,单独拎出来到底贡献几何?
作者构造了一个朴素 Mamba 基线,把 I-ViT 和 MARCA 的近似技术逐个塞进去(下表 (a)),再和 eMamba 自己的技术逐个测试(下表 (b))。所有测试都在 MARS 数据集、INT8 精度下进行:
(a) 朴素 Mamba(用 I-ViT / MARCA 的近似):
| I-Layer Norm. | MARCA SiLU | 移位指数 | 分段 Softplus | MAE [cm] | RMSE [cm] |
|---|---|---|---|---|---|
| - | - | - | - | 8.45 | 10.4 |
| √ | - | - | - | 26.4 | 29.1 |
| - | √ | - | - | 8.55 | 10.5 |
| - | - | √ | - | 13.2 | 19.8 |
| - | - | - | √ | 8.45 | 10.4 |
| √ | √ | √ | √ | 45.5 | 47.9 |
(b) eMamba(用自己的近似):
| Range Norm. | 分段 SiLU | 分段指数 | ReLU | MAE [cm] | RMSE [cm] |
|---|---|---|---|---|---|
| - | - | - | - | 8.45 | 10.4 |
| √ | - | - | - | 6.71 | 8.89 |
| - | √ | - | - | 8.46 | 10.4 |
| - | - | √ | - | 8.46 | 10.4 |
| - | - | - | √ | 8.51 | 10.5 |
| √ | √ | √ | √ | 6.63 | 8.84 |
两个表格放在一起看,结论非常震撼:
- 朴素 Mamba 的近似方案在 INT8 下是灾难:I-layer normalization 单独使用就把 MAE 从 8.45cm 拉爆到 26.4cm(缩放因子估计不当),移位指数也不理想(13.2cm),四项全开更是高达 45.5cm。也就是说,把别家(为 LLM 设计的)近似方案照搬到边缘场景,精度直接崩盘;
- eMamba 的近似方案不但不掉精度,反而涨精度:Range Normalization 单独使用就把 MAE 从 8.45 降到 6.71、RMSE 从 10.4 降到 8.89;分段 SiLU、分段指数、ReLU 各自的影响都在 0.06cm 以内;四项全开反而达到全场最好的 6.63 / 8.84。这说明 eMamba 的设计在 INT8 量化环境下天然更稳健。
系统级性能的消融(论文 Table 9)则揭示了流水线中的瓶颈效应:
| Range Norm. | 分段 SiLU | 分段指数 | ReLU | 帧延迟 [周期] | 吞吐量 [Mb/s] |
|---|---|---|---|---|---|
| - | - | - | - | 10,220 | 49.4 |
| √ | - | - | - | 2,480 | 188 |
| - | √ | - | - | 10,220 | 49.4 |
| - | - | √ | - | 10,220 | 49.4 |
| - | - | - | √ | 10,220 | 49.4 |
| √ | √ | √ | √ | 1,643 | 263 |
注意一个有意思的现象:单独开启分段 SiLU、分段指数或 ReLU,帧延迟纹丝不动(还是 10,220 周期)——但单独开启 Range Normalization 就把延迟砍到 2,480 周期。为什么?因为归一化是 Mamba 块的第一级流水线,朴素 Mamba 用的 I-layer normalization 延迟极高,后续所有层都只能干等它。瓶颈不解锁,其他地方的优化再好也传导不出来。四项全开后,Range Normalization 把瓶颈疏通,其他近似的延迟收益才得以在流水线上层层兑现,最终把帧延迟压到 1,643 周期、吞吐量推到 263 Mb/s。这又一次印证了前面说的”瓶颈转移”逻辑——只不过这次是反着讲:先解瓶颈,才能放大其余优化的价值。
总结
回顾整篇论文,eMamba 的价值可以浓缩成三句话:
- 架构层面:Mamba 的线性复杂度和选择性状态机制天然适合边缘场景,但在 eMamba 之前,没有人给它做一套完整的端到端硬件加速框架——已有的两个 Mamba 加速器都瞄准 LLM,评估方式(仿真器/综合工具)也不如 eMamba 扎实(FPGA 原型 + GF 22nm 版图)。
- 方法层面:eMamba 的武器库包括——带可学习参数的 Range Normalization 替代 Layer Normalization、数据画像驱动的分段线性近似(SiLU 17 段、指数 11 段)、Softplus 换 ReLU、逐层流水线 + ready/valid 握手、近似感知 NAS、统一 INT8 加 scale-aware SSM 层的混合量化。每项技术都有明确的”为什么”和消融数据支撑。
- 结果层面:精度上用 1.63–19.9 倍更少的参数追平或超越 CNN/ViT,在 WikiText2 上展现长序列稳定性;硬件上相对 CNN 加速器延迟低 5.62 倍、吞吐高 9.95 倍,相对 ViT 加速器面积小 4.77 倍、功耗低 9.84 倍、能耗低 48.6 倍。
对初学者来说,这篇论文最大的启发或许是它的方法论完整性:算法近似、架构搜索、量化策略、流水线设计、硬件验证环环相扣,每一环都朝着”边缘部署”这个同一目标对齐。单独看任何一项技术都不算惊世骇俗,但组合起来、并以流片级验证兜底,就构成了一篇扎实的系统工作。作者也强调这个框架是通用的,可以推广到 S4、S5、H3 等其他 SSM 架构上——SSM 硬件加速这个方向,才刚刚开始。
自测题:读完这篇,检验一下自己
1. 为什么 eMamba 要用 Range Normalization 替代 Layer Normalization?它用什么硬件资源换掉了哪些昂贵运算? Layer Normalization 需要计算方差、开平方根、做除法,这三样在硬件里都很贵。Range Normalization 用极差(最大值减最小值)替代标准差,把平方根和标准差计算变成了比较器(找最大最小值),只保留一个除法;再通过可学习的 、 参数补偿近似带来的精度损失。除法本身还可以通过多计算单元并行来摊薄延迟(最终选了 20 单元全并行,资源开销不到平台的 2%)。
2. SiLU 的分段近似为什么在 区间切 17 段,区间外却处理得那么粗暴? 因为对训练数据画像后发现激活值近似服从零均值高斯分布,绝大多数输入聚集在零附近;而 SiLU 恰好在 区间内非线性最强(先降后升)。所以误差预算全部花在数据密集、曲线弯曲的区域,保证每段误差不超过 3%;区间外(小于 -7 置零、大于 7 恒等)要么数据到不了,要么函数本身近似线性,粗暴处理不影响精度。这是”数据感知的近似”思想。
3. SiLU 和指数函数的分段近似为什么只能在推理阶段用,不能用于训练? 分段线性函数在切点处导数不连续、梯度形状被改变,而训练的反向传播依赖梯度更新参数,用被扭曲的梯度训练会让参数学歪。所以 eMamba 训练时只用结构性替换(Range Normalization、ReLU),推理时才叠加分段近似。
4. SSM 层的中间状态 为什么不能和其他参数一样用 INT8?eMamba 是怎么处理的? 因为 SSM 是递归的:每一步 乘以 时,两者的缩放因子也要相乘,位宽随时间步累积爆炸。eMamba 的处理是三步走: 用更高位宽(INT24)计算;先用完整的 24-bit 算出当前输出 (避免再量化丢信息污染输出);存储为下一步的 之前,除以 的缩放因子(右移 7 位)再降位宽,从源头阻断位宽累积。
5. 消融实验中,为什么单独开启分段 SiLU、分段指数或 ReLU 对帧延迟毫无帮助,四项全开却能达到 1,643 周期? 因为流水线瓶颈在第一级的归一化:朴素 Mamba 的 I-layer normalization 延迟极高,后续层全部在等它,其他模块的优化收益被堵在瓶颈后面无法兑现。单独开启 Range Normalization 把瓶颈疏通(延迟降到 2,480 周期),后续层的延迟改进才能顺着流水线逐级传导,四项全开最终压到 1,643 周期。这是系统优化中”先解瓶颈、再谈其他”的经典案例。