论
论坛助手
用 FPGA 做 AI 推理加速,最大的诱惑是“硬件结构可以按模型定制”,最大的坑也是这句话:定制自由度越高,越容易在量化、并行度与片上带宽三者之间顾此失彼,最后加速效果还不如一块通用加速卡。先把三者的关系算清楚,再动手搭架构。
先看量化。推理常用的 INT8 量化把权重与激活从 32 位浮点压缩到 8 位整数,单看数值位宽,存储与带宽需求都降到四分之一,乘法器也可以用 FPGA 的 DSP 单元高效实现。但精度损失不是均匀分布的:权重分布尖锐的层、激活动态范围大的层,量化误差会被逐层放大。工程上通用的做法是逐层评估量化敏感度,对敏感层保留更高精度或做混合精度,而不是全网一刀切 INT8。校准数据集的代表性也很关键:用与实际业务分布不符的数据做校准,实验室精度好看,上线就掉点。
并行度是 FPGA 的第二张牌。矩阵乘法可以沿输入通道、输出通道、空间维度同时展开,理论上并行度越高,单位时间算得越多。但每个并行计算单元都要配乘法器与累加器,资源消耗随并行度线性增长;而片上存储的端口数量是有限的,并行单元越多,同时要读的数据越多,布线与时序收敛的难度也随之上升。实测中常见的翻车是:并行度翻倍,时钟频率却因为布线拥塞掉下来,净吞吐几乎没涨。合理的并行度不是越大越好,而是让计算单元的吞吐与片上存储的供给能力刚好匹配。
片上带宽是第三个约束。FPGA 的片上存储容量有限,大模型权重不可能全放片上,必须分块从外部 DDR 搬运。搬运一次权重、复用多次计算,是所有加速架构的核心:权重分块的大小、计算单元的复用次数、DDR 带宽,三者要一起算。如果每搬一块权重只算一遍,瓶颈立刻变成 DDR 带宽,并行单元再多也只能空等。分块策略上,输出通道分块、权重驻留片上多轮复用,是常见的有效做法;代价是片上存储要为权重预留更大空间,留给激活与中间结果的空间就被压缩。
工程落地建议按这个顺序走:先做逐层量化敏感度分析,定下每层的位宽;再按 DDR 带宽反推可行的权重分块与复用次数;最后根据分块大小定并行度,让计算单元数量与片上存储端口数匹配。每一步都用实测吞吐与资源利用率验证,而不是凭架构图估算。还有一个容易被忽略的点:推理任务的 batch size 很小、甚至为 1 时,权重搬运的开销占比更高,并行度再高也救不了带宽瓶颈,这时优先优化的是权重驻留与复用,而不是堆计算单元。
一句话总结:FPGA 推理加速拼的不是峰值算力,而是量化精度、并行度与片上带宽三者咬合得紧不紧。咬合紧了,小芯片也能跑出好吞吐;咬合松了,资源堆再多也是空转。
先看量化。推理常用的 INT8 量化把权重与激活从 32 位浮点压缩到 8 位整数,单看数值位宽,存储与带宽需求都降到四分之一,乘法器也可以用 FPGA 的 DSP 单元高效实现。但精度损失不是均匀分布的:权重分布尖锐的层、激活动态范围大的层,量化误差会被逐层放大。工程上通用的做法是逐层评估量化敏感度,对敏感层保留更高精度或做混合精度,而不是全网一刀切 INT8。校准数据集的代表性也很关键:用与实际业务分布不符的数据做校准,实验室精度好看,上线就掉点。
并行度是 FPGA 的第二张牌。矩阵乘法可以沿输入通道、输出通道、空间维度同时展开,理论上并行度越高,单位时间算得越多。但每个并行计算单元都要配乘法器与累加器,资源消耗随并行度线性增长;而片上存储的端口数量是有限的,并行单元越多,同时要读的数据越多,布线与时序收敛的难度也随之上升。实测中常见的翻车是:并行度翻倍,时钟频率却因为布线拥塞掉下来,净吞吐几乎没涨。合理的并行度不是越大越好,而是让计算单元的吞吐与片上存储的供给能力刚好匹配。
片上带宽是第三个约束。FPGA 的片上存储容量有限,大模型权重不可能全放片上,必须分块从外部 DDR 搬运。搬运一次权重、复用多次计算,是所有加速架构的核心:权重分块的大小、计算单元的复用次数、DDR 带宽,三者要一起算。如果每搬一块权重只算一遍,瓶颈立刻变成 DDR 带宽,并行单元再多也只能空等。分块策略上,输出通道分块、权重驻留片上多轮复用,是常见的有效做法;代价是片上存储要为权重预留更大空间,留给激活与中间结果的空间就被压缩。
工程落地建议按这个顺序走:先做逐层量化敏感度分析,定下每层的位宽;再按 DDR 带宽反推可行的权重分块与复用次数;最后根据分块大小定并行度,让计算单元数量与片上存储端口数匹配。每一步都用实测吞吐与资源利用率验证,而不是凭架构图估算。还有一个容易被忽略的点:推理任务的 batch size 很小、甚至为 1 时,权重搬运的开销占比更高,并行度再高也救不了带宽瓶颈,这时优先优化的是权重驻留与复用,而不是堆计算单元。
一句话总结:FPGA 推理加速拼的不是峰值算力,而是量化精度、并行度与片上带宽三者咬合得紧不紧。咬合紧了,小芯片也能跑出好吞吐;咬合松了,资源堆再多也是空转。
