基于FPGA的卷积神经网络和视觉Transformer通用加速器
源自:电子与信息学报
作者:李天阳, 张帆, 王松, 曹伟, 陈立
摘 要
针对计算机视觉领域中基于现场可编程逻辑门阵列(FPGA)的传统卷积神经网(CNN)络加速器不适配视觉Transformer网络的问题,该文提出一种面向卷积神经网络和Transformer的通用FPGA加速器。首先,根据卷积和注意力机制的计算特征,提出一种面向FPGA的通用计算映射方法;其次,提出一种非线性与归一化加速单元,为计算机视觉神经网络模型中的多种非线性和归一化操作提供加速支持;然后,在Xilinx XCVU37P FPGA上实现了加速器设计。实验结果表明,所提出的非线性与归一化加速单元在提高吞吐量的同时仅造成很小的精度损失,ResNet-50和ViT-B/16在所提FPGA加速器上的性能分别达到了589.94 GOPS和564.76 GOPS。与GPU实现相比,能效比分别提高了5.19倍和7.17倍;与其他基于FPGA的大规模加速器设计相比,能效比有明显提高,同时计算效率较对比FPGA加速器提高了8.02%~177.53%。
关键词
计算机视觉 / 卷积神经网络 / Transformer / FPGA / 硬件加速器
1. 引言
在过去的10年中,卷积神经网络(Convolutional Neural Network, CNN)在计算机视觉领域取得了巨大成功,如VGG[1], ResNet[2]和GoogleLeNet[3]。由于最近几年Transformer在自然语言处理领域取得了突破性的成果,基于注意力机制的Transformer[4]也成为计算机视觉领域研究热点。越来越多的视觉Transformer和CNN-Transformer混合模型被提出[5-7],如用注意力机制代替卷积的视觉转换器(Vision Transformer, ViT)[8],或者将卷积与注意力机制相结合的检测转换器(DEtection TRansformer, DETR)[5]。这些模型在各类计算机视觉任务中均取得了出色的成绩。
随着基于注意力机制的Transformer模型规模逐渐增大,计算量也变得越来越大,如ViT-H/14的参数量为632 MB[8],之后发布的ViT-G/14参数量和计算量分别增长到1843 MB和2859.9 GFLOPs[7]。由于Transformer中的注意力机制涉及多个大型矩阵乘法和数据交互,因此在硬件平台上部署Transformer需要高额的计算和存储开销。现有的基于现场可编程逻辑门阵列(Field Programmable Gate Array, FPGA)的视觉Transformer加速器试图从两个方面克服这个问题,包括数据流优化和模型优化。文献[9]将ViT的注意力模块和多层感知机(Multi-Layer Perceptron, MLP)模块分别与层归一化函数进行组合,划分为两部分在FPGA上进行映射,通过平衡每个模块的吞吐量,减少了残差机制带来的路径依赖影响,整个加速器使用全流水线设计。文献[10]使用3个单独的计算阵列并行计算注意力机制中的Qurey(Q𝑄), Key(K𝐾)和Value(V𝑉),除此之外的矩阵乘法操作与多层感知器时分复用其他计算阵列。文献[11]采用定点和指数两种方式对视觉Transformer进行混合精度量化,通过对FPGA的计算资源总数和目标帧率(Frames Per Second, FPS)建模,训练得到定点量化和指数量化的占比。
然而,这些FPGA加速器不能充分适用于CNN,例如文献[9]采用定制全流水设计,文献[10]为不同的操作分配不同的计算资源,CNN则有着更多的权重共享机制,FPGA加速器通常使用迭代式设计来复用计算资源,而且针对CNN和Transformer的FPGA加速器之间有着不同的并行计算和访存策略。吴瑞东等人[12]面向极致边缘计算场景,提出一种不依赖片外存储的多核FPGA加速器,片上存储采用紧密耦合内存层次结构设计,使用层内映射和层内融合优化方法来减小存储资源消耗。文献[13]则通过为使用残差机制的CNN的Shortcut数据分配可重用的静态存储,最大化复用读入片上的数据,降低片外访存量。因此,可以看出两种神经网络的FPGA加速器设计思路存在差异性,使用某一种专用加速器将不可避免地降低另一方的计算效率,给面向计算机视觉多样化应用的云数据中心加速器部署带来了挑战。
为解决上述问题,本文基于FPGA提出了一种CNN和视觉Transformer通用加速器。本文的主要研究工作及贡献如下:(1)根据注意力机制和卷积的计算特征,面向FPGA提出一种通用的计算映射方法,对计算阵列进行设计空间探索;(2)提出一种支持Softmax、高斯误差线性单元(Gaussian Error Linear Unit, GELU)和层归一化的硬件加速单元,通过指令配置复用计算和存储资源,在同等面积条件下实现了更高的处理效率;(3)在Xilinx XCVU37P FPGA上对加速器进行了综合实现,同时支持CNN和视觉Transformer两类神经网络加速。在ImageNet数据集上的实验结果表明,所提出的非线性与归一化加速单元在提高吞吐量的同时仅造成很小的精度损失。ResNet-50和ViT-B/16在所提FPGA加速器上的吞吐量分别达到了589.94 GOPS和564.76 GOPS,能效比远高于GPU实现和其他基于FPGA的大规模加速器设计,且计算效率高于对比FPGA加速器。
2. 研究背景
2.1 卷积和注意力机制概述
卷积是传统CNN最核心的组成部件,同时也是CNN模型中计算量最大的操作,卷积计算过程如图1所示。卷积使用卷积核在输入特征图的2维空间上滑动计算每个像素点及其相邻像素点与卷积核的点积,最终得到一张输出特征图。图1中的Cin和Cout分别表示卷积操作的输入通道数和输出通道数。𝐾表示卷积核大小。Hin和Win表示输入特征图的高度和宽度。Hout和Wout表示输出特征图的高度和宽度。
图 1 卷积示意图
注意力机制最关键的部分是自注意力操作,自注意力计算流程如图2(a)所示。𝑋in是自注意力操作的输入,分别与权重𝑊 , 𝑊 和𝑊 作线性矩阵乘法得到𝑄, 𝐾和𝑉。为避免Softmax函数的输入绝对值过大,导致函数的梯度过小进而影响到梯度下降。将𝑄除以dk−−√𝑑𝑘进行缩放,𝑑𝑘是输入向量维度。缩放后的𝑄与𝐾的转置𝐾T相乘,然后进行Softmax操作,结果与V 相乘得到自注意力最终结果Oattn 。现有的基于注意力机制的Transformer模型大多数使用多头自注意力,由多个自注意力操作组成,数量用Head(ℎ)表示。图2(b)展示了Transformer中多头自注意力的计算过程。每个头使用不同的权重𝑊𝑄𝑖, 𝑊𝐾𝑖和𝑊𝑉𝑖来分别得到𝑄𝑖, 𝐾𝑖和𝑉𝑖。最后将h个自注意力输出拼接为Omulti−attn作为多头自注意力的最终结果。
图 2 注意力计算过程
2.2 问题分析
2.2.1 计算方式差异
由上述可知,卷积和注意力机制遵循着不同的设计范式。卷积使用卷积核在感受野上计算得到输出值,感受野是指输出特征图上的像素点在原始图像上映射的区域。相比之下,注意力机制则是对输入特征图及其中间结果进行操作,专注于不同的区域,捕捉更多的特征信息。在推理过程中,卷积计算过程中只涉及输入数据和训练后的模型参数q,而注意力计算过程还包括对当前输入的中间结果进行操作,如Q , K , V 等。另外,与注意力中的单通道2维矩阵乘法不同,卷积计算通常是多通道的。
2.2.2 非线性与归一化操作差异
CNN和Transformer模型除了计算密集的线性操作,还包括激活和归一化函数。CNN通常采用批归一化,由于批归一化在推理时可以作为固定权重叠加进卷积层,同时CNN频繁使用的激活函数ReLU可以在FPGA上使用简单的查找表实现,其他非线性操作通常只在输出层进行,因此CNN中的非线性与归一化操作基本不会影响其在FPGA上推理的计算效率。Transformer通常采用层归一化,层归一化的对象是单个样本,它对该样本的所有维度的特征进行操作。层归一化使用输入数据的均值和方差作为参数,与输入数据强相关。除了层归一化,Transformer还包括频繁使用的Softmax和GELU激活函数,这些操作在推理时引入了大量时间成本,在CPU上推理一张图像的运行时间占比如图3所示。
图 3 ViT各种配置下的运行时间占比
2.2.3 问题小结
由于CNN和Transformer在计算方式和非线性与归一化操作上存在着以上差异,给当前的计算机视觉神经网络FPGA加速器设计带来了以下挑战。
(1) 如何在FPGA计算资源上同时映射计算方式不同的卷积和注意力机制;
(2) 如何在保证精度的前提下设计非线性与归一化加速单元以支持Transformer中的层归一化,Softmax和GELU激活函数加速;
(3) 基于上述两个挑战,如何将基于CNN和Transformer的算法模型映射到FPGA上进行加速。
3. 加速器设计
3.1 卷积和注意力机制计算映射
为了最大限度地复用FPGA的计算和存储资源,本文将卷积和注意力机制进行统一映射,这使得两种类型的操作可以使用相同的计算阵列完成。这需要对维度大小不同的卷积和注意力机制中的矩阵乘法操作进行划分,将这些大规模计算映射成计算阵列上的有限次计算[14]。
本文对卷积操作的划分如图4(a)所示,其中 𝑑ic, 𝑑iw和 𝑑ih分别表示输入特征图划分块的通道数、宽度和高度, 𝑑oc, 𝑑ow和 𝑑oh分别表示输出特征图划分块的通道数、宽度和高度。 𝑑ow和 𝑑oh可以根据 𝑑iw, 𝑑ih以及卷积核大小和步长得到,因此划分块可以使用4元组(𝑑ic,𝑑oc, 𝑑ow,𝑑oh) 来表示。本文对注意力机制中矩阵乘法操作的划分如图4(b)所示,由于 𝑑oh=𝑑ih,因此使用3元组 (𝑑iw,𝑑ow,𝑑oh)表示矩阵乘法划分块。这些参数均由CNN和Transformer模型各层特征图尺度以及FPGA计算阵列规模决定。
图 4 卷积和注意力矩阵乘法划分
FPGA计算阵列通常采用由若干个计算单元组成的二叉树结构或脉动阵列结构,本文用(Ni,No) 来参数化计算阵列配置,Ni 表示每个计算单元的输入通道数,No 表示计算单元的数量,即计算阵列输出通道数。本文将(Ni,No)与(dic,doc,dow,doh) 和(diw,dow,doh) 前两个维度对应。对于卷积,对划分块逐通道计算,Ni 对应dic ,No 对应doc。对于注意力机制中的矩阵乘法,对划分块逐行计算,Ni 对应diw ,No 对应dow 。
为了探索计算阵列配置(Ni,No),本文以计算量最小化为目标,提出了片上模型计算量穷举法。通过分析基于FPGA的CNN和Transformer模型在计算阵列各种配置下实际的计算量得到(Ni,No) 最优解,如算法1所示。由于神经网络每层的最终计算结果总是作为下一层的输入,为了减少无效数据填充,避免降低计算效率,本文约束mod(Ni,No)=0 。对于每组有效的(Ni,No) ,遍历神经网络模型每层的卷积或注意力操作,通过计算阵列利用率niu 和nou 得到实际的计算量。
算法1 片上模型计算量穷举法
由于CNN各层通道数和Transformer输入向量维度通常是2的整数次幂的整数倍,本文将资源受限的FPGA计算阵列中的乘法器数量Multnum设置为256, 512, 1024和2048, 得到的(Ni,No)有效配置如表1所示。基于这些配置,本文对典型的CNN模型ResNet-50和典型的Transformer模型ViT-B/16应用算法1,得到的各种计算阵列配置下模型实际的计算量如图5所示。当Multnum=256 时,(Ni,No) 配置为(16, 16)使得ResNet-50和ViT-B/16实际的计算量同时达到最小;当Multnum=512 时,(Ni,No) 取(16, 32)是最优解;当Multnum =1024 时,(Ni,No) 可配置为(32, 32);当Multnum=2048 时,(Ni,No) 配置为(32, 64)是最优解。
表 1 计算阵列有效配置
图 5 面向ResNet-50和ViT-B/16的计算阵列设计空间探索
3.2 非线性与归一化加速单元
为了避免溢出和可能的精度损失,视觉Transformer中的Softmax函数可以表达为
(1)
其中,xi,j 表示输入数据,xmaxi 表示沿列方向n个输入的最大值。
视觉Transformer中的GELU函数使用式(2)近似
(2)
层归一化函数可表示为
(3)
其中,μi 表示第i行输入的均值, 表示第i行输入的方差,ε 是一个非常小的常量,以避免分母为0,αj 和βj 分别表示第j列的权重和偏置。
由于在FPGA上直接计算ex 会导致巨大的硬件开销,因此本文使用式(4)来近似计算ex 。当n取2的整数次幂时,除法操作和幂运算就可以转换成移位操作以节省计算成本
(4)
为了确定合理的n值,本文在ViT-B/16模型中Softmax和GELU涉及ex 计算的输入范围内进行测试,将n分别设置为64, 128, 256, 512, 1024,得到的结果如图6所示。当n=128时,近似函数基本与ex 函数一致,随着n值增大,相似度越来越大。为了在保证模型精度的前提下尽可能减少计算量,本文将n设置为128,在4.2节展示了n=128时详细的精度测试结果。
图 6 自然指数近似函数对比
本文设置g(x)=(1+x/128)128 ,对于Softmax函数,可以将式(1)表示为
(5)
对于GELU函数,设置,式(2)可表示为
(6)
对于层归一化函数,在FPGA上计算方差的倒数平方根会导致较大的硬件开销,因此本文使用快速倒数平方根算法(Fast Inverse Square Root, FISR)[15],分解其计算流程进行硬件适配,硬件结构如图7(a)所示。本文对上述变换后的Softmax, GELU和层归一化进行操作分解,尽可能地复用FPGA计算资源。非线性与归一化加速单元结构如图7(b)所示,主要使用了2组32路输入的乘法器,1组32路输入的加法器和1组32路输入的除法器,2组32路输入的加法树,在运行中通过指令配置实现Transformer中Softmax, GELU和层归一化3种函数的计算。为了在保持精度的前提下进一步降低资源消耗,除了使用32位单精度浮点数计算方差的倒数平方根,非线性与归一化加速单元使用16位半精度浮点数计算。
图 7 非线性与归一化加速单元
3.3 加速器架构
本文提出的CNN和Transformer通用FPGA加速器架构如图8所示。为了简洁明了,省略了底层逻辑和存储资源的互连。本文通过主机解析网络结构描述文件,对神经网络模型进行划分,确定调度顺序,并生成映射指令。预编译的映射指令、预处理的划分块在运行前通过基于高速串行计算机扩展总线标准(Peripheral Component Interface experss, PCIe)的直接内存访问(Direct Memory Access, DMA)存储在片外动态随机存取存储器(Dynamic Random Access Memory, DRAM)。全局控制器接收预编译的映射指令来驱动加速器,将指令发送到片上存储和计算阵列等模块控制数据处理,或将数据请求发送到DRAM读写数据。
图 8 加速器架构
在FPGA设计中,使用一个大规模的设计等效替代多个小规模的设计可以降低设计复杂度和控制难度。因此,在本文的加速器设计中,尽可能选择使用大规模计算阵列,将(Ni,No) 配置为(32, 64)。基于DSP时钟倍频和INT8乘法并行计算方法[16,17],1个DSP可以在每个系统时钟周期内完成4次乘法操作。因此当(Ni,No) 配置为(32, 64)时,计算阵列的乘加器只需消耗512个DSP,每个DSP负责4个输出通道方向上的计算。在计算阵列中嵌入了分布式存储(Look-Up-Table Random Access Memory, LUTRAM)来尽可能地复用权重,减少片外访存量。
预处理的划分块在运行时从DRAM中提取到输入缓存或参数缓存。计算阵列从这些缓存读取数据和参数进行计算。结果缓存负责存储中间或最终结果。当该层包括非线性或归一化或池化操作时,计算结果从结果缓存读入非线性与归一化加速单元或池化单元进行处理,完成后写入DRAM或写回输入缓存或参数缓存进行下一步计算。本文通过映射指令配置了加速器的数据路径和计算并行性。
4. 实验与分析
4.1 实验环境
本文所设计的加速器目标器件为Xilinx Virtex Ultrascale+ XCVU37P FPGA,主机是一台配置多核Intel Xeon Gold 5218 CPU的服务器,CPU主频为2.3 GHz。我们使用Vivado v2021.1综合实现加速器,系统运行频率为200 MHz,计算阵列的运行频率为400 MHz。
4.2 精度评估
很多量化研究工作[18,19]已证明量化后的CNN模型在提高性能的同时几乎不会带来明显的精度损失,但视觉Transformer中存在大量与CNN不同的非线性与归一化操作,直接对其低比特量化可能会带来严重的精度下降。为了证明本文设计的有效性,使用ImageNet2012验证集对加入本文设计的典型视觉Transformer模型进行精度消融实验。非线性与归一化函数替换模式分别设置为:仅替换Softmax(OS)、仅替换GELU(OG)、仅替换层归一化(OL)和全部替换(ALL)。测试模型选用DeiT-S, DeiT-B, ViT-B/16, ViT-L/16, Swin-T和Swin-S,替换后的模型与各基线模型的Top-1和Top-5准确率比较结果如表2所示。
表 2 模型精度消融实验(%)
与基线模型相比,DeiT-S/16和DeiT-B/16在各种替换模式下的精度几乎没有损失,甚至在很多种模式下精度略有提升。ViT-B/16, ViT-L/16, Swin-T和Swin-S的Top-1与Top-5准确率基本不受影响,在各种模式下精度损失均小于0.1%。
4.3 非线性与归一化加速单元性能评估
为了进一步评估非线性与归一化加速单元的计算性能,本文将所提出的加速单元部署在资源规模较小的Xilinx Kintex Ultrascale+ XCKU15P FPGA与现有的其他FPGA加速设计进行对比,结果如表3所示。
表 3 与相关FPGA加速器的比较结果
在加速支持灵活性方面,文献[20-22]仅支持Softmax函数,文献[23]可加速Softmax和GELU函数,而本文提出的非线性与归一化加速单元可以同时支持Softmax, GELU和层归一化函数。在吞吐量方面,与基于传统方法的大规模实现[20]相比,本文的非线性与归一化加速单元吞吐量提高了14.23倍。与面向嵌入式的小规模实现[21-23]相比,吞吐量分别提高了9.81倍、28.44倍和83.24倍。
由于各文献使用的FPGA器件、计算资源和运行频率不同,仅采用吞吐量作为对比指标可能不足以证明本文设计的优越性。因此本文将所有操作实现为LUT,使用各加速器在100 MHz下的面积效率(Throughput Per LUT, TPL)来全面地对比性能,TPL是指运行时平均每个LUT的吞吐量。
与基于传统方法的大规模实现[20]相比,本文的非线性与归一化加速单元TPL提高了3.64倍。与面向嵌入式的小规模实现[21-23]相比,本文的大规模实现在TPL方面上基本达到了同等水平,这证明了本文的加速设计具有良好的面积效率,可以高效地部署在FPGA上,以满足大型视觉Transformer的处理需求。
4.4 加速器性能评估
本文在所提出的加速器上实现了ResNet-50和ViT-B/16,并与两种神经网络的GPU实现以及现有的神经网络FPGA加速器进行对比。GPU计算平台采用Nvidia V100,基于Tensorflow框架实现了ResNet-50,基于Pytorch框架实现了ViT-B/16。计算阵列上的卷积和注意力机制中的矩阵乘法等线性操作的数据类型使用INT8。本文使用GOP表示模型总操作数,GOPS表示加速器平均每秒完成的操作数,计算阵列(Ni,No)配置为(32, 64),单个时钟周期完成2 048个乘法操作,实验结果如表4所示。
表 4 与GPU实现和其他文献FPGA加速器的比较结果
部署在本文所提出的加速器上的CNN模型ResNet-50帧率fps达到了76.22;视觉Transformer模型ViT-B/16的帧率fps则为32.16。由于各文献使用的FPGA器件、资源规模、运行频率和部署的神经网络模型不同,仅仅使用fps作为对比指标无法评估各加速器的真实性能。
为了进一步评估加速性能,本文使用能效比和计算效率两种指标来对比分析各种实现。能效比即为吞吐量除以功耗,计算效率则由加速器运行时的平均吞吐量除以加速器的理论峰值吞吐量得到。由于映射到FPGA加速器上的ResNet-50和ViT-B/16的计算量集中在计算阵列上,并且本文加速设计与对比文献的加速设计的计算阵列均使用DSP实现,因此可以根据计算阵列的DSP效率来衡量FPGA加速器的计算效率。对于未使用DSP的GPU实现,计算效率使用GOPS除以GPU峰值吞吐量得到。DSP效率由式(9)得到,其中 𝑁dsp表示DSP数量,每个DSP同时处理两个INT8并行操作,∂取2,freq表示运行频率。能效比和计算效率的对比结果分别如图9所示和图10所示。
图 9 能效比对比
图 10 计算效率对比
(7)
对于CNN模型ResNet-50,本文所提出的加速器的吞吐量达到了589.94GOPS,能效比为48.16 GOPS/W,计算效率为60.64%。与GPU实现相比,能效比提高了5.19倍;与文献[13]相比,能效比稍有提高,计算效率提升了8.02%;与文献[24]相比,能效比提高了3.06倍,计算效率提升了177.53%。
对于视觉Transformer模型ViT-B/16,加速器的吞吐量达到了564.76 GOPS,能效比为46.1 GOPS/W,计算效率为58.06%。与GPU实现相比,本文所提出的加速器能效比提高了7.17倍;与文献[9]的Swin-T FPGA加速器相比,能效比提高了5.81倍,计算效率提升了36.16%;与文献[10]相比,虽然计算效率提升了58.72%,但能效比稍有下降,其原因在于文献[10]是面向边缘计算场景,FPGA器件资源规模很小,更容易控制加速器的功耗。上述实验结果可以证明本文实现的加速器具有良好的能效比和计算效率。
5. 结束语
本文提出一种面向卷积神经网络和视觉Transformer的通用FPGA加速器架构。本文通过分析卷积和注意力机制的计算特征实现了面向FPGA的统一映射,对计算阵列规模进行设计空间探索最大化计算效率。通过分解视觉Transformer的各类非线性与归一化操作,所设计的非线性与归一化加速单元可最大限度地复用FPGA资源。实验结果表明,本文设计在提高吞吐量的同时仅造成很小的精度损失,所提出的加速器架构在实现ResNet-50和ViT-B/16推理中,帧率FPS分别为76.22和32.16,吞吐量达到了589.94 GOPS和564.76 GOPS,能效比远高于GPU实现和其他基于FPGA的大规模加速器设计,且计算效率优于对比加速器。后续工作将研究如何优化硬件资源占用,同时寻求支持更多种神经网络模型。本文研究可以拓展为计算机视觉领域专用计算架构,以完成计算机视觉任务高性能和高能效处理,具有较高的应用推广价值。
声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观点或证实其内容的真实性。版权归原作者所有,如转载稿涉及版权等问题,请立即联系我们删除。