引言随着智能化时代的到来人工智能的应用已经深入到社会的各行各业. 作为人工智能的主要研究分支神经网络的研究和发展成为主导当前智能化程度的主要力量.近年来随着人工智能的快速发展FPGA 由于其独有的硬件特点成为深度神经网络产业应用的宠儿.本文主要从FPGA实现深度神经网络方面考虑深度神经网络模型的压缩方法、如何把复杂模型落地到小型设备上等方面展开论述让人工智能真正的在各个领域落地。1. 基于FPGA的深度神经网络的加速与优化深度神经网络往往是在大内存、较强计算力的GPU 上进行训练学习的. 但在相关模型进行产品化落地应用时必须考虑设备资源的尺寸、内存、能耗、带宽和成本等因素. 神经网络模型压缩和加速的提出让复杂的深度神经网络在小型设备FPGA上的实现成为了可能. 这些实现使得神经网络得以搭载在FPGA 芯片上进一步应用到自动驾驶、航天航空以及手机等设备中.本文将从FPGA 神经网络加速器、神经网络压缩与加速技术、计算加速与优化、基于带宽的神经网络加速以及基于FPGA 的神经网络编译器及框架等五个方面进行总结与归纳.1.1 FPGA神经网络加速器随着深度学习的不断发展神经网络在图像、视频、语音处理等各个领域取得了巨大的成功。VGGNet、GoogleNet、ResNet 的出现让我们清楚的看到神经网络正往更深、更复杂的网络设计方向发展. 那么如何将更复杂的神经网络部署到FPGA上并能够满足一定的速度要求成为研究者们关注的焦点. 在现有的研究中涌现出大量的FPGA深度学习加速器 例如 DLAU[172] 、Deep-Burning[173] 、DeepX[174]、BISMO[175]、Bit Fusion[176]与为SGEMV设计的FPGA 加速器[177]等等.DLAU[172]是一种可扩展的加速器架构主要使用三级流水线处理单元与分片技术去提高吞吐量并对深度学习应用程序的局部性特征进行探索. 其中三级流水线处理单元主要包含分片矩阵乘法单元部分和累加单元和活化函数加速单元可以重复使用以实现超大规模的神经网络. 分片技术是来分割大规模的输入数据将输入节点数据转换成更小的集合并重复计算这样使得DLAU 加速器可以将处理不同尺寸的分片数据进行灵活配置. 经实验验证与Intel Core2 处理器相比DLAU 加速器可以实现36.1 倍的加速效果.DeepBurning[173]是一种自动化神经网络加速器的实现方法. 用户只需提供网络拓扑上层描述和硬件资源约束框架中的神经网络集成器就可以自动分析网络特征结合硬件约束在由内积单元、累加单元、池化单元等组成的组件库中选出合适组件组成硬件网络以及对应的控制流、数据流和数据布局方案. 该方法的出现方便了设计者使用FPGA加速神经网络计算同时提高了FPGA 的领域适应性. 实验表明与最先进的基于FPGA 的解决方案相比DeepBurning 设计的加速器具有更高的功耗效率.DeepX[174]是一个用于深度学习执行的软件加速器可以降低深度学习应用时所需的内存计算量与功耗. 它通过利用移动片上系统的异构处理器如GPULPU的混合降低资源开销. 在执行深度模型的不同推理阶段时每个计算单元提供不同的资源效率. DeepX 在深度学习推理阶段时通过扩展模型压缩原理可以扩展单个模型层的复杂度并以此控制推理过程中层的内存计算和能量消耗.同时它还可以分解深层模型结构将各块分配给本地和远程处理器有效并最大限度地提高资源利用率. 实验表明DeepX 可以让大规模的深度学习模型在移动处理器上高效地执行其性能显著优于现有的解决方案.BISMO[175]是一个可扩展的位串行矩阵乘法覆盖可以有效地在FPGA 上实例化. 它的核心是一个软件可编程加权二进制矩阵乘法引擎和用于获取数据并存储结果的相关硬件. 软件的可编程性使得它可以在任何矩阵大小和任何定点或整数精度上进行操作. 文献[177]中主要提出了二值神经网络BNN硬件加速器的设计方案它支持处理任意BNN 所需的所有操作. 网络参数例如二进制权值、标准化常数被保存在这些片上RAM 中并提供给并行执行计算的许多PEs. 片上RAM为PEs提供了足够的带宽提高了吞吐量. 与CPU 和GPU上经过良好优化的软件相比所提出的二值神经网络加速器在性能和能效方面都有一定数量级的提高.Bit Fusion[176]是一个支持不同位计算的加速器动态融合不同位以匹配各个单独DNN 层的位宽这使得我们可以将动态bit-level 融合/分解引入到DNN 加速器的设计中. 与目前两种先进的DNN加速器Eyeriss和Stripes相比Bit Fusion实现了2~3倍的加速以及降低了3.9~5.1 倍的能耗.1.2 神经网络压缩与加速技术深度神经网络在多个领域上表现出优于传统算法的效果. 但在应用过程中其计算量巨大占据内存较大. 因此若想真正将神经网络应用到嵌入式系统中去就必须对神经网络自身进行处理以实现神经网络的压缩与加速. FPGA 加速设计中涉及的几种常见的神经网络压缩与加速方法包含网络剪枝在内的深度压缩、低秩估计、模型量化以及知识蒸馏方法[178, 179].1.2.1 神经网络深度压缩2015 年Song Han 等人在文献[180]中提出了在不损失精度的前提下深度压缩对于AlexNet 可以减少35 倍的内存占用对于VGG-16 的内存占用可以减少49 倍其中网络剪枝就可以实现的模型压缩率就能达到10 倍以上. 2017 年深鉴科技的语音识别技术成为了在FPGA 上实现深度压缩应用的成功典型. 当然依然存在不少在FPGA 上实现的剪枝技术的研究. 2017 年在文献[181]中Fujii 等人提出了一种神经元修剪技术将VGG-11 网络层中神经元数量减少了89.3%但是保持了99%的准确性. 在权重参数大大减少的情况下由FPGA 上的片上存储器实现的权重存储器就可以对于存储器进行高速访问. 文献[182]提出了一种结构化的修剪方法不仅可以减小LSTM 模型的大小而且不会损失预测精度同时可以消除不平衡计算和不规则的内存访问. 神经网络的深度压缩的过程中包含模型剪枝、权值量化与共享和霍夫曼编码它们一起工作大大减少了神经网络的存储需求在精度几乎无损的情况下将模型压缩几十倍以上具体的深度压缩方法的主要流程如下图所示.神经网络深度压缩方法的主要流程网络剪枝的提出可以溯源到1989年由图灵奖获得者Yann LeCun 在文献[183]中提出来的. 其核心思想主要是通过估计每个参数的重要程度删除不重要的参数以达到模型压缩的目的效果示意如下图所示.连接与神经元剪枝前后1993 年发表在NIPS 上的一篇文献[184]中利用了二阶泰勒展开对网络参数进行选取并进行剪枝操作提出了将剪枝看作正则项来改善网络的训练和泛化能力. 根据裁剪方式不同现有的剪枝方法分为阈值裁剪方法、动态补救方法、Filters裁剪方法和重要性裁剪方法. 在剪枝过程中可以通过计算损失函数对参数的二阶导数的大小或计算参数的绝对值的大小来衡量网络参数重要程度数值越小参数越不重要可以进行删除.设计者在进行网络裁枝时需要考虑两个问题1. 对输出的一个节点进行裁剪是否影响到其他输出节点2. 如何对于删掉的参数进行彻底清除. 针对于以上两个问题目前提出了Filter-level、Group-level 与稀疏卷积方法[185]. 不管使用哪一种剪枝方法剪枝后的网络需要进行再次参数调优. 2017 年深鉴科技在文献[186]中提出了负载平衡感知剪枝考虑到最终多核并行加速的时候不同核心之间的负载均衡问题. 当然在剪枝的过程中剪枝的粒度大小也会影响网络的精度. 剪枝按照粒度大小可分为细粒度剪枝和粗粒度剪枝其中细粒度剪枝主要是对于权重进行裁剪主要是进行局部的调整可以保留模型的精度粗粒度的剪枝则是剪去滤波器或通道模型在速度上有较大的提升. 2017年斯坦福大学的HuiziMao等人发表在CVPR上的文献[187]就探索了不同修剪粒度对于模型精度的影响并证明粗粒修剪也能够达到与细粒修剪接近的甚至更好的精度.神经网络深度压缩过程的第二阶段是模型量化与参数共享在这里只介绍参数共享模型量化将在下一小节进行系统介绍. 文献[180, 188]将参数共享归为量化操作中的一小步. 不同的研究采用的共享规则也是存在差异的. 文献[189]使用了一个低成本的哈希函数将连接权重随机地分配到哈希桶中然后所有在同一个哈希桶中的连接共享一个参数值而文献[190]是对所有权重使用k-means 聚类操作聚类完成之后属于同一类的权重将共享一个参数值. 它们都是通过共享参数的方法来压缩神经网络模型. 其中典型的聚类量化方法将训练的每一层的权值参数进行k-means 聚类聚类完成之后属于同一类的参数都使用该类聚类中心的数值作为它们的权值参数数值然后通过索引矩阵将共享权值一一对应到权值参数的确定位置. 通过权值共享原来的权值矩阵变成了一个查找表与共享权值矩阵也就是说原来权值矩阵被一个与权值矩阵相同大小的查找表矩阵代替查找表矩阵上面的索引可以准确找到对应的共享权值共享权值则只需要存储在一个大小为共享权值总个数的矩阵中即可如下图所述.神经网络深度压缩方法中的权值共享神经网络深度压缩过程的第三阶段是哈夫曼编码. 哈夫曼编码是1952 年David A.Huffman 在文献[191]中提出来的. 它是一种可变字长编码的编码方式. 哈夫曼编码可以用短的码值来表示更多的数字提高编码效率以达到深度压缩的效果. 因此在深度压缩过程中最后保存网络的时候常常使用哈夫曼编码进行进一步的压缩.1.2.2 低秩估计低秩估计是利用矩阵分解或者张量分解以及矩阵乘法或者卷积运算这种线性运算的结合律将原本的参数张量分解成若干个小张量或将原本的卷积用几个小卷积代替. 高维矩阵的运算会采用Tensor 分解方法对神经网络进行加速和压缩. 目前的Tensor 分解方法主要包含了CP 分解、Tucker 分解、Tensor Train 分解[192]和Block Term 分解方法等等. 典型的神经网络卷积核是一个四维张量全连接层可以看作是一个二维矩阵这些张量中往往存在大量的冗余. 我们可以利用低秩估计的方法对于参数矩阵进行分解减少参数量达到模型压缩和加速效果. 低秩估计是对神经网络的每一层利用低秩滤波器进行逐层逼近每一层的参数就会被固定后而对于每一层之前的层会根据重建误差准则进行微调[193–195]. 压缩2D 卷积层的典型低秩方法如下图所示.2D卷积层的典型低秩方法在文献[196]中Jaderberg 等人提出的低秩近似方法主要是使用 n*11*n的线性组合卷积核替代n*n的卷积核. 该方法在文字识别实验中在精度无损失的情况下速度达到了原来2.5 倍。同时论文中也列出了使用低秩估计的方法来做模型压缩与加速的优劣势具体如下优势低秩估计没有改变基础运算的结构也不需要进行额外定义新的操作. 低秩估计的分解方法有很多种任何的矩阵或者张量分解方法都可以用于低秩分解. 在神经网络中应用低秩估计的方法进行网络的分解分解后的网络参数量将大大减少.劣势为保证分解后网络模型的准确率一般都需要对于分解后的网络进行参数调优. 同时在低秩估计时对于秩的保留数量没有明确的规定. 保留的秩太多可以保证一定的准确率但加速压缩效果不好. 保留的秩太少加速压缩的效果较好但准确率无法保证.关于FPGA 利用低秩估计进行网络的加速设计较多如文献[197, 198]利用低秩矩阵或者低秩扩展的方法进行神经网络加速也是一大研究热点. 文献[199]中作者基于信噪子空间理论针对正交频分复用提出了一种低秩信道估计方法并在FPGA 中进行实现. 2014 年Jaderberg 等人在文献[196]中提出了通过交叉通道和滤波器冗余的方法来构建秩为1的低秩滤波器实现加速效果. 同年Denton 等人在NIPS 上发文[200]提出了构建秩为k 的滤波器对于卷积使用一个中间层进行降秩操作这种方法在损失1%的精度前提下对于每个卷积层可以提速1 倍. 2017 年文献[198]中提出了一种新型的FPGA加速器可以加速基于矩阵梯度分解的低秩矩阵实现算法. 文献[197]中在低秩矩阵的理论基础上提出了一种新颖的自动计算框架可用于基于FPGA 的非稀疏相关矩阵的大数据在线分析.1.2.3 模型量化模型量化可以通过量化函数将全精度的数激化量参数甚至是梯度值映射到有限的整数空间. 模型量化可以减少每个参数的存储空间降低计算复杂度因此可以实现神经网络加速. 与前面介绍的方法不同网络裁枝方法与低秩估计方法都是从矩阵乘法角度出发着眼于减少参数量和计算量. 而模型量化则着眼于参数本身直接减少每个参数的存储空间 提升计算速度. BWN[201],TWN[202]、TNN[203] 将模型的参数量化到{-1, 1}或者{-1, 0, 1}这样就能将网络计算里的乘加运算转化为加减运算从而实现模型压缩和计算加速的目的.除了参数外BNN[204]、XNOR-Net[205]将模型的激活值也量化到{-1, 1}这样就能将乘加运算转化为比特级别的位运算. XNOR-Net[205]在CPU 上实现了58倍的加速比同时内存节省了32 倍. 由于位运算在FPGA 上可以实现更高的加速比文献[206]实现的二值神经网络在峰值时比CPU 加速约705 倍比GPU快70 倍. 极低比特的量化带来的精度损失也是非常明显的为此出现了多比特的模型量化方法.文献MBN[207]、Dorefa-Net[208]、ABC-Net[209]将多比特的数值运算分解为多个位运算可以在保证模型精度的同时实现模型压缩和计算加速. 目前现有的量化方式主要有均匀量化[205, 207, 208, 210]、对数量化[211–213]和自适应量化[209, 214–216]. 以上文献都是将模型所有层的参数或者激活值量化到相同的精度而混合精度量化可以根据模型不同层次的重要性和灵敏度来匹配更好的解从而获得更好的性能.HAQ[217]将硬件模拟器评估的加速度信息反馈加入训练过程并利用强化学习自动确定量化策略. 文献[218,219]将量化任务转换为神经网络结构搜索问题使用Gumbel-softmax 采样选择量化支路采用反向传播方法优化网络权值和结构参数. 通过量化对神经网络模型进行不同位数的编码应用少量的乘法与位运算加速了网络模型的运算速度.或者将神经网络中卷积运算中的矩阵乘法变为计算简单的加减法运算简化了计算量进而实现神经网络加速.基于FPGA 的深度神经网络实现也将量化作为一种常用技术手段. 2011 年文献[220]中完成了一种基于H.264 压缩的整数离散余弦变换和模型量化的FPGA 实现. 深鉴科技在FPGA 上部署的尺寸压缩20 倍的LSTM 模型实现了语音识别引擎压缩的20 倍中其中10 倍来自剪枝, 2 倍来自量化[186]. 文献[144]将权值量化到6 位然后将所有权值存储在FPGA 的片上存储器中大大提高了神经网络的计算速度最终的系统运行速度远高于实时性. 2018年文献[206]提出了一种用于FPGA 的二值化神经网络FP-BNN通过数据量化和优化片上存储消除了参数访问的瓶颈.1.2.4 知识蒸馏基于FPGA 的深度神经网络模型的设计一般都趋向于计算复杂度低的小模型对模型性能有了更高的要求既要求计算速度快、资源少又要具有复杂模型的精度性能. 因此对小模型的训练成为一个焦点问题. 知识蒸馏[221]是Hinton 等人在2015 年提出的一种模型训练方式它是将训练好的复杂网络模型具备的推广能力“知识”迁移到一个结构简单的网络中.以上提到的网络裁枝、低秩估计以及模型量化都是对特定网络模型进行压缩和加速. 然而知识蒸馏方法直接设计了一个简单结构的小网络将难点转移成对小网络的训练上. 整个思想中最大的难题在于如何有效地表达“知识”并有效地指导小网络的训练.知识蒸馏的结构主要由三大部分构成指导网络、指导损失函数以及学习网络如下图所示知识蒸馏的主要训练过程指导网络加载了预训练模型对于参数初始化并且在训练过程中参数固定学习网络的网络结构比较简单主要用来训练学习参数对于中间的指导损失函数部分知识蒸馏一般选取均方误差损失函数作为用于指导网络与学习网络的损失函数. 在以模型压缩为目的的知识蒸馏任务中指导网络与学习网络由相同个数、相似结构的网络块组成. 每个网络块中有若干个单元但学习网络中的每个网络块中含有的单元个数比指导网络的单元个数少.指导网络又常常被称为“教师网络”学习网络被常常称为“学生网络”. 知识蒸馏的核心思想中使用了软目标辅助硬目标一起训练. 其中软目标指的是教师网络模型输出的预测结果硬目标指的是样本原始标签即真实标签. 2015年Hinton 在他的论文[221]中推荐软目标与硬目标经验权重为9:1.在现有的神经网络加速的研究中有一部分工作是使用蒸馏进行模型优化训练的. 相关研究[222–225]中设计了或者改进了学生模型在几乎不损失精度的前提下使用更少的参数、更浅的网络结构提高了网络计算速度. 同时模型蒸馏往往会与模型量化同时进行神经网络的压缩与加速. 文献[226, 227]中利用知识蒸馏技术弥补因量化导致的性能下降提高低精度网络的性能. 文献[228]则是使用了在线蒸馏的方法突破了分布式SGD 存在的瓶颈提高了集群上的模型计算效率与精度.1.3 计算加速与优化1.3.1 矩阵乘法优化矩阵运算在深度神经网络的训练与前向计算中占据主导地位因此加速矩阵运算具有重大意义.矩阵乘法的优化可以通过减少乘法计算次数和提高计算速度来实现. 矩阵分块技术与Winograd 转换方法常常作为神经网络中的优化算法. 下面我们将针对这两种方法进行叙述.1矩阵分块技术在深度神经网络中存在大量的矩阵运算常常会因为矩阵太大而出现高速缓存缺失的情况. 循环分块可以将矩阵循环拆分成更小的模块进行计算这样可以使片上存储数据重复利用减少访问内存的次数提高计算的效率. 矩阵分块时前后的乘法计算总数恒定不变将n*n矩阵按m*m进行分块整个矩阵被分成n2 / m2 个子矩阵乘法计算总数仍然是(n2 / m2 )*n*m2即 n3. 每次都在相邻位置上进行读写提高了访问性能. 卷积神经网络算法大部分是利用循环来实现的循环过程中往往采用循环分块和循环展开进行优化. 循环分块大小会影响计算的并行度在一定程度上决定了单位时间内进行的计算操作. 所以在卷积神经网络运算时我们常常需要考虑输出特征图行和列分块大小并进行自身约束如行分块大小必须小于总行数等以及考虑片上资源的限制给出相应的约束条件.2矩阵Winograd 转换Winograd 转换方法的核心思想就是使用更多的加法来代替乘法[229]. 因此我们可以在滤波器维度较小的情况下使用Winograd 方法做卷积运算. 2016年文献[230]是CVPR 首个将Winograd 算法引入的研究工作文中利用Winograd 算法与傅里叶变换算法分别对卷积神经网络进行剪枝操作 得出Winograd 算法的剪枝性能优于傅里叶变换算法的结论. 现有的部分研究工作中引入了Winograd 滤波通过使用循环展开和平铺策略优化数据路径以支持Winograd 卷积在一定程度上使得所设计的卷积神经网络模型加速器性能提升功耗降低[231, 232]. 部分研究工作中也明确介绍了Winograd 算法在FPGA上的具体实现[233, 234]. 2017 年商汤科技在文献[235]中提出了Winograd 算法的FPGA 实现 采用Winograd 算法使得卷积计算循环层数减少. 2018年文献[236]中在FPGA 上实现的稀疏Winograd 卷积加速器与最新技术相比其在VGG-16 和YOLO网络上的实验结果在速度提高了2.9 倍至3.1 倍.1.3.2 卷积优化神经网络结构往往是由卷积层池化层以及全连接层构成的. 其中的卷积层和全连接层在硬件结构上往往是针对于矩阵运算进行设计的. 将卷积层和全连接层可以转化为矩阵然后利用FPGA 进行计算并加速. 如图所示就是将二维卷积转化为矩阵的示意图.二维卷积转化为矩阵操作卷积就是卷积核与图像矩阵的运算.卷积操作的实现方法主要有滑窗法、傅里叶变换法和im2col.滑窗法卷积核是一个小窗口在输入图像上按步长滑动每次操作卷积核对应区域的输入图像将卷积核中的权值和对应的输入图像的值相乘再相加得到的最终值赋给特征图对应于卷积核中心位置变量. 以4*4 的矩阵、3*3 的卷积核为例从第一个像素开始滑动逐个计算如下图所示.滑窗法示意图im2col操作是用来优化卷积运算它的核心是将卷积核感受野转化成一行列来存储优化运算速度减少内存访问时间. 其计算过程如下图所示.im2col法示意图卷积操作主要涉及输入特征图和卷积核权重的三维乘法和累加操作. 优化计算里的循环方式也是在FPGA 上部署神经网络的常用方法主要包括循环展开[91]、循环平铺[237]、循环交换[238]等. 在现有FPGA 与深度神经网络的相关研究工作中也均有使用以上三种技术定制具有三级内存层次结构的加速器的计算和通信模式[83,90,232,239,240]可以有效地映射与执行卷积循环.1.3.3 频率优化理论峰值工作频率也是FPGA 性能指标之一提高FPGA 的峰值性能也是目前FPGA 加速设计中的一个研究方向[85,91,241]. FPGA 能够达到多少工作频率不仅需要考虑FPGA 芯片自身支持的频率是多少同时需要考虑如何内部提高时钟频率即如何对程序优化来提高多用寄存器工作频率. 28nm 的Altera FPGA 上实现傅里叶变换等简单算法可以达到数百GFLOPSQR 与Cholesky 分解等复杂算法则达到100 GFLOPS 以上. 比较新的FPGA 能够支持700-900MHz 的DSP 理论峰值工作频率但现有的设计通常在100~400MHz 下工作[109, 116]. 因此提高FPGA 工作频率也是神经网络在FPGA 上进行部署的一个重点研究方向.1.4 基于带宽的神经网络加速在基于FPGA 的神经网络加速中内存带宽也常常是影响计算速度的瓶颈. 当模型的计算强度小于计算平台的计算强度上限时此时模型理论性能的大小完全由计算平台的带宽上限以及模型自身的计算强度所决定. 由此可见在模型处于带宽瓶颈区间的前提下计算平台的带宽越大模型的理论性能可呈线性增长. 因此通过提高带宽上限或者减小带宽需求可以实现对模型的加速. 本节将从三个方面对基于带宽的神经网络加速进行阐述首先介绍了衡量神经网络模型性能的Roof-line 模型其次分别总结了针对提高带宽上限和减小带宽需求的现有方法.1.4.1 Roof-line 模型Roof-line 模型就是用来衡量模型在一个计算平台的限制下所达到的最大浮点计算速度. 通常计算平台使用算力与带宽这两个指标进行性能衡量. 算力也称为计算平台的性能上限指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数.单位是FLOP/s. 带宽也即计算平台的带宽上限指的是一个计算平台倾尽全力每秒所能完成的内存交换量. 单位是Byte/s. 与此对应的计算强度上限Imax 就是算力和带宽相除的结果. Roof-line 模型的示意图Roofline Model示意图有了Roof-line 模型我们就可以知道神经网络模型在相关计算平台上的性能. 由计算平台的算力和带宽上限所决定的Roof-line 模型通常划分为两个区域计算瓶颈区域和带宽瓶颈区域. 一些基于FPGA 的加速文献[79, 186, 242]将Roof-line 模型中的计算强度定义为CTC 率即用来表示每次内存访问的操作数. 当模型处于带宽瓶颈状态时模型理论性能的大小完全由计算平台的带宽上限以及模型自身的计算强度所决定. 由此可见提高带宽上限或者减小系统的带宽需求都可以提高系统的性能从而进行加速. 具体的通过数据复用、规范数据访问的模式可以提高带宽的上限而通过数据量化、矩阵计算和存储优化可以减小系统的带宽需求.因此本节接下来将从上述几个方面具体阐述如何从带宽的角度提高系统的性能从而进行加速.1.4.2 提高带宽上限在基于FPGA 的深度神经网络加速中内存带宽常常是提高速度的瓶颈. 对于全连接层部分由于包含大量的权重因此会产生大量的内存访问而对于卷积层部分大量的乘加操作也会导致大量的内存访问. 由于片外内存的限制理论带宽有限实际带宽上限一般低于理论带宽上限而实际的带宽是由数据访问模式所决定的. 因此一方面复用数据可以变相地提高带宽上限另一方面对数据访问模式进行优化和改进也可以提高带宽上限从而达到加速的目的. 因此提高带宽可以从以下两个方面进行考虑数据复用和对数据访问模式的规范. 下面本节将对这两个方法的原理和研究现状进行介绍.1数据复用从Roof-line 模型可以看出在数据复用率较低的时候带宽就成为影响性能的瓶颈FPGA 运算资源没有被全部利用. 因此通过数据复用就可以使内存的实际应用带宽大于理论带宽从而增加了带宽上限. 数据复用分为输入复用、输出复用和权重复用三种[243]. 输入复用对输入缓冲区具有最小访问权限输出复用则是复用输出寄存器中的数据而权重复用则是指一定情况下对DRAM 进行重复权重访问的情况. 总的来说这三种数据复用模式就是在不同的阶段对数据进行重复使用以达到增加性能的目的. 在基于FPGA 的深度神经网络加速实验中有很大一部分是基于数据复用从而提高带宽上限进行加速的. 文献[172]所提出的技术利用数据复用来减少冗余通信操作以最大化数据共享与复用. 文献[243]采取数据复用和任务并行化进行数据复用从而在内存带宽不变的情况下提升CTC 率变相提高了实际带宽上限. 文献[109]提出了一种数据分配方案该方案最大化每个事务的突发长度到外部存储器以加速运算卷积层和全连接层以及避免不必要的访问延迟从而有效提高了DRAM 的传输带宽.2规范数据访问模式在基于FPGA 的神经网络加速中FPGA 作为协处理器. 更具体地说CPU 把指令写入内存FPGA 从内存读取指令执行并把计算结果写入内存. 因此如果规范了数据访问模式那么数据的读取效率也会提高从而增加了实际带宽上限. 文献中常常将特征图切割成存储在不连续地址中的小数据块进行特征映射来规范数据访问模式. 具体的文献[79]指出外部存储器中常见的特征映射格式包括NCHW 或CHWN其中N 表示批次维度C 表示通道维度H 和W 表示特征映射维度. 使用这些格式中的任何一种可以将特征图切割成存储在不连续地址中的小数据块. 因此通过规范数据访问模式增加了实际带宽上限. 文献[85]提出了一种特征映射存储格式将 H W 特征映射排列成rc 大小的HW/rc块从而将写突发大小从c/2 增加到rc/2从而实现通过数据规范进行加速的目的.1.4.3 减小带宽需求在深度神经网络模型计算过程中数据量化与矩阵计算优化会降低神经网络处理系统的带宽和存储需求从而减小带宽的需求. 在与数据量化有关的神经网络加速文献中研究者们常使用二值神经网络进行优化加速. 文献[110]通过利用一组新的优化能够有效地将二值化神经网络映射到硬件并且实现了全连接、卷积和池化层每层计算资源都根据用户提供的吞吐量需求进行定制从而实现了性能的提升. 文献[201]使用二值权值对模型进行量化并在ImageNet 数据集上带宽要求降低了32%.在深度神经网络的优化与加速中需要针对不同的网络层操作进行考虑如卷积操作和全连接操作所面临的问题是有所差异的. 卷积操作主要以计算优化为主参数少带宽需求不高. 全连接操作除了计算优化外权重参数较大需要大量内存访问因此带宽的优化也尤为重要. 在基于矩阵优化减小带宽需求的研究中研究者们常用的方法有基于Winograd 的方法、循环展开和矩阵稀疏性分析等的方法. 它们可以有效减少内存访问的总数从而减少带宽需求并提高计算性能. 具体的文献[116]利用三维卷积的矩阵转换来实现基于FPGA 神经网络加速功能. 文献[244]为了减少全连接层的内存占用将奇异值分解SVD应用于全连接层的权值矩阵. 他们还提出了一种动态的数据量化流组件进一步减少卷积神经网络的内存占用和带宽需求. 文献[109]为了提高带宽利用率设计了一个统一的矩阵乘法内核. 文献[115]提出了一种基于OpenCL的深度神经网络体系结构该方法利用Winograd 变换来减少乘法累加运算可以减少约50%的运算量.他们提出的体系结构将卷积层和全连接层的外部存储器带宽需求降低了一个数量级.1.5 基于FPGA的神经网络编译器及框架FPGA 的价值所在就是高度灵活、快速部署在这方面涌现出很多可在FPGA 上部署神经网络的编译器和框架. 例如sensAI 和ALAMO 编译器[239]、FP-DNN 框架[112] 、FPGAConvNet 框架[101] 、Caffeinated FPGAs 框架[231]以及FINN 框架[110]等等.在文献[87]中Yufei Ma 等人提出了一个基于库的RTL 级CNN 编译器该编译器可以自动生成用于各种CNN 推理任务的定制FPGA 硬件以便实现CNN 从软件到FPGA 的高级快速原型设计. 针对FPGA 部署神经网络 研究者又提出了编译器ALAMO[239]它使用模块化RTL 编译器加速深度学习算法目标是提供一种自动方式将CNN 推理过程映射到可以使用的高效RTL 代码. 该文献表明自动编译器解决方案有望实现深度学习的模块化和可扩展硬件加速.随着神经网络的发展在FPGA 上部署神经网络的框架也成为研究热点. 为了将神经网络部署在FPGA 上研究者提出各种不同的框架. 例如YijinGuan 等人提出了FP-DNN 框架[112]该框架可以自动将DNN 映射到FPGA 上以加速模型推理.Stylianos I 等人提出了PGAConvNet 框架[101]该框架可以将卷积神经网络CNN 映射到FPGA 上.Roberto 等人提出了Caffeinated FPGAs 框架[231]该框架是CNN 框架Caffe 的修改版并带有FPGA 支持可实现CNN 模型和专用的FPGA 实现并在必要时灵活地对设备进行重新编程. 文献[110]中提出了FINN 框架主要使用灵活的异构流架构的FPGA加速器通过利用一组新颖的优化可以有效映射二值化神经网络.大量计算和频繁的内存访问是神经网络在便携式系统上部署的挑战性问题. 现有高度适用于FPGA的综合工具例如HLSOpenCL大大减少了设计时间硬件级设计即RTL可以提高效率并实现更大的加速. 随着神经网络的不断发展其在FPGA上的部署问题也将成研究者关注的重点. 这将进一步促使更多的针对FPGA 上的神经网络部署的编译器以及框架的出现.2. 总结本文简单论述了FPGA实现深度神经网络的方法里面涉及到很多具体的技术细节需要各位有兴趣的小伙伴去仔细阅读相关的文献而且有兴趣的小伙伴应该读一下原论文以及论文中参考的论文进一步的梳理争取把知识点弄明白。