FPGA 在大模型推理中的应用
此前已详述 FPGA 在 AI 中的优势,若用于优化大模型推理过程,有以下理论方案:
方案一:OffLoad MoE Expert MLP
MoE 的 MLP 阶段有一个重要的运算特点。因为专家多(DeepSeek V3.1 的 MoE 有 256 个专家),每个专家需要运算的 batch 相对较小,路由后分散,运算变得细碎。此时,瓶颈不在计算而在调度和权重读取。
如果使用 GPU 完成,其强项在于并行大数据和多批次运算。但每个运算依赖于 SM,SM 需要 Kernel 准备,大量时间花在准备上。处理数据量极少时,读取权重数据的时间反而更长,真正的运算并行很少(可能一个专家算一个 token)。不同网络层的运算是不能并行的,唯一可以并行的是路由计算得到的 N 个专家。这就像大饭店的大锅炒菜,最合理的方式是一锅同时炒多份,但现在来的人少,一个大锅每次只能炒一份,相比洗锅和准备时间,显得浪费。
如果交给 FPGA 运算,因为 FPGA 是定制的硬件电路,不存在 Kernel 准备的事情,完全是一个固定的数据流处理。需要处理的数据多少,不影响运算效率(因为它的并行是靠硬件电路的复制来完成,而 GPU 靠并行调度)。如果没有足够多的数据,GPU 只能是高射炮打蚊子。当然,权重的读取仍然需要有足够的空间和带宽。对于 FPGA,标准做法是需要 HBM,当然 HBM 的存量有限,后面会给出另外的方案。
总结:MLP 时,是按每个 token 进行路由,也就是说每个 token 会落在不同的专家,反过来说,每个专家最终需要处理的 token 并不会太多。任务拆得非常碎,大量的处理时间会花在调用不同专家的不同权重上,也就是激活专家的 kernel 和读取权重数据上。
这里要澄清一个概念,MoE 在计算路由专家时,是按单个 token 来计算的,并不是传统理解的那种行业专家,按一整上下文来计算路由专家。你在读一段话时,遇到数字时调用'算术能力',遇到代码时调用'语法能力',遇到人名时调用'实体记忆'。这些能力在 MoE 里就是不同 expert。它们是'技能模块',不是'行业部门'。专家的能力是一种隐特征,并不是我们常规理解的行业特征。
核心思想:
MoE 的瓶颈不是 FLOPs,而是'调度 + 权重访问 + 任务粒度'
GPU 为大而生,FPGA 为碎而生。
方案二:访存扩展——数据切片
上面说到,不管运算有多高效,但权重和中间过程数据是需要内存的,并且需要很高的访问速度。如果没有很高的 HBM,单个芯片的访问 DDR 带宽也有限,那怎么办?
在使用 FPGA 完成 MoE 时,为了保证单层网络在进行路由运算时有足够的并行度,最好是将所有路由专家的处理都一次完成。但那样的话,对于 FPGA 的访存要求会很高,在 Prefill 阶段甚至是不可能达成的。比如:有 256 个专家需要运算,如果一个专家的权重很大(比如:满血 DeepSeek 671 / 256 大约会有 2G 内存),也就是一个专家的处理需要有数据有 2G,考虑内存访问的速度是有限的(比如:DDR 访问速度是 2400M),如果光是读数据就要 1S,那这件事情就没法做了。所以,这块是一定要优化的。
优化的方案很简单,考虑到 MLP 的运算,数据是可以拆分的(有点像大数据运算的 Map Reduce 的原理和前提条件),所以,可以将权重数据拆分到多个 FPGA 芯片负责的内存上(比如:使用 DDR),这样,可以将数据分散到多个芯片,分头运算,然后汇总。这完全类似 Map Reduce 的原理。这就大大提升了访存的带宽。
具体需要拆分成多少个 FPGA 芯片,这个问题较复杂,要考虑你采用的 FPGA 芯片的 DSP 能力,配置的是 HBM 还是普通 DDR,以及相应的访存带宽。还有你需要完成的模型的大小,对应单一专家的模型大小。这些条件综合进考虑,选择合适的芯片和数量,进一步确认,在存储中如何拆分。
核心思想:
权重拆分,将运算分布到多颗 FPGA,提升访存吞吐量。
方案三:KV Cache / Memory Offload
FPGA 还可以做 KV Cache 的管理、压缩、分层存储。
3.1:KV Cache 优化
从系统视角,KVCache 并不是简单的 KV 存储和复用,它的实际作用是:
- 种类繁多,包括不同会话,不同数据批,不同 sequence length,动态增长(decode),这是一些碎片。
- 索引复杂,token->layer->head->K/V。
- 读写带宽非常紧。Attention 每一层都要读,Decode 每个 token 都需要读,Prefill 要写,decode 要大量的读。
- 生命周期需要管理:及时释放,回收,长对话处理。
- 数据格式需要转换 FP16 -> FP8 -> INT8。
- 多层存储之间需要不断迁移处理。HBM-->DDR-->NVMe,热/冷 token 区分切换。
上面的任务都是控制型的,GPU 做不好,FPGA 如何做呢?
- 提供硬件级的控制器,建立分配表,索引,实现 sliding window 逻辑,提供会话上下文的状态机。


