面向稀疏卷积神经网络的CGRA 加速器研究①

2024-03-20 08:21严明玉吴欣欣李文明吴海彬范东睿
高技术通讯 2024年2期
关键词:加速器能效权值

谭 龙 严明玉 吴欣欣 李文明 吴海彬 范东睿

(*中国科学院计算技术研究所处理器国家重点实验室 北京 100190)

(**中国科学院大学 北京 100049)

稀疏卷积神经网络(convolutional neural network,CNN)在可接受的精度损失范围内可以减少稠密卷积神经网络对硬件计算和存储资源的需求,因此被应用在各种应用场景中,如自然语言处理领域[1]、图像识别[2]和无人驾驶领域[3]。不幸的是,由于稀疏卷积神经网络本身的稀疏性和不规则性,导致稀疏卷积神经网络在通用处理器上执行时面临访存效率低、硬件利用率低等问题,这些问题严重阻碍了其性能和能效提升。

目前大量工作针对CNN 提出了基于应用特定集成电路(application specific integrated circuits,ASICs)设计的定制化加速器[4-9],这些加速器根据CNN 特性定制化数据通路和计算单元来高效支持稀疏CNN 运行。然而由于这些加速器是高度定制化的,一旦电路制造完成就无法改变,缺乏可重配置性和可编程性,无法适用于演进的神经网络模型。例如DianNao[4]、NeuroMAX[5]等加速器是针对稠密神经网络设计,无法有效地加速稀疏神经网络。Cambricon-X[6]和SparseTen[7]等加速器针对稀疏神经网络定制化计算单元和数据通路,但是对稀疏处理局限于某一种稀疏性上,同时由于缺乏灵活性,仅对特定模型有效,无法让更多网络模型均取得性能和能效提升。

本文提出了一种针对稀疏CNN 设计的高能效且灵活的架构DyCNN。为了灵活地支持不同稀疏卷积神经网络的执行,DyCNN 从不同的稀疏CNN的运算中抽象算子并定义精简指令,同时设计轻量级的计算单元来支持稀疏CNN 的操作。此外,DyCNN 利用粗粒度可重构架构(coarse-grained reconfigurable architecture,CGRA)[10]中的粗粒度数据流并行性可实现指令的高并行性,进一步提升稀疏CNN的执行效率。

然而稀疏卷积神经网络中不仅存在权值的稀疏性,同时存在激活函数产生的激活值稀疏性。权值稀疏性在训练结束后确定下来,在前向推理过程中保持不变。但由于激活值是前向推理中动态产生的,其稀疏性具有动态性。因为同时存在以上2 种稀疏性,基于CGRA 为稀疏CNN 设计高效加速器主要面临着以下2 个挑战:(1)2 种不同稀疏性带来大量不同的冗余计算和访存指令,导致处理单元之间不能高效共享一组片上指令,使得整体的性能和能效较低;(2)当稀疏CNN 被映射在处理单元上执行时,稀疏性不规则分布导致处理单元之间负载分布不均衡,整体硬件利用率较低从而阻碍了整体性能的提升。

为解决上述2 个挑战,本文在DyCNN 设计中分别提出了以下2 个解决方法:(1)设计了基于数据感知的指令动态过滤机制来消除稀疏性带来的影响;(2)提出了基于负载感知的动静结合负载均衡策略来实现处理单元之间的负载均衡。

本文的主要贡献如下。

(1)提出了一种基于CGRA 的高能效且灵活的稀疏卷积神经网络加速结构DyCNN,它具有轻量级流水线以支持稀疏卷积操作,同时可利用数据流执行模型来实现指令的高并行性。

(2)设计了基于数据感知的指令动态过滤机制,以消除每个处理单元中由于2 种稀疏性产生的不同无效指令,从而让各处理单元之间可高效重用同一组片上指令,避免耗时的片外指令访存。

(3)设计了基于负载感知的动静结合负载均衡策略,实现了处理单元间的负载均衡,提高了整体硬件利用率,从而提升了整体的性能和能效。

(4)基于RTL 来评估DyCNN 面积和能耗,并使用详细微架构模拟评估DyCNN 的性能和能耗。Dy-CNN 在运行稀疏CNN 时比运行密集CNN 实现了平均1.69 倍的性能提升以及3.04 倍的能效提升,比先进的GPU(cuSPARSE)和Cambricon-X 上的解决方案分别实现了2.78 倍、1.48 倍性能提升和35.62倍、1.17 倍能效提升。

1 相关工作

1.1 针对稠密CNN 的专用加速器

目前针对稠密CNN 提出的专用加速器已经得到了较好的发展。DianNao[4]利用硬件化的神经元和突触实现对CNN 中乘加法的支持,利用较小的面积和能耗实现了针对CNN 的高吞吐量的专用处理器。NeuroMAX[5]提出了一种基于移位器实现的对数计算单元,并且设计了一个二维权值广播数据流执行模式来减少片外访存和提高计算单元的硬件利用率,从而提升了整体性能和吞吐量。但是以NeuroMAX 为代表的稠密卷积神经网络加速器无法高效地支持稀疏CNN 的执行。与此不同,本文的目标是设计一个能灵活高效支持稀疏CNN 模型执行的加速结构。

1.2 针对稀疏CNN 的专用加速器

由于稠密CNN 加速器的局限性,现在出现了很多为稀疏CNN 设计的专用加速器[4-9]。这些专用神经网络加速器的目标是通过去除激活值或权值中的零值数据来提升稀疏卷积神经网络的执行性能和能效。为了实现稀疏加速,Kung 等人[8]提出的将稀疏的权值矩阵转化成单个稠密列矩阵的方法,提高了稀疏CNN 在脉冲阵列结构上执行的硬件利用率。以上工作虽然有一定的加速效果,但要么无法对卷积层实现加速,要么是只考虑了单一稀疏性,仍然存在优化空间。而本文的目标是综合考虑权值和激活值两者的稀疏性,对稀疏CNN 实现全方位加速和能效提升。

目前也有综合考虑2 种稀疏性的优化研究工作,如Cambricon-X[6]利用权值稀疏性在其片上缓存中仅保留非零权值,但是没有对激活值数据进行压缩处理,因此可以减少零值权值对应的计算和访存时间,但激活值的稀疏性仍然会带来计算和访存浪费。SparseTen[7]提出使用新颖的位掩码来表示稀疏张量,基于此来实现内联接计算稀疏向量-向量乘法,提升了稀疏卷积运算的效率。虽然这些加速器都实现了性能和能效提升,但是由于硬件结构缺乏可重配置和硬件灵活性,无法很好地适用新的神经网络模型。与以上加速器对比,本文基于CGRA 架构提供了更高的硬件灵活性和更广的适用范围。针对不同模型特点,它可以随着稀疏CNN 模型的演进和变化增加或删减指令,重新配置硬件结构和映射方式来支持更多的稀疏CNN 模型。

1.3 基于CGRA 的神经网络加速器

CGRA 近年来因为其兼具高可编程性和高性能而得到了广泛的关注,目前已有工作基于CGRA 设计神经网络相关的加速器。Ando 等人[11]基于CGRA 为稠密CNN 提出了一个时域多线程加速器。它可以通过多个计算阶段来提高输入数据的局部性和重用性,但是该加速器无法高效支持稀疏CNN 的运行。CQNN[12]基于CGRA 提出了一个针对量化神经网络加速框架,可以灵活地配置硬件结构来支持各种精度的神经网络执行。但是它同样无法支持稀疏化CNN 的执行。与以上工作不同的是,本文目标是基于CGRA 设计高能效且灵活的稀疏卷积神经网络加速器以支持演变迅速的稀疏网络模型。

2 背景

本节首先介绍稀疏卷积神经网络,以及稀疏卷积神经网络中的2 种数据稀疏特性,之后介绍粗粒度可重构架构(CGRA)。

2.1 稀疏卷积神经网络

目前主流的CNN 模型通常通过构建深层网络结构来实现较高的准确率。CNN 模型中计算层主要包括卷积层(CONV)、池化层(POOL)和全连接层(FC)。其中卷积层执行时间占据了整个网络模型处理执行时间的80%以上[13],因此卷积层无疑是整个CNN 模型的瓶颈所在。每个卷积层由高维卷积操作组成,它通过把过滤器(Filters)应用到输入激活(input activation,IA)上,两者进行卷积操作来提取输入激活的局部特征。在卷积操作完成之后,会利用激活函数来引入非线性因素生成输出激活(output activation,OA),比如整流线性单元(rectified linear unit,ReLU)[14]是常使用的激活函数。其中Filters 的值是使用训练算法[15]对网络进行训练学习得到的权值(Weights)。

图1 展示了一个完整的卷积计算的可视化过程,表1 中列出了卷积计算中的主要参数,通常一个CNN 模型中包含多个连续的卷积层,OA 在相邻卷积层之间传递,上一个卷积层生成的OA 作为下一卷积层的IA 参与卷积运算,如此迭代下去,直到所有卷积层计算完成。

表1 卷积层的参数信息

图1 CNN 模型计算流程

由于CNN 模型越来越复杂,参数越来越多,增加了对计算和存储硬件资源的需求。因此有研究人员提出了许多压缩CNN 模型参数的方法(例如剪枝[16]),这些方法对结果精度损失影响较小,同时可以大量减小模型参数大小,从而减少CNN 对计算和存储的需求。然而,上述对模型参数压缩的方法会导致网络模型的权值参数包含了大量的零值,因此权值参数的稀疏性较高。在Han 等人[16]研究中,Alex-Net[17]、VGG16[18]等网络模型通过剪枝后的权值稀疏度(零值的数据量占数据总量的比率)能高达90%以上[16]。这种稀疏性是伴随模型参数训练完成而产生的,在使用稀疏卷积神经网络前向推理过程中,权值稀疏性不再发生改变,因此可视为一种静态稀疏性。

在稀疏CNN 执行过程中,由于通常包含了激活函数,比如ReLU 函数,它将输出激活中小于0 的数置为0,从而在输出激活中产生了稀疏性。由于0与任何数据进行乘法操作,结果为0,与另一值进行加法操作,结果与该值相等,因此0 被视为无效值,其参与的计算操作被视为无效计算,可以去除。但与权值稀疏性不同的是,激活值稀疏性是在计算过程中激活函数确定的,无法在前向推理执行前提前得知;同时由于随着上一卷积层生成的OA 作为下一卷积层IA 计算并不断迭代,所以该稀疏性在执行中是传递性的,因此可视为一种动态稀疏性。

2.2 粗粒度数据流架构

CGRA 从20 世纪90 年代开始迅速发展[19]。这种架构是基于20 世纪60 年代提出的可重构计算概念的自然粗粒度实现[20]。它不仅像ASIC 一样具有高能效和高性能,而且还具有出色的可编程性[21]。

CGRA 与数据流体系结构[22]关系密切,它们通常与数据流机制集成在一起,因此CGRA 的操作可以由数据流驱动。CGRA 内部通常由一个二维处理单元(processing element,PE)阵列组成,CGRA 的配置信息定义了这些PE 的功能和它们之间的互连关系。CGRA 可以通过互连网络利用PE 之间的高效数据流执行方式,这是传统处理器结构不支持的方式。通过有效的数据流和控制流的结合,CGRA 可以避免PE 之间的过度顺序化执行,利用粗粒度并行性提升执行效率。同时CGRA 可以进一步支持PE 之间的显式数据通信,从而减少PE 之间数据移动的能耗。因此这种具有数据流和控制流结合的混合模式是CGRA 同时具有高性能和高能效的重要原因。基于以上分析,本文利用CGRA 去优化稀疏卷积神经网络执行,可以在不牺牲可编程性的情况下实现DyCNN 的高性能和高能效。

为了充分提高指令的并行性,DyCNN 在PE 阵列层级采用经典的数据流并行执行模型[23]。如图2(a)所示,在该执行模型中,CNN 应用被编译划分成多部分指令块(如C1~C9 等)。每个指令块中包含一系列硬件指令。所有的指令块根据依赖关系将应用程序表示为数据流图,然后将其映射到图2(b)所示的二维PE 阵列中执行。与PE 间的执行模型不同,在每个PE 内部,指令块采用顺序流方式执行。

图2 指令在PE 上映射方式和稀疏导致PE 的指令重用差异

3 稀疏卷积神经网络面临的挑战

本节通过分析稀疏卷积神经网络在CGRA 上执行的挑战和先前工作的不足来阐述本文工作的设计理念和设计要素。

3.1 两种稀疏性并存导致大量无效指令

由2.1 节可知,在稀疏卷积神经网络中存在着权值和激活值2 种稀疏性,在稀疏卷积神经网络前向推理过程中,会生成大量权值和激活值中零值相对应的指令。由于在矩阵乘法运算中,零值参与的计算对结果不会产生任何影响,因此这些数据对应的计算被视为无效计算。这些无效计算对应的指令访存、数据访存和指令执行的时间和能耗会导致稀疏卷积神经网络在CGRA 上执行性能和能效大幅降低。

如图2(c)所示,PE1、PE3 分别运行2 个通道3×3 的Filter 和3 ×3 的IA 的卷积运算(黑粗线框标示出来的部分)。若为稠密网络,运行一个通道卷积运算的一组指令模板共包含如图2(d)所示9 组指令,其中主要包含了读取数据和乘加运算。其中图2(c)中矩阵中标灰的代表有效数值,白色的代表无效值,无效值所对应的图2(d)中指令组是无效指令,这些无效指令的执行会占据大量的时间,严重阻碍了整体性能和能效的提升。

目前已有工作通过排除固定的权值稀疏性来提升性能,但仍然面临着存在激活值稀疏性的问题[6,24]。如果在CGRA 上只是通过预先感知权值的固定稀疏性,虽然一定程度上能去除各PE 中部分无效指令的执行,但是由于稀疏数据的分布不规则,各PE 之间执行的指令差异较大,使得片上PE 无法重用相同的指令,每个PE 都需要从片外访存自身的指令,从而增加耗时较长的片外指令访存。如图2(c)所示,由于PE 所执行的稀疏数据分布不一致,图2(d)中对应有效执行的指令(黑粗线框标出)也差异很大,如对于PE1,第2、5、7、8 组指令为其有效数据对应的真正有效的指令,而对PE9,第1、2、5、6、9 组指令才是真正有效的指令。若采用此方法,会导致各PE 之间无法共用同一组相同指令模版(只需要根据配置修改数据访存地址),需要单独地去片外访存自身有效数据对应的有效指令。这种高延迟的指令访存导致PE 计算部件处于空闲等待状态,降低了整体硬件的利用率,从而降低了整体执行性能并增加了能耗。

为了支撑这一点,本文构建了一个典型的CGRA 加速器模型,并使用工作[6]中的稀疏去除方法分别运行AlexNet 和VGG16 对应的稠密网络和稀疏网络,收集其指令执行和指令访存时间。图3 所为AlexNet(第CONV2 层到第CONV5 层)和VGG16(第CONV3_1 层到第CONV5_3 层)对应稠密(De)和稀疏(Sp)卷积网络中指令的访存时间和执行时间分解。从图3 中可以看到,稠密卷积操作中指令的访存时间仅占总时间的1%~2%,绝大部分的时间被指令执行时间所占据,这意味着在片上指令的重用性很高,耗时指令的片外访存较少,整体硬件利用率较高。与此不同的是,在执行稀疏卷积操作时,可以看到指令访存时间占总时间比例比较大,最高在VGG16 的CONV5_1 层能达到60%。虽然稀疏卷积操作中指令的执行时间较稠密卷积操作有所减少,但是因为耗时较长的片外指令访存和未去除的激活值稀疏性,导致总体的执行时间要比稠密卷积操作甚至更长。从图3 中还可以看出输出激活值的稀疏度也较高,比如AlexNet 的CONV5 层能达到90%,因此如何有效去除稀疏卷积神经网络中2种并存的稀疏性带来的影响对于提升执行效率和能效是一个迫在眉睫的问题。

图3 AlexNet 和VGG16 运行时间分解(左坐标轴表示稠密(De)和稀疏(Sp)网络指令执行时间分解,并且将Sp 的执行时间归一化到De;右坐标轴表示输出激活值稀疏度;最后一组柱线展示各层De 和Sp 的几何平均值(GM))

在粗粒度可重构架构中,每个PE 内可配置独立的取指和控制单元,因此本文提出了数据动态感知的指令过滤机制来使得每个PE 在指令执行时过滤掉无效值相关的冗余指令,从而避免冗余指令和数据访存操作,同时使得每个PE 之间仍然能像稠密网络一样高效共享同样的片上指令,减少耗时的指令片外访存,从而去除稀疏性带来的影响。

3.2 稀疏性导致处理单元之间负载不均衡

由于稀疏卷积神经网络在前向推理过程中存在着权值和激活数据两方面的稀疏性,并且稀疏性分布十分不规则,因此将负载分配给CGRA 中不同PE执行后,会导致不同PE 之间的负载分布不均衡。具体表现为有些PE 处于忙碌,而有些PE 处于闲置等待状态,从而导致整体硬件资源利用率较低,性能较差,能耗较高。

根据3.1 节中实验统计执行CONV5_1 层处理单元的计算部件利用率,从图4 中可以看到不同PE之间的计算部件利用率(实际性能和理论峰值性能的比值)相差很大,其中有些PE 计算部件利用率能够达到接近60%,但是有些PE 计算部件的利用率仅有20%。这种相差较大的计算部件利用率会导致PE 之间互相等待,运行慢的PE 拖慢了整体的执行速度,延长了整体的执行时间,从而降低了整体的硬件资源利用率,严重阻碍了整体性能的提升。在负载不均衡的情况下,稀疏CNN 的执行效率低下,整体性能难以提升。为了充分利用稀疏网络的计算和存储优势,稀疏卷积神经网络的负载不均衡问题亟待解决。

图4 同一行和同一列PE 中的计算部件利用率

在初始化阶段进行负载划分时,可以先通过感知静态的权值稀疏性和输入激活的动态稀疏性,采用加权轮询方式进行均衡分配。在执行过程当中,新的输出激活值不断生成,结合3.1 节中提到的数据动态感知方式可以实现相邻PE 之间动态负载窃取和调度,从而进一步实现负载均衡,提升整体硬件的利用率。

4 DyCNN 加速结构

本节介绍本文基于CGRA 提出的架构DyCNN,首先介绍整体结构和执行方式;然后介绍为了消除由于权值和激活值的稀疏性影响设计的数据动态感知的稀疏去除机制和多阶段之间的流水化执行机制;最后阐述为了提高硬件利用率设计的动静结合的负载均衡策略。

4.1 DyCNN 整体结构介绍

本文提出的架构如图5(a)所示,它主要由处理单元(PE)、控制器、权值和激活值静态随机存取存储器(static random access memory,SRAM)以及片上网络组成。平铺的PE 之间通过片上网络互连。控制器包含了状态寄存器和负载调度器,负责整体PE阵列的状态收集和负载控制。权值和输入输出激活值存储在相应的片上SRAM 中。如图5(b)所示,每个PE 也由一个控制单元、指令和操作数缓存、路由器以及一个消除数据相关的轻量级计算单元组成。每个PE 中都包含翻译器、指令选择器,它们是实现数据动态感知机制的主要单元。图5(c)展示了Dy-CNN 为支持稀疏CNN 操作而定义的指令格式,其中具有保留位,可以根据新的CNN 模型轻松进行扩展,从而能支持演变迅速的CNN 模型。

图5 DyCNN 的结构图概览

同时为了提高数据在片上的重用性,DyCNN 采用了行列共享的负载划分和映射执行模型(row-column sharing scheme,RCS)。如图6 所示,本文将IA按行划分成的行分区,保证每个行分区的非0 值基本相同,并且将不同的行分区映射给不同的PE 行执行,这样位于同一行的PE 可以共享相同的IA 行分区。与此同时将并列不同通道的Filter 映射给不同列的PE 执行,从而使得位于同一列的PE 共享相同的Filter。通过以上的映射执行方式,可以有效地提高片上PE 之间对IA 和Filter 的共享和重用性,减少耗时的片外访存。

图6 数据映射执行模型

4.2 数据动态感知机制

由于激活值稀疏性是在计算过程中动态生成和在不同卷积层之间传递的,因此为了有效地感知激活值稀疏性,本文提出了基于位图(bitmap)的数据动态感知机制。该机制主要思想是通过将权值和激活值在计算过程中动态地转换成bitmap,然后通过感知对应的bitmap 的值来判断数据是有效还是无效,进而通过数据的无效性和有效性来判断指令的有效性。在bitmap 中,使用1 bit 来表示数据的有效性,其中0 表示数据无效,1 表示数据有效,可以对数据实现高效的压缩存储,减少了感知稀疏性的成本和额外开销。

如图7 所示,数据翻译器的功能是动态地实现激活数据感知,它从存储输出激活值的缓存中读出输出激活值,然后将输出激活值中的每个数值执行按位或(OR)操作,生成1 bit 的数值结果来代表该数值的有效性。如果该数值的所有数值位bit 不全为0 时,通过OR 操作则会生成1 bit 为1 的数值,代表该数值为有效数值,会参与有效计算。如果输出缓存所有数值位的全为0,则会生成1 bit 为0 的数值,代表该数值为无效数值,该数值参与的矩阵运算是无效计算。生成的输出激活值对应的bitmap 会被存储在bitmap 缓存中。权值数据同样可以利用数据翻译单元来将其转换成bitmap 存储在缓存中。不同的是,因为权值数据在前向推理过程中是静态的,在稀疏卷积神经网络前向推理过程中,只需要在初始化时执行一次数值和bitmap 转换即可,不需要重复转换;而输出激活数据在多层卷积的模型下是动态生成的,因此在每层生成一次新的输出激活数据时,需要使用数据翻译单元将输出激活数据转换成新的bitmap 存储在缓存中,以供后续指令选择单元使用。

图7 数据动态感知和指令动态过滤机制

4.3 基于数据感知的指令动态过滤机制

为了通过感知数据的稀疏性,去除每个PE 上冗余无效指令,使得每个PE 能够共享同一组指令并避免冗余指令的片外访存,本文设计了指令选择器来对无效数据对应的计算和访存指令进行筛选。首先通过数据翻译单元动态地将权值数据和输出激活数据转换成bitmap 存储,接下来需要利用权值数据和输出激活数据的bitmap 对指令进行相应的筛选。

图7 展示了指令选择单元对PE 中指令的筛选过程,主要包含2 个阶段。第1 阶段:首先指令选择单元将IA 的bitmap 和Filters 的bitmap 从相应缓存地址中读出;然后将IA 和Filters 参与计算的对应数据的作按位与(AND)运算,从而得出数据位对应的指令标记,并将指令标记存储在指令标记缓存中。如果对应的指令标记为0,则代表对应的指令为无效指令,这部分指令是过滤目标。

第2 阶段:在得到指令标记信息之后,指令选择单元从指令标记缓存中取出相应的标记,根据相应的标记信息去指令缓存中取出对应有效的指令,并且将对应有效的指令送进流水化计算单元中进行执行。指令控制单元不断从指令标记缓存中读取指令标记,并对指令标记信息逐条筛选,将每条指令标记为1 的指令筛选出来送进计算单元执行;而指令标记为0 的指令则不执行;直到所有的指令标记信息检测结束。

4.4 指令执行和选择阶段流水化

第4.2 和4.3 节展示了本文设计的数据动态感知和指令选择单元主要结构和执行流程。可以看出本文在每个PE 内部指令的执行主要划分为以下3个执行阶段:(1)数据翻译阶段:负责将权值数据和激活数据动态转化成存储需求较小的bitmap 格式,从而压缩数据存储,并且用于之后的指令选择阶段实现去除稀疏性带来的冗余指令;(2)指令选择阶段:首先利用数据翻译阶段生成的数据bitmap 来感知数据的有效性,利用数据的有效性生成指令标记信息,并且利用指令标记信息选择出有效的指令;(3)计算阶段:将指令选择阶段筛选出来的有效指令和数据读取出来并送入计算单元执行真正的有效计算。

如图8 所示,为了提升每个PE 内以上3 个执行阶段的执行效率,本文的设计将这3 个执行阶段流水化执行。因为片上存储以双缓冲的形式组织,可以一部分用于存储正在计算的数据,一部分用于存储下一阶段需要执行的数据,因此可以有效避免不同阶段流水化执行的阻塞问题。在一个PE 内部,当一部分数据进入数据翻译阶段之后,随着bitmap数据的慢慢生成,这部分数据可以直接进入指令选择和计算阶段,以很好地将数据翻译、指令选择和计算阶段的时间重叠起来,从而掩盖掉数据翻译和指令选择的时间开销,最大程度地减少稀疏去除机制带来的性能损失。

图8 各阶段流水化执行策略

4.5 基于负载感知的动静结合均衡策略

权值和激活数据的稀疏不规则性,导致分配给每个PE 的权值和激活值有效数据数量不均衡,每个PE 之间出现负载不均衡现象。为了充分提高DyCNN 中整体计算部件的利用率,本文提出了基于负载感知的动静结合的负载均衡策略。前人工作[24]提出基于权值中有效值数量来进行负载的划分和映射,它将PE 阵列按列进行分组,并使得同一组的PE共享同一组权值;对于不同的组之间基于权值中非零权值个数去进行划分,使得不同组之间划分得到的权值中非零值数量尽量均衡。这种负载均衡策略只考虑了权值静态稀疏性的影响,没有解决激活值动态稀疏性带来的影响。因为激活数据的稀疏性是在计算过程中动态变化的,DyCNN 不能简单采用初始化负载映射算法来保证负载均衡,所以本文为DyCNN 提出感知数据的静态和动态相结合的负载均衡策略。

根据4.1 节中的描述,为了增加片上指令和数据的重用性,减少片外的访存,DyCNN 采用了如图6所示的负载映射和执行方式。这种映射执行方式进一步增加了IA 和Filters 的片上重用性。但是每层的IA 和Filters 都存在稀疏性,IA 和Filters 两者都是影响不同PE 之间负载均衡的因素,因此在进行负载初始划分时,DyCNN 需要综合考虑IA 和Filters中的有效值数量来实现负载的均衡分配。

首先介绍静态负载均衡策略。由于水平方向上的PE 复用相同的IA,所有对应IA 的有效工作负载一致;同理垂直方向上的PE 复用相同的Filters,所以它们之间的有效工作负载基本一致。基于此,在进行负载划分时,先利用4.2 节的稀疏感知机制,对有效工作负载进行统计,对于每个PE 列,它们被映射新的Filters 时采用加权轮询算法按非零权值的数量排序依次分配给具有不同权重的PE 列。含有较少负载的PE 列权重则高,优先被分配有效值多的Filters;含有较多负载的PE 列权重则低,会被分配有效值少的Filters。如图9 所示,假设一共有6 个具有不同非零权值数量的Filters(如F1 的权值数量是20)分配给3 列PE 执行,采用先将F1~F6 按非零权值数量进行排序,然后按大小轮流分配给各列PE。DyCNN 将IA 按行进行分区划分,然后分配给每个PE 行,同时保证每个行分区的非零值数量基本相等。

图9 基于加权轮询的静态负载均衡策略

其次介绍动态负载均衡策略。为了在运行时解决由于动态变化的输入激活稀疏性导致的负载不均衡问题,DyCNN 在静态负载均衡策略基础上进一步设计了一个动态均衡策略(dynamic balancing scheme,DBS)。它主要由2 个因素驱动:(1)不同PE 行之间是共享输入激活的,且输入激活是动态生成的;(2)通过使用RCS 负载映射方式,DyCNN 可以避免PE 访问彼此不同输入激活之间的同步操作。

对于动态均衡策略的第1 个设计是如何有效表示工作负载的,如第4.1 节所述,DyCNN 的工作负载由输入激活的连续行分区表示。因此DyCNN 选择在输入激活矩阵的行分区中使用开始索引IS和结束索引IE来表示负载范围,这2 个变量存储在片上缓存中。

第2 个设计是工作负载窃取方案。前人工作通常在工作队列中加入同步原语,或者为闲置单元中断忙碌单元。这些方法都会带来巨大的开销。相反,本文利用DyCNN 中控制器的状态寄存器来减少开销。DyCNN 中的处理单元只需访问状态寄存器中各处理单元IS和IE的值即可实现在不中断被窃取单元当前的工作情况下完成负载窃取。

算法1 展示了本文的DBS 具体实现。最初每个处理单元Pi都分配有具有相同数量的非零值的行分区,由索引IS和IE定义负载区间。每个线程使用一个同步变量锁来保证负载窃取的原子性。每个处理单元对卷积运算的处理从IS开始,当IS=IE时,处理单元已完成其初始工作量并进入空闲状态,然后请求选择一个相邻忙碌的处理单元Pv进行负载的窃取。在DyCNN 中选择让闲置处理单元窃取忙碌处理单元一半的工作量,因为它已在前人工作中证明效果较好[25]。

5 实验与结果

本节将展示DyCNN 执行稀疏化之后的AlexNet和VGG16 的卷积层相比稀疏化之前的加速效果,并将优化效果与先进的通用架构图形处理器(graphics processing unit,GPU)和稀疏卷积神经网络加速器Cambiricon-X 上的方案比较从性能、能效两方面提供详细的结果对比和分析。

5.1 实验平台配置和对比基准

为了评估DyCNN 的有效性,本文用Verilog 实现了DyCNN 的结构,并使用Synopsys 公司的编译器和台积电12 nm GP 标准VT 库工艺进行综合来准确评估DyCNN 的功率和面积。为了对DyCNN 进行准确的性能评估,本文基于中国科学院计算技术研究所自主研发的大规模并行模拟框架SimICT[26]实现时钟精确型的模拟器并使用Ramulator[27]来集成存储子系统。整个加速器的面积为14.22 mm2,单个PE 面积为0.16 mm2。片上SRAM 的面积、功耗和访问延迟使用Cacti 6.5[28]估算。

表2 展示了用于评估的系统配置信息。本文首先从性能和能效方面对在DyCNN 运行稀疏CNN 与运行密集CNN 进行对比,评估并验证DyCNN 中针对稀疏优化方法的有效性。除此之外,本文还将DyCNN 与NVIDIA Titan XP GPU(基于cuSPARSE[29]实现)和Cambricon-X 进行性能和能效的对比。最后,本文使用计算部件利用率和指令减少数量来分析DyCNN 针对稀疏CNN 提出的优化策略效率。

表2 参与评估结构的配置信息

为了全面地验证DyCNN 的效果,本文选取了应用广泛的AlexNet 和VGG16 卷积神经网络模型中几个典型的卷积层来评估DyCNN 的性能和能效。表3 展示了以上2 种CNN 模型中各卷积层的参数,其中Weight 的稀疏度表示AlexNet 和VGG16 的稠密网络稀疏化成对应稀疏网络后每层的Weight 稀疏百分比。

表3 CNN 模型的参数信息

5.2 结果分析

(1)性能

在图10 中,本文首先比较了DyCNN 执行稀疏CNN(DyCNN-Sp)归一化为DyCNN 执行稠密CNN(DyCNN-De)的性能加速比。所有卷积层性能加速比的几何平均值(geometric mean,GM)在最后一组柱线中标记为GM。总体来看,DyCNN 在执行稀疏CNN 相比执行稠密CNN 实现了1.69 倍的加速。一方面,DyCNN 执行稀疏CNN 的性能提升主要来源于DyCNN 通过数据感知的指令动态过滤方式去除了2 种稀疏性带来的无效指令和数据的计算和访存,使得各PE 之间可以高效共享同一组指令,提升了片上指令和数据的重用效率,从而提升了整体性能。除此之外,稀疏CNN 相比稠密CNN 具有占用内存小的特征,从而可以在片上存储更多的指令和数据,进一步减少了高延迟的片外访存。另一方面,通过使用基于数据感知的静态和动态负载调度策略相结合的方法,DyCNN在执行稀疏卷积神经网络时具有更高的硬件利用率来提升整体性能。然后详细分析具体卷积层之间的性能提升情况。通过图10 可以发现,DyCNN 在AlexNet 的CONV2 层性能提升最多为2.60 倍,表明加速器对大的Filter 的卷积层加速效果更明显。同时,由于VGG16 的CONV1_2 层激活稀疏度较低,与其他卷积层相比,加速效果只有1.28 倍。

图10 DyCNN 运行稀疏与运行稠密网络、GPU 和Cambricon-X 的性能加速比

为了进一步展示DyCNN 的性能优势,图10 展示了使用DyCNN 与GPU、Cambircon-X 分别运行AlexNet 和VGG16 稀疏CNN 的加速比。从图10 可以看到,DyCNN 的性能是GPU 性能2.78 倍,DyCNN性能相对于Cambricon-X 的加速比是1.48 倍。整体来说,DyCNN 可以通过高指令并行度来支持稀疏卷积神经网络的执行,更重要的是,DyCNN 可以通过数据感知的数据翻译和指令选择单元过滤掉各PE 内无效指令,使得所有PE 可以高效共享相同的片上指令,进一步避免了2 种稀疏性带来的耗时指令片外存储器访问。此外,通过使用动静结合的负载调度策略,提升了DyCNN 的硬件利用率,进一步去除了稀疏数据不规则分布带来的性能影响,提升了稀疏卷积神经网络的执行性能。

(2)能效

图11(a)展示了DyCNN 在执行稀疏卷积神经网络与执行稠密卷积神经网络时的能效比。整体上可以看到稀疏卷积神经网络的能效平均提升了3.04倍。通过能耗分解,结果表明其中计算、数据缓存、片上数据传输消耗的能量分别减少了88.12%、76.80%、53.27%。

图11 能效比

图11(b)展示了DyCNN、Cambricon-X 分别和GPU 在运行稀疏CNN 时的能效比。从图中可以看到,与GPU 相比,DyCNN 的能效提高了约35.62 倍,Cambricon-X 的能效仅提高了30.44 倍。该实验结果充分展现了DyCNN 执行稀疏卷积神经网络的高能效。DyCNN 的能效收益主要来源于:(1)由于通过数据感知和指令动态过滤机制增加了高效的片上指令和数据重用,能耗较高的片外存储器访问次数更少;(2)通过轻量级的流水线化执行和计算单元之间负载均衡实现了更高的硬件利用率和整体能效。

(3)计算部件利用率

为了验证本文提出的负载均衡策略的有效性,图12展示了VGG16 的CONV1_2 层同一行和同一列方向执行时的PE 的计算部件利用率。从图12中可以看到,即使PE 阵列在垂直方向上复用相同的Filters 和水平方向复用相同的IA,在实现负载均衡之前,每列PE 计算部件利用率仍然差异较大,可见Filters 和IA 的稀疏性对整体硬件利用率影响很大。

图12 DyCNN 运行在VGG16 CONV1_2 层的计算部件利用率

与之不同,从图12 中可看出,使用本文提出的负载均衡策略可以有效实现PE 之间负载均衡,使得各PE 的计算部件利用率基本保持一致,各运算单元的计算部件利用率稳定在45%~50%之间。由此通过使用本文提出的动静结合的负载均衡策略,可以保证DyCNN 中PE 阵列的负载均衡,提高计算部件的利用率,提升整体性能和能效。

(4)指令执行次数减少比例

为了验证本文稀疏去除机制的有效性,本文将密集卷积层和稀疏卷积层的指令执行次数进行了详细比较。

从图13 中可以看到,由于2 种稀疏性并存,PE中存在着大量的冗余无效指令,通过数据翻译和指令选择单元互相配合,PE 阵列执行时跳过了0 值相关无效指令,使得稀疏网络的总指令执行次数比密集网络平均减少了69.21%。而稀疏数据相对较少的卷积层指令减少的次数较少,以VGG16 的CONV2_2 层为例,因为CONV2_2 层中无效的激活数据只有19.00%,即存在的0 值数据相对较少,对应的无效指令也较少,所以减少的指令执行次数也相对较少。综上所述,本文提出的基于数据感知的指令动态过滤方式可以有效减少指令执行次数,去除稀疏性带来的影响,从而提升DyCNN 的性能和能效。

图13 DyCNN 运行稠密和稀疏网络的指令执行次数减少比例(左边的坐标轴(柱)表示各类指令在总减少指令中所占比例;右边的坐标轴(曲线)表示总指令减少比例)

6 结论

本文针对稀疏卷积神经网络提出了一个高效灵活的硬件加速结构DyCNN。DyCNN 基于CGRA 设计,可以充分利用其高指令并行性来支持CNN 的操作。此外,针对稀疏卷积神经网络中激活值和权值的2 种稀疏性并存的挑战,DyCNN 设计了基于数据感知的指令动态过滤机制滤除了卷积运算中大量的无效计算和访存指令的执行,避免了不必要的片外指令和数据访存,减少了无效指令的执行次数,增加了各计算单元指令的片上重用效率。同时DyCNN提出了基于负载感知的动静结合负载均衡策略保证了PE 之间的负载均衡。实验表明,本文提出的加速结构DyCNN 在性能和能耗方面具有优势,能够为规模越来越大、演进迅速的稀疏卷积神经网络加速提供有效的解决方案。

猜你喜欢
加速器能效权值
化学工业的“加速器”
莫比斯加速器众创办公空间
一种融合时间权值和用户行为序列的电影推荐模型
全民小康路上的“加速器”
CONTENTS
上海:稳中有进 能效趋优
关注能效
基于权值动量的RBM加速学习算法研究
等待“加速器”
浅谈实现高能效制造的未来发展趋势