Angel-Eye: A Complete Design Flow for MappingCNN onto Embedded FPGA

天使之眼:将CNN映射到嵌入式FPGA

 

摘要:卷积神经网络(CNN)已成为人工智能领域的一种成功的算法,也是许多计算机视觉(CV)算法的强大候选算法。但CNN的计算复杂度远高于传统算法。在GPU加速的帮助下,基于CNN的应用程序被广泛地应用在服务器上。然而,对于嵌入式平台,基于cnn的解决方案仍然过于复杂,无法应用。在fpga上进行了各种专用的硬件设计来加速cnn,而很少有人探索整个设计流程的快速部署和高驱动效率。

在本文中,我们研究了最先进的CNN模型和基于CNN的应用。总结了在嵌入式fpga上映射CNN对内存、计算和系统灵活性的要求。基于这些要求,我们提出了天使之眼,一种可编程和灵活的CNN加速器架构,以及数据量化策略和编译工具。数据量化策略有助于将位宽度降到8位,精度损失可以忽略不计。该编译工具可以有效地将某个CNN模型映射到硬件上。在ZynqXC7Z045平台上进行评估,在同一平台上Angel-Eye与同等级的FPGA运行相比,实现速度快了6倍,驱动效率高了5倍。利用VGG网络、行人检测和人脸校正的应用来评估我们在ZynqXC7Z020上的设计。使用NIVIDATK1和TX1平台进行比较。天使之眼实现了类似的性能,并且能源效率提高了16倍。

介绍

卷积神经网络(CNN)是一种最先进的人工智能算法。随着CNN有一个很大的模型和足够的训练数据集,CNN为某些任务生成了复杂的特性,优于传统的人工创造的特性。因此,cnn可以在图像分类、目标检测,立体视觉等领域实现非常高的性能。一些音频算法还将CNN作为特征提取步骤之一。

尽管cnn性能优异,但由于其计算的复杂性高,很难在日常应用程序和设备中实现。大型CNN模型最多可以涉及大约40G的操作(乘法或加法),用于推断一个224×224图像。在实际的应用程序中,更大的图像可以放大这个数字。因此,基于CNN的应用程序通常作为大型服务器上的云服务来实现。对于个人设备,传统的CPU平台很难以能够接受的处理速度处理CNN模型。对于需要实时处理的对象检测这样的任务,情况更糟。

gpu提供了高度的并行性,是加速CNN的良好候选者。gpu已被广泛应用于CNN的训练和推理中。GPU的高利用率依赖于大批量处理,即并行处理的图像数量。大批量的分批处理的规模对于实时推理是不切实际的。对于对象跟踪等视频流上的应用程序,输入图像应逐帧进行处理。每一帧结果的延迟对应用程序的性能至关重要。在视频处理中使用分批处理大大增加了延迟。在一些跟踪算法中,一帧的结果会影响下一帧的过程。这就要求逐个处理这些帧。

另一方面,我们可以为CNN设计专用的架构,并在一个框架内并行化CNN计算。FPGA的灵活性使它成为CNN加速的一个很好的候选者。通过可升级的设计,我们还可以在嵌入式fpas上实现CNN加速器。对于CNN加速,已经提出了几种设计,但很少有人讨论将CNN映射到嵌入式fpga上的总体设计流程。

考虑到CNN的高计算和存储能力,不简化就将其映射到嵌入式fpga上是不可行的。CNN最近的工作表明,数据格式可以从32位浮点压缩到固定点。这大大降低了硬件的功率和面积成本。我们已经证明了8位不动点对于VGG网络就足够了。Han等人。通过权重共享将数据压缩到4位。最近的工作甚至尝试了1位的权重来进行分类。

各种硬件架构已经被提出来加速FPGA上的CNN。大多数工作都是手动将目标CNN模型映射到硬件结构上的。Zhang等人探索AlexNet加速器的设计空间并在FPGA上提出了一个浮点加速器,实现了自动设计工具,但它的目标是针对单个网络。它将硬件性能推到极端,但是牺牲了对不同网络的灵活性。

通过我们对CNN模型和基于CNN的应用程序的研究,这将在第三节中介绍,我们表明针对某个网络可能不是加速器设计的好选择。另一种选择是使用灵活的硬件结构,并通过改变软件将不同的网络写到硬件上。我们采用这种选择和设计说明,这样我们仍然提供良好的硬件效率。这可以快速响应网络拓扑结构的变化,并支持在运行时进行不同网络之间的切换。

在本文中,我们将之前的工作扩展了一个完整的设计流程,并将CNN写入到嵌入式FPGA。本流程中包括以下三个部分:

1.将原始网络压缩为fixed-point形式的数据量化策略。

2.可以参数化并且运行可配置的硬件结构体系,以支持多种网络并适合多种平台。

3.提供了一种将CNN模型映射到硬件架构上的编译器。

我们在FPGA上的实验展现了,所提出的设计流程提供了高能效的CNN加速。本文的其余部分组织如下。第二节介绍了CNN的背景。第三节介绍了其动机和设计目标。有关流程的详细信息见第四节。我们在第五节中展示了实验结果。第六节回顾了以前的工作。第七节总结了本文。
 

二  CNN初步

一个CNN由一组层组成。顾名思义,cnn中最重要的层是卷积(Conv)层。此外,全连接(FC)层、非线性层和池化层(下采样层)在CNN中也是必不可少的。

卷积层:在输入特定的图上应用与训练过的采集器的二维卷积来提取局部特征。多个Conv层通常通过级联来提取高级特征。图1(a)显示了一个示例,其中的特征贴图为蓝色,而三维Conv内核是绿色的。每个输出特征map的各自像素是部分输入具有三维卷积核的内积。

全连接层:对输入特征向量应用线性变换。它通常被用作CNN的最后阶段的分类器。图1(b)显示了一个包含四个输入和三个输出的简单FC层,其中每个连接代表模型的权重。

非线性层:有助于提高神经网络的拟合能力。在CNN中,重构线性单元(ReLU),如图1(c)所示,是最常用的函数。各种神经网络也采用了双曲正切函数和s型函数。

池化层:用于下采样。平均池化和最大池化是两种主要类型的池层类型。对于池化层,它输出输入特征图中每个子区域的最大值或平均值。池化层不仅可以减少特征映射的大小和后期层的计算,还可以引入平移不变性。图1(d)显示了一个具有2×2内核简单的最大池化层。

一个用于面部识别的可行的CNN如图2所示。它计算人脸的5个特征点的坐标,两个点代表眼睛,两个点代表嘴,一个鼻子点。Conv层、池层和非线性层交错以提取特征。最后的FC层从提取的特征中生成这些点的坐标。我们还使用这个网络来评估我们的硬件设计。

三,动机

在介绍设计流程的细节之前,我们首先研究了最先进的CNN模型和基于CNN的应用程序,以查看我们的设计流程所需的特性。

A. CNN模型

最先进的CNN模型在拓扑结构上与早期的网络有很大的不同。最近的工作更关注Conv层的设计,而不是FC层。与VGG网络一样,最终使用3层超过1.2亿权重的FC层进行分类。ResNet是2015年图像网大规模视觉识别挑战(ILSVRC)的赢家,它实现了152层,其中只有最后一层是完全连接的层。

快捷结构引入Conv层来增强学习能力。本文还提出了没有FC层的网络。CNN最成功的应用之一是目标检测。R-CNN用传统的计算机视觉算法提取建议,并用CNN给每个算法一个类别和信心。FastR-CNN以完整的图像作为CNN的输入,提取关于输出特征的建议,以减少对重叠建议的冗余计算。最近的工作甚至使用了一个完全卷积的网络来实现完整的流程。

CNN中的卷积内核也在发生变化。最近的CNN模型比更小的卷积核更喜欢更小的卷积核。早期的CNN设计的对Conv层采用了11×11大小的卷积核,比VGG网络中的3×3核要大得多。152层ResNet除了第一层之外的所有层都使用3×3内核。SqueezeNet甚至使用1×1内核来进一步降低计算复杂度。实验结果表明,这种结构与AlexNet的分类精度相当,而参数大小少了50倍。在Conv层中使用较小的内核可以降低计算复杂度,同时保持网络性能。关于MAC操作在最先进的CNN模型中如何分布的统计数据如表I所示。我们可以看到,卷积层,特别是那些像3×3这样内核大小较小的层,是在模块设计中最受欢迎的。因此,所提出的硬件采用了3×3卷积内核设计来适应最先进的CNN模型中的大部分层。

表I还显示了这些模型的总体计算复杂度。通常,CNN模型中会包含giga级的MAC。如果没有加速或简化,就在嵌入式平台上使用这些模型是不可行的。

除了计算复杂度外,CNN的存储复杂度也较高。对于表I中列出的CNN模型,我们还研究了不同层之间的中间数据的大小和每个层的参数。VGG-11模型的样本统计数据如图3所示。对于卷积层,特征map的最大size或单层卷积核的大小达到MB级,这对于嵌入式FPGA很难完全缓存在芯片上。因此,应探索有效的内存管理和数据重用策略。

B.来自应用程序的建议

在许多应用中,如目标检测、人脸识别和立体视觉,CNN已经展示了其能力,并击败了使用handcrafted models的传统算法。在移动设备上实现这种算法将对机器人或智能相机制造商有很大的帮助。但在某些情况下,该算法中需要多个网络。在[19]中,提出了一种用于人脸识别的级联CNN结构。在这个算法中,第一个CNN                        第二个CNN适用于保留下来的提案。在这一步中,我们还放弃了更多的提议。在这种情况下,算法中需要多个CNN模型。CNN的结果影响了算法的控制流程。仅仅为这类应用程序实现一个CNN加速器是不够的。

在这种情况下,使用多个加速器是可能的,但如果涉及到更多的模型,则不是一个可扩展的解决方案。所以CNN加速器应该在运行时是可以配置的。由于CNN的执行可以由运行时结果来决定,因此需要一个主机控制器来处理控制流程。

四,流程描述

设计流程的总体结构如图4所示。首先,为了解决CNN模型的高计算复杂度,提出了数据量化来压缩数据位宽,以减少工作负载。其次,为了将模型部署到硬件加速器上,提出了一个编译器来自动生成一个指令序列来描述CNN的执行过程。这三个步骤的细节:块分区、内存mapping和可靠性检查将在第四-C节中进行讨论。我们提出了一个硬件加速器来支持指令接口。为了更好地描述编译器的行为,将在编译器之前引入硬件架构。

A,量化数据

如前一节所述,CNN模型的高计算复杂度使得其在嵌入式平台上难以部署。压缩模型是一个不错的选择。压缩网络的一种直接方法是减少计算的位宽。与GPU或CPU相比,这利用了FPGA或ASIC设计的灵活性。在之前的工作中,它也被证明是一种有效的方法,但被限制在16位或12位。

通常,CNN在GPU上使用32位浮点数进行训练。最新的GPU可以处理16位浮点格式,但与固定点数据格式相比仍然很复杂。压缩位宽意味着进行粗数据量化。CNN中不同层的动态范围通常很大。因此,对所有层进行固定点数据格式的统一量化可能会造成很大的性能损失。为了解决这个问题,我们提出了一种量化策略,其中固定点数据的半径位置在每层的选择不同。该策略试图在给定位宽度的每一层中找到最佳的半径点位置。这对硬件是友好的,因为只需要额外的转换器来校正数据。Fixed-point 加法器和乘数器保持不变。

量化流程如图5所示。该网络首先用浮点数据格式进行训练。然后对每一层,我们首先收集特征图和网络参数上的统计数据,得到其对数值的直方图。这激发了我们如何选择半径点的位置。对于每个可能的解决方案,我们将其应用于网络,得到一个固定点格式层,并测试量化后的准确性。在此步骤中可能会出现溢出和溢出。对于溢出数据,我们保持其符号,并将其绝对值设置为最大值。对于下流数据,我们设置为0。半调整器用于将浮点数据转换为固定点格式。保持了精度最好的量化结果。在所有层上进行量化后,我们应用微调来进一步提高精度。网络被转换为浮点格式以进行微调:梯度、前馈和反向传播微调期间的权重、激活都是浮点数。然后将微调结果转换为固定点格式,并为每个层选择选定的半径点位置。

注意,我们使用了一个贪婪的策略,通过分层优化半径x的位置。如果我们一起优化所有的层,求解空间对层数是指数级的,这将过于消耗计算。

我们的实验结果表明,该贪婪策略(greedy strategy)可以将最先进的网络简化为8位固定点格式,但精度损失可以忽略不计。

数据量化后,将网络中的所有数据都设置为相同位宽的fifixed-point格式。但在乘法和积累后,每层的结果都会使位宽变得更宽。

B,硬件体系结构

如第三节所述,CNN加速器应该是运行时可配置的。我们之前的工作仅限于VGG模型。本文提出了一种灵活的指令界面。CNN的计算采用三种指令来描述:LOAD、SAVE和CALC,对应于带有外部内存的I/O和卷积操作。最先进的CNN模型的大多数变体都被这个指令集所覆盖。每个指令都是128位或192位,并包含以下字段:

1.运行代码用于区分不同的指令。

2.dependency代码为指令间依赖关系设置标志,并帮助并行化不同类型的指令。这允许在指令执行之前进行调度。

3.参数包含每种指令的特定字段。对于负载和安全指令,将设置了外部存储器和片上存储器中的数据块的地址和大小描述。提供片上存储器的地址接口,帮助软件充分利用有限的片上存储器。对于CALC指令,将设置片上存储器中的数据块地址和大小。还设置了用于池、偏见和填充的其他标志。

如图6所示,提出了一个硬件体系结构来支持这个指令接口。它可分为四个部分:PE阵列、片上缓冲器、外部内存和控制器。

PE数组:PE数组在CNN中实现了卷积操作。通过PE阵列实现了三个级别的并行性:

内核级别并行性。每个PE由几个卷积引擎组成。每个卷积引擎并行计算卷积核的内积和图像的一个window窗口。每个PE中不同的卷积引擎在不同的输入通道上并行地进行卷积。根据CNN的定义,不同输入通道的结果被添加在一起。

输出通道并行性。不同的PE共享相同的输入通道,而不是卷积内核,以并行计算不同的输出通道。

单个PE的详细结构如图7所示。在每个PE中,不同的卷积并行计算不同输入信道上的二维卷积。正如第三节所介绍的,在最先进的CNN模型中,最流行的卷积核的大小为3×3。因此,我们在硬件中采用了基于线缓冲设计的3×3卷积内核。这实现了内核级的并行性,并实现了对图像数据的良好重用。虽然内核是固定的,但我们仍然可以支持其他内核大小,如图9所示。对于像1×1这样的较小的内核,内核被填充到3×3来得到支持。对于像5×5这样的大内核,使用多个3×3内核来覆盖它。这意味着对同一图像进行3×3卷积,并将结果加在一起。

在数据量化的帮助下,乘数器和加法器可以简化为使用具有一定位宽的固定点数据。为了避免数据溢出,对中间数据扩展了位宽度。对于我们的8位设计,使用了24位的中间数据。移位器用于将偏差与积累的数据对齐,并根据每一层的数据量化结果切割最终结果。

芯片上的缓冲区:这部分分离的PE阵列与外部内存。这意味着数据的输入/输出和计算可以并行进行。如果输出通道需要超过一轮的计算,输出缓冲区还可以为PE阵列提供中间结果。如第三节所述,CNN是内存密集型的。因此,我们需要有效地利用片上缓冲区。我们引入了一个二维描述接口来管理数据,如图8所示。缓冲区中的每个图像都用以下参数进行描述:开始地址、宽度、高度和行步骤。这使软件能够充分利用不同特征地图大小的片上缓冲区。有了这个接口,软件还可以通过分割矩阵来在这些缓冲区上实现乒乓球策略。

外部内存:对于最先进的CNN和目前可用的嵌入式平台,芯片上的缓冲区通常不足以缓存所有的参数和数据。外部内存用于保存网络的所有参数和每个层的结果。在该系统中,外部内存也用于CNN内核与主机CPU之间的通信。使用共享内存进行数据通信有机会减少丰富的数据传输。

控制器:此部分接收、译码并向其他三个部分发出指令。控制器监控每个部件的工作状态,并检查是否可以发布对该部件的当前指令。因此,主机可以通过一个简单的FIFO接口将生成的指令发送给控制器,并通过检查控制器中的状态寄存器来等待工作完成。这减少了主机在运行时的调度成本。当CNN正在运行时还可以使用主机CPU完成其他任务。

图10显示了这部分的结构。并行执行指令可能会造成数据冲突。在硬件中,一个执行指令如果:1)相应的硬件处于空闲状态,2)它所依赖的指令已经完成,则执行一个指令。条件1由负载InsFIFO、CALC输入FIFO和安全输入FIFO来维护,如图10所示。fifo中的指令将在相应的硬件空闲时发出。条件2通过检查Dep检查模块中的依赖代码来维护。

C,编译器

提出了一种编译器来将网络描述符map到指令中。优化处理了CNN的高存储复杂性。本编译器遵循一些基本的调度规则,充分利用CNN中的数据本地化,减少数据I/O:

1。输入通道优先。有时,输入特征图需要被切割成更小的块。我们在输入缓冲区中保留一组已加载的输入特征映射块,并生成尽可能多的输出通道的中间结果。这意味着卷积内核在这个过程中正在发生变化。通常,特征map比卷积核要大得多。所以保持芯片上的特征maps比保持卷积内核更好。

2,输出通道第二。当特征maps被切割成块时,我们首先计算位于相同位置的所有输出块,然后继续移动到下一个位置。

3.没有中间结果输出。这意味着当输出缓冲区充满中间结果时,我们将一组新的输入特征map加载到输入缓冲区,并在这些输出通道上进行积累。

4.往返。当一组输出缓冲区完成计算时,我们已经穿越了所有的输入通道。下一轮的穿越将在相反的方向上进行。这减少了两轮穿越之间的冗余负载。

在编译过程中包括了三个步骤:

块分区。由于片上内存有限,特别是对于嵌入式平台,并不是所有一层的特征图和网络参数都可以缓存在芯片上。因此,我们需要划分一层的计算,以适应每个块到硬件。为了提高效率,我们分析了不同的分区策略,以实现高效率,而几乎任何类型的分区都可以通过指令集来实现。分区的主要问题是带宽要求。降低I/O可以降低功耗,节省系统中其他合作加速器和主机的带宽。为了保持数据I/O突发长度,我们要求为行主数据格式横向裁剪特征映射。然后剩下的问题是决定单个块中有多少行。

假设一个层有M个大小为f×f的输入特征图和N个相同大小的输出特征图。卷积核的大小为K×k。输入、输出和卷积核的缓冲区大小为Bi、Bo和Bw。r行在每个特征map块中。因为我们不将中间结果存储到DDR上,输出量是一个图层的常数。我们可以生成输入特征maps和卷积核的输入量的函数,如方程(2)中的Di和方程(3)中的Di。

Angel-Eye: A Complete Design Flow for MappingCNN onto Embedded FPGA_第1张图片

方程(1)给出了Di的两个分支的边界。如果r行在一个块中,我们将得到一个特征map的f/r块。考虑到相邻块之间的填充和重叠,将为每个块加载r+K−1行。

如果r≤R,则所有输入通道相同位置的块可以在芯片上进行缓冲。从一个输出通道移动到下一个输出通道将不需要与外部内存进行额外的数据交换。所以每个块只加载一次,总的输入量是根据方程(2)的第一个分支。如果是r>R,则需要额外的数据交换。考虑对一个输出块的计算,需要位于相同位置的所有输入块。如果上一个输出块位于同一位置,则可以重用输入块。最大重用大小为Bi。因此,每个输出块的数据输入量为(r+K−1)fM−Bi,但第一个输出通道除外。为了利用输出缓冲区,Bo/rf输出通道被分组在一起。这意味着每一组都可以完全缓冲。因此,使块在所有输出通道的相同位置需要Nrf/Bo轮计算。这对应于方程(2)的第二个分支。

对于卷积内核,如果数据总量大于权重缓冲区,那么当从一个位置的块移动到下一个位置时,需要额外的数据交换。与输入特征图相似,体重数据可以被重用,我们得到了方程(3)的第二个分支。这是我们设计的常见情况。

上述函数不考虑不可分割的情况。在我们的编译器中,通过一个模拟来计算每个可能的r的所有输入量。选择输入量最少的r。图11显示了三个例子。

至于情况(a),只有Di的第一个分支得到满足。所以总输入量可以用式(4)表示。在这种情况下,R应该尽可能大。

Case(b)是CNN模型中间的一个典型层,其中通道数量较大,特征图为中等大小。分裂条件R位于r的域内,所以应该考虑这两个分支。对于第二个分支,总输入量可以表示为等式(5)。在这种情况下,可以找到一个局部最小解。

Case(c)是CNN模型末端的一个典型层,其中通道数较大,特征图较小。只满足方程(2)中的第一个分支。所以这个解决方案与案例(a)是相同的。请注意,案例(a)的Bi和Bo与案例(b)和案例(c)的Bi和Bo不同。在这一层中只使用了3个输入通道,而我们在硬件设计中有16个输入通道。所以Bi只有总输入缓冲区大小的3/16。

内存映射。外部内存空间分配用于主机CPU和CNN加速器之间的通信。首先,应分配输入特征map内存空间。特征map应该是行主格式,每个通道都在连续存储。然后,应该分配每一层的结果的内存空间。数据格式将由硬件自动处理。在计算一层的过程中,只需要两个内存块,一个用于输入,一个用于输出。因此,非相邻层的结果的内存空间可以重叠。如果需要中间层的结果,编译器支持这种情况,并保留空间不被其他层重写。

然后,分配了卷积核和偏差的内存空间。这个空间在整个CNN加速的过程中都被保留了下来。通常这个空间在第一次CNN加速之前只初始化一次。随着这个块划分的结果,确定了卷积核和偏差的使用顺序。根据此顺序生成一个填充参数内存空间的参数.bin文件。根据块划分结果,为输入输出特征map块分配卷积核。在所有内存分配后,填充指令序列中相应的地址字段。

可靠性检查。在内存映射步骤完成后,指令集已经可以完成CNN的计算过程。但是数据可靠性检查可以发现计算和数据I/O之间存在潜在的并行性。此步骤检查指令之间数据的可靠性,并在指令中设置标志位,以让硬件探索并行性。指令的顺序也被调整,以充分利用硬件并行性。

D,运行时的工作流程

该系统的运行时工作流程如图12所示。在初始化阶段,数据量化生成的参数.bin文件应该根据编译器给出的地址。bin文件加载到内存中。说明也应该在内存中准备好。在运行时,非cnn任务在系统的ARM核心上运行。当调用CNN时,输入图像首先被复制到编译器分配的物理内存空间,然后指令被发送到加速器。当加速器工作时,可以使用主机CPU执行其他任务。主机会检查加速器的状态寄存器,以查看它是否已完成。然后跑算法。注意,在每一帧内可以完成多个CNN,而图是每一帧一个推理的示例。

五。实验

在本节中,提出的数据量化策略分析了不同的cnn。然后用量化的网络来评估硬件性能。

A,数据量化结果

在四种网络上对所提出的数据量化策略进行了评估:谷歌LeNet[23]、VGG-16网络[2]、SqueezeNet[13]和VGG-CNN-F模型,来自可获得的Caffe的zoom。ImageNet分类数据集[25]用于量化和验证。用50张图像来优化每一层的半径位置。用5000张图像来测试网络的分类精度。数据量化后,对所有位宽配置进行微调。以32位浮点结果作为基线。实验结果见表2。

对于所有的网络,除了VGG-CNN-F上的微调结果外,16位数据量化在ImageNet数据集上造成的精度损失不到1%。这与之前的工作结果一致。降到8位,VGG-16和VGG-CNN-F模型的性能仍然与16位相似,而谷歌LeNet和挤压网遭受进一步的性能损失。在8位数据量化之前,所有模型的性能仍然保持相对较高。通过6位数据量化,所有模型在某种程度上都崩溃。因此,我们在硬件实现中选择了8位和16位。

对所有模型都进行微调。它在VGG-16和VGG-CNN-F模型上工作得很好,但对谷歌网和挤压网没有帮助。重点关注VGG-16和VGGCNN-F,我们发现微调很重要,特别是当位宽很窄时。当使用6位不动点数据时,VGG-16模型的前1位精度提高了13%以上。

除了图像分类外,我们还在图2中的人脸对齐网络上测试了该策略。与分类相比,该任务中使用的网络输出的关键点坐标,而不是相对分数,因此需要更高的数据精度。示例校正结果如图13所示。该应用程序中的8位数据量化仍然提供良好的性能。坐标误差在2帧以内。

CNN的另一个应用是目标检测。最近的工作是使用CNN从一个图像中生成建议,并给每个图像一个分类结果。在我们的测试中,我们选择了具有YOLO小模型的YOLO检测算法来进行行人检测任务。将该算法应用于无人机录制的视频。8位数据量化也被应用于网络的卷积层。其中一个示例结果如图14所示。这两个例子表明,8位数据量化可以支持常见的应用程序。

B,硬件性能

进行了两种基于FPGA的硬件架构设计。该设计的16位版本在XilinxXC7Z045芯片上实现,其目标是高性能运行。一个8位版本在XilinxXC7Z020芯片上实现,它针对低功耗应用。

我们设计的硬件参数和资源利用如表三所示。所有结果均由Vivado2015.4版本在合成和实现后生成。通过正确地选择设计参数,我们可以充分利用片上资源。请注意,我们并没有使用XC7Z020上的所有资源,因为该设计与我们的演示中的HDMI显示逻辑共存。比较XC7Z045上的8位和16位版本的结果,我们发现8位版本提供了50%的并行性,同时消耗了更少的资源。这表明了数据量化的重要性。

VGG16网络用于在XC7Z045和XC7Z020fpga上测试我们设计的性能和能源效率。CNN和GPU的其他FPGA设计结果如表4所示。从这种比较中可以得出一些结论。

首先,精度对能效的影响很大。早期设计的使用48位固定点数据或32位浮点数据,其能源效率要低得多。比较XC7Z045的8位设计与16位设计也得出了这一结论。这两种设计利用相似的资源和以相同的时钟频率运行,因此应该消耗相似的功率。但8位设计提供了50%以上的性能改进,这意味着能源效率更好。

其次,对硬件的利用是很重要的。当网络完全匹配10×10卷积器设计时,在[6]中报告的性能是200个gop。但对于5×5和7×7内核,性能降到了23个gop。如第二节所述,最先进的神经网络中的大部分计算都来自3×3卷积。因此,本工作中提出的设计应该会更好。

第三,存储器的I/O接口影响能源效率。从内存中读写数据的能量成本很高。[7]中的设计只实现了通道并行性来简化数据路径的设计。但该策略在卷积操作中没有利用数据局部性,从而导致更多的数据I/O。[28]中的设计实现了整个AlexNet的大型VX690T芯片,其中每一层的中间结果不会被写入内存。这进一步降低了数据I/O,从而实现了与我们的16位设计相比更高的能源效率。但是这种设计很难缩小到部署在BRAM资源有限的嵌入式平台上。

我们还将我们的设计与使用VGG-16网络的桌面GPU进行了比较。测试了第一批模式和第32批模式。与批32模式相比,批1模式的性能损失约为41%。我们的8位设计在大网络上使用第一批模式实现了更高的能源效率。但是GPU的规模对于嵌入式平台来说太大了。

对于XC7Z020上的8位版本实现,除了VGG-16网络之外,还使用了另外两个任务,YOLO和面部对齐。我们比较了我们的设计性能与28nm的NVIDIATK1SoC和最新的NVIDIATX1SoC平台的性能。对于YOLO和面部对齐,CNN部分是在FPGA上实现的。其余的算法都由SoC中的集成CPU来处理。虽然分批处理方式可以充分利用TK1或TX1上的GPU的并行性,但它对于实时视频处理不是一个好的选择,因为它增加了延迟。对于一些应用程序,如跟踪,一帧的结果用于下一帧的计算。这就需要逐个处理这些帧。所以我们在实验中不使用分批处理。性能比较情况见表V。

这三个平台在较大的CNN模型上都表现得更好。但该设计提供了更稳定的性能。在YOLO和面部对齐任务中,Angel-Eye甚至提供了比TK1更好的性能,并实现了与TX1相似的性能。这是因为GPU的并行性模式不能很好地适应小网络。TK1和TX1的运行功率为10W,而XC7Z020上的Angel-Eye的运行功率仅为3.5W。因此,我们的设计可以实现比TK1高16倍的能效,比TX1高10倍。

通过仿真估计了8位版本在XC7Z030和XC7Z045上的性能。在XC7Z020上,我们测量的实际I/O带宽约为500MB/s。估计是基于这个基础的。XC7Z030具有相同的带宽,XC7Z045使带宽翻倍,对FPGA具有额外的独立DDR端口。与XC7Z020相比,这两个平台即使在保守的150MHz估计时钟频率下,也可以借助更多资源的帮助,实现约1.25倍和3.46倍的性能。

VGG(Visual Geometry Group视觉几何组)

你可能感兴趣的:(神经网络,深度学习,机器学习)