音乐
暂未播放
FPGA 加速器完全拆解(二):LLM 推理的前沿技术——FlightLLM、CXL-SpecKV 与 LightMamba

背景:LLM 推理给 FPGA 出了三道新考题#
上一篇我们拆解了 FPGA 加速器的底层原理与三个经典设计(EIE、ESE、Brainwave),得到一条主线:FPGA 加速器不是把模型”跑”在硬件上,而是把模型”变”成硬件——压缩、量化、稀疏化之后的模型,其数据流模式直接决定电路的形状。这一篇把这条主线延伸到 LLM 时代,看看 2024 年之后 FPGA 加速大语言模型推理的前沿技术长什么样。
先回顾一个残酷的事实。Transformer 大模型动辄几十上百亿参数,稠密 FP16 的 LLaMA2-7B 一次前向就要 14 GFLOPs,而数据中心 FPGA 的峰值算力(INT8 约 5-10 TOPS)比 GPU(数百 TOPS)低一到两个数量级。在”拼矩阵乘算力”这个维度上,FPGA 永远拼不过 GPU,所以 FPGA 加速 LLM 的路线只能是”让模型变得更省”然后”把省下来的每一分都吃干榨净”——这正是前沿论文共同的出发点。
但”让模型更省”在 GPU 上恰恰难以兑现。论文 FlightLLM(FPGA 2024,清华大学、上海交大、无问芯穹团队)把这个问题概括为 LLM 推理的三道考题:
考题一:稀疏算不出来。 压缩模型最有效的手段之一是权重剪枝,但 GPU 只高效支持 2:4 结构化稀疏(每 4 个权重中固定位置留 2 个),而 LLM 上 2:4 稀疏会造成明显的精度损失;能保住精度的非结构化稀疏(75% 权重被剪掉)在 GPU 上几乎换不来端到端加速——分支判断、索引解引用、缓存失效的开销把省下的乘法全吃掉了。
考题二:混合精度省不了带宽。 量化能把权重压到 3-4 bit,但 GPU 的 SIMT 架构和缓存对齐要求所有权重同一位宽,于是”重要的权重给 5 bit、不重要的给 3 bit”这种混合位宽方案在 GPU 上无法兑现带宽收益。
考题三:小批量的内存效率。 decode 阶段一次只处理一个 token,访问的是片外的细粒度数据(权重、KV cache),GPU 的带宽利用率常常只有 29-43%。
FPGA 恰好是这三道题的”标准答案”候选:可编程的 DSP 链可以按稀疏模式定制、片上 BRAM/URAM 层次可以装下 decode 阶段的所有激活、位宽完全由设计者决定。问题只是——怎么把这些优势落到工程上。下面三篇前沿工作分别给出了三种不同的答案。

平台铺垫:Versal ACAP 与 AI Engine 阵列#
在进入案例之前,先认识一下它们共同的舞台:AMD/Xilinx 的 Versal 平台。2020 年 AMD 以 350 亿美元收购 Xilinx 后,把 CPU、GPU、FPGA 整合为统一 AI 平台,核心产品就是 Versal ACAP(Adaptive Compute Acceleration Platform,自适应计算加速平台)。
Versal 的”自适应”体现在一颗芯片上集成了三类引擎:
- 标量引擎(PS):Arm 处理器核,跑操作系统和调度软件;
- 可编程逻辑(PL):传统 FPGA 逻辑阵列,LUT/DSP/BRAM/URAM,就是上一篇讲的那套;
- AI 引擎(AIE):一组硬核的 SIMD 向量处理器,按二维阵列排布,用 VLIW(超长指令字)每周期发射一条向量指令、一条标量指令和多次访存;每个 AIE tile 有自己的程序内存、数据内存和 DMA,tile 之间用流式接口直连。
三类引擎通过片上的 NoC(片上网络)互联,数据搬运不再是”可编程逻辑里慢慢布线”,而是走高速硬核网络。Versal 的 AI 引擎把”可重构逻辑 + 硬核算力”结合了起来:PL 负责灵活的控制与数据流,AIE 负责高密度定点计算——这解决了上一篇提到的”纯逻辑阵列算力天花板”问题。
三个案例中,FlightLLM 跑在 Alveo U280 和 Versal VHK158 上,LightMamba 跑在 Versal VCK190 上,CXL-SpecKV 跑在 Intel Agilex-7 上。注意一个趋势:前沿 FPGA 加速器论文几乎都在 Versal 系列上落地,因为它的 HBM 带宽(U280 是 460 GB/s,VHK158 提升到 819 GB/s)和 AI 引擎算力已经接近入门级 GPU,而 PL 部分仍然保留 FPGA 的灵活性。
前沿案例一:FlightLLM——把 LLM”编译”成 FPGA 电路(FPGA 2024)#
第一个案例是清华大学、上海交通大学与无问芯穹合作的 FlightLLM,发表于 FPGA 2024(DOI: 10.1145/3626202.3637562)。它的目标最宏大:为 LLM 推理提供一条”完整映射流程”(complete mapping flow)——从 PyTorch 模型出发,经过压缩、编译,最终在 FPGA 上生成一套可运行的指令流和配套 RTL。论文的核心主张是:GPU 处理不了压缩后的 LLM,而 FPGA 可以用它特有的 DSP48 和异构内存层次把压缩收益全部兑现。
总体架构:任务调度器 + 计算核#
FlightLLM 的硬件架构(论文图 4)很简洁:一个任务调度器、一个内存控制器、若干个计算核(core)。模型并行地把任务分给多个核,核之间做数据同步。
每个计算核由四个部件组成:
- MPE(统一矩阵处理引擎):处理所有矩阵运算,包括稠密的 GEMM/GEMV 和稀疏的 SpMM/SpMV/SDDMM;
- MMU(内存管理单元):负责片外内存访问,内置混合精度反量化单元;
- SFU(特殊功能单元):处理 softmax、LayerNorm、SiLU 等非矩阵运算;
- 指令调度器:解码指令、调度各个硬件单元。

SFU 内部值得一提(论文图 7):它把一条 MISC 指令拆成微操作,逐个交给 ALU 执行;softmax 和 LayerNorm 这类”两阶段”运算需要先读完整向量算出归约参数、再读一遍算最终输出,而 SiLU 和逐元素加/乘这类”逐元素”运算可以边读边算。多个核的 SFU 之间还有一条共享数据通路——一个核算出的向量结果可以直接广播给其他核的 SFU,不必写回 HBM 再读,这是为解码阶段”多头共享中间结果”定制的。

这个架构看起来平淡,真正的机关在 MPE 内部。
核心创新一:可配置稀疏 DSP 链(CSD-Chain)#
为什么稀疏在 FPGA 上也难算?因为 FPGA 的乘法器是固定级联的 DSP48。为了压榨 DSP 的累加器和进位链,经典做法是把 DSP 首尾相连成一条固定的链(每个 DSP 的输出直接进下一个 DSP 的累加输入),这样乘法累加零开销。但固定的链意味着数据流路径固定——遇到稀疏矩阵,某几个乘数明明是零,链却必须照常跑,算力就浪费了。
FlightLLM 的解法是把固定链改造成可配置的稀疏 DSP 链(CSD-Chain):把一条长 DSP 链分成若干 DSP 组(DG),每组两个 DSP48(每个 DSP48 打包 2 个 INT8 MAC),组与组之间用可配置路径连接。在这条链上加了三个硬件单元:
- 稀疏多路选择器(Sparse MUX):每个 DSP48 同时接收两个激活(A 和 B,权重复用),送入之前先按稀疏索引从多个输入里只挑非零的激活送进去。零激活根本不会进入乘法器。
- 归约节点(RN):稠密 GEMM 里每条链只需要一个最终输出,但 SpMM 一个周期可能要产生多个输出。RN 放在 DSP 组末尾,需要时把组间级联路径打断,让当前组直接输出结果,后面的组重新开始一条新的乘法链(通过 Z-MUX 注入零)。
- 溢出调整单元(OAU):一个 DSP48 的乘法器是 25×18 bit,当它同时服务两个激活时每个激活只能用 18 bit 的端口,长级联累加容易溢出。OAU 把结果拆成高位部分(MSP)和低位部分(LSP),LSP 继续级联到下一个 DSP48 做累加,MSP 送到下一组的 RN 校准输出。当链上不超过 8 个 DSP48 时,16 bit 整数累加不会溢出,OAU 可以跳过。

这套设计的精妙之处在于:同一套硬件,稠密和稀疏都能全速跑。稠密时链不断开,整条链做一个大累加;稀疏时(以 2:4 为例,每 4 个权重只留 2 个)链被 RN 打断成两条独立链,每周期同时产出 2 个 MAC 结果。论文实测,配合 block 稀疏和 N
N
核心创新二:统一矩阵处理引擎(MPE)#
MPE 由若干 MPU(矩阵处理单元)组成,每个 MPU 又由若干 VPU(向量处理单元)组成。VPU 就是上面说的 CSD-Chain 点积单元。通过配置 MPU,MPE 可以切换两种工作模式(论文图 5):
- MM 模式:矩阵乘矩阵,prefill 阶段用;
- MV 模式:矩阵乘向量,decode 阶段用——此时把并行度参数从 [pM,pK,pN] 调整为 [1,pK′,pN′]。

为什么要专门调 MV 模式的并行度?这背后是 FlightLLM 的访存-计算重叠模型。对一次形状为 M×K 与 K×N 的矩阵乘法,设 pM,pK,pN 是三个维度的计算并行度、BW 是片外带宽,则访存时间和计算时间分别为:
Tmem=BWM⋅K+K⋅N+M⋅NTcmp=pM⋅pK⋅pNM⋅K⋅N要隐藏访存延迟(双缓冲),必须满足 Tmem<Tcmp。对 MV 运算,M=1 且 pM=1,直接代入会发现计算时间骤减、访存时间不变,条件被打破。论文的做法是在 [pK′,pN′] 的参数空间里搜索一组配置,让 MV 模式下计算资源部分空闲、但带宽仍然打满——牺牲一点算力利用率,换来 decode 阶段不卡在内存上。
此外,MPE 还通过指令调度支持 SDDMM(采样稠密-稠密矩阵乘,稀疏注意力的关键算子):把块稀疏注意力当作多个块级 GEMM 来处理,零掩码完全覆盖的块直接跳过,部分覆盖的块只算需要的那部分。
核心创新三:全片上解码(always-on-chip decode)#
decode 阶段的主要矛盾不是算力,而是频繁访问片外内存取细粒度数据。FlightLLM 的解法大胆而直接:把整个 decode 迭代的所有层计算全部融合在片上完成,只有最终结果写回片外。
为什么可行?因为 decode 阶段每个 token 的激活是向量(长度等于隐藏维度),不是矩阵,几个 MB 的片上 URAM 完全装得下。具体做法(论文图 8):
- 激活向量从第一层开始就留在片上缓冲区,MPE 算完当前层的线性/注意力后,输出直接作为下一层输入,不写片外;
- SFU(处理 softmax、LayerNorm、SiLU、逐元素运算)与 MPE 没有硬件资源冲突,两类计算可以时间上重叠:softmax 和 LayerNorm 需要完整向量,必须等 MPE 算完才能开始;而 SiLU 和逐元素加/乘在 MPE 输出一部分时就能立刻算;
- 结果是在一次 decode 迭代内,片外内存访问只剩下”读权重/KV + 写最终结果”,中间结果全部在片上流转。

效果立竿见影:带宽利用率从 35.6% 提升到 65.9%。这种”全片上”策略只在 decode 阶段可行(激活是向量),prefill 阶段激活是矩阵、片上装不下,所以 prefill 的融合只做到”稀疏注意力掩码跳过”的程度(论文图 8c)。
混合精度:3.5-bit 权重的反量化单元#
量化策略上,FlightLLM 用梯度重要性分析给每个权重分配 3、4 或 5 bit,平均 3.5 bit,激活保持 INT8——这就是 GPU 无法高效执行的混合位宽。FPGA 侧怎么处理?论文设计了一个专用反量化单元:把紧凑存储的 2/3/4-bit 数据按控制信号、缩放因子和符号位自动展开成统一的 INT8 再送进 MPE,避免在 LUT 里铺大量乘法器做反量化。这样,混合精度数据的带宽节省是实打实的(数据在内存里就是 3.5 bit),计算侧只多了一点点展开逻辑。
内存延迟优化:HBM + DDR 分工#
Alveo U280 有 8 GB HBM(460 GB/s)和 32 GB DDR(38 GB/s)两类内存。一般直觉是”全放 HBM”,但 FlightLLM 反其道而行:MPE 的大块访问放 HBM(单次访问 ~MB 级),SFU 的小块访问放 DDR(单次访问 ~100 B 级)。原因是 HBM 的访问延迟比 DDR 更高,当数据量小到百字节级时,HBM 的延迟开销反而超过 DDR——小访问走低延迟的 DDR,大访问走高带宽的 HBM,各取所长。这是”异构内存层次”思想在 FPGA 上的典型应用。
编译:1.67 TB 的指令怎么缩到 3.25 GB#
FPGA 加速器一般用静态编译生成指令,但 LLM 解码是逐个 token 生成的,输入长度每增加 1,指令就不同。如果为所有可能长度(prefill 1-2048 + decode 1-2048)分别生成指令,LLaMA2-7B 部署在 U280 上需要约 1.67 TB 的指令存储——远超片外容量。论文提出长度自适应编译,两步压缩:
- 阈值分组共享:把长度相近的输入用同一套指令。例如输入长度 1-16 的 decode 共用 16 token 的指令(利用 N
稀疏块 16×16 和稀疏注意力块 64×64 的粒度,性能损失可忽略)。decode 是访存瓶颈,指令执行频率高,所以 decode 用更细的阈值避免冗余计算。这一步把指令降到 4.77 GB。 - HBM 通道指令合并:每个 PE 的缓冲区连了 8 个 HBM 通道,原本每个通道一条 LD/ST 指令,现在合并成一条,硬件解码器展开成 8 条同时发射。指令降到 3.25 GB,DDR 装得下,性能损失可忽略。
部署流程与实测成绩#
完整的映射流程(论文图 9)是:PyTorch 模型 → 稀疏化 + 量化 → 导出中间表示 IR → 优化(消除 view 等无效层、融合 attention+softmax、linear+SiLU)→ 数据分配 HBM/DDR 地址 → 按模板生成指令 → 按平台参数(DSP 数量、HBM/DDR 容量带宽、片上 RAM)自动生成 RTL。也就是说,换一块 FPGA 不需要重新设计硬件,改参数重新综合即可——这正是 FPGA”可重构”价值的工程化。

实测数据(U280,225 MHz):
- 模型 LLaMA2-7B 和 OPT-6.7B,batch=1(延迟敏感场景)下,端到端延迟相对 V100S(vLLM+SmoothQuant 优化)提升 1.2-1.3×;
- 能效(token/J)相对 V100S 优化方案提升 6.0×、相对 A100 提升 4.2×;成本效率(token/s/$)提升 1.8×(U280 售价约 8000 美元 vs V100S 约 12000 美元);
- 带宽利用率 65.9%,超过 A100 优化方案的 57.4%;
- 在最新 Versal VHK158(32 GB HBM、819 GB/s)上,吞吐超过 A100 的 1.2×;对比 gpt-fast(PyTorch 官方 INT4 优化方案,A100 上 196.8 token/s),VHK158 上 FlightLLM 达到 92.5 token/s,能效是其 2.9×;
- 对比专用加速器 DFX/CTA/FACT(同参数模拟),端到端延迟几何平均提升 2.7×(U280)/ 4.6×(VHK158);
- 精度代价:全压缩(稀疏注意力 + N
剪枝 + 3.5-bit 量化)后 LLaMA2-7B 在 WikiText-103 上的困惑度从 8.7 升到 10.2,可接受。


FlightLLM 的意义在于证明了”压缩 + FPGA 完整映射流程”可以端到端打败 GPU:U280 这片 2021 年的 FPGA 卡,在能效上赢了 A100,在最新的 Versal 上吞吐也反超。它把上一篇文章的结论推到了新高度:FPGA 不是”边缘凑合”,而是”数据中心里值得认真对待的推理平台”。
前沿案例二:CXL-SpecKV——把 KV 缓存拆到 FPGA 的内存池(FPGA 2026)#
第二个案例换了个战场:不加速计算,而是解决 LLM 推理的内存墙。CXL-SpecKV 由耶鲁大学和哥伦比亚大学的研究者提出,发表于 FPGA 2026(获得最佳论文提名,DOI: 10.1145/3748173.3779188),开源在 GitHub。
问题:KV 缓存大到 GPU 装不下#
自回归解码时,模型要把每个历史 token 的 K、V 张量存下来供后续 token 查询。这个 KV 缓存的总大小是:
MKV=2⋅L⋅B⋅Smax⋅dh⋅Pbits其中 L 是层数、B 是批大小、Smax 是最大序列长度、dh 是隐藏维度、Pbits 是精度。代入 LLaMA-2 70B(L=80,dh=8192),批大小 32、序列 2048、FP16,得到 640 GB——而 A100 只有 80 GB。KV 缓存直接决定了能同时服务多少个请求:显存放不下,批大小就上不去,吞吐就上不去。
已有的解法各有各的痛:KV 量化(INT8/INT4)能压缩 2-4 倍但有精度损失;CPU/磁盘 offload(如 FlexGen)带宽太低(PCIe 8-12 GB/s vs HBM 2 TB/s 以上);投机解码(speculative decoding)加速的是”算”,反而因为要维护多条候选序列的 KV 而增加内存压力。
CXL-SpecKV 的思路:把 KV 缓存整体搬到 FPGA 挂载的 CXL 内存池里,GPU 只留一小块热缓存,再用 FPGA 硬件把”远端的慢”藏起来。CXL(Compute Express Link)是 2022 年之后兴起的互连标准,基于 PCIe 物理层,提供缓存一致的共享内存访问,延迟亚微秒级(200-400 ns)、带宽 64 GB/s(x16 链路)。相比 PCIe offload 的 8-12 GB/s 和 3-5 μs 延迟,CXL 把”内存解聚”(memory disaggregation)从理论变成了工程现实。
前提:KV 缓存的六个可利用特征#
论文先对 KV 缓存的访问模式做了 profiling,发现六个可被利用的特征:
- 顺序时间局部性:生成第 t 个 token 时,要访问位置 [0,t−1] 的全部 KV——访问序列是确定的、可预测的,这为”预取”提供了可能;
- 层间独立:不同层的 KV 互不依赖,可以按层流水线化处理;
- 读多写少:读写比约为 S:1(序列长度比 1),缓存友好;
- 值聚集在零附近:KV 张量的值高度集中在零附近,INT8 量化精度损失小于 1%(>99% 精度保持),单这一项就有 2× 压缩;
- 头间空间相关:相邻注意力头的值高度相关,差分编码 δi=xi−xi−1 能进一步压缩;
- 层间可压缩性不同:前 1/3 层压缩比可达 3-4×,后 1/3 层只有 2.5-3×——需要按层选择算法。
系统架构:四组件 + 三层内存#
CXL-SpecKV 由四个组件构成:
- GPU 推理引擎:跑模型前向,维护最近 128-256 个 token 的本地 KV 小缓存;
- CXL 内存池:FPGA 挂载的大容量内存(每设备 64-256 GB),主 KV 存储;
- FPGA 缓存引擎:实现压缩/解压流水线、地址翻译、缓存管理,800 MHz、吞吐 1.6 TB/s;
- 投机预取器:预测未来 token 序列、提前把对应 KV 条目搬到 GPU 侧,128 KB 的 LSTM 模型,预测延迟 <10 μs。
内存组织成三层层次:L1 GPU 本地缓存(8-16 GB,LRU);L2 预取缓冲(2-4 GB,双缓冲重叠数据传输与计算);L3 CXL 内存池(64-256 GB,按 4 KB 页组织以匹配 CXL 事务粒度)。一致性靠 CXL 2.0 的 CXL.cache/CXL.mem 协议,而预取路径绕开一致性协议直接只读访问 CXL 内存,减少协议开销;预取错了直接丢弃,不产生一致性操作。
投机预取器:95% 准确率的 LSTM#
投机预取是整套系统最关键的创新——它猜测的不是下一个 token 是什么,而是下一个 token 需要哪些 KV 条目。预取器是一个极轻量的 LSTM:输入最近 16 个 token ID 的 64 维嵌入(共 1024 维),经过 2 层各 128 隐单元的 LSTM,输出 top-k 预测(beam search 宽度 4)。整个模型只有 128K 参数(FP16 下 512 KB),在 FPGA 上推理不到 10 μs。
预取流水线端到端延迟:
Lprefetch=Lpred+LATU+LDMA=64+4+12=80 cycles其中 LSTM 推理占 64 个周期,地址翻译 4 个周期,DMA 12 个周期。CXL 控制器支持最多 16 个并发未完成请求(Ωmax=16),有效吞吐由内存带宽和并发度共同决定。系统稳定的条件是预取流量不超过 CXL 链路带宽:
λreq⋅k⋅Sentry<BWCXL⋅Hpred其中 λreq 是请求到达率、k 是预取深度、Sentry 是条目大小(4 KB)、Hpred 是预测命中率(0.95)。
预取错了怎么办?三个机制兜底:惰性失效(预取缓冲里的错数据不立即清,被新预取自然覆盖);回退路径(真 token 不在预测里时,同步从 CXL 取,延迟惩罚但保证正确);自适应深度(预测准确率高的请求加大 k,低的减小 k)。此外还有多层预取:处理第 l 层时同时预取第 l+1、l+2 层的 KV,有效延迟变为:
Teffective=Tcompute+max(Tprefetch−2×Tlayer,0)对多数模型,Tprefetch<2×Tlayer,有效延迟开销趋近于零。
FPGA 缓存引擎:压缩就是省带宽#
FPGA 缓存引擎(跑在 Intel Agilex-7 上)包含五个模块:ATU(地址翻译单元,TLB 命中率 >92%)、压缩引擎、解压引擎、内存控制器(16 个 HBM 通道,合计 1.6 TB/s)和 DMA 引擎。压缩流水线分三步(论文算法 2):
- 按页缩放量化:s=max(∣X∣)/127,把 FP16 数据按页统一缩放成 INT8;
- 差分编码:利用头内空间相关性,δj,i=xj,iint8−xj,i−1int8;
- 游程编码(RLE):压缩差分后的长零串。
平均压缩比 3.2×(各层 2.5-4.0×),以 1.2% 困惑度损失为代价。每个压缩实例 20 级全流水、发射间隔为 1,吞吐 51.2 GB/s(512 bit × 800 MHz);解压关键路径 25 个周期,另有”早退旁路”(约 30% 的流量是未压缩的直接通过,5 个周期),加权平均约 19 个周期。整引擎在 Agilex-7 上只占 30.5% ALM、25.9% DSP、15.8% M20K,频率 812 MHz——留了足够的余量在同一片 FPGA 上放最多 3 个额外引擎。
实测成绩#
系统在 8×A100 + 4×Agilex-7 + CXL 2.0 平台上评测(vLLM/TensorRT-LLM 通过自定义内存分配器插件接入),模型覆盖 LLaMA-2/3、Qwen、Mixtral、Gemma 等 22 种配置:
- 吞吐提升 2.1-3.2×(平均 2.4×):LLaMA-2 70B 聊天负载从 GPU-only 的 487 token/s(批大小 16)升到 1549 token/s(批大小 64)——因为 CXL 内存池让批大小从 16 涨到 128(配合压缩可到 384);
- 对比 CPU offload 提升 3.8-5.2×、对比仅压缩提升 1.8-2.3×;对比”无预取的 CXL 解聚”提升 1.6-2.1×——证明预取是整套系统的胜负手;
- 延迟代价可控:TTFT +4.2%、每 token 解码延迟 +8.2%、P99 +12.3%;
- 预取:top-4 准确率 94-97%,命中率 94.7%;有效平均访存延迟 383 ns vs 同步 CXL 的 1850 ns(4.8× 降低);内存访问时间占总延迟比例从无预取时的 37% 降到 10.6%,隐藏了 76% 的解聚延迟;
- 成本:A100 80GB 记 1.0×、FPGA 记 0.18×,用 1.37× 的硬件成本换 2.4× 吞吐,性价比提升 1.75×;8 GPU 规模下性价比优势扩大到 2.2×;
- 能效:0.340 vs 0.647 J/token,1.90× 提升(FPGA 4 块共 184 W,吞吐翻三倍后单位 token 能耗反而减半);
- 扩展性:4 GPU 时 95% 并行效率,8 GPU 时 87%。




CXL-SpecKV 的故事告诉我们:FPGA 在 LLM 时代的另一个高价值角色是”内存管理引擎”而非”算力引擎”。它不碰矩阵乘,靠的是把 KV 缓存的压缩、地址翻译、预取调度做成定制流水线——这类”有明确数据结构、需要确定性延迟、要绕过通用 CPU 栈”的工作,正是 GPU 和 CPU 都做不好、而 FPGA 最擅长的。与上一篇的 Blink(SmartNIC 直通)和 DualPath(KV-Cache 直读)放在一起看,一条清晰的趋势浮现:FPGA 正在成为 GPU 的”内存外设”和”数据通道”。
前沿案例三:LightMamba——SSM 的量化-硬件协同设计(DATE 2025)#
第三个案例换一个模型家族:状态空间模型(SSM)。LightMamba 由北京大学 Meng Li 团队完成,发表于 DATE 2025(DOI: 10.1109/DATE59290.2025.10993079),开源在 GitHub。
为什么 Mamba 难加速#
Mamba 类模型(如 Mamba2)相比 Transformer 的优势是线性复杂度:不需要随序列增长的 KV 缓存,只维护一个固定大小的隐藏状态 ht,解码时每个 token 的增量计算是常数。这天然解决了上一个案例的内存墙问题。但 Mamba 在 FPGA 上也不好算,论文总结了三个挑战:

先看清 Mamba 块的组成(上图):输入 token 先经过输入投影生成 X,B,C,Δ,Z 五个张量,X 经过 conv1d 后进入 SSM 层,SSM 维护隐藏状态 ht 并输出 Y,最后与 Z 逐元素相乘、经输出投影还原维度。其中 B,C 是类似注意力里的选择向量,Δ 控制状态更新的步长——这些逐元素运算和隐藏状态递推正是 FPGA 加速的难点所在。
挑战一:散落的激活离群值。 量化 LLM 的关键障碍是激活里的离群值(绝对值远大于均值的元素)。Transformer 的离群值固定在少数几个通道上,所以 SmoothQuant 可以按通道缩放;但 Mamba 的离群值随 token 变化出现在不同通道(论文图 2 实测),SmoothQuant 和 OutlierSuppression+ 统统失效——后者 4-bit 量化误差高达 309.8,比不做任何处理的 RTN(19.5)还差一个数量级。

挑战二:SSM 层量化贵。 SSM 层全是逐元素乘(EM),没有矩阵乘那样的归约。量化后每算一步都要把中间结果”重量化”回低精度——矩阵乘有归约可以摊销,EM 没有,重量化开销巨大。论文实测(图 3),SSM 层的重量化硬件成本比非逐元素运算高一个数量级。
挑战三:计算依赖复杂。 SSM 的输入 X,B,C,Δ 全部由输入投影层生成,导致输入投影和 SSM 必须串行执行,硬件利用率不到 60%;而且 SSM 的中间激活(BˉX、Aˉht−1、ht 等)占了片上 URAM 的 70% 以上。
旋转辅助量化:把离群值”摊平”#
量化算法层面,LightMamba 用旋转辅助量化解决挑战一。核心思想来自 QuaRot/SpinQuant:给激活和权重乘一个正交矩阵(这里用 Hadamard 矩阵 H,元素只有 ±1、无需乘法器),利用 XW=XHHTW 的恒等关系,在不改变结果的前提下把离群值”摊”到其他元素上——离群值被均摊后,4-bit 量化的误差大幅下降。
但关键问题是:SSM 层不满足旋转等价。看隐藏状态递推:
ht=Aˉ⊙ht−1+Bˉ⊙Xt两边同乘 H 得到 (ht−1H) 吗?验证一下:
htH=(Aˉ⊙ht−1)H+(Bˉ⊙Xt)H由于逐元素乘不满足结合律(Aˉ⊙(ht−1H)=(Aˉ⊙ht−1)H),上式无法变成 Aˉ⊙(ht−1H)+Bˉ⊙(XtH)。也就是说,把旋转穿进 SSM 的递推会被逐元素乘挡住,SSM 不能像线性层那样直接旋转。
所以 LightMamba 的策略是:只旋转线性层,且把旋转尽量融合进相邻算子,让大部分旋转零成本(论文图 4)。全模型的旋转点有五个:① 嵌入表(融合进 embedding 权重);② 第一个 RMSNorm 之后(先把 RMSNorm 的缩放因子 D 拆出来融合进输入投影权重);③ 第二个 RMSNorm 之后(这是唯一需要在线计算的旋转,论文验证了把缩放因子也融合会增大量化误差,所以不融合);④ 输出投影两侧(一侧融合权重、另一侧与 ③ 合并);⑤ LM head(融合进输出权重)。最终只有旋转 ③ 在运行时用硬件执行,代价很小。

SSM 层则改用 PoT(2 的幂次)量化:把量化步长限制为 2 的幂,于是”反量化 + 重量化”从乘法变成移位操作,硬件开销骤降(论文图 3 中 PoT 的重量化成本曲线远低于普通量化)。
硬件架构:部分展开的空间架构 + 三个专用单元#
硬件层面,LightMamba 采用部分展开的空间架构:把单个 Mamba 块在 FPGA 上展开成流水线,而不是像 FlightLLM 那样用指令驱动的时间复用架构。理由很实在:SSM 的逐元素运算种类多、依赖复杂,时间复用架构(一个 PE 串行做所有事)处理不了;而完全展开的空间架构(每个算子一个专用 PE)矩阵并行度又太低。部分展开是两者的折中:矩阵乘用 MMU 时间复用(一个块的所有线性层共用),SSM 内部全展开成流水(算子级并行)。

三个核心单元:
- MMU(矩阵乘法单元):树形 MAC 阵列,一周期完成 din×dout 次 MAC;利用 DSP 打包技术(一个 DSP48 做两个低比特 MAC)只需 din×dout/2 个 DSP。输入投影和输出投影按时间复用共享 MMU;
- SSMU(SSM 单元):把 SSM 计算图全展开,每个算子一个专用 EMU(逐元素乘单元),算子之间用 FIFO 连接,各算子并行度单独调优以平衡流水;
- HTU(Hadamard 变换单元):支持在线旋转 ③。128 点 Hadamard 变换用 FHT(快速 Hadamard 变换)蝶形算法实现:7 级蝶形,每级一个蝶形核 + 两个 FIFO,相比直接用 MMU 乘 Hadamard 矩阵延迟降低 72%;40 点的小变换直接复用 MMU(Hadamard 矩阵只有 ±1,不需要真乘法)。
计算重排序与细粒度分块融合#
SSM 与输入投影的强依赖导致利用率低(挑战三)。LightMamba 的计算重排序很聪明:输入投影原来按顺序生成 X,B,C,Δ,Z;现在改为先生成 Δ,B,C 存进片上缓冲,再按头交替生成 X 和 Z。这样 SSM 在 Δ,B,C 就绪后立即开始,与输入投影流水重叠:

效果:总计算时间减少 32%,硬件利用率从 58% 提升到 96%。
接着是细粒度分块与融合:SSMU 需要存大量中间激活(占 URAM 70% 以上),论文沿 head 和隐藏状态维度把 SSM 计算切成 np×pp 的小块,逐块流水执行,同时把相邻算子融合(前一个算子的输出直接喂给下一个,不经过片上缓冲)。URAM 占用从 246 块降到 61 块(4× 减少),流水气泡也被消除。
实测成绩#
LightMamba 在 Xilinx Versal VCK190(400 MHz)上实际部署,Alveo U280 用经 HLS 仿真验证的周期级模拟器评估:
- 精度:W4A4(权重激活各 4 bit)下 LAMBADA 困惑度 6.35(全模型量化 LightMamba*),优于 SmoothQuant 的 8.26、RTN 的 17.46,而 OutlierSuppression+ 直接崩掉(>100);相比 FP16 基线仅损失约 2 个点;
- 吞吐:VCK190 上 W4A4 达到 7.21 token/s(W8A8 为 3.61);U280 模拟达到 93 token/s,是 RTX 2070 GPU 基线的 1.43×;
- 能效:VCK190 相对 RTX 2070 平均提升 6.06×、相对 RTX 4090 提升 4.65×(2.25 vs 0.371/0.484 token/J);
- 资源:VCK190 W4A4 仅用 107K LUT、228 DSP、912 BRAM、61 URAM,频率 400 MHz;
- 消融:量化带来 2.23→5.32 token/s;旋转量化 + HTU 把精度提升 4.3% 且吞吐几乎不变;计算重排序把吞吐推到 7.21;分块融合把 URAM 从 246 降到 61。

LightMamba 的启示:算法和硬件必须一起设计。旋转量化不是白送的——它要求硬件里有 HTU,要求知道哪些旋转能融合、哪些必须在线算;计算重排序也不是调度优化——它要求输入投影的数据生成顺序可编程。这就是为什么论文题目叫”quantization and hardware co-design”。
三条路线的横向对比#
把三个案例放在一张表里对比:
| 维度 | FlightLLM(FPGA 2024) | CXL-SpecKV(FPGA 2026) | LightMamba(DATE 2025) |
|---|---|---|---|
| 解决的问题 | 压缩模型在 GPU 上跑不出加速 | KV 缓存撑爆 GPU 显存 | Mamba 离群值多、SSM 难量化 |
| 硬件角色 | 算力引擎(替代 GPU) | 内存引擎(辅助 GPU) | 算力引擎(边缘/能效场景) |
| 平台 | Alveo U280 / Versal VHK158 | Intel Agilex-7 + CXL 2.0 | Versal VCK190 / Alveo U280 |
| 关键硬件创新 | 可配置稀疏 DSP 链、全片上解码 | 压缩/解压流水线、投机预取器 | MMU/SSMU/HTU 部分展开流水 |
| 关键算法创新 | N | LSTM 预取 + INT8/差分/RLE 压缩 | 旋转辅助量化 + PoT 量化 |
| 性能 | 1.2-1.3× 延迟 vs V100S-opt;VHK158 上 1.2× 吞吐 vs A100 | 2.1-3.2× 吞吐 vs GPU-only | 1.43× 吞吐 vs RTX 2070 |
| 能效 | 6.0× vs V100S-opt | 1.9× J/token | 4.65-6.06× vs GPU |
| 代价 | 压缩带来的困惑度上升(8.7→10.2) | 8-12% 延迟开销、预取带宽浪费 | 需要重训练调参的量化校准、SSM 无旋转等价 |
三条路线共享两条设计主线:
主线一:FPGA 的优势不在算力,而在”让压缩真正生效”。 FlightLLM 用可配置稀疏链兑现稀疏、用混合位宽兑现量化;CXL-SpecKV 用专用压缩流水线兑现 KV 压缩——这些都是 GPU 的 SIMT/缓存结构”天然做不好”的事。GPU 硬件是为稠密 FP16 设计的,压缩模型的收益在 GPU 上被结构性浪费,而 FPGA 可以把压缩格式直接变成硬件数据通路。
主线二:数据流思维——让数据尽量留在片上。 FlightLLM 的全片上解码、CXL-SpecKV 的三层内存与预取、LightMamba 的分块融合,本质是同一件事的不同变体:把”从内存拿数据”变成”让数据在硬件里流动”。上一篇的能量表(DRAM 读 640 pJ vs SRAM 读 5 pJ)在这里以系统级的形式再次出现——每一次片外访问的消除,都直接变成带宽利用率的提升和能效的翻倍。
当然也要说清局限。FlightLLM 的 batch=1 优势在 batch 增大后衰减(论文图 15:batch 增大后 GPU 的硬件资源优势逐渐显现);CXL-SpecKV 依赖 CXL 2.0 硬件生态,且 12.8% 的预取浪费是带宽上的固定开销;LightMamba 只处理 Mamba2 单块展开,扩展到更大的模型需要重新评估资源。FPGA 不会取代 GPU,而是在”GPU 不擅长”的维度上(延迟敏感、压缩友好、能效优先、内存解聚)站稳脚跟——这与上一篇的结论一致,且被三篇前沿工作进一步验证。
小结#
这一篇顺着上一篇末尾的预告,拆解了 FPGA 加速 LLM 推理的三条前沿路线:
- FlightLLM(FPGA 2024):完整映射流程派——可配置稀疏 DSP 链 + 全片上解码 + 混合精度,把”压缩后的 LLM”端到端地编译成 FPGA 电路,能效 6.0× 胜 V100S、吞吐 1.2× 胜 A100;
- CXL-SpecKV(FPGA 2026):内存解聚派——用 FPGA 缓存引擎 + LSTM 投机预取,把 KV 缓存搬到 CXL 内存池,吞吐最高 3.2×、内存成本降 2.8×,证明 FPGA 是 GPU 的最佳”内存外设”;
- LightMamba(DATE 2025):算法-硬件协同设计派——旋转辅助量化 + 计算重排序 + 分块融合,把 Mamba 压到 W4A4 还能在 Versal 上跑出 4.65-6.06× 的能效。
三者的共同结论:LLM 时代 FPGA 的竞争力来自”把模型变省”与”把省下的兑现”之间的无缝衔接——这是通用处理器结构性做不到的事。下一篇将进入 FPGA 加速器的工程侧:从设计到上板,Vitis HLS 的 pragma 优化、AI Engine 的编程模型(ADF 数据流图)、以及如何把 Roofline 模型用于 FPGA 设计空间探索,把前面两篇的”纸上架构”变成能跑的 bitstream。
参考资料#
- FlightLLM: Efficient Large Language Model Inference with a Complete Mapping Flow on FPGAs(FPGA 2024,arXiv 摘要页)
- FlightLLM 论文全文(arXiv HTML 版,含全部图表)
- FlightLLM(ACM Digital Library,DOI: 10.1145/3626202.3637562)
- CXL-SpecKV: A Disaggregated FPGA Speculative KV-Cache for Datacenter LLM Serving(FPGA 2026,arXiv 摘要页)
- CXL-SpecKV 论文全文(ar5iv 渲染版)
- CXL-SpecKV 开源代码(GitHub:FastLM/CXL-SpecKV,含 FPGA RTL 与内核驱动)
- CXL-SpecKV(ACM Digital Library,DOI: 10.1145/3748173.3779188)
- LightMamba: Efficient Mamba Acceleration on FPGA with Quantization and Hardware Co-design(DATE 2025,arXiv 摘要页)
- LightMamba 论文全文(arXiv HTML 版,含全部图表)
- LightMamba(IEEE Xplore,DOI: 10.1109/DATE59290.2025.10993079)
- LightMamba 开源代码(GitHub:PKU-SEC-Lab/LightMamba)
- AMD AI Engine 技术页(Versal AI Engine 架构与编程模型介绍)
- Tutorial: Introduction to the AMD Versal ACAP and its Programming Model(FPGA 2023 教程,IEEE)
- Transformers are SSMs: Generalized Models and Efficient Algorithms through Structured State Space Duality(Mamba2 论文,arXiv)
- QuaRot: Outlier-Free 4-Bit Inference in Rotated LLMs(旋转量化原始工作,arXiv)
- SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models(arXiv)
- vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention(arXiv)
- FlexGen: High-Throughput Generative Inference of Large Language Models with a Single GPU(内存 offload 基线,arXiv)
- gpt-fast(PyTorch 官方 LLM 推理优化代码库,GitHub)
- FPGA 加速器完全拆解(一):可重构硬件、设计空间与经典推理引擎(本系列上一篇)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时
评论区
分享你的想法,与大家交流讨论
音乐
暂未播放



