低功耗CNN加速器内存优化

一种用于低功耗CNN加速器的片上内存子系统设计案例

摘要

机器学习的快速发展正在推动大量新型应用的出现,例如用于嵌入式和移动设备的图像和语音识别。然而,当前最先进的深度学习模型(如卷积神经网络(CNN))对片上存储和计算资源的需求极高,导致其难以在低功耗移动或嵌入式系统中顺畅运行。为了将大型CNN模型适配到面向物联网或信息物理系统应用的移动及更先进的设备中,我们提出了一种高效的片上内存架构,用于CNN推理加速,并展示了其在自研单指令多数据(SIMD)结构的机器学习处理器中的应用。重新设计的片上存储子系统Memsqueezer包含一个激活权重缓冲区和数据缓冲区集,采用专用压缩方法分别减少CNN参数(权重)和激活数据所占用的存储空间。Memsqueezer缓冲区能够根据计算中的数据流对数据和权重集进行压缩,同时还包含一个内置冗余检测机制,主动扫描CNN的工作集,通过消除CNN模型中的计算冗余来提升其推理性能。实验结果表明,在相同面积预算下,采用Memsqueezer缓冲区的CNN处理器相比传统缓冲区设计实现了两倍以上的性能提升,并平均降低85%的能耗。

索引术语 —深度学习,卷积神经网络,低功耗,内存子系统。

I. 引言

深度卷积神经网络在计算机视觉、图像处理和语音识别方面取得了显著进展。专用深度学习架构的出现有望在手机、机器人技术和微型无人飞行器等轻量级设备上实现机器智能。

如今,机器学习和计算机体系结构领域的研究人员正强调基于GPGPU的优化或专用加速器来处理深度神经网络。由于大量的网络超参数和较大的工作集,在资源和功率预算有限的低端设备上应用典型的CNN模型进行机器智能并不容易。如何降低CNN调用的内存占用,是实现在智能嵌入式、物联网、信息物理设备中部署深度学习的关键步骤。

传统上,使用稀疏矩阵编码和量化[1][2][3], 等数据压缩方法来提升在移动CPU或GPGPU[1]上运行的CNN的内存利用率。这些软件方法要么基于稀疏矩阵和量化采用通用压缩算法,要么利用应用级技巧消除CNN模型中的结构或功能冗余[18]。软件方法已被证明在通用CPU和GPU上表现良好,然而,由于多种因素,它们在专用CNN加速器中的效率可能不如硬件压缩[3][15][14][4]:

首先,传统方法忽略了加速器的底层架构,无法解决由数据错位或随机内存访问导致的带宽利用率不足问题。基于稀疏矩阵的压缩方案必然是变长压缩,以实现更高的压缩比,但这会导致加速器缓冲区中的数据错位,从而引起不可预测的访问延迟,并破坏内存与处理单元(PEs)之间的连续数据流[1][2], ,最终导致带宽利用不足和性能下降。

其次,传统的软件级压缩未能考虑片上内存带宽与PE吞吐量之间的平衡。在CNN加速器中,大规模PE阵列与压缩数据流之间的平衡难以实现。例如,当以恒定带宽从片上缓冲区获取压缩数据时,每个周期解压后产生的实际数据量是波动的,无法很好地匹配处理单元的需求,这要么浪费了片上带宽,要么阻塞流水线。最后,稀疏性压缩不足以充分利用CNN工作集中的值冗余,还可结合动态基于硬件的压缩以进一步提高压缩比。

对于旨在加速网络推理的CNN加速器,采用带有硬件压缩机制的专用片上内存架构有助于将大型卷积神经网络压缩到轻量级设备中。现代CNN推理加速器设计主要分为两类:一类是具有灵活性和多功能性的轻量级向量处理器(VP)风格,如DianNao[11], ;另一类是提供高吞吐量推理能力的二维脉动阵列结构[16]。在本研究中,我们提出了一种用于低开销VP风格神经网络的主动式片上内存设计Memsqueezer。

加速器。本文提出的用于CNN加速器的主动式片上内存子系统并非在硬连线电路中对现有压缩算法进行简单实现。它必须匹配缓冲区带宽与处理单元,将数据预处理排除在关键路径之外,并且不能破坏处理单元与片上缓冲区之间简单的数据/权重流模式。总体而言,Memsqueezer在多个方面不同于以往的通用压缩方法,如稀疏矩阵或量化:

首先,活动缓冲区旨在用于基于向量处理器的CNN加速器或基于专用集成电路或现场可编程门阵列的处理器,并且不会在存储阵列中引入数据错位。它确保加速器仅具有简单数据流模式和简单地址生成机制,以实现更高的能效。

其次,Memsqueezer缓冲区通过采用不同的硬件压缩策略,考虑了卷积神经网络的工作集分类。由于卷积神经网络必须处理两类重要数据集:权重和激活数据,Memsqueezer包含两个部分:利用离线数据聚类和基值‐差值分割方法来压缩权重集的激活权重缓冲区,以及采用基于频繁模式的方法对中间数据流进行动态压缩和解压缩的主动数据缓冲区。先前的CNN压缩方法大多集中在权重压缩上,却常常忽视中间数据压缩的解决方案。我们发现,当权重数据被高比率压缩时,中间数据也可能成为片上存储的瓶颈。更糟糕的是,忽略中间数据压缩还可能导致数据带宽与计算吞吐量之间的失衡,一旦未压缩数据流占用的带宽超过权重流,便可能成为新的薄弱环节。

最后,Memsqueezer集成了一个内存冗余检测器,用于消除权重或中间数据中的全零或近零模式,并将零模式输入的计算操作快速转发给处理单元[33], ,从而使得数据压缩不仅有利于内存,还能提升性能。

总之,我们的方法大大缩小了片上内存的大小,并提升了CNN推理的性能。通过Memsqueezer,CNN加速器将变得更加轻量化和带宽高效,从而能够在资源受限的设备中充分利用CNN推理的数据级并行性。

II. 背景与动机研究

A. 深度卷积神经网络与CNN推理加速基础

深度卷积神经网络(CNN)是用于图像/语音识别、自动翻译和数据分析等应用的强大机器学习模型。一个CNN通常包含多个交替的卷积层和池化层,后接若干全连接层,如图1所示。在图1中,每个由多个二维特征图组成的三维立方体将通过一层被转换为一个新的三维立方体,并输入到后续层中。CNN推理中最耗计算的操作源于卷积层,这些卷积层占CNN推理执行时间的60~90%之多[4]。

示意图0

图1 包含多层的典型CNN加速器

深度卷积神经网络由重复的卷积层、池化层和全连接层组成,这些层通常在推理硬件中按串行方式处理。卷积层和全连接层的计算通常涉及大量权重,这给运行这些模型的硬件的片上存储和带宽带来了巨大压力。几种主流CNN模型的数据分解情况如表1所示,其中展示了当前先进CNN模型的部分采样层。可以看出,其工作集非常庞大,导致先前的加速器需要配备大容量且昂贵的片上缓存,以避免大量的片外内存访问[4][11]。以中等规模的Alexnet为例,假设我们试图将该网络映射到块内存有限的FPGA设备(即Zynq‐7020 SoC)上,则必须至少实现5x~的数据压缩比,才能将整个网络容纳进FPGA芯片可用的块内存中。表1中指出的另一个问题是,中间数据也可能成为片上存储的瓶颈,而这一点在先前的压缩方案中常常被忽视。例如,专为移动设备设计的紧凑型模型SqueezeNet,为了获得更好的性能,最多需要2310K的片上数据缓冲区。总体而言,先前设计为消除片外内存访问所需的片上内存空间,在超轻量级SoC场景下有时是不可接受的。因此,在这些场景中,Memsqueezer能够提供一种具有更高容量和带宽利用率的主动式片上内存子系统,从而在低开销CNN加速器中有效处理权重和数据,适用于轻量级物联网SoC和移动设备。

B. 深度CNN加速器和Memsqueezer

最近提出了大量基于细粒度和粗粒度可编程逻辑的专用架构,以加速CNN推理[5][6][7][8][9][10]。

一些针对现场可编程门阵列(FPGA)的数据流架构已被提出。这些架构依赖人工经验,在设计初期将神经网络模型的高层流图表示划分并映射到现场可编程门阵列(FPGA)中[6][7]。其他粗粒度可编程架构则可通过在处理单元阵列中进行循环展开,利用特征图和卷积核内部的大规模并行性[5][7]。

表1 CNN模型不同层的权重和数据集大小

卷积层1 卷积层2 卷积层3 Fc1 Fc2
Alexnet
数据(千) 294 567.2 364.5 18 8
权重(K) 68 600 1728 73728 32768
VGG
数据(K) 6272 1568 2048 64 8
权重(K) 72 144 1152 262144 32768
压缩-net
数据(K) 2310 576
权重(K) -162

另一类专用CNN加速器属于专用指令处理器(ASIPs)[11][12][4]的范畴。它们具备高效率的宏指令集,专为处理CNN推理的工作集而设计,且无需为了支持通用指令以及相关的复杂指令和数据调度而牺牲计算效率。

最先进的CNN处理器可以根据硬件结构分为两类。第一类受到传统向量处理器(VPs)的启发,即点乘阵列。图2展示了VP风格CNN处理器的示例。DianNao及其他属于此类的小面积加速器通常具有一个向量化处理单元(PE)阵列,用于执行密集卷积和全连接操作[11][4]。由于VP风格加速器类似于传统的低功耗SIMD协处理器,且得益于编译技术的成熟,它们被认为更加紧凑和多功能,能够支持更多算法和机器学习模型[12][13][17]。例如,PuDianNao能够支持支持向量机(SVM)、K均值、K近邻(KNN)、贝叶斯模型以及其他神经网络以外的机器学习技术[12]。

与Diannao、PuDianNao等CNN处理器不同,采用二维脉动阵列的设计能够提供更高水平的数据处理并行性,并通过在阵列间共享更多数据来提升权重/数据重用性[14][16]。其代价是更复杂的数据调度,以及在卷积核尺寸和步幅不兼容的情况下出现处理单元利用率不足的问题。

二维脉动阵列的另一优势在于能够通过消除不必要的零操作数操作来加速稀疏神经网络模型。EIE和Cnvlutin与我们之前的工作[33], 同时开展,能够重新调度CNN前向传播中的数据流,以最大化稀疏权重/激活矩阵中的计算跳过效果[14][15]。Eyeriss利用零值神经元在紧凑片上缓冲区中实现内存压缩,但并未将其用于计算加速。

Memsqueezer被认为可适用于二维脉动架构和基于稀疏性的加速器,因为Memsqueezer是一种独立内存压缩机制,还能检测权重和激活值中的零模式(稀疏性)以实现加速目的[33]。然而,为了使这些二维脉动结构能够像EIE一样实现基于稀疏性的加速,Memsqueezer必须进行调整,以与其中的数据流调度机制协同工作,通过正确分发激活和权重块来动态跳过零操作数运算,这超出了本文的范围。

如第2.1节所述,由于近年来深度卷积神经网络模型的参数不断增长,虚拟处理器或脉动架构都面临着需要大容量片上内存所带来的开销。在本研究中,我们实现了一种数据驱动的VP-style卷积神经网络处理器,如先前的工作[12][17]所述,并修改了该处理器的参数,以展示Memsqueezer在不同硬件设计中的适用性。所采用的卷积神经网络处理器结构如图2所示。本文讨论的Memsqueezer缓冲区及其他基线技术均在假设架构下进行评估。

III. Memsqueezer的整体架构

首先,我们简要描述本文采用的CNN处理器设计[12][17]。这是一种典型的专用指令集处理器设计,具有与神经网络推理及其他机器学习模型相关的领域特定指令集。该基线架构能够支持不同配置和拓扑的深度卷积神经网络。图2(a)展示了我们的数据流CNN处理器的架构。该处理器由多个主要组件构成:分别用于输入和输出数据的两个缓冲区,一个用于输入权重的缓冲区,均实现为单端口静态随机存取存储器阵列。这些缓冲区连接到一组处理单元(PEs),用于执行乘法、加法和激活函数操作。所有这些处理单元由地址生成单元(AGUs)进行管理,以指导其输入和输出数据。这些地址生成单元(AGUs)由中央协调器控制。协调器向地址生成单元(AGUs)发送指令,指示其加载/存储特征数据和权重,并向或从处理单元传输数据。AGU的指令由特定编译器生成。该编译器将网络规格(层数、每层使用的卷积核、下采样率和激活函数等)转换为一系列宏指令。同时,编译器还可以分析目标CNN模型的规格,并通过将包括权重和数据的工作集分块的方式将其映射到硬件上。每个数据块在一条指令[17]的控制下,由AGU以流式方式转发至处理单元。粗粒度指令由协调器获取并送入AGUs,使其根据预确定模式生成缓冲区和内存地址。因此,AGUs(包括权重AGU、数据AGU和内存AGU)被视为该数据流架构的中心,分别负责权重缓冲区、数据缓冲区、处理单元和主内存控制器之间的数据交换。

指令流和数据流。先前研究中的SIMD点积阵列被用作基线CNN加速器[17],,其具有一组专用的宏指令,通过指示地址生成单元在内存与缓冲区之间或缓冲区与处理单元之间加载正确的数据,来执行权重‐激活生产操作。为了提高指令调度的效率,此类指令的操作数字段采用“流”粒度,指定一段连续的权重或激活数据块,可由地址生成单元自动访问和引导,而无需其他组件干预。例如,重要的

示意图1

图2 典型卷积神经网络加速器中Memsqueezer缓冲区的示意图以及地址生成单元中的数据/权重取指模式

图2(b)展示了一个卷积层的基本数据取指模式。在此构建的案例中,Din 个输入通道通过多个滤波器进行卷积,以生成一个输出特征图。假设该处理器中仅有两个处理单元,卷积核和特征图中的像素由地址生成单元直接分别取指到PE‐1和PE‐2进行卷积操作。AGUs按照序号指示的顺序获取输入数据,并按对应颜色将它们分发到各个处理单元。例如,在第一个周期中,两个输入通道中的像素‐0和像素‐1被交叉分发到PE‐1和PE‐2,同时卷积核中的字‐0和字‐1也被相应地发送到处理单元。处理单元的输出预期会被累加以生成输出通道中的一个像素。这些数据/权重取指模式由发送至地址生成单元的指令指定,从而使其生成正确的地址模式以索引数据和权重缓冲区。

由于神经网络权重的大小有时对低端设备而言过大,因此已提出许多方法来缓解加速器芯片上权重缓存的压力。一种可能的解决方案是采用简单的“基值+差值”方法对数据进行压缩。这种简单压缩的思路在于,某些权重组具有较低的动态范围,即它们的值非常接近。在这种情况下,一组权重可以使用一个公共的“基值”加上若干相对差值(“差值”)以紧凑形式表示。通常,基值与差值的总大小远小于原始权重组的大小。因此,Memsqueezer权重缓冲区将预处理网络,并将全部权重划分为少量可在卷积层和全连接层中所有权重间共享的基值和差值。在本工作中,Memsqueezer不直接在缓冲区中存储大量权重/数据像素,而是采用k-means算法将权重划分为基值和差值,这些值被存储在由整个权重集共享的紧凑型基值表和增量表中,如图2所示。同时,Memsqueezer会存储每个卷积核权重的基值索引和增量索引,并保留其在原始权重布局中的顺序,以便地址生成单元仍能根据用于获取真实权重的原始模式自动获取这些索引。一旦获得索引,便用于读取基值和差值,并将其相加以生成紧凑形式的量化权重值。

与权重缓冲区不同,数据缓冲区动态压缩生成的激活数据,并在发送给处理单元之前将其解压缩,从而使小尺寸缓冲区能够存储所有激活值。

IV. 激活权重和数据缓冲区设计

A. 激活权重缓冲区的结构

卷积神经网络权重在离线网络训练阶段生成并获取,属于只读数据,可在网络调用前进行预处理。因此,采用复杂度和开销较高的压缩架构不会影响性能,因为其运行开销可在离线阶段分摊。一种可行的解决方案是使用简单的基值+差值方法来压缩数据。因此,Memsqueezer权重缓冲区将对网络进行预处理,并将全部权重划分为少量可在卷积层和全连接层中所有权重间共享的基值和差值。通过这种方式,每个权重点可表示为从共享的基值和差值组中选取的一个基址值和一个增量值之和。当预处理后的基值和差值被预加载到表中后,CNN加速器通过将其相加生成最终的神经网络权重,如图3所示。图3展示了权重缓冲区集合的基本结构,包括索引表、基值缓冲器和增量缓冲区。在每个周期中,这三个缓冲区各被索引一次,然后输出与处理单元发射宽度相匹配的未压缩权重分块。此处,一个权重分区定义为每次访问所获取的权重单元数量,包含n个权重,等于n个处理单元的宽度。

尽管权重分区的大小设置为与加速器中处理单元的吞吐量相匹配,Memsqueezer并不一定将大小为n的权重分块整体压缩,也不一定分别压缩每个大小为n的权重字(16位或32位)。

示意图2

图3 Memsqueezer权重缓冲区集合的组织结构

压缩粒度介于1~n个词之间,具体取值将在后续章节中确定以实现最高的压缩比。此处我们定义,块是作为整体进行压缩的基本单位。分块可能包含多个块。图3(a)仅展示了一个示例,其中大小为n-的权重分块被划分为两个块:w-blk-1和w-blk-2。这两个块分别是通过将基值-1/基值-2与delta-1/delta-2相加得到的。基值通过基值索引(BI)从基表中选取,差值通过增量索引(DI)从增量表中选取。BI和DI均位于索引缓冲区的同一行,并由权重AGU指令从索引缓冲区中依次输出。

除了压缩粒度之外,基值和差值的数量也影响可实现的压缩率。Memsqueezer不一定以基址+增量的形式存储权重分块。Memsqueezer可以重新划分权重,使其呈现为(base-1+base-2+…+base-n+delta)的形式。在图3(b)中,更宽的索引缓冲区包含多组BI和DI。在图3(b)中,BI(i,j)表示压缩块‐i的第 j-个基值。通过这种方式,未压缩权重块 w-blk-i是多个基值与差值之和的求和结果。

B. 将权重集预处理为差值和基值

如何将权重划分为基址和增量对压缩比有很大影响。为了使用最少数量的基值和差值来表示目标权重集,我们采用基于K均值的方法对权重数据集进行预处理。

K均值聚类是一种无监督机器学习算法,能够自动检测相近值的簇(权重)并将每个权重簇分组。“K”表示质心的数量,即每个簇的中心。因此,在每个簇中,权重的值非常接近唯一的质心,使得每个权重点都可以由该簇内共享的质心和一个小的增量值(delta)表示,该增量是权重点与质心之间的差值。因此,质心的值被用作该簇中所有权重的基址,而差值则被用作相应权重的增量。k均值算法是一种迭代过程,通常以随机选择的质心作为初始簇的起点。然后计算质心与每个点之间的距离。一个数据点将被分配到其质心距离该点最近的簇。对于每个初始簇,算法会重新计算质心位置,使其到该簇内所有点的总距离最短。此过程不断迭代,直到最终收敛于稳定的质心和点的分配。

示意图3

图4 基值与增量生成的流程

正如我们所讨论的,如上一节所讨论的,可能存在m 一个权重块可能需要多个基值来表示。然而,生成多个基值需要进行多轮重复的K均值聚类。如图4所示,对于第一轮K均值聚类得到的簇‐i,将该簇中每个点减去其质心的值(base(i)),从而生成一个新的由delta点构成的簇,定义为簇‐i’。减法操作完成后,对该delta簇‐i’中的新点再次进行新一轮的K均值聚类,以生成多个新的子簇。对于任意属于大簇‐i’的新簇‐i,j,其质心base(i, j)将作为簇‐i,j中各点的第二个基值。通过这种方式,簇‐i,j中的所有点(权重)都可以表示为{base(i)+ base(i,j)+delta}的形式。K均值聚类还可以被

一种用于低功耗CNN加速器的片上内存子系统设计案例

IV. 激活权重和数据缓冲区设计

B. 将权重集预处理为差值和基值(续)

多次重复以生成更多基值,从而产生更多的基表。我们还探索了设计空间,以在实验中找到能够实现最高压缩比的基表大小和权重分块大小。

假设在N个权重块上以a位, k个基值和宽度为m个差值、b位进行压缩,则索引表的大小为ܾ ∙(݈݋݃݇+݈݋݃݉),Memsqueezer权重缓冲区的最终压缩比为:

$$
\frac{b \cdot (\log k + \log m) + k + m}{N \cdot a}
\quad (1)
$$

C. 重新量化基值和权重

神经网络加速器通常使用定点数值表示来进行计算,以兼顾效率和准确率。根据公式-1,进一步压缩基址+增量值的一种方法是将基值和差值的位宽缩短为b,而不是a,后者是压缩权重块的原始大小。因为在采用定点运算的低开销CNN加速器中,定点权重以Q格式存储,使用一个Q变量即可在有限的精度下表示特定范围内的数据。Q格式允许指定:用于表示数值的位数以及数值范围。

除了这两个参数外,决定基值/增量表压缩效率和表示精度的其他关键因素是步长(分辨率)。众所周知,Q编码仅为原始全精度浮点值的一种定点近似,目的是为了提高硬件成本效益。然而,对于原始Q编码用户而言,存在一个隐含假设:即应用数据的值在其值范围内均匀分布,并且两个连续Q变量之间的步长是恒定的。例如,两个相邻Q10.6字之间的差值为$2^{-6}$。如果该假设符合神经网络传播中的实际情况,则使用定点数值逼近浮点数据所带来的精度损失将被最小化。然而,根据我们的统计观察,基值的值分布并不总是在编码所限定的范围内均匀分布的。因此,我们希望通过重新量化基值和增量值,使得可以用更短的字长来表示原始数据,同时精度损失最小。因此,在确定基值或增量值的定点表示时,需要考虑三个参数:位宽、步长(分辨率)和范围。它们之间的关系可描述为:

$$
\text{Range} \approx \text{Resolution} \cdot 2^{\text{bitwidth}}
\quad (2)
$$

重新量化差值和基值的关键在于,在仍具有足够大的范围和足够小的步长以保持准确率的前提下,找到最小的位宽。经过多轮K均值聚类后,基值分布在值空间的某一范围内,而差值倾向于分布在值空间的另一部分。因此,较少的比特位足以覆盖基值和差值的动态范围。关于步长,我们指出基值和差值的分布并非均匀分布,可以研究不同的分辨率方案,以在溢出误差和量化误差之间取得最佳权衡。表2展示了假设不同分布时最优量化器的分辨率。

例如,如果权重基值以2位宽度进行量化,根据表,最佳方法是将值设置为-1.494、-0.498、0.498和1.494,即分辨率为0.996。

表2 各种输入分布下最优量化器的分辨率[18]

位宽 均匀 高斯 拉普拉斯 伽马分布
1 1.0 1.596 1.414 1.154
2 0.5 0.996 1.087 1.060
3 0.25 0.586 0.731 0.796
4 0.125 0.335 0.456 0.540

对于某种类型的量化器,使用相同字长编码所产生的精度损失是不同的。预期权重基址和增量的最佳步长(分辨率)能够减少权重表示误差,该误差以信噪比(SQNR)作为位宽[18]的函数进行度量。SQNR用于衡量全字长编码原始值与量化后窄字长编码值之间的误差,它直接影响网络推理的计算精度。如果权重的实际值分布接近某种特定分布(例如高斯分布),则使用高斯量化器可以提高量化效率,获得更高的SQNR。确定量化器的过程如下所示:

  1. 收集目标网络的基值和差值的统计信息,并确定每层基址和增量的定点格式。在此阶段,计算候选分辨率的信噪比,并确保选择信噪比最大的分辨率。
  2. 确定量化器的标准差:ε。
  3. 通过表2计算分辨率:s = ε ∙ res(bitwidth)。
  4. 计算小数位数:n = -⌈log₂s⌉。

硬件支持权重缓冲区必须能够动态地将量化值恢复为完整长度的权重,以便神经网络加速器中的计算单元可以识别原始Q格式的权重进行处理。因此,必须在基址和增量表的输出端口添加一个重量化单元,如图5所示,使表输出统一比特位的值,这是计算中使用的通用表示形式。之后,需要一个Q转换器(移位器)将重量化后的基值和增量转换为相同的Q格式。

例如,当基址被量化为具有高斯步长的L位字时,重量化器将通过将该字与选定的高斯分辨率值相乘,动态地将L位量化字恢复为截断的2L位字。该重量化器基于一个定点恒定乘法器。实现恒定乘法电路的一种直接方法是使用CSD(规范符号数字)编码来减少所需的加/减[19]数量。

图5 增量和基表中的数据重量化器

D. 激活数据缓冲区设计

由于采用在线方法将动态生成的数据压缩为增量和基址形式会显著降低系统性能,因此主动数据缓冲区无法采用类似的基‐增量压缩。为此,我们参考了一种快速且低成本的在线基于频繁模式的方法来压缩特征数据集[20]。基于频繁模式的压缩假设输出块由多个重复短模式(如0x0000)组成,而存储处理单元输出的完整长度字会浪费内存空间。相反,如果我们将最频繁出现的模式(如0x00001111(半字))存储在一个紧凑的表中,并用模式索引序列来表示输出数据,则内存空间将大大减少。

基于频繁模式的压缩可以减少由n个处理单元生成的输出字的长度。例如,激活或池化层产生的许多小值可以通过4、5甚至更短的字来存储。一些神经元输出字全为零,或包含多个连续的零位,但通常它们被存储在一个完整的字中。通过使用频繁模式索引来表示这些小值、半零或全零字,可以缩短字长。压缩后,每个数据字被划分为一个前缀和一个局部字,其中前缀用于指示预存在字典中的模式类型,局部字则由相关模式指定的值范围内的多个压缩段组成。最简单的模式表如表3所示,仅包含四种模式。该表显示了存储在活动缓冲区集的索引表中的索引,以及压缩后局部缓冲区中本地数据的大小。在实验中,我们额外使用了八种模式,例如低位1/4为零或高位1/4为零,以获得更好的压缩效果。

表3 字典表中的模式

模式 索引 本地数据大小
全零 00 2位
半字,-16 < v < 16 01 5位
上半部分字,下半部分结尾 10 5位
所有其他模式 11 16位

图6描述了活动数据缓冲区中的压缩和解压缩阶段。数据缓冲区集包括一个模式索引表和一个本地数据缓冲区。每当处理单元输出n个字时,这些字会在并行模式比较器中与预存模式进行比较,以确定每个字所属的模式。同时,比较结果被发送到编码器,编码器将每个字分别缩短为符合其匹配模式所指定范围的本地数据条目。随后,它们的模式索引被连续地写入模式索引表,而缩短后的字则相应地存入本地数据缓冲区。这就是在线数据压缩的完整过程。

在图6的右侧部分显示,在数据AGU的控制下,解压缩器首先使用移位寄存器将来自索引表的输出索引行分割成多个分段模式索引,然后将这些分段模式索引输入到模式解码器。该模式解码器将模式用于索引各个局部字的值范围。模式解码器的输出相加以确定本地数据缓冲区中存储的所有本地数据字的起始偏移量和结束偏移量。结合分割偏移量,来自本地数据缓冲区的输出行可以在移位寄存器中被正确分割为n个未压缩的全长度字,供处理单元使用。

图6 深度学习加速器中中间数据的压缩与解压缩

V. MEMSQUEEZER的实现细节

A. 逐层压缩策略

属于不同网络层的权重或数据集应具有不同的值范围和分布,它们对输出准确率的影响也不相同。因此,区别对待各层可能在压缩率和精度损失之间实现更好的平衡。

对于数据缓冲区,逐层压缩在层间转换时改变数据缓冲区的压缩策略。CNN加速器中有两个数据缓冲区,因为处理层-n必须从一个数据缓冲区(缓冲区-1)读取输入数据,并将输出数据生成到另一个缓冲区(缓冲区-2)。在此过程中,缓冲区-1保存由层-n-1生成的结果,而数据缓冲区-2接收来自处理单元输出的层-n的传入结果+1,这也是层-n的待输入数据。因此,在逐层压缩方案中,必须有两个模式表分别对应这两个数据缓冲区,一个用于输入数据,一个用于当前神经层的输出数据。这两个模式表以交替方式更新,为两个连续层提供不同的编码方案。当层-n完成处理后,属于数据缓冲区-1的模式表-1(层-n的输入缓冲区)将被更新,准备对层-n的输出数据进行编码+1,并将在之后用于解码馈送给层-n作为输入的数据+2。当层-n+1完成后,必须更新模式表-2以对层-n的结果进行编码+2,随后该表将保持静态,直到层-n+3的传播终止。通过这种方式,数据缓冲区可以动态变化,从而为不同层启用不同的压缩方法,相较于在整个传播层中使用静态压缩策略,有望表现出更高的压缩效率。更新模式表会导致流水线停顿,因为处理单元需要等待输入数据。然而,这一时间开销可以被权重重载延迟所隐藏。准备下一层次权重缓冲区中的权重和偏置所需的时间远长于更新紧凑模式表的时间。因此,逐层压缩在加速器中不会引入性能开销。每一层的模式内容可以通过查看目标网络中采样激活值的值预先确定。

根据[21]中的结论以及我们的分析证明,网络中的中间数据很可能落入一种有偏分布,并且这种分布在不同输入下被认为是稳定的。因此,我们可以预先确定每层将使用的模式,并在层切换期间将其重新加载至对应的模式表中。

由于权重在离线阶段已被压缩和量化,因此逐层压缩可以轻松在软件中实现,并且对Memsqueezer权重缓冲区影响较小。

B. Memsqueezer中的计算冗余消除

Memsqueezer还通过预先标注权重和数据集中的冗余值(全零模式或近零模式)带来了提升性能的机遇。如果活动缓冲区能向地址生成单元提供正确的反馈,使其跳过零操作,则将获得显著的性能增益。根据我们的分析,在典型CNN的所有层的特征图和权重中,存在50%-70%比例的零操作数。

对于数据缓冲区,跳过零数据不会对卷积层的求和结果产生任何影响。零模式或半零模式保留在模式表中,可用于指示计算中的零操作数。通过在数据缓冲区中采用基于频繁模式的压缩,可以比解码其他模式更早地识别出数据段包含零字。例如,当数据以两个字为粒度进行压缩时,模式表中的模式索引0011将指示该压缩块包含一个非零字和一个可在处理单元中跳过的零字。

然而,对于激活权重缓冲区而言,由于权重以基于增量的方式进行压缩,检测非零字更加复杂。零字必须在最终生成未压缩权重后才能被检测到。当生成权重块时,内置检测器会将其与零进行比较,从而为处理单元生成零掩码。如图7(a)所示,一个零字检测器位于权重缓冲区的输出锁存器旁边,它将权重行与零(Thsm)进行比较,为n个处理单元生成n位零掩码。

当权重和数据的n位零掩码分别由零检测器和数据缓冲区生成后,如图7(b)所示,需要另一个冗余检测电路来查找足够的零字以形成包含n个空字的发射窗口,从而使对应的发射窗口可以在n个处理单元中跳过,进而进入下一批权重和数据分区。从图7(b)可以看出,数据和权重缓冲区的n位零掩码经过逐位AND操作处理,第一级与门的输出随后被取反并全部输入到一个与门,该与门生成用于计算跳过的单比特冗余指示器。只有当如图7(b)所示的电路在权重或数据缓冲区中检测到n个连续的冗余掩码位时,下一个发射窗口中的数据和权重才能被完全清空,以进入下一批数据和权重。最终的与操作结果被发送至权重和数据AGU,通知其向处理单元发出下一个n个不可跳过的数据‐权重对。

即使由于存在非零输入词而无法跳过当前发射窗口,掩码信号也可以发送到地址生成单元,以防止从数据或权重缓冲区加载零数据,从而仅使未被屏蔽的数据‐权重对被相应的处理单元接收,而其他处理单元则被禁用。

如图7(a)所示,比较器用于“零权重”检测器中,以生成权重的零掩码。通过使用比较器,我们找到了一种更激进的方法,将“小值”标记为零模式,以此在计算精度和能效之间进行权衡,从而提高能效。

在某些情况下追求低功耗操作的嵌入式系统。在此模式下,零掩码的生成方式如下:

$$
\text{Mask} =
\begin{cases}
1 & \text{if } |\text{input data}| \geq \text{Thsm} \
0 & \text{otherwise}
\end{cases}
\quad (2)
$$

其中Thsm是“小数值”的可调阈值。将权重的绝对值与Thsm进行比较,意味着小于Thsm的输入数据也将被丢弃,从而跳过处理单元(PEs)中的相应操作。根据近似计算的思想,小数值有时可被视为噪声,由激活函数过滤,从而仅引起轻微甚至无明显的准确率损失。在一项针对主流CNN模型的案例研究中,它们对小数值近似的敏感性在不同层之间有所差异。为了充分挖掘各层中的小数值以跳过更多的计算冗余,我们根据经验分别为卷积层和全连接层设置不同的阈值Thsm,确保不会出现明显的精度损失。

图7 Memsqueezer缓冲区中的冗余检测器

C. Memsqueezer缓冲区的开销

性能开销 Memsqueezer不会引起性能下降,因为所有压缩和解压缩操作均不在卷积神经网络调用的关键路径上。首先,神经参数在离线阶段完成压缩,不会在加速器运行时引入额外开销。在执行阶段,权重和数据在地址生成单元(AGU)的控制下,以确定性时间步长持续从缓冲区流式传输到处理单元(PE)。与数据解压缩相关的索引地址生成、加法与移位操作被流水线化,并提前若干周期完成,早于相应的PE操作。因此,根据Roofline模型,只要权重和数据缓冲区所使用的带宽等于处理单元的吞吐量,数据解压缩和处理单元计算就可以通过二者之间的桥接问题缓冲区(issue-buffer)以流水线方式执行,此时内存和处理单元均可实现100%利用率。根据采用45纳米工艺技术的设计综合报告[22],外围解压缩逻辑、小数值检测器(SND)以及重量化电路的关键路径和平均动态功耗分别如表4所示。

表4 Memsqueezer的开销

组件 Area (mm²) Area (%) 关键路径延迟(ns) 动态功率 (mw)
基础数据加法器 0.017 0.9% 0.78 1.3
量化器 0.036 1.9% 0.84 2.1
SND 0.032 1.7% 0.67 1.5

硬件开销 Memsqueezer内存不修改标准的单端口SRAM阵列,也不依赖特殊工艺技术。然而,会带来额外的开销由于多个缓冲区和存储体的外围电路、压缩逻辑以及冗余检测电路,面积开销也相应增加。我们使用45纳米工艺技术实现了压缩器和冗余检测电路[22],并利用CACTI评估缓冲区的存储开销。在实验中,我们将公平地比较包含所有这些阵列和外围逻辑的Memsqueezer缓冲区与具有相同面积预算的普通片上缓冲区[11][17]。此外,解压缩器、小数值检测和重量化电路所占用的具体面积如表4所示。

VI. 评估

A. 实验设置

我们实现了集成Memsqueezer的可综合RTL模型的CNN加速器。该CNN加速器系统包括向量化硬件和编译器[17]。编译器处理硬件配置和网络描述文件(Caffe中的*.prototxt[23])作为输入,生成在线控制位和地址模式。此外,我们还构建了一个周期精确的详细仿真器以实现快速仿真。该仿真器包含一个全功能模型,可为各种卷积神经网络生成推理输出,以及一个周期精确的性能模型,基于采用开源45纳米工艺技术实现的加速器综合结果,输出加速器的功率/性能特征。从Synopsys Design Compiler和PrimeTime PX获得的电路级参数被传递给周期精确仿真器,从而使我们的仿真器能够根据组件级活动真实地刻画运行时应用的性能和功率统计信息。

对于网络训练和调优,采用Caffe实现最先进的卷积神经网络,并在包含四路NVidia K40 GPU卡的通用GPU服务器上进行训练。这些CNN生成的权重被输入到仿真器中,以模拟网络推理过程。

基准测试。 我们评估了多个流行的CNN模型:Alexnet、GoogleNet、VGG和NiN,作为Memsqueezer加速器[24]上的工作负载。输入测试数据集来自官方ImageNet库[25]。

实验中有多项重要方案进行对比:

  • 基线 是文献[12]和[17]中描述的VP风格CNN处理器的直接实现。该加速器的硬件描述见表5。加速器的工作频率为800兆赫兹,供电电压为1.0v。表5显示了处理单元(PE)的数量以及基线中普通缓冲区的总存储开销。值得注意的是,基线中的CNN权重和激活值采用16位定点Q格式编码表示,而不是当前主流CPU或GPU中使用的16位或32位浮点表示,因为定点表示能够在精度损失可忽略的情况下实现高效的硬件设计[11]。为了公平比较,本节中的性能及其他评估结果大多相对于基线进行了归一化处理。

  • Memsqueezer(MS) 16位权重/数据将在Memsqueezer中进一步压缩,Memsqueezer是VP风格CNN处理器的一个实例,与基线相同,只是将权重/数据缓冲区替换为所提出的设计。表5还显示了Memsqueezer(MS)缓冲区集的大小,包括所有索引表或其他缓冲区。还可以看出,尽管端口宽度较窄,MS缓冲区仍能提供与处理单元(PEs)相匹配的恒定标称带宽,这证明了其高带宽利用率。表5中的块大小表示MS压缩的粒度,而数量(Num.)表示权重和数据缓冲区集中所使用的缓冲区数量,这些参数是通过设计空间穷举找到的最佳参数,被认为能够为数据和权重带来最高的压缩率。

  • DC DC通过利用网络参数中的稀疏性来实现内存压缩和加速[14]。我们在基线加速器中实现了稀疏性压缩的概念,使其能够将网络参数压缩为压缩稀疏列(CSC)格式,并使所有处理单元跳过权重和激活值中的所有不必要的零操作数。每个处理单元的片上权重和数据缓冲区的大小相应设置为[14]。该方案被称为DC,并在实验中与Memsqueezer进行了比较。

  • 等范数 等范数是一种采用较小片上缓冲区的基线设计实例。权重和数据缓冲区的大小经过刻意配置,使其面积与模型压缩设计的面积相等。

  • BDI BDI是一种基线实现,使用基值‐差值‐立即数(BDI)压缩方法对权重和激活数据进行压缩,该方法将权重/数据块分别分解为两个16位基值和多个8位差值。BDI是一种针对通用处理器中大容量缓存的低开销但高效率的压缩架构。在实验中,所实现的BDI设计包含一个权重缓冲区和两个激活缓冲区,其总芯片面积与MS相同。

表5 已实现加速器的参数

组件 Num. 宽度 Size 带宽
PE 16/32 - 16*(16或32)位 -
数据缓冲区 2 - 2MB 16*(16或32)位
数据缓冲区(MS) 2个索引
2个本地缓冲区
32位 254千字节 16*(16或32)位
数据缓冲区(DC) 32个本地缓冲区 - 128KB 8*(16或32)位
权重缓冲区 1 - 1MB 16*(16或32)位
权重缓冲区(MS) 2个基表
1个增量缓冲区
32位 128KB 16*(16或32)位
权重缓冲区(DC) 1矩阵缓冲区
1指针缓冲区
- 5120KB 8*(16或32)位
偏置缓冲区 1 - 1K -

B. 实验结果

1) Memsqueezer权重缓冲区的压缩效果

首先,我们展示了不同模型中每个卷积神经网络层实现的权重压缩比。图8(a)显示了1B1D权重缓冲区配置相对于16位权重表示基线的权重压缩比,这意味着仅需一个基值和一个增量值即可恢复被划分并分发给处理单元的完整权重块。类似地,xB1D使用x个基值和1个增量值来表示一个权重块。1B1D权重的平均压缩比约为2.44。

图8(b)和图8(c)分别展示了2B1D和3B1D配置相对于基线的压缩比。2B1D的平均压缩比为4.3,而3B1D的平均压缩比为4.6。显然,压缩效果得到了增强。

图8 Memsqueezer权重缓冲区中的压缩比

2) Memsqueezer数据缓冲区的压缩效果

我们还展示了图9中msqueezer数据缓冲区相较于采用16位定点数据表示的非压缩缓冲区的表现。基线是指所有层共享相同模式表的情况,而逐层则表示在层间转换时更新表内容的压缩比。如图9所示,当逐层压缩中模式表的模式数量变化时,压缩比也随之变化。原因显而易见:一方面,增加模式类型会导致选择数据块模式所需的索引字更长;另一方面,使用较少的模式会导致更长的本地数据块必须根据其模式转换为未压缩数据。因此,采用每层模式字典并选择合适的模式表大小对于在数据缓冲区中获得更高的压缩比至关重要。在图9中,逐层数据压缩比约为4.44,比基线高出19%。相比之下,将激活值压缩为CSC格式的DC也实现了3.9倍的压缩比,而BDI同样达到了2.02的压缩率。

图9 Memsqueezer数据缓冲区中的压缩比

3)性能

在图10和图11中,展示了多种方案的性能评估结果。等范数表示普通数据和权重缓冲区的性能,其总面积极耗与Memsqueezer缓冲区相同。CACTI用于确保等范数与Memsqueezer具有相同的开销,以实现公平比较[27]。MS-RE表示在AGUs中启用冗余检测能力的Memsqueezer性能。MS-Retrained是MS-RE的优化版本,利用网络重训练的误差弹性特性,实现更优的压缩和冗余消除效果。例如,为了获得更紧凑的增量表,MS-Retrained有意将相近的增量值合并为一个增量条目,从而使增量缓冲区更小。然而,这种近似会引入额外的网络推理精度损失。因此,在MS-Retrained中,通过调用离线网络重训练步骤,利用网络自适应来补偿精度损失并更新权重。同时,用于跳过接近零输入操作的小数值检测器也会在网络推理中引入精度损失。类似地,MS-Retrained也可以在离线重训练阶段补偿小数值近似的精度损失。在此近似感知网络训练阶段,MS-Retrained调整权重值以使用更少的增量值,并在前向传播阶段去除小数值的权重。随后,反向传播训练将自适应调整网络参数,以补偿潜在的精度损失。这是由于神经网络训练本身具备内在的误差弹性。

图10比较了第一卷积层的推理时间(x10³周期),该层反映了CNN推理中主要计算任务的性能。尽管具有相同的面积预算,MS缓冲区通过压缩工作集实现了更高的容量利用率。因此,MS比Equal-Norm快得多。总体而言,MS的平均性能接近baseline,但比因缓冲区容量有限而导致频繁片外内存访问的Equal-Norm高出1.6x。MS-RE平均比MS快16%,而经过网络重训练优化的MS-Retrained比普通MS快19%。BDI由于提高了缓冲区利用率,也比Equal-Norm高出24%,而DC的性能与baseline非常接近。DC性能表现的原因在于其消除了所有缓冲区未命中,但无法利用卷积层中的稀疏性以达到加速目的。

图11显示了所比较方案的总全层网络推理时间(x10⁶周期)。同样,在所有方案中,MS-Retrained实现了最高速度,平均比等范数快2.2倍。同时,MS和baseline的性能仍然非常接近。与MS和baseline相比,MS-RE由于跳过了零操作数的冗余计算,平均实现了11.7%的性能加速。相比之下,MS-Inter采用较保守的策略合并相似的基值/增量条目,因此加速效果较小。而BDI相比等范数实现了1.4倍的加速,DC相比等范数实现了2.1倍的加速。DC带来的性能加速源于全连接层中基于稀疏性的操作跳过。

图10 Conv-1层的执行时间

图11 总推理时间比较

4) 能耗

在图12中,我们比较了各评估方案的总能耗,包括通过Ramulator[28]分析得到的主存(1GB LPDDR3)能耗。结果显示,MS的能耗仅为基线的76%,而等范数方案的能耗比基线高出321%。节省的能耗来自以下几个方面:1. MS具有更紧凑的片上存储和窄内存端口;2. MS性能更优,因此完成网络推理所需时间更短;3. 权重/数据的压缩体积减少了主存访问所消耗的动态能量。同时,MS-RE相比MS进一步实现了14.6%的能耗降低,因为它不仅跳过了所有零操作数的加载操作,还通过冗余消除加速了计算。MS-Retrained相比MS能耗降低了31.5%。在能耗统计中,多个索引/模式表、局部/增量/基值缓冲区、所有压缩逻辑和冗余检测逻辑的功耗均在仿真器中被准确计入。与MS-Retrained相比,BDI的能耗高出240%,而DC的能耗高出32%。然而,当排除主存能耗时,MS的节能效果更加显著,其能耗仅为基线的27%或等范数方案的54%。

5) 精度损失

与服务器端深度学习应用不同,嵌入式或移动系统在运行近似计算负载时,更希望获得能效更高的解决方案,并通常允许系统在网络推理的性能惩罚与CNN模型精度之间进行权衡[29]。为了实现更高的压缩率并最终提升性能,Memsqueezer也可以牺牲精度以换取硬件效率。它会近似权重缓冲区中的基值/增量条目,并在激进模式冗余检测器中将近零模式近似为零字,如上一节所述。尽管我们谨慎地设置了阈值Thsm以及增量条目合并的阈值,但这两个因素仍可能导致所评估的卷积神经网络出现精度损失。为了验证精度损失的影响,MS和MS-RE配置为仅使用保守近似策略,以避免在网络推理过程中产生精度损失;而得益于感知近似的网络重训练的保护,MS-Retrained可以采用更激进的方法以及更高的阈值来合并增量值并定义“零”操作数。在实验中,我们使用仿真器对来自ImageNet的5万张随机图像分别使用MS-RE和baseline进行分类,并在表6中展示它们的准确率。可以看出,MS-RE和MS的准确率几乎与baseline相同。对于MS-Retrained,由于网络重训练的补偿作用,其分类准确率仅略低于baseline(平均落后<0.6%)。从表6可以看出,MS-Retrained可将权重缓冲区的压缩比平均提高21.6%,并在少量精度损失的情况下将冗余消除效果提升15%。已知浮点表示能够提供更好的准确率,因此我们也展示了在通用图形处理器(GPGPU)上运行的32位浮点网络(Float32)的准确率。与其他无数据近似效果的压缩方案相比,MS因引入数据表示误差而导致准确率损失,但结果表明Memsqueezer的准确率损失仍然非常微小。

图12 网络推理能耗

表6 分类准确率对比

基线 相等-Norm MS MS-RE MS-Retrained DC MS-Inter Float32
Alexnet 80.4% 80.4% 80.4% 78.7% 79.2% 80.4% 80.4% 80.3%
NiN 79.4% 79.4% 79.4% 77.7% 78.3% 79.4% 79% 79.47%
Gnet 89.1% 89.1% 89.1% 86.1% 88.3% 89.1% 88.6% 89.3%
Vgg 88.4% 88.4% 88.4% 87.2% 88.1% 88.4% 88.4% 88.5%

权重量化重映射也会导致精度损失,因为基值/差值在基值/增量表中的位宽减小,尽管使用重量化是为了最小化信噪比损失。当量化器的位宽减小时,由于信噪比损失,图像分类准确率将下降。因此,通过控制量化器的位宽,压缩比与分类准确率损失之间将存在权衡,如图13所示。用户可根据片上存储空间的可用性以及应用对输出质量的限制,在该曲线上选择一个量化点,以在准确率和压缩比之间进行折衷,这对于实际中既需要服务质量又需要输出准确率的嵌入式系统具有重要意义。

图13 分类准确率对比

VII. 相关工作

深度学习加速器有大量的文献介绍了基于FPGA或粗粒度可重构架构的CNN加速器[5][7]。例如,Neuflow采用自动映射工具将数据流转换到基于FPGA的处理器上。除了FPGA之外,还有一系列面向CNN的加速器或专用处理器被实现为专用集成电路(ASIC),以利用内存分块和CNN推理中的确定性数据访问模式来实现内存级优化[6][30][12]。例如,DianNao具有专用指令集,通过循环展开和内存分块来加速小规模卷积神经网络推理[12][17]。像DNA这样的粗粒度可重构设计能够通过在线重构策略性地将不同的卷积核映射到底层的处理单元[32][31]。这些深度CNN加速器非常重视内存优化以保持局部性,并且通常避免昂贵的随机内存访问,依赖内存与处理单元之间的连续数据流来实现高吞吐量,而传统数据压缩方法会破坏这种连续性。在近期的研究中,脉动架构也因出色的数据重用性和处理单元可扩展性而被广泛用于构建CNN加速器[14][15][16][32]。

CNN压缩架构稀疏化是一种通过在训练阶段对网络进行剪枝来减小神经网络规模的常用方法[3]。Nguyen等人提出减少激活值数量以实现工作集压缩和加速[2]。深度压缩[3]进一步通过剪枝、量化和霍夫曼编码对权重进行压缩,从而降低存储开销

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值