音乐
暂未播放
FPGA 加速器完全拆解(一):可重构硬件、设计空间与经典推理引擎

背景:GPU 与 ASIC 之间,为什么还需要 FPGA#
前面拆解 TPU v1 时,我们看到了 AI 推理加速的”专用派”:Google 用 15 个月造出一颗只跑推理的 ASIC(专用集成电路),用脉动阵列把矩阵乘法做到极致,换来 92 TOPS 的峰值算力。但 ASIC 有个致命缺点——设计一版要流片,动辄数百万美元、一年起步的周期,而且一旦模型结构变了(比如从卷积变成 Transformer、从稠密变成稀疏),硬件就废了。GPU 则是另一个极端:什么模型都能跑,软件生态无敌,但代价是通用的 SIMT 处理器要花大量晶体管去处理取指、译码、调度、缓存一致性这些”与计算无关”的事务。
FPGA 恰好站在两者之间:买回来的时候是一块空白的”万能电路”,用 bitstream(配置文件)可以把它变成任何想要的电路;过几个月模型变了,重新生成一份 bitstream 再加载一次,硬件就跟上了。 这就是”可重构”三个字的全部含义。
用一句话概括三家定位:
| 平台 | 本质 | 优势 | 劣势 |
|---|---|---|---|
| GPU | 大规模并行通用处理器 | 生态无敌、算力巨大、什么都能跑 | 延迟不确定性、能效浪费在通用性上 |
| ASIC | 为一种算法刻死的电路 | 性能/能效天花板最高 | 流片贵、周期长、算法一变就作废 |
| FPGA | 可反复改写的电路 | 性能接近 ASIC、灵活性接近软件 | 频率低、开发门槛高 |
这个定位不是空想,而是真金白银的市场选择:2015 年 Intel 以 167 亿美元收购 FPGA 双雄之一的 Altera;2020 年 AMD 以 350 亿美元收购另一家 Xilinx,随后把 CPU(AMD)+ GPU(AMD)+ FPGA(Xilinx)整合成统一的 AI 平台,推出了带 AI Engine 阵列的 Versal 系列。三大厂商都在押注”可重构硬件在 AI 时代的价值”。
本文是系列第一篇,先解决三个问题:FPGA 到底由什么组成、为什么适合做 AI 推理、经典加速器是怎么设计的。下一篇再进入 FPGA 上的 LLM 推理(CXL 内存解聚、KV 压缩引擎、Versal AI Engine 等)。
FPGA 硬件基础:四种基本资源与可重构的本质#
理解 FPGA 最快的方式,是把它的裸片想象成一张布满网格的棋盘:
- 可编程逻辑块(CLB)——棋盘上的格子,用来实现任意逻辑;
- 可编程互连——格子之间的连线,决定谁和谁相连;
- DSP 块——嵌在棋盘里的专用乘法器/累加器;
- BRAM——嵌在棋盘里的专用存储块。
“可重构”的秘密在于:芯片上电后,一个叫 bitstream 的二进制文件被加载进遍布全片的配置 SRAM,这些配置位决定了每个格子做什么、每条连线通不通。 所以同样的裸片,加载 A 文件是一颗路由器芯片,加载 B 文件是一颗神经网络加速器。这是 FPGA 与 CPU/GPU/ASIC 最本质的区别:后三者电路是出厂焊死的,FPGA 的电路是”软件定义”的。
可编程逻辑块:LUT 与触发器#
一个 CLB 内部的核心元件是 LUT(查找表)。Xilinx 7 系列及之后的器件使用 6 输入 LUT:它本质是一块 64 位 SRAM,6 个输入作为地址,查表输出 1 位结果。任意 6 输入的布尔函数都可以提前算好真值表写进这 64 位里——这就是”查找表”的由来:不实现具体的与门或门,而是把”真值表”存起来。一张 6 输入 LUT 可实现的函数数量是:
Nfunc=226=264即 64 位真值表可以穷举 64 种输入组合各自对应的输出,所以它等价于”任何 6 输入布尔函数”。4 个 LUT 加上 8 个触发器(Flip-Flop,用来寄存一拍数据、构成流水线)组成一个 slice,两个 slice 组成一个 CLB。现代 FPGA 上这样的 CLB 数以万计,正是这些 LUT 构成了加速器里的加法树、比较器、状态机、译码逻辑。
LUT 还有一个特性对 AI 加速很重要:它不仅能当逻辑用,还可以被配置成分布式 RAM 或移位寄存器。小型的中间缓冲、行缓冲(行缓冲通常只存 2-3 行像素/特征值)用 LUT 实现,BRAM 则留给大块数据。
可编程互连:FPGA 的隐形瓶颈#
格子之间靠可编程互连网络连接:布线通道里有大量金属线段,线段交点处有可编程开关盒(switch box),bitstream 决定每个开关通断。互连是 FPGA 最被低估的资源——它占了裸片面积的最大份额,而且信号经过可编程开关的延迟远高于 ASIC 里的直连金属线。这就是为什么同工艺下 FPGA 的频率(通常 200-500 MHz)远低于 GPU(1.5-2 GHz)和 ASIC:逻辑本身不难做快,难的是把信号在可编程网络中传得快。后面你会看到,所有 FPGA 加速器设计的核心思想之一,就是”尽量减少跨互连的数据搬运,把数据留在计算单元内部流动”。
DSP 块:MAC 的硬件化身#
神经网络的基本运算单元是乘累加(MAC)。FPGA 厂商在逻辑阵列中嵌入专门的 DSP 块来做这件事。以 Xilinx 7 系列最常见的 DSP48E1 为例:它包含一个 25×18 位有符号乘法器、一个 48 位累加器/加法器,支持乘加融合(A×B+C),还支持相邻 DSP 块级联形成更宽的加法链。一片 XCKU060 有 2,760 个 DSP 块,每个时钟周期可完成一次乘法累加,所以理论上 200 MHz 下纯 MAC 峰值约为:
2,760×1×200 MHz≈552 G MAC/s即约 1.1 TOPS(按 1 MAC = 2 ops 计)。这个数字远小于 GPU 的几十 TOPS,但注意两点:DSP 可以按需只跑 INT8/INT4(INT8 时部分器件一个 DSP 可拆成两个 MAC),而且 FPGA 的全部算力都在”做有用的乘法”,没有调度、没有访存排队浪费。DSP 块数量是 FPGA 加速器设计中最硬性的资源约束——设计的第一步往往是数一数模型一层需要多少个乘法器,再看片子上够不够。
BRAM:片上存储块#
BRAM 是 FPGA 的片上存储,Xilinx 7 系列每块 18 Kb/36 Kb,可配置成不同位宽的双口 RAM。一片 XCKU060 有 1,080 块 36 Kb BRAM,合计约 4.9 MB。BRAM 是加速器的”缓存”:权重、激活、中间结果放 BRAM,访问延迟几个周期、能耗远低于片外 DRAM。BRAM 总量决定了”模型权重能不能全部放片上”——这是 FPGA 加速器设计中最关键的分水岭之一(EIE 那节会看到 45nm 工艺下 DRAM 与 SRAM 的能耗差三个数量级)。
可重构性:静态重构与动态部分重构#
bitstream 加载分两种:静态重构——上电时加载一份完整 bitstream,整个芯片变成一套电路,运行中不再变化;动态部分重构(DPR)——运行中只重写芯片的某个区域,其他区域照常工作。DPR 是 FPGA 独有的杀手锏:模型换层时,可以在线把”当前层的加速电路”换成”下一层的加速电路”,同一份硬件资源时间复用给不同算子(后文 Brainwave 的”合成期参数化”思路与其异曲同工)。
为什么 FPGA 适合做 AI 推理#
讲完资源,回答核心问题:这些”积木”凭什么用来加速 AI 推理?四个理由。
1. 精度可以量身定制#
GPU 的算力是按 FP16/BF16/INT8 等少数几种固定格式设计的,Tensor Core 只支持这几种。而 FPGA 的 DSP 块和 LUT 算术电路是”按 bitstream 铺出来的”,精度完全由设计者决定:INT8、INT4、INT2、块浮点(block floating point,一组数共享一个指数)、甚至二值(1 bit)都可以。位宽每砍一半,BRAM 能放的权重多一倍、DSP 能做的 MAC 多一倍。
最极端的例子是 FINN 框架(FPGA 2017,arXiv 1612.07119):它把权重和激活全部压成二值 {−1,+1},乘法变成同或(XNOR)运算,加法变成 popcount(数 1 的个数),于是 DSP 块根本不需要了——用 LUT 直接铺出 XNOR-popcount 加法树。结果是,在仅 25W 功耗的 ZC706 开发板上,MNIST 分类达到 1,230 万张/秒(延迟 0.31 µs,准确率 95.8%),CIFAR-10 达到 2.19 万张/秒(延迟 283 µs)。这在当时是 FPGA 上报告过的最快分类速率。二值网络在 ImageNet 上精度损失还太大(ResNet-18 二值化后 top-5 从 89% 掉到 73%),实用性有限,但它把”精度可定制”这个自由度展示得淋漓尽致:同样的硅片,只改 bitstream,就能在算力和精度之间滑动。
2. 数据流架构:去掉”取指译码”这层皮#
GPU 的每个 SM 都要从显存取指令、译码、调度——这是通用处理器为了”什么都能跑”付出的固定开销。FPGA 加速器则相反:把神经网络的计算图直接变成电路,每个算子是一个硬件模块,模块之间用布线直连,数据像流水一样从一个模块流到下一个。 这就是数据流(dataflow)架构:没有指令流,每个周期每个模块都在做自己的事。典型形态是 PE(处理单元)阵列 + 流水线:前一个模块算完的中间结果直接进后一个模块的寄存器,不需要写回内存再读出来。
要理解这个差异的价值,回想 TPU v1 文章里的 Roofline 模型:实际性能被”算力上限”和”带宽上限”两条线卡住。GPU 把数据从 HBM 读进寄存器要经过漫长的存储层级;FPGA 把权重常驻 BRAM、把中间结果留在流水线寄存器里,数据的”复用半径”被硬件布线天然缩短。FPGA 加速器因此对带宽的敏感度低得多,更靠近 Roofline 的算力线。
3. 确定性延迟:为 batch=1 而生#
在线交互式 AI(搜索排序、语音识别、聊天补全)有一个被 GPU 忽视的需求:请求逐个到达,几乎无法攒批。GPU 的设计哲学是”吞吐优先”——batch 越大越好,batch=1 时算力利用率常常惨不忍睹(想想 TPU v1 平均 28% 的利用率是怎么来的)。FPGA 的数据流架构没有”调度器”,电路本身就是并行度:无论来一个请求还是一百个请求,流水线照常每个周期吞吐一个结果,延迟是确定性的。 这正是 Microsoft 在 Brainwave 里选择 FPGA 的根本原因(后文详述)。
4. 能效:把数据留在片上#
EIE 论文(ISCA 2016)引用了一张 45nm 工艺的经典能量表,这张表是整个”为什么用 FPGA/ASIC 加速推理”讨论的基石:
| 操作 | 能耗 (pJ) | 相对成本 |
|---|---|---|
| 32 位整数加法 | 0.1 | 1 |
| 32 位浮点加法 | 0.9 | 9 |
| 32 位 SRAM 读 | 5 | 50 |
| 32 位 DRAM 读 | 640 | 6,400 |
DRAM 读一次的能量是加法运算的 6,400 倍、SRAM 的 128 倍。 所以推理加速的本质问题不是”算得快”,而是”少去 DRAM”。FPGA 的 BRAM 总量虽然远小于 GPU 的 HBM,但它是”计算单元眼皮底下的存储”——权重常驻 BRAM,访问能耗只有 DRAM 的 1/128。后面 ESE 用 41W 功耗跑出 GPU 三倍的稀疏推理性能,靠的就是这条。
代价:频率与开发门槛#
当然也要说清代价。FPGA 的软肋:其一,频率低(数据中心 FPGA 一般 200-500 MHz,GPU 是 1.5 GHz+),同工艺下峰值算力被频率拖累;其二,DSP 块数量有限(XCKU060 才 2,760 个 DSP);其三,开发门槛——用 RTL 手写一个加速器需要数月,用 HLS 虽然快但要忍受抽象层损耗。这也解释了为什么 FPGA 加速器论文几乎都是”算法-硬件协同设计”:模型剪枝/量化做得越狠,硬件越好做,效果越夸张。
设计方法:RTL 还是 HLS#
开发 FPGA 加速器有两条路线。
RTL(Verilog/SystemVerilog):从寄存器传输级描述电路,精细控制每个周期、每个 BRAM 端口、每级流水。性能天花板最高,但开发周期以月计,调试困难。大多数经典加速器(EIE 的 ASIC 设计、ESE 的硬件主体)都用 RTL。
HLS(高层次综合):用 C/C++ 描述算法,由工具(Vitis HLS / Vivado HLS)自动生成 RTL。开发者通过 pragma(编译指示)告诉工具怎么做硬件,三件套:
1// 循环流水化:下一个迭代的加载可以与当前迭代的计算重叠2#pragma HLS PIPELINE3// 循环展开:把串行迭代变成并行电路(展开因子 = 并行度)4#pragma HLS UNROLL factor=45// 数组分区:把一块 BRAM 拆成多块,支持并行读写6#pragma HLS ARRAY_PARTITION variable=weights type=cyclic factor=8HLS 的意义在于把”设计空间探索”变成参数搜索:展开多少、分区几块、流水几级,改改 pragma 就能重新综合。FINN 就是完全用 HLS 实现的:它把每一层的计算资源(PE 数、SIMD 宽度)按吞吐目标”按层定制”,工具自动把 C++ 变成流式硬件。
无论哪条路线,设计第一步都是资源建模——算清楚每层需要多少 DSP、多少 BRAM、多少 LUT。以卷积层为例,若把输出通道维度展开 Po 路并行,需要的乘法器数量是:
NMAC=Cin×Kh×Kw×Po其中 Cin 是输入通道数,Kh×Kw 是卷积核尺寸,Po 是同时计算的输出通道数。比如 3×3 卷积、Cin=64、Po=4,就需要 64×9×4=2,304 个乘法器——已经逼近一片大器件的 DSP 上限。于是就有了 FPGA 设计的经典权衡:用时间换面积——展开度不够的部分,用循环迭代(time-multiplexing)串行算。比如 depthwise 卷积(每通道一个核)不应该给每个通道配乘法器,而是只做 4-8 个 PE 循环复用遍历所有通道,LUT/DSP 占用可以降一个数量级,代价是延迟变长。
经典案例一:EIE——为压缩模型而生的稀疏推理引擎(ISCA 2016)#
第一个值得拆解的经典设计是斯坦福/微软等团队 2016 年发表在 ISCA 的 EIE(Efficient Inference Engine)。它虽然最终实现为 ASIC,但它的设计空间(稀疏 + 数据流 + 码本量化)直接催生了后来的 FPGA 稀疏加速器(包括下一节的 ESE),是理解 FPGA 加速器设计思路的最佳入口。
动机:算力便宜,内存昂贵#
EIE 出发点是团队的 Deep Compression 工作(Deep Compression 论文):对训练好的网络做三步压缩——剪枝(砍掉幅度小的权重,AlexNet 可砍 90%)、权值共享(K-means 聚类,同一簇的权重共用一个码本值,每个权重只存 4 位索引)、量化(码本值本身量化为低精度)。压缩后 AlexNet 的权重从 240 MB 降到约 6.9 MB,可以整体装进片上 SRAM。配合上一节的能量表:DRAM 读取 640 pJ vs SRAM 读取 5 pJ,模型装进片上就等于把每字节的读取能耗除以 128。
但问题来了:压缩后的权重矩阵高度稀疏且不规则(非零元位置随机),CPU 和 GPU 跑这种稀疏矩阵反而慢——分支判断、索引解引用、缓存失效的代价超过了省下来的乘法。EIE 的口号就是”直接在这个压缩模型上计算”,专门为稀疏不规则的数据格式设计硬件。

上图(EIE 论文图 1)展示了它的流程:左边是 Deep Compression 把稠密模型压缩成稀疏+码本共享的格式,右边是 EIE 引擎直接消费这种格式。中间的关键是”计算格式跟着压缩格式走”——不是先解压再算,而是边解压边算。
设计:CSC 编码、PE 阵列与负载均衡#
EIE 的 PE(处理单元)结构是整个设计的精华,我们拆成三块:
CSC 编码 + 相对索引。 稀疏矩阵按列存储(CSC 格式),每个非零元素存”行号相对偏移(4 位)+ 权值码本索引(4 位)“,8 位一个条目。用相对偏移而非绝对行号,是为了把索引本身也压短;但偏移量有限(4 位最多表示 16),非零元间隔超过 15 就要补零占位——这是后面负载均衡讨论的伏笔。
列交错分配。 64 个 PE 并行工作时,如果按行连续切分矩阵,剪枝后各行非零数差异巨大,必然有人忙死有人闲死。EIE 的做法是把矩阵的列交错分给 64 个 PE(第 i 列给 PE imod64),让每个 PE 分到的非零元数量大致均衡。
4 级流水 + 前导非零检测(LNZD)。 每个 PE 内部处理一个激活值要经历:码本查表与地址累加(并行)→ 输出激活读取与输入激活乘法(并行)→ 移位累加 → 写回,共 4 级流水,关键路径 1.15 ns。PE 之间的激活分发由 LNZD(Leading Non-zero Detection)树完成:ReLU 之后约 70% 的激活是零,LNZD 节点扫描激活向量、只把非零的激活广播给 PE,把零激活直接跳过。动态激活稀疏和静态权重稀疏双重跳过,是 EIE 能效的核心来源。

上图(论文图 5)是单个 PE 在 TSMC 45nm 下的版图。注意面积几乎全是 SRAM(93%)——存储稀疏矩阵和索引的 SRAM 是硬件主体,计算电路只占很小一部分。这印证了”推理加速器的瓶颈是存储而不是算力”这个主题。每个 PE 容纳 131K 个压缩权重(对应原始稠密模型约 120 万个权重),每秒完成 8 亿次权重计算,面积仅 0.638 mm²、功耗 9.16 mW。
结果:189× 加速,24,000× 能效#
AlexNet 的全连接层装进 64 个 PE(共 40.8 mm²、590 mW),以 800 MHz 跑出 1.88 万帧/秒;整个引擎对压缩网络的处理能力为 102 GOPS,等效稠密网络约 3 TOPS。与 i7-5930k CPU、Titan X GPU、Tegra K1 移动 GPU 对比:


两图(论文图 6、图 7)分别是相对 CPU 跑稠密模型的加速比与能效(纵轴对数刻度):EIE 平均比 CPU 快 189×、比 Titan X 快 13×、比 Tegra K1 快 307×;能效上分别省 24,000× / 3,400× / 2,700× 的能量。这些数字的含金量在于:对比的是”压缩模型在专用硬件上” vs “原始模型在通用硬件上”的端到端差距——30 倍模型压缩(剪枝 10× + 权值共享 8×)与硬件跳过零计算的能力相乘,就是加速比和能效的来源。10 年后的今天,EIE 的 W4A16 思路(4 位码本权重、16 位累加)在 GPTQ、AWQ、llama.cpp 等 LLM 推理引擎里以线性量化(而非码本)的形式复活了,EIE 团队 2023 年写的 回顾文章 对此有专门讨论。
局限:EIE 是 ASIC,FPGA 呢?#
EIE 的短板也很明显:它是 ASIC,流片成本高、无法跟随模型演化;且只处理全连接层(稀疏矩阵-向量乘),卷积层不适用。把 EIE 的稀疏数据流搬到 FPGA 上、扩展到 LSTM,正是下一节的 ESE 做的事。
经典案例二:ESE——FPGA 上的稀疏 LSTM 引擎(FPGA 2017)#
ESE(Efficient Speech Recognition Engine) 是微软、斯坦福、百度等团队 2016 年底发布、发表于 FPGA 2017 的工作,把 EIE 的设计思想移植到了 FPGA,目标是端到端的语音识别推理:在 LSTM 模型里,LSTM 层占了整个语音识别流水线 90% 以上的执行时间(论文图 3 的实测),所以专门加速 LSTM。
动机与模型压缩:20× 压缩#
语音识别的 LSTM 权重规模远超 FPGA 片上存储容量。ESE 沿用 Deep Compression 的思路做两步压缩:剪枝(剪到约 10% 密度,全模型只剩约 320 万个非零权重)+ 量化(32 位浮点 → 12 位定点),合计 20× 压缩,精度损失可忽略。但压缩带来了 EIE 同样的问题:稀疏矩阵在并行硬件上负载不均衡——有的 PE 分到一大堆非零权重,有的分到零星几个,快的等慢的。
关键设计一:负载均衡感知的剪枝#
ESE 的原创点在于把剪枝和硬件架构一起设计:剪枝时就让每个 PE 分到的非零权重数量均衡。具体做法是把权重矩阵分成与 PE 数量相同的子矩阵,对每个子矩阵单独设定剪枝阈值,让各子矩阵的非零数大致相同(论文图 5):

上图中,矩阵被分成 4 个色块,每块属于一个 PE。普通剪枝(左)剪完后色块之间的非零数差异巨大;负载均衡感知剪枝(右)每个色块单独定阈值,非零数几乎一样。代价是各块压缩率略有差异,但论文实测精度差异在剪枝过程的方差之内。效果立竿见影:同样的稀疏模型,用负载均衡感知剪枝相比普通剪枝,硬件上的加速比从 5.5× 提升到 6.2×(相对稠密模型)。
关键设计二:CSC 编码与通道化 PE 阵列#
压缩后的权重按 CSC 列格式编码,编码时做数据对齐(零填充)。计算时,一列的非零权重被分配给 2 个 PE(论文图 8 的计算模式):每个 PE 拿同一列里自己那部分非零权重,与同一个输入向量元素做乘加——即”一个稀疏矩阵向量乘(SpMV)被拆成多个 PE 并行做局部的 SpMV”。ESE 系统级配置为 32 个通道 × 每个通道 32 个 PE = 1,024 个 PE(论文图 10):

上图(论文图 10)的 (a) 是整体架构:右侧是 32 通道的 PE 阵列,左侧的 MMU(内存管理单元)负责从 DDR3 取权重和数据(后述),中间的控制器(scheduler)负责把 LSTM 的计算拆成”水平/垂直”两个方向的执行相位。(b) 展示了单通道内部:多个 PE 通过一个广播网络共享同一个输入激活向量,各算各的局部乘加,最后结果汇合。注意一个反直觉的工程决策:权重没有放 BRAM,而是放 DDR3。原因很直白——XCKU060 的 BRAM 合计只有 4.25 MB,而剪枝后的 LSTM 仍有约 320 万个非零权重(压缩前约 2,900 万),加上 CSC 索引等元数据,远远放不下。片上 BRAM 只用来放输入向量和中间结果,这迫使 ESE 用下一段的双缓冲机制来隐藏 DDR3 的访存延迟。
关键设计三:MMU 与双缓冲#
权重从 DDR3 读取是稀疏、不规则的,而且延迟很大。ESE 的 MMU 用**双缓冲(double buffering)**解决:两块片上缓冲 ping-pong 交替——一块在给 PE 供数时,另一块同时在从 DDR3 预取下一批权重,用硬件把”访存延迟”和”计算”重叠起来:

上图(论文图 12)的 MMU 内部:两块缓冲轮流担任”供数”与”预取”角色,DDR3 的延迟被隐藏。类似地,PE 之间用 FIFO 做负载均衡——论文图 13 的实测显示,FIFO 深度为 8 时 ALU 利用率超过 90%,继续加深收益迅速递减,所以取深度 8(这和 EIE 用 FIFO 吸收 PE 间负载不均衡、同样选深度 8 的结论如出一辙)。
结果:282 GOPS、41W、比 GPU 快 3×#
实现平台是 Xilinx Kintex UltraScale XCKU060,200 MHz。资源利用率几乎拉满:LUT 88.6%(293,920/331,680)、触发器 68.3%、BRAM 87.7%(947/1,080)、DSP 54.5%(1,504/2,760)。
性能结果:对稀疏 LSTM 达到 282 GOPS(等效稠密模型 2.52 TOPS),整机功耗仅 41 W。在端到端语音识别基准上,ESE 比 i7-5930k CPU 快 43×、比 Pascal Titan X GPU 快 3×;能效比 CPU 高 40×、比 GPU 高 11.5×(对比 GPU 时是稀疏模型对稀疏模型)。3× 的加速来自哪里?Titan X 跑稀疏 LSTM 时,cuSPARSE 的核函数要为不规则索引做大量分支与内存随机访问,而 ESE 的硬件流水把这些开销全部变成”确定性”的电路行为——稀疏性在 FPGA 上是免费的,在 GPU 上是收费的。
ESE 的意义总结成一句话:EIE 证明了稀疏加速的设计空间,ESE 证明了这块空间在 FPGA 上能落地——20× 模型压缩 + 1,024 个 PE 的稀疏数据流 + 双缓冲访存重叠,41W 的功耗包打 GPU。
经典案例三:Brainwave——云规模 FPGA 推理服务(ISCA 2018)#
前两个案例是”单卡级”的学术设计,第三个案例把 FPGA 推到了数据中心规模:Microsoft 的 Project Brainwave(ISCA 2018,Fowers et al.)。它的故事要从 Catapult 讲起。
Catapult:把 FPGA 织进数据中心网络#
早在 2014 年,Microsoft 就在 ISCA 上发表了 Catapult:把一块 Altera Stratix V FPGA 插进每台服务器的 PCIe 槽,FPGA 之间用 10 Gb 线缆连成 6×8 的二维环面(torus),形成一个”服务器之间的可重构网中网”。在 Bing 搜索的文档排序服务上实测:加入 FPGA 后每台服务器在相同延迟分布下吞吐提升 95%——相当于一半数量的服务器干同样的活。Catapult 证明了”FPGA 不只是加速卡,而是可以成为数据中心的一层基础设施”。Brainwave 是 Catapult 的延续:专门为 DNN 推理重新设计了 FPGA 上的处理器(NPU),并把 FPGA 卡放在网卡与交换机之间,支持卡间低延迟直连。
NPU 架构:单线程 SIMD 指令集 + 片上权重#
Brainwave 的 NPU 是一个有意思的”混合体”:它有一套精简的单线程 SIMD 指令集(矩阵-向量乘法、向量-向量运算),但微架构完全是 FPGA 定制的数据流。设计哲学是:
- 权重钉在片上:模型权重预加载到 NPU 的分布式 SRAM 寄存器堆里,推理时零 DRAM 权重流量;
- 单线程模型:所有指令是一维向量/二维矩阵上的运算,软件上就是把计算图线性化,没有线程调度、没有同步开销;
- 四个合成期参数:数据类型(精度)、向量宽度、数据通道数、矩阵-向量块引擎大小。同一份 NPU 代码,改这四个参数就能综合出适配不同模型的硬件——这正是 FPGA”可重构”在云场景的变现方式:硬件可以跟随模型演进,而不是模型将就固定硬件。
Brainwave 选 FPGA 的核心动机是实时(batch=1)推理:交互式 AI 场景请求逐个到达,GPU 在 batch=1 时延迟和吞吐都很差,而 NPU 的流水线架构让单请求延迟接近”纯计算时间”。实测数据:在 Intel Stratix 10 FPGA 上,中等规模 RNN 模型持续算力 11–35.9 TFLOPS、延迟低于 4 ms(全部无批处理);峰值约 48 TFLOPS(每周期 96,000 个 MAC),batch=1 时硬件利用率最高 75%;ResNet-50 单张推理低于 2 ms。作为参照,论文报告大型 RNN 上比当时最先进 GPU 的延迟和吞吐提升超过一个数量级。后续 IEEE Micro 的系统论文 报告 batch=1 有效性能最高 39.5 TFLOPS。
启示:FPGA 是”硬件即服务”#
Brainwave 在学术之外的意义在于:它首次把 FPGA 加速器做成云上可弹性分配的资源——模型编译成 bitstream 后按需加载到任意空闲 FPGA 上,推理请求经由网络直接到达硬件微服务,没有软件在关键路径上。这套”可重构硬件 + 硬件微服务”的架构,十年后的今天正在被 FPGA+CXL 的内存解聚方案(本系列下一篇的主角)以另一种形式延续。
设计空间对比:FPGA vs GPU vs ASIC#
把三个案例和已有知识收拢成一张对比表(数值为典型数据中心器件量级):
| 维度 | GPU(如 A100) | FPGA(如 Stratix 10) | ASIC(如 TPU v1) |
|---|---|---|---|
| 峰值算力 | 数十 TFLOPS(FP16) | 约 5–10 TFLOPS(INT8) | 92 TOPS(INT8) |
| 频率 | ~1.5 GHz | ~200–500 MHz | ~700 MHz |
| 精度灵活性 | 固定几种(FP16/INT8) | 任意位宽/块浮点/二值 | 流片时定死 |
| batch=1 延迟 | 差(调度开销大) | 确定且低 | 确定且低 |
| 稀疏/不规则数据 | 低效(分支+访存) | 可定制硬件直接跳过 | 看架构 |
| 能效(性能/瓦) | 中 | 高(41W 跑 282 GOPS) | 最高 |
| 模型变更适应性 | 改代码即可 | 改 bitstream 即可 | 必须重流片 |
| 开发周期 | 天级 | 周-月级(HLS 加速) | 年-季度级 |
| 生态 | 无敌(CUDA) | 弱(但 AMD/Intel 在补) | 无 |
一句话决策:算力密度要极致且算法五年不变 → ASIC;要通用、要生态、要吞吐 → GPU;要定制精度/低延迟/低功耗/硬件可演进 → FPGA。 现实中 LLM 时代的典型分工是:GPU 做训练和稠密大算力推理,FPGA 做延迟敏感的边缘推理、稀疏/低比特推理、以及 GPU 的”外设”(内存解聚、KV 缓存管理、网络处理)——后两种角色将在下一篇展开。
局限与未解决的问题#
诚实地列出 FPGA 路线尚未解决的痛点:
- 频率与算力天花板:可编程互连的延迟让 FPGA 频率停留在几百 MHz,同工艺下峰值算力落后 GPU 一到两个数量级。厂商的应对是”异构嵌入”——在 FPGA 阵列旁嵌固定功能的硬核(Versal 的 AI Engine 阵列就是一组可编程的 SIMD 向量处理器,本质上是”可重构的 DSP 集群”,把频率和算力都提上去了),但这让器件越来越像”FPGA+ASIC 混血”,也说明纯逻辑阵列的算力天花板是真实存在的。
- 资源转换损耗:HLS 生成的电路通常比手写 RTL 差 20-50% 的面积/时序;而手写 RTL 的人才稀缺、周期长。工具链(Vitis HLS、oneAPI)仍在快速迭代,但”写 C 不等于写电路”的鸿沟短期内不会消失。
- 批量吞吐不敌 GPU:batch=1 是 FPGA 的主场,但大 batch 稠密推理下 GPU 的吞吐仍是碾压级的——FPGA 不会取代数据中心里的 GPU,而是占据”GPU 不擅长”的角落。
- 生态碎片化:AMD/Intel 两家的工具链、IP、板卡互不兼容;部署和运维经验积累远不如 CUDA 生态。
小结#
本篇从四个层次讲清了 FPGA 加速器:
- 硬件基础:LUT(查表实现任意逻辑)、互连(可重构的代价与瓶颈)、DSP 块(MAC 的硬件化身)、BRAM(计算眼皮底下的存储),以及 bitstream 与可重构的本质;
- 为什么适合 AI 推理:精度可定制、数据流架构消除取指译码、batch=1 确定性延迟、片上存储带来的能效优势——四条都指向同一件事:把”计算+存储+数据流”按模型量身定做;
- 设计方法:RTL 与 HLS 的取舍、pragma 三件套、DSP/BRAM 资源建模、“用时间换面积”;
- 三个经典设计:EIE(稀疏+码本量化,189×/13×/307×)、ESE(FPGA 稀疏 LSTM,282 GOPS/41W、43×/3×)、Brainwave(云规模数据流 NPU,batch=1 下 11–35.9 TFLOPS)。
这三代设计有一条共同的主线:FPGA 加速器不是把模型”跑”在硬件上,而是把模型”变”成硬件——压缩、量化、稀疏化之后的模型,其数据流模式直接决定电路的形状。这条主线延伸到 LLM 时代会更加清晰:FPGA 不再试图与 GPU 拼矩阵乘算力,而是去补 GPU 系统的短板。
下一篇将讨论 FPGA 上的 LLM 推理:CXL 内存解聚架构如何用 FPGA 把 KV 缓存搬到远端(CXL-SpecKV,FPGA 2026,吞吐最高提升 3.2×)、FPGA 上的 KV 压缩引擎如何替 GPU 省带宽、以及 LightMamba 这类算法-硬件协同设计如何在 Versal 上跑出 4.65–6.06× 的能效。
参考资料#
- EIE: Efficient Inference Engine on Compressed Deep Neural Network(ISCA 2016,arXiv 摘要页)
- EIE 论文全文(arXiv HTML 版,含全部图表)
- ESE: Efficient Speech Recognition Engine with Sparse LSTM on FPGA(arXiv 摘要页)
- ESE 论文全文(arXiv HTML 版,含全部图表)
- FINN: A Framework for Fast, Scalable Binarized Neural Network Inference on Reconfigurable Logic(FPGA 2017)
- Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding(arXiv)
- Retrospective: EIE: Efficient Inference Engine on Sparse and Compressed Neural Network(arXiv,2023 回顾)
- A Configurable Cloud-Scale DNN Processor for Real-Time AI(ISCA 2018,Brainwave NPU)
- Serving DNNs in Real Time at Datacenter Scale with Project Brainwave(IEEE Micro 2018)
- A Reconfigurable Fabric for Accelerating Large-Scale Datacenter Services(ISCA 2014,Catapult)
- 7 Series DSP48E1 Slice User Guide(AMD/Xilinx 官方文档,UG479)
- LightMamba: Efficient Mamba Acceleration on FPGA with Quantization and Hardware Co-design(DATE 2025)
- CXL-SpecKV: A Disaggregated FPGA Speculative KV-Cache for Datacenter LLM Serving(FPGA 2026)
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
部分内容可能已过时
评论区
分享你的想法,与大家交流讨论
音乐
暂未播放



