布景介绍
数据、算法和算力是人工智能技能的三大要素。其间,算力表现着人工智能(AI)技能具体完结的才能,完结载体首要有CPU、GPU、FPGA和ASIC四类器材。CPU依据冯诺依曼架构,尽管灵敏,却推迟很大,在推理和练习进程中首要完结其拿手的操控和调度类使命。GPU以献身灵敏性为价值来进步核算吞吐量,但其本钱高、功耗大,特别关于推理环节,并行度的优势并不能彻底发挥。专用ASIC芯片开发周期长,资金投入大,因为其结构固化无法习惯现在快速演进的AI算法。FPGA因其高功用、低功耗、低推迟、灵敏可重配的特性,被广泛地用作AI加快,开发者无需替换芯片,即可完结优化最新的AI算法,为产品赢得名贵的时刻。
由此,百度依据FPGA打造了EdgeBoard嵌入式AI解决方案,能够供给强壮的算力,支撑定制化模型,适配各种不同的场景,并大幅进步设备端的AI推理才能,具有高功用、高通用、易集成等特色。本文将首要介绍EdgeBoard中神经网络算子在FPGA中的完结。
FPGA加快的要害要素
FPGA完结AI加快有两大要害要素,一是FPGA内部资源,二是内存拜访带宽。FPGA内部资源首要包含LUT,FF,RAM以及DSP等,FPGA本质上是可编程逻辑电路,可用逻辑电路的多少取决于芯片内部资源,这也就决议了芯片的峰值算力和可包容的算子品种数。
在深度学习中,90%以上的核算都会集在conv、dw-conv和pooling等少量的几个算子上。所以,并不是FPGA中添加的加快算子数量越多越好,而是要重视算子的加快质量:一是用更少的资源完结更多的功用;二是进步耗时占比大的算子功用。
在实践中,添加新算子前需求平衡该算子在网络中所耗时刻的占比以及其在FPGA中所耗费的资源。当然能够经过选取更大规划的片子来打破这种约束,可是端上设备受限于本钱、功耗等要素,只能平衡多种要素挑选一个适宜规划的芯片,然后经过多种规划办法和技巧来进步加快功用。本文接下来就将介绍在EdgeBoard中怎么优化规划DSP资源进步算力,以及怎么经过算子复用和交融技能完结对多算子的支撑。
进步内存拜访带宽是进步AI加快功用的另一要害要素,因为FPGA与内存的数据交互在整个核算进程中占比很高,有时乃至超过了核算自身所耗费的时刻。直接进步内存拜访带宽的办法包含进步DDR位宽、添加传输所用的高速接口资源、进步DMA传输的时钟频率等。别的也能够经过复用FPGA芯片上的内存资源(RAM)以及核算和传输交叠履行(overlap)等办法,削减与外部DDR存储的交互,下降数据传输的开支。这些规划办法较为常见,本文不做具体介绍。
两大要害技能完结四倍算力进步
FPGA中的核算首要依托DSP完结,高效运用DSP是确保FPGA算力的要害。EdgeBoard FPGA中的DSP选用DSP48E2架构,如图1所示,包含一个27-bit的预加法器(pre-adder),一个27×18的乘法器(mult)和一个48-bit的ALU。
图1. DSP48E2结构图
在EdgeBoard的FPGA规划中,充分运用DSP48E2自身的特色,选用supertile和INT8移位核算技能,完结了四倍算力进步。
一.Supertile
一般来讲,Xilinx Ultrascale系列FPGA运转的最高频率在300MHz到400MHz之间,但DSP是FPGA中的硬核,能够运转在更高的频率上。如图2所示,SLB-M与DSP这样构成的根本单元,被称之为Supertile,FPGA内部Supertile的布局如图3所示。Supertile技能的中心在于使DSP运转于两倍逻辑频率上,使整个体系算力到达倍增的作用。这首要得益于芯片结构中SLICEM与DSP方位接近,运用专有的布线资源,推迟缩短,能够支撑SLICEM以双倍逻辑运转的频率向DSP供给数据。别的,神经网络中存在着数据复用,经过filter和image数据的复用和交织,一次取数屡次运用,然后削减量据的转移次数,进步核算功率。
图2. Supertile结构
图3. DSP和SLICEM在FPGA中的方位
二.INT8移位核算技能
运用DSP48E2的结构特色,一个DSP完结两路INT8的乘加。在进行8bit数据核算时,将a左移18位,置于输入的高8位,低19位补0,从DSP的A端输入,b维持在低8位,从DSP的D端输入,如图4所示。a与b两者先进行累加,然后与c相乘后,成果将别离坐落输出的高(a*c)、低(b*c)两部分,该核算进程如图5所示。
图4. DSP移位示意图
图5.单DSP完结两路INT8相乘
在实践中,咱们把a,b两路作为filter数据输入,c作为image数据输入。这样DSP在一个时钟周期内就一起完结了两路的核算,再次使算力翻倍。结合前面说到的supertile倍频规划,两种规划使得单个DSP的算力进步四倍。因为一次核算进程有乘、加两个操作(operations),所以单个DSP在一个时钟周期高效的完结了8个operations。
多算子复用
深度学习中首要有两类运算,一类是指数运算,另一类是乘加运算。前者首要坐落激活函数层,后者是深度学习触及最多也是最根底的运算。乘加运算依据kernel的维度不同,又可分为向量型和矩阵型,在EdgeBoard中划分为三个运算单元,别离为向量运算单元(VPU: vector processing unit)、矩阵运算单元(MPU: matrix processing unit)和指数激活运算单元(EXP-ACT: exponential activation unit)。
一.向量运算单元
向量运算单元VPU担任完结dw-conv(depth-wise convolution),完结3维输入图画(H x W x C)和3维卷积核(K1 x K2 x C)的乘加操作。其间一个卷积核担任输入图画的一个通道,卷积核的数量与上一层的通道数相同,该进程如图6所示。图7表明的是一个通道内以kernel 2×2和stride 2为例的核算进程。
图6. dw-conv示意图
图7. dw-conv的核算
EdgeBoard经过复用VPU一套核算资源完结了average/max pooling,elementwise add/sub,scale,batch-normalize,elementwise-mul和dropout等多种算子。
1.Average pooling能够看作是卷积核参数固定的dw-conv,行将求和后取均匀(除以卷积核面积)的操作转化成先乘以一个系数(1/卷积核面积)再求和。如图8所示,该比如中卷积核巨细为2×2,卷积核参数即为1/4。卷积核固定的参数能够相似于dw-conv下发卷积核的方法由SDK封装后下发,也能够经过SDK装备一个参数完结,然后在FPGA中核算转化,这样节约卷积核参数传输的时刻。别的,max-pooling算子与average pooling的核算进程相似,只需求将求均值操作换成求最大值的操作,其他挖窗、存取数等进程坚持不变。
图8. Pooling复用dw-conv
2.Elementwise add/sub完结两幅图画对应元素的相加或相减,不同于dw-conv的是它有两幅输入图画。假如咱们操控两幅图画的输入次序,将两幅图画按行交织拼成一幅图画,然后取卷积核为2×1,行stride为1,列stride为2,pad均设置成0,则依照dw-conv的核算方法就完结了elementwise的核算。经过在FPGA中设置当时像素对应的kernel值为1或-1,就能够别离完结对应elementwise add和elementwise sub两个算子。该进程如图9所示。
图9. ew-add/sub复用dw-conv
3.Scale算子首要在图画预处理时运用,将输入图画每一个通道的悉数像素点乘以该通道对应的scale值,然后加上bias。假如咱们将dw-conv的卷积核巨细设成1×1,队伍stride都设置成1,pad设置成0,卷积核参数值设成scale,就能够经过dw-conv完结scale算子的功用。经过剖析发现,batch-normalize,elementwise-mul和dropout等算子都能够经过scale算子来完结。
二.矩阵运算单元
矩阵运算单元MPU担任完结convolution,完结3维输入图画(H x W x C)和4维卷积核(N x K1 x K2 x C)的乘加操作,单个卷积核的通道数和输入图画的通道数相同,而卷积核的数量N决议了输出的通道数,如图10所示。full connection算子完结的1维输入数组(长度C)和2维权重(N x C)的乘加操作。将 full connection输入数组扩展成 H x W x C,输出扩展成 N x K1 x K2 x C,其间H, W, K1和K2均设置成1,这样 full connection就能够调用convolution来完结。别的,在核算 deconv时,经过SDK对卷积核进行分拆、重排,就能够经过调用conv来完结deconv,相同带来了极大的收益。
图10. Conv算子示意图
三.指数激活运算单元
指数激活运算单元EXP-ACT完结的根底是sigmoid,因为在FPGA中进行指数型运算比较耗资源,怎么复用该核算单元就变得十分有意义。经过剖析发现,能够把 tanh和两通道softmax转化成 sigmoid的方式,这样一个指数运算单元就支撑了3种算子,完结资源运用的最大化。
多算子交融
在推理时做BatchNorm运算十分耗时,经过SDK将BatchNorm+Scale的线性变换参数交融到卷积层,替换本来的weights和bias,这样4个算子能够交融成单个算子conv + batchnorm + scale + relu,关于dw-conv相同如此。相关于每核算完一个算子就将数据送回内存,这种算子交融大大削减了内存的读写操作,有用进步了处理帧率。
此外,咱们将scale、bias和relu为代表的激活函数层放到各算子之后的链路上,然后一致送到DMA传输模块,如图11所示。这不只使得各算子复用了这些逻辑,节约了很多片内资源,也使得各算子都能够具有这些功用,且都能以最大带宽进行DMA传输。在实践中,咱们将这些功用做成可选项,由软件依据当时网络算子的需求进行挑选,在节约资源的一起,既确保了通用性,又统筹了灵敏性。
图11. EdgeBoard内部结构和链路图