论文笔记:An Efficient Hardware Accelerator for Sparse Convolutional Neural Networks on FPGAs

Abstract

深度卷积神经网络(CNN)以巨大的计算为代价取得了卓越的性能。随着CNN模型变得越来越复杂和深入,通过剪枝网络中的冗余连接来压缩CNN以使其稀疏已成为一种吸引人的方法,可以减少计算量和内存需求。另一方面,FPGA被证明是加速CNN推理的有效硬件平台。但是,大多数现有的FPGA体系结构都集中在密集的CNN模型上。当执行稀疏模型时,这些密集的体系结构效率低下,因为大多数算术运算都涉及零操作数的加法和乘法。在这项工作中,我们提出了一种用于FPGA上稀疏CNN的硬件加速器。为了有效地处理稀疏卷积层中的不规则连接,我们提出了一种面向加权的数据流,该数据流利用元素矩阵乘法作为关键操作。每个权重被单独处理,从而产生较低的解码开销。然后,我们设计了一种FPGA架构,该架构具有tile查找表和通道多路复用器。tile查找表(TLUT)旨在匹配稀疏权重和输入像素之间的索引。使用TLUT,可以通过使用有效的索引操作来减轻运行时解码的开销。此外,我们提出了一种权重布局,以实现高效的片上存储器访问而不会发生冲突。为了与权重布局配合,插入了一个通道多路复用器(CMUX)以定位地址。实验表明,对于Xilinx ZCU102上的现代CNN,我们的加速器可以达到223.4-309.0 GOP / s,比FPGA上以前的密集型CNN加速器提供2.4X-12.9X的加速。

Introduction

受生物神经系统的启发,深度学习最近获得了显着的准确性提高。卷积神经网络(CNN)是深度学习中最常用的模型,已在包括图像和语音识别在内的各个领域中采用[1-4]。 CNN准确性的显着提高是以巨大的计算复杂性为代价的,因为它需要对整个特征图上的所有区域进行全面评估。

事实证明,剪枝深度神经网络是减少这些模型的总体计算和内存需求,同时又保持较高准确性的有效解决方案[5,6]。 [5,6]表明,对于某些DNN,存在很大的冗余(高达90%),可以在不牺牲准确性的情况下对其进行剪枝。理论上,剪枝技术减少了卷积算法中的运算数量,这可能为更快的推理过程提供了机会。

但是,FPGA上用于密集模型的现有体系结构不适合稀疏的CNN模型。这些工作大多数基于循环操作(例如循环交换和循环展开)来优化其数据流[7,8]。密集的体系结构可能导致较高的硬件效率,因为大多数乘法运算涉及零个操作数[7-16]。近年来,已经在FPGA上研究了稀疏DNN的实现[17]。这些体系结构主要集中在FC层,FC层主要使用矩阵矢量乘法运算,并在RNN和LSTM中使用。但是,现代CNN计算的主要运算符是卷积运算。例如,在GoogLeNet中,卷积运算占总计算量的90%。尽管空间卷积可以映射到矩阵向量乘法,但是这将增加局部内存需求,因为输入特征图中的像素在展平为向量时必须多次复制。要为稀疏CNN模型设计高效的FPGA加速器。

由于以下原因,这是非常具有挑战性的:

  • 卷积层涉及稀疏CNN的输入特征图和输出特征图之间的复杂连接。显然,每个输出像素通过滑动核与部分输入像素相连。网络稀疏时,连接会变得不规则。设计用于处理不规则性的数据流很困难,但可以利用FPGA的高度并行性并保持FPGA效率。
  • 稀疏权重以稀疏格式编码,这需要额外的坐标计算才能找到权重。但是,稀疏权重(非零)的分布是不规则的,这导致内存访问效率低和片上带宽利用率低。

为了解决第一个挑战,我们提出了一个面向权重的数据流,其中每个PE都执行元素矩阵乘法而不是空间卷积。在这里,元素是指稀疏权重,矩阵是指输入图块。在此数据流中,稀疏权重将单独处理。通过这样做,我们成功地避免了与稀疏性相关的设计问题,例如不规则的连接和负载不平衡等。对于第二个挑战,我们提出了一种权重布局,该布局可以实现对权重的有效片内存储器访问。在这种布局中,并行处理的权重被连续存储,并且结果是从不同的BRAMbank中累加的,以避免访问冲突。此外,我们为稀疏的CNN设计了一种有效的体系结构,该体系结构具有tile查找表(TLUT)和通道多路复用器(CMUX)。 TLUT可以减少运行时索引匹配的开销,而CMUX可以在更新结果时轻松地定位输出地址。

总之,这项工作做出了以下贡献:

  • 我们提出了一个以元素矩阵乘法为关键操作的数据流,其中元素和矩阵分别指的是稀疏权重和输入图块。

  • 我们提出了一种权重布局,可以实现高效的片内存储器访问。在此布局中,并行使用的权重被连续存储。

  • 我们提出了一套针对稀疏CNN的架构优化技术。我们设计了一个查找表以将权重与相应的输入像素进行匹配,并设计了一个通道多路复用器来定位输出地址。

实验表明,对于Xilinx ZCU102上的VGG,Alexnet,Resnet和GoogLeNet,我们的加速器可以分别达到309.0、223.4、291.4和257.4 GOP / s。与之前的密集型CNN FPGA加速器相比,我们的加速器实现了2.4X-12.9X的加速。与TitanX GPU平台相比,我们的加速器显示出7.56倍的能源效率。

Background

CNN是一类深层的前馈人工神经网络,它由一系列包括卷积层,池化层和完全连接层(FC层)的层组成。卷积层是内核从输入特征图中提取特征的最重要层。图1显示了典型的卷积操作。卷积运算使用小的R×S内核在输入特征图上滑动,滑动窗口内的像素利用内核中的权重执行乘加运算,以计算H×W输出特征中的像素值地图。在一个卷积层中通常有许多输入特征图(又名输入通道)和输出特征图(输出通道),输入图和输出图的数量分别为M和N,如图1所示。注意,将不同输入通道中的卷积结果累加以获得输出通道结果。

CNN通常具有大量权重,这可能会导致过度拟合的问题。权重剪枝技术[5,6]已被证明是在保持整体模型准确性的同时减少计算和内存大小的有效方法。例如,深度压缩[5,6]可以将AlexNet [18]和VGG-16 [3]中的权重数量分别减少9倍和13倍。这些被称为非结构化剪枝技术。还有其他剪枝技术可以使用结构化模式剪枝新颖[19-21]。结构化剪枝技术的优点是它们对硬件友好。但是,由于严格的数学形式化,它们通常产生较低的压缩率。我们建议的稀疏CNN加速器可用于结构化和非结构化剪枝技术。

WEIGHT-ORIENTED DATAFLOW

在这里插入图片描述
在为ASIC平台上的稀疏CNN设计数据流方面,已经进行了先前的努力。但是,由于架构不同,这些数据流对于FPGA平台而言效率很低。在表I中,我们基于数据流的内部计算对现有的ASIC设计进行了分类。 SCNN体系结构[22]应用面向像素的数据流,其中最里面的计算是笛卡尔积。使用笛卡尔积,此数据流将输入像素与权重相乘,并返回多个部分和。此方法需要大量的坐标计算才能找到稀疏的权重。此外,部分和与不同的输出像素相连,由于复杂的数据依赖性,这给在FPGA上流水线带来了巨大挑战。 Cambricon-X [23]设计采用直接和逐步索引技术通过检测非零来选择输入像素。 Cambricon-X通过将权重收集到一个向量中来跨通道执行向量点积,该向量需要动态选择输入向量。该数据流仅在通道维度上执行并行计算,这将导致FPGA的并行性差。

FPGA上存在密集的CNN数据流[8-10、24、25]。但是,这些数据流将导致无效的乘法,这是由稀疏CNN的权重和输入/输出通道之间的冗余连接引起的。如图2所示,无效乘法分别来自空间核,输入通道和输出通道尺寸。输入特征图与空间核维和输入通道维中的权重共享相同的索引。换句话说,在将输入与内核进行卷积时,需要使用索引与权重匹配的输入像素。此外,不同的内核连接到不同的输出特征图,并且零权重将不会对相应的输出特征图起作用。
在这里插入图片描述

我们建议通过将每个权重作为单个元素处理,将卷积计算转换为元素矩阵乘法。我们将稀疏权重压缩为两个数组:(1)SPw数组,其中同一输入通道中的非零权重被压缩为向量。我们使用坐标列表(COO)格式存储稀疏权重。确切的讲,向量中的每个元素都是5元组(n,r,s,值,有效),代表索引和权重值; (2)NZ数组,它记录每个输入通道中非零权重的数量。一次处理一个输入通道。

图3(a)显示了我们的数据流的伪代码,其中包括三个步骤。在步骤1中,我们根据位置(h,w,m)将必要的输入像素收集到输入图块中。输出特征图中的TH×TWtile通过特定权重与输入特征图中的TH×TW像素连接。给定特定的内核大小和滑动步幅,TH×TWtile对应于输入特征图中的TH×TWtile,如下所示:
T H = R + s t r i d e × ( T H − 1 ) , T W = R + s t r i d e × ( T W − 1 ) ( 1 ) T_H = R + stride×(T_H -1),T_W = R +stride×(T_W -1)(1) TH=R+stride×(TH1)TW=R+stride×(TW1)(1)
输入图块以垂直步幅TH和水平步幅TW滑动,如图3(a)所示。

步骤2是数据流的内部计算,其中TN权重与输入图块并行相乘。

图3(b)展示了面向权重的数据流中内部计算的细节。根据权重的位置,我们选择与权重相关的输入像素的图块。更清楚地,给定一个输出图块,每个权重对应于由权重在内核中的位置确定的某个子输入图块。例如,稀疏权重左上角的值“ 1”会与输入特征地图的所有4×4左上图块相乘。权重来自不同的输出通道。最后,在步骤3中,将根据索引(n,h,w)将乘法结果累积到输出像素中。

我们的数据流及其元素矩阵乘法内部计算具有以下优点。首先,我们的数据流分别处理稀疏权重。通过这样做,我们可以有效地利用稀疏性,同时减少稀疏性的解码开销。其次,我们的数据流在FPGA上提供了足够的并行性。更清楚地,空间核中的输出像素和输出通道尺寸是并行计算的。第三,我们的数据流具有较低的数据依赖开销。图3中步骤2的结果被累加到不存在读写冲突的不同输出像素中。

ARCHITECTURE OPTIMIZATION

在第三节中,我们将卷积运算转换为元素矩阵乘法。但是,在FPGA上实现此数据流带来了两个挑战。第一个挑战是为特定权重选择必要的像素。单个权重仅连接到输入特征图中的部分像素,而内核不同位置的权重则连接到不同的输入像素,如图3的步骤1所示。其次,确保多个结果可以在步骤2中并行地将其累加到输出缓冲区,在FPGA存储器结构(例如,双端口BRAM)的硬件约束下,需要专用的数据布局。此外,应该对PE进行流水线处理以增加吞吐量。

在这里插入图片描述

图4显示了架构概述。在第IV-A节中,我们使用图块查找表(TLUT)来匹配权重和所需的输入像素。使用图块查找表可以避免运行时索引匹配。在第IV-B节中,我们提出了一种新颖的权重布局,其中并行权重被连续存储。此外,布局可以确保将PE阵列的结果累积到不同的输出bank中,而不会在管道中发生数据访问冲突。为了与布局配合,在IV-C节中,我们提出了一个通道多路复用器(CMUX)来定位通道地址。通道多路复用器接收稀疏格式的权重索引,并输出应将结果累加到哪个bank。由于跨输出通道的权重分配可能不平衡,因此我们在第IV-D节中分析负载平衡问题。

A. TLUT module

如上所述,权重代表输入特征图和输出特征图之间的连接。但是,当权重稀疏时,连接将失去其结构化拓扑。为了弥合输入像素与常规PE阵列之间的不规则连接,我们在输入图块和PE之间插入了图块查找表。图5描述了权重和输入像素如何配对。给定输入特征图中的位置和并行计算的输出像素数,将根据等式1选择一个区域。然后,我们枚举所有可能需要与权重相乘的子输入图块。显然,当内核在输入图块中滑动时,R×S内核中的权重将连接到输入图块中的一组输入像素。这些像素将一起批处理成一个新的图块。

在这里插入图片描述

当步幅等于1时,所选像素彼此相邻,如图5所示。内核中共有R×S个图块,其中R×S个位置分别存储在图块查找表中。tile查找表将运行时索引匹配替换为简单的数组索引操作。由于运行时索引匹配需要大量的多路复用器,因此这有助于大大节省逻辑资源。例如,在图2中,红色权重的位置是(0,0),对应于红色图块,我们可以直接获取在确定起点(h,w,m)时已预提取的红色图块中的像素。

在这里插入图片描述

B. PE design and weight layout

在这里插入图片描述

PE从tile查找表接收解码的权重和选择的tile。我们启动一个PE阵列,每个PE进行一个元素矩阵乘法运算。在数据流的第2步中,我们并行计算来自不同输出通道的多个输出像素。 TN均质PE并行处理多个权重和输入图块。此外,我们将流水线技术应用于我们的PE设计。流水线化允许第2步中的多个操作同时进行处理以提高吞吐量,并且流水化效率由迭代间隔确定。根据图3,迭代间隔由权重访问带宽和输出访问带宽限制。

为了能够同时更新多个输出通道,输出缓冲区被划分为TN×TH×TW个bank,其中通道维中的每个bank i存储来自(TN×x + i)输出通道的权重,如图7所示。 权重按通道的升序排序。如果需要从同一存储bank读取多个新颖,则将导致较长的读取延迟。为了解决该问题,权重布局被重新布置以与分区的输出缓冲器配合。我们通过将输出通道n除以TN来定义商和余数。在图3中,压缩后的权重存储在2D矩阵SPw中,对于矩阵中的每一行,我们根据其余部分对权重进行排序。具体来说,我们重新排列权重以确保每个连续的TN权重具有不同的余数,如图6所示,以便将PE阵列的结果累加到输出缓冲区。例如,在图6中,并行处理了4个权重。在我们的权重布局中,需要在迭代i + 1中将来自PE数组的结果累积到输出通道(0,5,2,7),其余数为(0,1,2,3)。以这种方式,多个写操作引用了不同的存储体,从而导致了改进的迭代间隔。

C. CMUX模块

在PE阵列中,每个PE生成一个结果块,这些结果属于一个不同的输出通道。结果需要累加到的地址由格式中的索引确定。如图7所示,在PE阵列和输出缓冲器之间插入了一个通道多路复用器,以定位地址。通道多路复用器由TN输入线组成,这些TN输入线代表输出通道维中存储体的数量。输出的通道权重索引将传输到通道多路复用器,然后通道多路复用器将输出需要累积结果的bank。

D.负载平衡分析

在这里插入图片描述

在我们的体系结构中,PE严格的一起处理具有不同余数的TN权重。但是,具有不同余数的权重不能平均分布。结果,等待时间总是受剩余的最大非零值限制。因此,我们将权重与所有余数之间的无效数据对齐,以使不同余数之间的权重数相等,如图8所示。有一个有效的COO格式信号(n,r,s,value,valid)用于指示权重是否有效。计算效率可以如下计算:
C o m p u t e e f f = #   o f   v a l i d #   o f   v a l i d + #   o f   i n v a l i d Compute_{eff} = \frac{\# \ of \ valid}{\# \ of\ valid + \#\ of\ invalid} Computeeff=# of valid+# of invalid# of valid
在图8的示例中,并行因子TN设置为4、6、8,具有固定数量的非零值28。对于每个因子,具有不同余数的非零数是不同的。我们将每个其余部分的权重对齐为相同的值,灰色点表示可能导致效率低下的无效值。例如,当TN = 8时,计算效率为828×5 = 70%。在实验部分,我们将使用真实网络分析计算效率。

IMPLEMENTATION DETAILS

A.内存系统

FPGA的片上内存不足以容纳特征图的所有通道。因此,我们以128个通道为单位加载和计算特征图。我们应用线缓冲技术来存储输入和输出要素图。由于内核在输入特征图上滑动时存在重叠,因此存在水平和垂直数据重用的机会。行缓冲区设计在以前的加速器中被广泛使用,并且可以有效地重用输入数据。有两个输入图块以乒乓方式工作,以重叠图块查找表的延迟和PE阵列的延迟。如图3所示,PE阵列的等待时间取决于LK的循环计数和管线深度。通常,循环LK的等待时间远大于平铺查找表的等待时间(常数)。

B.统一设计

通常,现代的CNN网络包含不同的内核大小。例如,Resnet在残差块中具有1×1和3×3内核,而GoogLeNet在初始模块中具有1×1、3×3和5×5内核。由于每个权重都是在数据流中独立处理的,因此我们的体系结构可以灵活地处理不同的内核大小。为了统一图块查找表的结构,我们将所有内核转换为3×3内核。图9显示了将5×5内核转换为3×3内核的示例。将5×5内核填充为零的6×6内核,然后分成四个3×3内核。请注意,分割后的内核从不同的位置开始,如图9所示。除了卷积层,CNN模型中还有其他层。在我们的体系结构中,我们实现了两个广泛使用的层:池化层和整流线性单元(ReLU)层。池化层在输入要素图的子区域中输出最大值。 ReLU层将小于零的任何输入值设置为零。当将结果写入片外存储器时,通过引入比较运算符来实现这两层。

EXPERIMENT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQWwoTfq-1604054646799)(An Efficient Hardware Accelerator for Sparse Convolutional Neural Networks on FPGAs笔记.assets/image-20200319203535989.png)]
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值