Efficient Scheduling of Irregular Network Structures on CNN Accelerators

Efficient Scheduling of Irregular Network Structures on CNN Accelerators

个人观点:
本文主要思想如何划分fused layer以及划分后的子图在固定的缓冲容量下如何提高每一层的可用内存空间.本文主要受到 An Effective Fusion and Tile Size Model for Optimizing Image Processing Pipelines 这篇文章的影响,将多输入/多输出的节点,转化为pipeline的形式,牺牲解的质量去换取时间。
下面就是文章的主要内容

摘要

最先进的CNN结构在层连接的意义上呈现出日益增长的不规则性,这源于创新的手工设计和最近提出的神经结构搜索方法。这种不规则的结构提高了识别的准确性,但也给硬件部署带来了挑战,特别是在常规架构的CNN加速器上:
(1)复杂的数据依赖关系使得层间的数据重用策略的确定并非易事
(2)由于每个网络的执行顺序不是唯一的,因此层调度、内存分配和tilling策略的选择对硬件性能有很大影响
这些挑战是现有CNN调度器无法解决的,CNN调度器主要关注单层的数据流。在这项工作中,我们提出了一个全面的框架来分析和解决任意连接的CNN网络到特定硬件加速器的映射问题
为了有效地利用层间数据重用,我们提出了(1)一种基于动态规划和节点化的DAG分区方法,有效地利用层间数据重用(2)采用子图调度和片上内存分配策略,寻找最优执行顺序。
随着CNN加速器的建模,我们也提出了针对融合层tilling的方法。建立了一个自动框架,以从主流深度学习框架产生的原始CNN模型生成二进制机器代码,该模型可以在几分钟内处理具有1000层以上的大规模CNN。基于最新加速器(如NVDLA)的实验表明,我们的技术极大地减少了层间依赖的外部数据传输,并比现有方法带来了显著的性能改进。

1、介绍

网络拓扑的进化是卷积神经网络(CNNs)发展的驱动力,在结构工程方面投入了大量的精力。从链状连接到残块,初始结构和密集连接,由于这些创新的拓扑结构,令人印象深刻的准确性提高已被展现。最近,神经架构搜索(NAS)框架被提出是为了找到识别性能更好的CNN结构,或者在保持准确性的前提下找到更少的网络参数。NAS的自动搜索过程导致了CNN的拓扑不可预测,使得层之间的连接更加不规则
在各种硬件平台中,CNN加速器因其卓越的性能和能效而成为AI时代的有前途的引擎然而,为了有效地利用其特殊的PE阵列结构和有限的片内存储资源,CNN加速器的调度策略必须精心选择。考虑到CNN拓扑结构的日益复杂,CNN调度算法面临着新的挑战。
首先,新兴的CNN中复杂的数据依赖性使得优化利用层间数据局部性变得不容易。由于缓冲容量有限,通常需要在加速器与外部内存(DRAM)之间传输单个CNN层的feature map (fmap),这带来了额外的延迟并降低能率。fusion被提出来解决这一问题。如图1所示,将CNN结构表示为一个有向无环图(DAG),一组融合层就是从DAG中划分出来的子图。每个子图内部的相关数据在片上传输,节省了不必要的外部数据传输。
在这里插入图片描述
但是,层融合也会导致冗余计算,分区不当甚至会导致CNN加速器的性能下降[13]。因此,利用层间数据局部性的关键是找到最优的数据局部性DAG分区。以前的工作已经致力于解决这个问题,但他们遇到了局部最优或无法负担的时间开销的问题。
其次,执行顺序和内存分配的选择对性能影响很大。对于线性连接执行顺序唯一的CNN,随时需要将最多两层的fmap存储在芯片上,而简单的双缓冲就足够了。然而,由于多输入/输出节点和长时间连接在新兴CNN中很常见,可能的执行命令数量随着层数呈指数级增长.一个不适当的顺序会减少用于缓冲CNN层的可用内存空间,并增加计算冗余性。各种调度方法最多可导致50%的性能差异
正如上文所分析的,之前的工作并不能有效的解决CNN不规则的结构带来的新挑战。在这项工作中,我们提出了一个新的优化框架来调度任意连接网络的代表性
① DAG分区。提出了
一种基于节点聚类和动态规划的DAG分区方法
。该算法仅实现O(N2)时间复杂度和最多比以前的CNN推理速度提高87%
② 子图调度。研究了图调度效率低下的根源,提出了一种基于回溯的方法来确定任意子图的最优执行顺序。在此基础上,为每个CNN层分配尽可能多的内存空间.
③ 循环转换的fusion层。在这项工作中,我们对基于PE阵列的加速器的时序行为进行建模,并得出必须满足的最小拼接单元. 在子图中的相邻层之间转移。将多层视为一个整体流程,我们制定解决其循环转换的方法循环图块之间的重叠最少。
④ 我们建立一个自动框架并评估在6个最新技术下提出的优化技术在代表性的CNN加速器(例如NVDLA [14])上测试的用于图像识别的CNN结构。 实验显示整体性能显着改善,并且在几分钟内可以安排超过1000层的网络
本文组织如下。第二部分解释了这项工作的背景和动机。第3节说明了我们的自动端到端优化流程。第四节和第五节详细解释了提出的技术。第六节给出实验结果,第七节对本文进行总结。

2、背景&动机

在本节中,我们首先对新兴的cnn进行了简要的综述,总结了其结构特征。然后,通过对CNN的调度和资源分配技术的分析,说明了本文的动机

2.1 CNN发展结构

网络拓扑结构一直是CNN识别精度和建模效率的关键因素。在早期的突破由AlexNet领导[1]和VGGNet [2],研究者构建拓扑更复杂的cnn. ResNet(2015, 77.8%)采用身份快捷连接,Inception v3(2016, 78.8%)提出基于分支的细胞结构。DenseNet(2017, 79.2%)将一个层的输出与随后的所有层连接起来。最近,NAS生成的CNN,如NASNet和PNASNet,与人工设计的CNN架构相比,具有显著的优势,其准确率在ImageNet分别为82.7%和82.9%.自NAS框架使用强化学习或进化搜索方法,生成的CNN结构是不可预测的更复杂的拓扑
新生cnn的不规则性可以表现为:
a、长期数据依赖
图中的黑线表示直接的数据依赖性. 生产者节点的输出可以被消费者节点直接利用。对于长期依赖关系,如连接到多输入消费者节点的红线,一个生产者节点必须等待其他相关节点,才能被消费者节点使用。

b、多输入/输出节点
图2中,单元N的输入被多播到单独的节点,并且所有分支都连接到单元N的输出

c、不断增加的层次。早期的CNNs,比如小于20层的VGGNet,甚至可以通过遍历所有可能的候选节点来进行调度。然而,最先进的cnn通常包含0.1-1K层,这需要高效的处理。
这些新特性给以下CNN调度考虑带来了挑战:(1)利用层间数据局部性和(2)指定执行顺序和内存分配

2.2 层间数据局部性的开发

为了提高性能和能源效率,CNN加速器设计的一个关键是最大化层内/层间的数据重用。[9,12]在本工作中,我们重点研究了层间数据局部性的开发.
层融合技术被提出来减少外部数据移动, 为了适应有限的片上缓冲区空间,通常将CNN安排为图块(tile)[19]. 如图3©所示,将3个级联层的fmap处理为两个图块,分别用红色和蓝色着色。由于卷积执行Kh * Kw到1 * 1的操作,相邻的fmap片通常相互重叠(紫色区域)。
在执行过程中,立即使用第N个fmap的Tile-1来计算N+1层的fmap,以此类推。
以这种方式,节省了两个融合层之间的片外存储/加载。但层融合也带来了计算冗余,该冗余增加了2个因子.
(1)当更多的层融合在一起时,冗余变大。(2)tile越多,冗余度越高,每个tile的尺寸越小。
因此,CNN层的融合策略需要慎重选择,特别是对于不规则结构。由于一个CNN拓扑可以表示为一个有向无环图(DAG),这个过程相当于将一个给定的DAG划分为不重叠的子图.由于组合爆炸,搜索空间是巨大的。设N为一个DAG的总节点数,dn为第N个节点的输出度。因此,单个节点可能的分区选择为2 dn,总分区的数量如公式1所示。对于线性CNN拓扑,比如VGGNet,这个数字已经是2N,对于更复杂的网络,它甚至更大。显然,枚举变得不切实际。
Halide提出了一种基于贪婪搜索的启发式算法来解决这一问题。首先将每个节点视为单个组,然后计算融合每个组对的效益(与连接),并融合最好的一对成一个新的组。当不能获得好处时,这个程序继续进行。这种方法是快速有效的,但不能保证全局最优. Jangda等人提出了一种基于动态规划的搜索算法,该算法覆盖了整个求解空间并保证了最优结果。 对于线性DAG拓扑,此方法表现出O(n2)时间复杂度. 但是,其对于复杂的CNN结构的时间复杂度是指数级的,这对于新兴的CNN来说是不切实际的.在本文中,我们提出了一种新的DAG划分算法,使搜索复杂度保持在O(N2),同时实现接近最优的解决方案。

2.3 子图调度

如上所述,分配给每一层的内存空间应该足够大,以减少计算冗余。然而,简单地增加片上缓冲区容量会导致昂贵的区域和电力开销。本文研究了在固定的缓冲容量下如何提高每一层的可用内存空间.
由于存在长期的数据依赖关系,不规则CNN结构中各层的执行顺序会有所不同。在调度不当的情况下,不能立即使用的fmap会等待其他层的执行,并长期占用缓冲区空间. 如果每个fmap占用的内存空间能被尽快释放,那么后续的层就能被分配更多的缓冲资源. NVDLA提出循环缓冲[14]来解决CNN层的内存分配问题。从开始地址开始,新生成的层(加载或计算)将被分配到与最近处理层相邻的空间. 当内存空间用完时,将从开始地址重新分配新数据。这种方法没有考虑数据依赖性,不能产生最优解决方案(第六节)。简单地采用深度优先搜索(DFS)或广度优先搜索(BFS)也不能得到最优解。在本文中,我们提出了基于回溯的子图调度来优化执行顺序和内存分配。

3、自动化优化流程

为了评估所提出的调度技术,我们建立了一个自动框架,将预训练的CNN模型转换为可执行的机器代码,用于CNN加速器,并报告硬件性能,如图4所示。
概述所提出的CNN结构端到端的分析和评估框架
在前端,我们采用开源的ONNX工具[21],从主流的深度学习框架如Tensorflow和Caffe获得统一的模型表示。然后对ONN模型进行解析,得到DAG拓扑、每层配置和权重参数。之后,每个CNN被安排如下迭代过程
① DAG调度
搜索最优DAG分划解。在每个搜索步骤中,它将当前分区发送到子网络调度器,并记录来自分析器的性能反馈。当搜索完成后,就可以确定最优划分。对于不带来冗余计算的CNN层,在搜索之前将它们与父节点融合,DAG调度程序以便在不降低性能的前提下加速调度。

② 子网调度
子网调度程序设置有两个功能:(1)确定任意子图的执行顺序和bank分配。 (2)在每一层上执行循环平铺,并生成可执行的指令代码以提供给探查器。

③ Profiler
Profiler包含基于特定CNN加速器 化它们,即,重叠外部数据获取和数组计算/虽然Verilog仿真更加精确,但其耗时的W特性使其无法应用于庞大的设计空间探索中。因此,我们将其设置为黄金模型来验证剖析结果,调整剖析器代码。在固定调度策略下测试,profiler与Verilog仿真的执行时间差异在10%以内,验证了该profiler的可靠性。

4、提出了DAG调度技术

在本节中,我们首先将标准动态规划(DP)应用于DAG分区,并演示其不切实际的时间复杂度。然后,我们用基于节点聚类的方法对标准DP进行增强以实现O(N2)复杂性. 在第四节- 3中,我们形式化了调度算法来确定最优的执行顺序和内存分配。

4.1 标准动态规划方法

定义:表示为G = (V, E)的DAG包含所有节点(层)V = {v0, v2,…,vN−1}和边(连接)E = {eij}在CNN结构中。在搜索中,G被划分为子图{S0, S1,…, Sn−1},Si∩Sj =∅避免重复计算。成本(Si)返回子图Si的评估度量,如硬件执行周期。这样划分下G的总代价为 在这里插入图片描述
递归搜索。DP的搜索过程从G的输入节点(v0)开始,如果有多个输入,则设置一个虚拟节点作为其祖先节点。此时,得到的子图为S0 = {v0},其余的图为G0 =G−{S0}。现在我们有两种选择(图5(a)):(1)将S0与其其中一个后续节点vk合并,分别将S0转化为S0+{vk},G0转化为G0−{{vk}}。(2)保持S0不变,将G0作为新的输入DAG进行DP搜索过程。最后的决策是通过比较这两种可能的选择的代价,直到所有的节点都排列在同一组中。每个G0的分区和成本在由子网调度器和分析器计算后被存储以供重用。这样,动态规划就覆盖了DAG分区的整个解空间。

复杂性。对于级联N个节点的线性DAG,将其时间复杂度定义为Comp(N)。考虑增加一个新节点到N−1个节点的DAG,新引入的包含该节点的组数为N(将此节点与之前的0, 1…N−1个节点),可以在式中递归推导Comp(N)=Comp(N-1)+N=O(N2) (Comp(1) = 1)
但是,对于不规则的CNN结构,将第N个节点添加到N-1个节点DAG时,可能的分组应覆盖在每个多输出节点遇到的所有分支,并且总数从N增加到Π(2node(i)-1), 因此,对于非线性DAGs, DP的时间复杂度是指数型的,不能用于处理最先进的cnn。
限制单个组中的节点数量可以减少搜索量。然而,这显然是以最多违背最优解52%为代价的

4.2基于DAG分区的节点集群

这里我们提出了DAG分区策略。首先,我们用从网络输入节点到它的最长路径的长度标记DAG中的每个节点。如图5(b)所示,具有相同深度(j,j+1 …)的节点聚在一起.这使节点依赖性变得清晰:当每个节点深度小于j+1被计算时,第(j+1)个深度的所有节点都准备好执行

其次,在此基础上,我们用深度序列索引每个节点(图5©)。然后,形成DAG分区的搜索路径:每个子图必须包含索引相邻的节点。这样,一个任意连接的将DAG变换成线性矩阵。

最后我们对推导出的线性结构应用DP算法来确定最终的DAG分区结果,最终的分区结果为O(N2)时间。沿着搜索路径,可以将多个深度层的相邻节点融合到同一子图中(图5 (d))

在这里插入图片描述
如算法1所述,第1-3行执行逐元素层的融合,这不会带来多余的计算,例如 ReLU,批处理规范化和1x1-CONV。 此后,DAG中的每个节点都可以表示级联的层,例如 CONV + BN + ReLU。 然后,第4-7行使用节点聚类线性化DAG,并通过索引定义搜索路径。 其余部分使用动态编程从下至上搜索最佳分区。
在这里插入图片描述

4.3 子图调度和片上内存分配

在此工作中,我们考虑了一种典型的片上全局缓冲区,它由单个SRAM banks组成,并支持多个同时访问。这种灵活的设计对于不规则依赖非常有效,并且已经被最先进的CNN加速器所采用. 每个CNN层的Fmap可以存储在多个banks中,编译时逻辑合并为一个bank group (bank group, BG)。如图6所示,调度分为2个步骤:
(1)将各层分配到一个不冲突的BG。
(2)将SRAM banks聚类为单独的BGs。我们提出了优化这一过程的技术,使BGs的数量最小化并实现有效的分配。
在这里插入图片描述
首先,为了确定子图的执行顺序和BG分配,我们提出了一种基于回溯的算法,以尽快释放占用的BG。 在图6中,假设首先执行节点A,则在步骤1之后,可以执行3个节点:选择B,C,G,G被选择执行,因为它是现有节点D的输出。在步骤2之后,尽管两者可以选择B和C,我们检测到出现D释放的条件:D => F => E => B,因此B被回溯并选择在下一步中加载。利用这两个原理,可以确定执行顺序。另外,当一层有多个空闲BG可用时,我们的策略是:(1)选择在最后一步中不执行片外写入的BG,因此可以对BG-i进行读取和对BG-j进行写入并行执行。(2)选择包含fmap的BG,该fmap的大小与此层最相似,以便有效地利用内存空间。策略(1)是首选。

其次,在确定了BG的数量以及层与BG的关系之后,将SRAM banks聚类到与它们所包含的最大fmap大小成比例的BG中。例如,如果要存储在BG-i中的fmap是BG-j中的fmap的2倍,则为BG-i分配的SRAM库比BG-j的2倍。

5、将CNN映射到加速器上

在本节中,我们首先对基于PE array的CNN加速器的时序行为进行建模,然后为融合层制定tiling策略。

5.1 基于PE阵列的架构

如图7(a)所示,CNN的核心单元由一个2-D PE数组,以及用于输入、权重和积累的缓冲区。数据通信的类型包括广播,逐点广播以及在相邻PE之间进行传输。 尽管存在各种数据流,但PE数组的基本功能是在给定ifmap和某些大小的权重的情况下生成ofmap。
在这里插入图片描述
在这里,我们以NVDLA的数据流为例,并在图7(b)中表示其时序行为。 在此数据流中,output channels水平映射在单独的列上,而input channels垂直映射在单独的行上,如Cyclecore的基本公式所示。然后,我们考虑阵列中相邻数据移动引起的传播延迟,以及权重在内部PE中被重用的时间(Re)。最后通过计算周期和通信周期的比较,得出了计算周期总数。

5.2 Loop Tiling for Fused Layers

一个fmap tile是一个从每一层分离出来的单元,将由PE数组执行。在融合层卷积中,一个图块直接传递到后续层,而不需要等待该层完成。为了有效地将cnn映射到基于pe阵列的加速器上,应正确确定每一层的切片大小。如图8 (a)所示,第n层一个输出点的完整计算依赖于第N-1层的Kh·Kw·Ci点。如果第(N-1)层的图块大小仅为Kh·Kw·Ci / 2,则从N传递到N + 1的数据仅是部分和,这会使第(N + 1)层的计算增加一倍. 因此,Kh·Kw·Ci是除输出层外不能进一步分割的最小瓦片单元
在这里插入图片描述
由于CONV层执行Kh * Kw到1 * 1的操作,相邻的瓦片往往相互重叠,造成冗余计算. 为了找到最优的平铺方案,我们将这个问题表述在图8 (b)中。子图中输出层的tile大小可以自由选择。而对于其他层,由于上面导出的最小平铺单元,平铺大小是根据其输出层的平铺大小计算的. 此外,对于每一层,数据总量不应超过子图调度器分配的缓冲区空间。在这些限制条件下,我们可以通过遍历所有候选参数得到最优的循环平铺参数。

2020_10_18 组会

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值