FPGA加速MoE推理:架构设计与实践

📅 发布时间:2026/9/9 9:42:17
FPGA加速MoE推理:架构设计与实践
MoE模型Mixture of Experts混合专家模型这两年在大模型圈里火得不行从GPT-4到DeepSeek V3几乎头部模型都用了这个架构。我身边的FPGA工程师朋友也越来越多地问起这件事这玩意儿到底是个什么结构用FPGA能不能做硬件上卡在哪正好我之前断断续续研究过MoE模型的硬件加速方案也实际在FPGA上做过一些验证性的实现这篇就把我对MoE模型的理解和FPGA实现路径做一个梳理偏重工程视角算法理论部分只讲够用的程度重点放在硬件实现的分析上。这篇内容适合几类人看想了解MoE模型核心机制但不想啃论文的算法工程师打算在大模型推理方向找切入点的FPGA工程师以及正在做边缘侧大模型部署、对算力和带宽有焦虑的架构师。1. MoE模型的核心机制与结构拆解1.1 什么是混合专家模型混合专家模型的核心思想并不复杂把一个大模型拆成多个“专家”子网络每次推理时只激活其中一小部分专家来处理输入而不是像传统Dense模型那样所有参数都必须参与整个计算过程。这个思路其实很符合直觉。打个比方一家大医院里有内科、外科、骨科、神经科等几十个科室一个病人来看病分诊台路由器会根据症状把他分到一两个相关科室而不是让全院的医生都来给这个病人会诊。如果每次接诊都让全院医生上场效率极低且绝大多数人都在做无用功。MoE就是把“全院会诊”变成了“分诊台引导下的精准挂号”。这个机制带来的直接收益是模型总参数量可以做得非常大比如数千亿但每次推理实际计算的参数量活跃参数量却小得多。在语言模型领域这意味着模型容量记住的知识、学习到的模式可以大幅扩展而推理的计算成本只随活跃参数增长不随总参数增长。1.2 Gate RouterMoE的分诊台MoE模型里的“分诊台”就是门控网络Gate Router它是一个很小的神经网络输入是当前token的隐藏状态向量输出是每个专家被选择的概率分布。以业界常用的Top-2路由为例门控网络对N个专家分别计算一个得分然后取分数最高的两个专家作为当前token的激活专家。每个专家的输出会乘上对应的门控权重再相加得到最终输出。门控网络的实现通常是一个线性层加Softmaxgate_scores softmax( W_g * x )其中x是token的hidden stateW_g是门控权重矩阵维度是hidden_size × num_experts输出的gate_scores决定每个专家的权重。这里有一个工程上容易被忽视的点Router对专家数量的扩展性是O(N)的如果专家数量很多比如128或256个专家Router本身的计算量也不可忽视在硬件实现时不能只考虑专家网络的计算还要把这个“分诊台”的时延和计算纳入整体预算。1.3 稀疏激活与负载均衡MoE模型最核心的特性就是“稀疏激活”。输入数据token序列通过Router后不同的token会被路由到不同的专家上整个模型的参数虽然很多但推理时只有一小部分专家处于工作状态。这种稀疏性带来了一个问题负载不均衡。在自然语言中某些常用词、高频模式会大量命中某几个专家而另一些专家可能几乎不被选中。如果硬件按“所有专家都被访问”去设计资源那没有被访问的专家所占据的存储和计算资源在那一次推理里就是纯浪费如果硬件按“少量专家被访问”去设计那高负载专家对应的数据通路可能成为瓶颈。为了解决这个问题训练阶段通常会加入负载均衡损失鼓励token尽可能均匀分布到各个专家上。但在硬件推理阶段负载仍然存在动态波动这给FPGA上的计算调度带来了不小的挑战后面我会专门展开讲。2. FPGA搭台MoE唱戏硬件加速的可行性与约束2.1 为什么有人想用FPGA做MoE推理当前大模型推理的绝对主力是GPU尤其是NVIDIA的A100/H100系列但GPU在MoE推理上其实存在一些结构性效率问题。GPU的线程束warp粒度是32个线程它们执行的是SIMT单指令多线程模式。当遇到MoE的稀疏路由时同一个warp里的不同线程可能被路由到不同的专家上这就产生了分支发散。GPU需要分别执行这些分支浪费了并行吞吐。这也是一些工作如DeepSeek的DeepSeekMoE以及后来的DeepEP推理框架一直在优化的问题。FPGA的优势在于细粒度的定制化数据流。你可以把FPGA上的计算单元、存储、互连完全按照MoE模型的数据流特征来定制。比如把Router做成专门的流水线单元把专家网络实现成多个并行的矩阵向量乘GEMV引擎把token分配做成自定义的交换结构。这些在GPU的固定架构上做不到。FPGA的另一大优势是IO灵活性。大模型推理的本质瓶颈很多时候不是算力而是带宽从HBM/DRAM中搬运权重的带宽。FPGA可以灵活配置DDR/SPI/PCIE等接口配合定制化的数据复用策略在某些量化场景下有机会做得比GPU更省电、更便宜。2.2 边缘侧部署的现实场景另一个典型的FPGA应用场景是边缘侧或嵌入式的快速推理。如果要在智能终端、车载设备、工业控制器上跑一个小型MoE模型比如参数总量在1B到7B级别激活参数在100M到500M级别FPGA相比GPU的优势很明显功耗可控FPGA的功耗通常在几瓦到几十瓦GPU动辄数百瓦实时性好FPGA的流水线结构天然适合低时延处理接口灵活直接接传感器、采集卡、工业总线都方便我见过一个实际项目用Zynq UltraScale系列在边缘设备上跑一个语音命令识别的MoE模型INT8量化后模型总量约800MB激活参数量约120MBDDR4带宽足够支撑实时推理整板功耗控制在15W以内这在GPU方案下很难做到。2.3 FPGA做MoE推理的三个硬约束虽然FPGA有上述优势但做MoE推理也面临三个绕不开的硬约束第一个约束是片上存储有限。即便最新的FPGA如Versal系列片上BRAM/URAM总量也就几十MB级别。一个7B模型的权重即便量化到INT8也有7GB必须放在外部DDR中。这意味着每次计算都要从DDR搬运权重带宽决定了吞吐上限。第二个约束是稀疏路由导致的外部存储访问模式不规则。DDR对顺序访问友好随机访问的带宽利用率会大打折扣。MoE的专家路由恰好是“随机的”——一批token分散到不同专家对应的权重在DDR中的地址分散在不同区域。这个矛盾直接决定了FPGA实现的架构选择。第三个约束是开发周期长。相比GPU上成熟的推理框架vLLM、TensorRT-LLM等FPGA上的MoE实现基本属于“从零造轮子”需要自己写硬件逻辑、自己管理DDR访问调度、自己设计数据分发网络。工程量大验证困难。3. FPGA实现MoE的整体架构设计与核心模块分析3.1 整体设计框架我在FPGA上实现MoE推理时整体框架分为五个功能模块预处理模块、Router模块、专家计算引擎、数据分发网络、后处理模块。预处理模块负责对输入token进行Embedding查询和位置编码。Router模块实现门控网络的计算输出每个token的路由决策。专家计算引擎是计算核心负责执行被选中专家的前向传播。数据分发网络负责把token向量和对应的专家参数高效地送到目标计算单元。后处理模块负责归一化和残差连接。5分钟读懂MoE的FPGA整体框架Token流进入预处理模块完成Embedding编码Router计算每个token的专家选择结果Top-2数据分发网络将token向量按路由结果送往对应专家计算引擎专家计算引擎调用DDR中的专家权重执行GEMV计算计算结果聚合后进入后处理LayerNorm残差输出最终向量3.2 矩阵向量乘GEMV模块MoE计算的核心算子MoE的专家网络本质上是多个FFN前馈网络其核心计算是矩阵向量乘GEMV即y W * x其中W是专家的权重矩阵维度是hidden_size × intermediate_sizex是token向量维度是hidden_sizey是输出向量。在FPGA上实现GEMV最经典的架构是脉动阵列Systolic Array。把权重矩阵预先加载到片上BRAM中输入向量从阵列一端流入部分和partial sum在阵列中逐级传递最终在另一端输出结果。我用的方案是权重矩阵按行切分分配到多个PEProcessing Element中。每个PE内部执行乘累加MAC操作多个PE并行处理不同的输出维度。对于hidden_size4096、intermediate_size14336的标准MoE FFN层单专家单层的计算量约为1.2亿次MAC在200MHz的FPGA上用512个MAC单元并行计算算下来单层时延大约在1ms级别这是可以接受的。提示MoE模型推理的主要计算瓶颈其实不在计算单元的利用率而在于权重从DDR搬到片上BRAM的带宽。以INT8权重为例如果intermediate_size14336单专家单层的权重大小为4096×14336×1字节 ≈ 58.7MB。以DDR4-2400的理论带宽19.2GB/s计算单次加载就需要约3ms。所以做MoE加速第一步要规划的是带宽预算而不是计算资源。3.3 直接映射vs数据流优化两种实现思路在FPGA上实现MoE有两种路线我分别尝试过各有优劣。第一种是直接映射方案为每个专家分配一组独立的计算单元所有专家并行工作。Token进来后Router决定去哪个专家数据直接送过去执行。这种方案结构简单控制逻辑少但资源利用率低。如果专家数量很多32个甚至更多而每次只有Top-2被激活那大部分计算单元都在闲置。第二种是数据流优化方案把专家计算单元做成共享的资源池只实现2到4个专家的硬件实例但通过时分复用的方式来处理所有专家的计算任务。Router给出的路由结果决定当前那个token去调用哪套权重。这样计算资源利用率高但需要一套高效的任务调度和权重预取机制。推荐的做法是折中对于热的专家被频繁选中使用一组专用计算单元对于冷的专家偶尔被选中走共享计算池。这需要编译期做一定的静态分析把专家访问频率统计出来再进行硬件资源配置。3.4 稀疏路由的硬件调度策略MoE在硬件上的最大难点就是稀疏路由带来的动态调度。我在设计中采用了“动态批处理dynamic batching 权重预取weight prefetch”的组合策略。动态批处理指的是等待一定数量的token比如64个统一经过Router拿到各自的Top-2专家选择结果后按专家分组把去往同一个专家的token聚合成一个小批量再一次性计算。这样可以提高计算单元的吞吐效率避免单token逐个计算带来的启动开销。权重预取则是在第一批token还在计算时预先把下一批token可能需要的专家权重从DDR搬运到片上BRAM。这里的关键是预测——虽然Router的输出是动态的但上一批token的路由结果对下一批有很强的参考性相邻token通常倾向于路由到相似的专家所以预取命中率通常不错。在调度算法上我用了一个简单的启发式策略批内的token按Router得分从高到低排序优先调度得分高的token对应的专家预取的权重按“最近最少使用LRU”策略淘汰实测下来这个方案能把DDR的带宽利用率从纯随机访问的约30%提升到顺序流式访问的约70%。4. 实操过程与关键细节详解4.1 开发工具与硬件平台选择针对MoE的FPGA验证项目我使用的硬件平台是Xilinx Alveo U250数据中心级和Zynq UltraScale ZU7EV嵌入式级开发工具是Vivado 2023.1和Vitis HLS。Alveo U250的优势是DDR带宽充足4个DDR4 bank总带宽77GB/s适合做全尺寸MoE模型的性能验证。ZU7EV则更适合做低功耗验证它自带ARM核方便跑Linux和上位机调度逻辑。Vitis HLS对于GEMV这类计算密集型的算子非常友好可以直接用C/C描述矩阵向量乘逻辑综合成RTL。但对于数据分发网络和Router控制逻辑这类控制流密集的部分建议直接用RTL编写HLS生成的调度逻辑在这种场景下效率不高。4.2 量化方案与精度管理MoE模型的FPGA实现几乎必然涉及量化。我的标准做法是训练后量化PTQ到INT8对敏感层Router和部分LayerNorm保留FP16。Router层对量化非常敏感因为它的输出决定了token去哪个专家一旦选错后续计算全部白做。实测数据表明Router层从FP16降到INT8后模型准确率下降约2%-3%而专家网络的权重降到INT8后准确率下降不到1%。所以Router层我做了