FPGA加速CNN优秀,Transformer不灵?原因是啥
过去几年,视频图像处理的核心网络已经从CNN变成了Transformer。
大家知道ChatGPT是基于Transformer的,而Google后来又把原本用于自然语言处理的Transformer成功迁移到视频图像处理领域,这就是Vision Transformer,即ViT。给人的感觉是CNN时代,FPGA还挺活跃的,到了Transformer时代,怎么出镜率就很低了呢。
FPGA在加速CNN上的表现优异,而在Transformer上则显得力不从心,主要是因为两种模型在计算方式和数据流模式上的差异。让我们逐一解释。CNN
CNN叫卷积神经网络,其核心是卷积运算。卷积是一种高度重复的局部计算,有以下计算特点:> 局部计算密集:每个卷积核只需要访问局部区域的数据(如 3×3、5×5的矩阵),每次计算感受野(receptive field)很小,需要通过多层卷积网络逐步扩大感受野。> 数据重用性高:输入图像的相邻区域会被多个卷积核重复访问,适合数据缓存的优化。> 高度并行:可以同时对多个通道、多个卷积核进行计算,提高计算效率。
卷积核(kernel)的大小决定了视野CNN计算主要是乘加运算(MAC),FPGA可以通过大量DSP进行并行加速。依赖小窗口的卷积计算,数据局部性好,FPGA的片上BRAM/SRAM可用作line-buffer,高效存储和复用数据,减少数据搬运成本。FPGA天然适合流水线处理架构,擅长局部数据流并行乘加运算。
Transformer而Transformer以自注意力计算(Self-Attention)机制为核心,开始就必须具有全局视野,特点如下:> 计算复杂度高:Self-Attention的计算复杂度是“序列长度的平方×每个词的维度”,当序列变长时计算量激增。
> 全局计算:在 Self-Attention的全局计算中,每个Token都需要与整个序列的Key进行相关性计算,并对Value加权求和。> 大存储高带宽: 虽然Query可由当前Token局部生成,但Key和Value是全局共享的,需从外部DRAM重复读取整段序列,带来巨量的存储和带宽需求。ViT把图像分为很多个patch即Token,每个Token之间都会相互产生计算Transformer依赖大规模矩阵乘法(MatMul),传统FPGA基本上就是LUT和DSP单元,缺乏高效的矩阵乘法加速器。GPU/TPU具有专门的矩阵乘法计算单元Tensor Core,更适合Transformer计算。
另外,FPGA片上存储也很受限。Transformer需要存储整个Query-Key-Value矩阵,FPGA的片上存储无法容纳大规模注意力计算,导致需要频繁访问外部DRAM,因而性能受限。
业界创新
一些FPGA集成了NPU如AIE,用于加速矩阵乘法和激活函数,在一定程度上缓解了Transformer 的算力压力。
而当前FPGA厂家的NPU仍以CNN为优化目标,缺乏对Self-Attention等全连接计算模式的专门适配,难以高效支持大规模Transformer模型,或许适合轻量级中小规模transformer推理工作,需看实际部署效果。
由于FPGA的片上存储容量有限,即便配合HBM,仍难以支撑Transformer在长序列、大批量计算时对Key/Value的高频、大带宽访存需求。
HBM同时,FPGA开发门槛较高,针对内嵌NPU的工具链尚不完善,开发人员需要同时精通硬件描述语言、NPU架构以及Transformer算法原理。这使得基于FPGA内嵌NPU优化Transformer计算的效率较低,进一步限制了其在Transformer模型部署中的广泛应用。 一些研究尝试用FPGA加速Transformer,比如用量化(Quantization)减少精度到INT8/INT4计算,对权重和Token剪枝来降低计算复杂度,但会显著降低模型准确性,效果也有限。
稀疏化(Sparsity)可以减少不必要的计算,但仍然受限于访存带宽,尤其是在稀疏模式下的访存访问往往呈现出不规则、低复用率的特性,反而加剧了带宽瓶颈。
总结
显然,要对Transformer加速,有两个重要条件。第一,必须有大规模矩阵乘法加速器;第二,需要大存储HBM和高带宽互联。CNN的计算范式刚好处在FPGA的甜蜜点上,因此应用广泛。谷歌的TPU和NVIDIA Tensor-Core进行了专门优化,更适合加速Transformer。虽然FPGA搭载NPU和HBM显著提升了其对Transformer加速能力,但受限于Self-Attention的二次方复杂度和带宽需求,仍难以突破大规模模型和超长序列的瓶颈。或许,未来需结合算法层面的优化和软硬件协同设计,方能充分发挥FPGA的优势。
感谢分享,学习到了 讲的不错!:)
页:
[1]
