多FPGA 进行模型推理
1. 多颗 FPGA 实现模型推理:完全可行,而且是主流方案
- 绝大多数大模型、高吞吐、低延迟推理场景(如云端 AI 加速卡、自动驾驶域控、机器人中央计算单元)都是多 FPGA / 多芯片协同推理。
- 典型做法:
- 模型切层 / 切通道 / 切任务分布到多片 FPGA
- 片间流水并行 + 数据并行
- 每片 FPGA 负责一部分算子 / 层 / 特征图
只要带宽、时延、同步设计得当,性能几乎可以接近线性扩展。
2. 多 FPGA 之间用什么总线 / 接口通信?
按速度从高到低、从近到远排序:
(1)芯片内 / 紧耦合:Die-to-Die 互联(D2D)
- UCIe、BoW、AIB 等
- 用于 2.5D/3D 封装内多裸片(小芯片)
- 带宽极高、时延极低
(2)板级高速:SerDes 高速串行接口
- PCIe 5.0/6.0(最常用,软件生态最好)
- CXL 2.0/3.0(未来大模型多芯片统一内存)
- 100G/400G Ethernet(分布式多卡、多机箱)
- 自定义 Multi-gigabit Transceiver(MGT) 直连(低时延专用)
(3)传统并行总线(基本不用)
- AXI、APB 等是片内总线,不用于多 FPGA 通信。
3. 必须要有数据存储单元吗?
必须有,而且非常关键。
你至少需要三类存储:
- 片上存储(BRAM/URAM)
- 存放权重、特征图、指令
- 决定推理时延与吞吐
- 片外高带宽内存(HBM / GDDR6 / DDR5)
- 大模型权重、特征图缓存
- 多 FPGA 推理最吃带宽
- 片间共享 / 同步存储
- 用于多 FPGA 之间的数据同步、乒乓缓冲、命令队列
- 可以是:
- 共享 DDR
- CXL 共享内存
- 片上双端口 RAM + 高速链路
一句话:
没有存储,多 FPGA 就无法流水线、无法缓存中间特征图、无法切模型。
极简总结
- 多 FPGA 推理:可行,且是高性能 AI 推理的标准方案
- 片间通信:PCIe/CXL/Ethernet/ 自定义 MGT
- 数据存储:必须有,片上 + 片外 + 片间缓存缺一不可
多 FPGA 模型推理整体架构(板级 / 多卡)
plaintext
┌─────────────────────────────────────────────────────────────────┐ │ 主机 / 主控 CPU │ └───────────────────────┬─────────────────────────────────────────┘ │ PCIe/CXL 管理通道 ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 板级高速交换区域 │ │ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 高速交换芯片 │◄───────►│ 时钟/同步模块 │ │ │ │ (PCIe Switch / │ │ (同步多片时序) │ │ │ │ 自定义MGT交换) │ └─────────────────┘ │ │ └────────┬────────┘ │ └───────────┼─────────────────────────────────────────────────────┘ │ 高速数据通路 (PCIe 5.0/CXL/100G/MGT直连) ┌──────────┴──────────┐ ┌──────────────────┐ ┌───────────────┐ │ │ │ │ │ │ │ FPGA 0 │ │ FPGA 1 │ │ FPGA N │ │ (模型前层/编码) │◄──┤ (模型中层/计算) │◄──┤ (模型后层/输出)│ │ │ │ │ │ │ └───────────┬──────────┘ └────────┬─────────┘ └───────┬───────┘ │ │ │ ┌──────┴──────┐ ┌──────┴──────┐ ┌─────┴──────┐ │ 片外存储 │ │ 片外存储 │ │ 片外存储 │ │ HBM/DDR5 │ │ HBM/DDR5 │ │ HBM/DDR5 │ └─────────────┘ └─────────────┘ └────────────┘ 内部结构(单 FPGA 内部)
plaintext
┌─────────────────────────────────────────────────────┐ │ FPGA 芯片 │ │ ┌─────────────────┐ ┌─────────────────────┐ │ │ │ 片间高速接口 │◄───────►│ 片上总线 AXI/Stream │ │ │ │ (PCIe/MGT硬核) │ │ 数据流互联 │ │ │ └────────┬────────┘ └──────────┬──────────┘ │ └───────────┼──────────────────────────────┼───────────┘ │ │ ┌──────────┴──────────┐ ┌──────────┴──────────┐ │ 计算阵列 │ │ 片上存储 │ │ (DSP/ALU/张量引擎) │◄──────►│ BRAM / URAM │ └──────────┬──────────┘ └──────────┬──────────┘ │ │ └────────────────────────────────┘ │ ┌───────────┴───────────┐ │ 片外存储控制器 │ │ (DDR5/HBM 控制器) │ └───────────┬───────────┘ │ ┌───────────┴───────────┐ │ DDR5 / HBM │ └───────────────────────┘ 关键通信总线(你问的重点)
- 片间通信总线
- 高速串行:PCIe 5.0/6.0、CXL、100G/400G、MGT 直连
- 用于:多 FPGA 之间传输特征图、权重、控制指令
- 片内通信总线
- AXI4-Stream / AXI4 Full
- 用于:FPGA 内部模块之间数据流、存储读写
- 存储单元(必须有)
- 片上:BRAM、URAM → 缓存特征图、指令
- 片外:DDR5、HBM → 存模型权重、大特征图
- 多片之间:CXL 共享内存 / 乒乓缓冲
一句话总结
- 多 FPGA 推理:可行,且是大模型加速标配
- 通信:PCIe/CXL/MGT 高速串行
- 存储:片上 BRAM + 片外 HBM/DDR5 必须有
你现在需要的是能直接落地的多 FPGA 模型推理切分策略,我会按「易实现→高性能」的优先级,给你 3 类核心策略,每个策略都包含适用场景、切分方法和工程注意事项,你可以直接对应到之前的多 FPGA 架构上。
核心前提
所有切分策略的核心目标:让多 FPGA 间的数据传输量最小、算力利用率最高、延迟最低,且必须匹配你之前架构里的PCIe/CXL/MGT 高速链路带宽。
策略 1:按「模型层级」切分(Pipeline 切分,最易实现)
这是新手 / 中小模型首选的切分方式,也是工程上落地最多的方案。
核心思路
把模型的不同层 / 算子组分配到不同 FPGA 上,形成流水线:
- FPGA 0:负责模型前处理 + 卷积 / Attention 前几层
- FPGA 1:负责模型中间层(如 Transformer Block 1~N)
- FPGA N:负责模型后几层 + 后处理 + 输出
适用场景
- 模型:CNN、Transformer(LLM)、ResNet 等层级化明显的模型
- 硬件:FPGA 数量≤8 片,片间带宽≥100Gbps(PCIe 5.0 x8 即可满足)
- 需求:追求高吞吐(如云端推理),对单帧延迟要求不极致
工程实现要点
- 切分点选在数据量最小的层间:比如 Transformer 的 QKV 计算后(特征图维度小),而非大尺寸特征图输出后;
- 做流水线对齐:让每片 FPGA 的单批次计算耗时接近(比如都控制在 100μs),避免某片 FPGA 空闲;
- 缓存设计:每片 FPGA 的片外 DDR/HBM 缓存当前层的权重 + 输入特征图,片上 BRAM 缓存中间结果;
- 示例(LLM 7B 模型):
- FPGA 0:Embedding 层 + Transformer Block 1~4
- FPGA 1:Transformer Block 5~8
- FPGA 2:Transformer Block 9~12 + Linear 输出层
策略 2:按「数据维度」切分(Parallel 切分,高性能)
也叫 “张量并行 / 通道并行”,适合大模型、高算力需求场景。
核心思路
把同一层的计算任务按数据维度拆分,多 FPGA 并行计算后合并结果:
- 比如 CNN 的卷积层:将输入特征图的通道(Channel)拆分成 N 份,每片 FPGA 计算 1/N 通道的卷积;
- 比如 Transformer 的 Attention 层:将 Q/K/V 矩阵按头数拆分(8 头 Attention 拆给 2 片 FPGA,每片算 4 头)。
适用场景
- 模型:大模型(LLM 10B+、大尺寸 CNN)、单层层数多 / 计算量大的模型
- 硬件:FPGA 数量≥4 片,片间带宽≥400Gbps(建议 CXL 或 MGT 直连)
- 需求:追求低延迟(如自动驾驶、实时机器人推理)
工程实现要点
- 切分维度选计算密集型维度:优先按通道 / 头数 / 矩阵行 / 列切,而非空间维度(H/W);
- 同步设计:必须加全局同步模块(对应之前架构里的时钟 / 同步模块),保证多 FPGA 同时开始 / 结束计算;
- 结果合并:指定 1 片 FPGA 作为 “主 FPGA”,负责接收其他 FPGA 的计算结果并合并(如拼接通道、求和);
- 示例(ResNet50):
- 卷积层通道数 = 256,4 片 FPGA 各计算 64 通道的卷积;
- 每片 FPGA 输出 64 通道特征图,主 FPGA 拼接为 256 通道后进入下一层。
策略 3:混合切分(Pipeline+Parallel,最优解)
结合前两种策略的优势,是大模型多 FPGA 推理的 “终极方案”。
核心思路
先按层级切分把模型拆成多个阶段,再对每个阶段内的单一层做数据并行切分:
- 示例(LLM 70B 模型):
- 阶段 1(FPGA 0/1):Embedding 层 + Block 1~10 → 2 片 FPGA 做数据并行;
- 阶段 2(FPGA 2/3):Block 11~20 → 2 片 FPGA 做数据并行;
- 阶段 3(FPGA 4/5):Block 21~30 + 输出层 → 2 片 FPGA 做数据并行。
适用场景
- 模型:超大模型(LLM 50B+)、高吞吐 + 低延迟双需求场景
- 硬件:FPGA 数量≥6 片,片间带宽≥400Gbps(CXL/400G Ethernet)
- 需求:云端大模型推理、自动驾驶域控核心计算
工程实现要点
- 层级切分控制阶段数≤FPGA 总数量 / 2,避免流水线过长;
- 数据并行的 FPGA 组内用 MGT 直连(低延迟),组间用 PCIe/CXL(高带宽);
- 权重分配:每个 FPGA 只存自己负责的那部分权重(减少存储压力);
- 容错设计:某片 FPGA 故障时,可降级为单组数据并行(比如 2 片→1 片)。
策略选择速查表
表格
| 切分策略 | 实现难度 | 片间带宽要求 | 适用场景 | 核心目标 |
|---|---|---|---|---|
| 层级切分 | 低 | ≥100Gbps | 中小模型、高吞吐 | 易落地、高吞吐 |
| 数据维度切分 | 中高 | ≥400Gbps | 大模型、低延迟 | 低延迟、高算力 |
| 混合切分 | 高 | ≥400Gbps | 超大模型、双需求 | 平衡吞吐 + 延迟 |
总结
- 入门首选层级切分:逻辑简单,适配成本低,能快速验证多 FPGA 推理可行性;
- 高性能选数据维度切分:需重点优化片间同步和带宽,适合低延迟场景;
- 超大模型选混合切分:结合前两者优势,是工程上的最优解,但需做好算力 / 带宽规划。
一、多 FPGA 推理 总线推荐(按优先级)
1. 板内多 FPGA(同一块板卡)
首选:自定义 MGT 直连 + AXI-Stream 封装
- 速率:10G/25G/100G 每通道
- 优势:时延最低、无协议开销、最适合推理流水
- 适用:模型切分、特征图传输、流水同步
次选:PCIe 5.0 x8/x16
- 带宽:x16 单向~128GB/s
- 优势:生态成熟、可直接连 CPU、可做控制 + 数据通路
高端:CXL 3.0
- 支持共享内存,多 FPGA 像在同一片内存里
- 大模型切分最舒服
2. 多板卡 / 机柜间
- 100G/400G Ethernet
- 或 400G QSFP-DD 自定义 SerDes
二、你最关心的:带宽怎么算?
我给你最简公式,FPGA/AI 推理通用。
关键公式
1. 特征图数据量
Data=H×W×C×DataType_bit
- H/W:特征图高宽
- C:通道数
- DataType_bit:
- FP32 → 32
- FP16/BF16 → 16
- INT8 → 8
- INT4 → 4
2. 片间需要的最小带宽
冗余
- Latency:你能接受的传输时延
- 1.2~1.5:协议开销、拥塞冗余
三、直接给你算 3 个真实场景
场景 1:CNN 中间特征图传输(典型 FPGA 推理)
- H=32, W=32, C=256
- INT8
- 帧率 30fps
- 单张特征图点数:32×32×256 = 262,144
- 数据量:262,144 × 8bit = 2Mb = 256KB
- 每秒数据量:256KB × 30 = 7.5MB/s
加 1.5 倍冗余:→ 需要~11.25MB/s 有效带宽
总线推荐
- 随便一个 PCIe 3.0 x1 都够
- 实际用 MGT 10G 通道 毫无压力
场景 2:Transformer 层间切分(大模型常用)
- 特征:Token=512,Hidden=4096,INT8
- 每帧一层输出:512×4096 Byte
- 单层数据:512×4096 = 2MB
- 30fps:60MB/s加冗余 → 90MB/s
总线推荐
- PCIe 4.0 x4 轻松跑
- 或 25G MGT 直连
场景 3:大模型张量并行(多 FPGA 算同一层)
- Hidden=8192,FP16
- 切 4 片 FPGA,每片传输 8192/4=2048 维度
- 每 Token:8192×2Byte = 16KB
- 512Token:8MB
- 30fps → 240MB/s加冗余 → 360MB/s
总线推荐
- PCIe 5.0 x4
- 或 50G/100G MGT
四、我直接给你最终选型结论(不用你再算)
1. 模型层级切分(Pipeline)
- 总线:PCIe 5.0 + 10G/25G MGT 直连
- 带宽:10~100Gbps 足够
2. 模型张量 / 通道并行(Parallel)
- 总线:100G MGT / PCIe 5.0 x16 / CXL
- 带宽:100~400Gbps
3. 板间多卡
- 总线:400G Ethernet 或 QSFP-DD
五、极简记忆口诀
- CNN 小特征图:10G~25G 够用
- Transformer 层间:50G~100G 稳妥
- 张量并行:100G+ 才够爽