深度学习模型的编译方法及装置与流程

文档序号:31839568发布日期:2022-10-18 22:13阅读:49来源:国知局
深度学习模型的编译方法及装置与流程

1.本技术涉及人工智能技术领域,尤其涉及深度学习模型的编译方法及装置。


背景技术:

2.人工智能技术正在经历飞速发展的时代,而机器学习是实现人工智能的必由之路,随着人工智能技术的不断迭代、革新,机器学习领域中一种被称为深度学习的技术得以发展和落地应用。为应对海量的数据计算,传统的计算架构已无法满足深度学习计算的需求。为了解决这个问题,人工智能(artificial intelligence,ai)芯片得以开发应用,但ai芯片与深度学习的结合,需要领域处理器架构(domain specific architecture,dsa)专用的编译器,因此,深度学习编译器(tensor virtual machine,tvm)应运而生。
3.tvm主要用作对深度学习模型的静态图进行编译,且可以对静态图或者该静态图的算子层进行优化,其中,对算子层的优化采用的是计算描述(compute)和调度优化(schedule)相分离的策略。
4.在使用深度学习编译器对深度学习模型进行编译的过程中发现,目前的编译效率不高,有待改进。


技术实现要素:

5.经过分析发现,现有技术中,针对n个算子和m个硬件平台,需人工定制n*m套模板策略预先存储在深度学习编译器中,然后在编译时,深度学习编译器针对待编译的深度学习模型中的每个算子,确定用于部署该算子的硬件平台之后,均需要从这n*m套模板策略中去一一匹配,得到与该算子和该硬件平台匹配的模板策略,以便于根据该模板测量部署该算子在该硬件平台上的数据流。其中,由于针对每个算子,都要基于对应的硬件平台从海量的模板策略中进行匹配,因此导致最终编译效率低,尤其模板策略数量越多,效率越低下。
6.针对上述问题,本技术提供一种深度学习模型的编译方法,利用编译器基于算子描述信息以及用于部署该算子的计算芯片的缓冲区的相关信息来确定该算子在计算芯片上的目标数据通路,即部署策略,从而可以提高深度学习模型的编译效率。
7.第一方面,本技术提供一种深度学习模型的编译方法,所述方法由编译器执行,所述编译器运行在计算设备上,所述方法包括:获取计算芯片的硬件架构的描述信息,所述计算芯片为用于部署深度学习模型的计算芯片,所述描述信息包括所述计算芯片的缓冲区的名称、所述缓冲区的级别和所述缓冲区之间的连接关系;获取所述深度学习模型中算子的描述信息;根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的目标数据通路。
8.本技术中,因为是编译器自动基于算子描述信息以及用于部署该算子的计算芯片的缓冲区的相关信息来确定该算子在计算芯片上的目标数据通路的,因此,针对每个算子在每个硬件架构上的部署策略,只需要修改算子的描述信息和硬件架构的结构信息就可。这与现有技术中需要在大量定制的模板策略一一去匹配相比,大大减少了工作量,从而能
够提高编译效率,且能保证数据流的高效性和正确性。
9.结合第一方面,在第一种可能的实现方式中,所述根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的目标数据通路,包括:根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的所有可行数据通路;根据预先设置的路径筛选规则,从所述所有可行数据通路中筛选得到备选数据通路;从所述备选数据通路中为所述算子选择所述目标数据通路。
10.结合第一种可能的实现方式,在第二种可能的实现方式中,所述路径筛选规则包括以下规则中的一种或多种:删除重复搬移的路径、优先选择不经过补充层sup级别的缓冲区的路径、若备选路径均不经过sup级别的缓冲区时选择最长路径、若备选路径均经过sup级别的缓冲区时选择最短路径。
11.结合第一方面或上述任意一种可能的实现方式,在第三种可能的实现方式中,所述算子的描述信息包括:所述算子的输入数据、所述算子的输出数据、所述算子的输入数据和所述算子的输出数据之间的依赖关系和所述算子的尺寸信息。
12.结合第一方面或上述任意一种可能的实现方式,在第四种可能的实现方式中,所述计算芯片为ai芯片。
13.第二方面,本技术提供一种深度学习模型的编译装置,所述装置包括:获取模块,用于获取计算芯片的硬件架构的描述信息,所述计算芯片为用于部署深度学习模型的计算芯片,所述描述信息包括所述计算芯片的缓冲区的名称、所述缓冲区的级别和所述缓冲区之间的连接关系;所述获取模块还用于获取所述深度学习模型中算子的描述信息;确定模块,用于根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的目标数据通路。
14.结合第二方面,在第一种可能的实现方式中,所述确定模块用于根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的目标数据通路,包括:所述确定模块还用于根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的所有可行数据通路;筛选模块,用于根据预先设置的路径筛选规则,从所述所有可行数据通路中筛选得到备选数据通路;选择模块,用于从所述备选数据通路中为所述算子选择所述目标数据通路。
15.结合第一种可能的实现方式,在第二种可能的实现方式中,所述路径筛选规则包括以下规则中的一种或多种:删除重复搬移的路径、优先选择不经过补充层sup级别的缓冲区的路径、若备选路径均不经过sup级别的缓冲区时选择最长路径、若备选路径均经过sup级别的缓冲区时选择最短路径。
16.结合第二方面或上述任意一种可能的实现方式,在第三种可能的实现方式中,所述算子的描述信息包括:所述算子的输入数据、所述算子的输出数据、所述算子的输入数据和所述算子的输出数据之间的依赖关系和所述算子的尺寸信息。
17.结合第二方面或上述任意一种可能的实现方式,在第四种可能的实现方式中,所述计算芯片为ai芯片。
18.第三方面,本技术提供一种深度学习模型的编译装置,所述装置包括与存储器耦合的处理器,所述处理器用于执行所述存储器中的程序代码,以实现第一方面或其中任意一种可能的实现方式中的方法。
19.第四方面,本技术提供一种计算机可读存储介质,所述存储介质中存储有计算机程序或指令,当所述计算机程序或指令被处理器执行时,以实现第一方面或其中任意一种可能的实现方式中的方法。
20.第五方面,本技术提供一种计算机程序产品,所述计算机程序产品中包括计算机程序代码,当所述计算机程序代码在计算机上运行时,使得所述计算机实现如第一方面或其中任意一种可能的实现方式中的方法。
附图说明
21.图1为本技术一个实施例提供的tvm编译部署的示意图;
22.图2为本技术一个实施例提供的tvm优化流程的示意图;
23.图3是本技术一个实施例提供的不同算子部署到不同的硬件上的部署示意图;
24.图4是本技术一个实施例提供的ai芯片数据流自动生成技术的部署示意图;
25.图5为本技术一个实施例提供的深度学习开发工具架构示意图;
26.图6为本技术一个实施例提供的深度学习模型的编译方法的流程图;
27.图7为本技术一个实施例提供的ai芯片硬件架构示意图;
28.图8为本技术一个实施例提供的算子的示意图;
29.图9为本技术另一个实施例提供的数据流自动生成示意图;
30.图10为本技术一个实施例提供的节点信息示意图;
31.图11为本技术另一个实施例提供的节点信息示意图;
32.图12为本技术一个实施例提供的深度学习模型的编译装置示意图;
33.图13为本技术一个实施例提供的装置示意性框图。
具体实施方式
34.为了更好地介绍本技术的实施例,下面先对本技术实施例中的相关概念进行介绍。
35.1、深度学习
36.深度学习(deep learning,dl)是机器学习(machine learning,ml)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(artificial intelligence,ai)。深度学习的概念源于人工神经网络的研究,含多个隐藏层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。研究深度学习的动机在于建立模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本等。
37.深度学习是一类模式分析方法的统称,就具体研究内容而言,主要涉及三类方法:
38.(1)基于卷积运算的神经网络系统,即卷积神经网络(convolutional neural networks,cnn)。
39.(2)基于多层神经元的自编码神经网络,包括自编码(auto encoder)以及近年来受到广泛关注的稀疏编码两类(sparse coding)。
40.(3)以多层自编码神经网络的方式进行预训练,进而结合鉴别信息进一步优化神经网络权值的深度置信网络。
41.通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务。由此可将深度学习理解为进行“特征学习”或“表示学习”。
42.2、邻接矩阵
43.邻接矩阵是表示顶点之间相邻关系的矩阵,邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。假设g=(v,e)是一个图,其中v={v1,v2,

,vn},则g的邻接矩阵是一个具有下列性质的n阶方阵:
44.①
对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。
45.②
在无向图中,任一顶点i的度为第i列(或第i行)所有非零元素的个数,在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个数。
46.③
用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间。
47.有向图邻接矩阵中第i行非零元素的个数为第i个顶点的出度,第i列非零元素的个数为第i个顶点的入度,第i个顶点的度为第i行与第i列非零元素个数之和。
48.用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。
49.下面将结合附图对本技术实施例的实施方式进行详细描述。
50.在对本技术实施例进行详细地解释说明之前,先对本技术实施例的应用场景予以说明。
51.在人工智能领域中,深度学习是机器学习的分支,是一种以神经网络为架构,对数据进行表征学习的算法。随着深度学习的发展,有越来越多的需求需要将深度学习模型部署到不同的硬件设备上,如手机、嵌入式设备或加速器等硬件设备上。其中,深度学习编译器(tensor virtual machine,tvm)就是这样一种编译并部署深度学习模型的工具,它能够对深度学习模型进行编译,然后部署到不同的硬件架构上,形成端到端的解决方案。
52.tvm主要做的是静态图的编译,且可以对静态图或者该静态图的算子层进行优化,静态图也可以称作图层,图层独立于底层硬件,而算子层与底层硬件直接相关。针对算子层的优化,tvm采用计算描述(compute)和调度优化(schedule)相分离的策略,其中计算描述(compute)与底层硬件无关,而调度优化(schedule)与底层硬件强相关。
53.图1为本技术一个实施例提供的tvm编译部署的示意图。如图1所述,图中有多个算子,算子是深度学习模型中的基本计算单元,例如卷积算子、阈值算子和池化算子等,这些算子经过编译器tvm可以部署到硬件a或硬件b或硬件c或硬件d或硬件e或硬件f上。其中,这些硬件可以是终端或服务器中的计算芯片,终端可以为手机、平板电脑或计算机等。
54.图2为本技术一个实施例提供的tvm进行算子层优化的流程示意图。如图2所示,每一虚线框里可以是一个算子或者融合算子,经过图层优化,可以把这些算子结合成一个整体,然后作为一个整体对其进行算子层优化,例如可以把卷积算子和阈值算子作为一个整体,对其进行算子层优化。
55.算子层优化中,首先获取算子的计算描述(compute),然后再对其进行调度优化(schedule)操作。通常来说,算子的计算描述与底层硬件无关。本技术实施例中,算子的计
算描述也可以称为算子的描述信息。
56.算子的计算描述可以包括算子的输入数据信息,算子的输出数据信息、算子的输入数据和算子的输出数据之间的依赖关系信息和算子的尺寸信息等。
57.获得算子的描述信息后,对算子进行schedule操作,schedule操作流程上也有一定的执行顺序:(1)对计算表达进行目标架构的数据流部署,以满足目标架构的硬件计算流程;(2)对计算表达进行访存优化,以满足目标架构的硬件资源限制;(3)对计算表达的循环层次进行调整优化,以进一步提升计算性能;(4)根据硬件的并行能力,对计算表达进行并行优化,提升计算性能,也即图中所示的数据流部署、访存优化、循环优化和并行优化,其中,tvm提供的schedule原语操作中,用于循环优化的原语操作包括:fuse、split、tile、reorder、unroll;用于访存优化的原语操作包括:cache read、cache write、compute at、compute inline;用于多线程并行优化的原语操作包括:bind、parallel、vectorize等。
58.由于tvm算子层优化中的schedule部分与硬件是直接相关的,不同的硬件架构,需要自己特定的一套优化策略(访存优化,循环优化,并行优化均需要针对特定硬件并结合专家经验进行设计),而特定优化的基础就是schedule第一步的数据流部署,它的主要作用就是让compute描述的执行过程满足硬件的架构设计,所以数据流的部署阶段至关重要。
59.需要说明的是,tvm编译器面向的硬件设备一般为通用处理器,用于将深度学习模型部署到中央处理器(central processing unit,cpu)或图形处理器(graphics processing unit,gpu)等通用处理器中,而本技术实施例提供的深度学习编译方法还可以应用于将深度学习模型部署到人工智能(artificial intelligence,ai)芯片中,扩展了应用场景,能够提升面向专用ai芯片的编译效果,进而提升深度学习模型在专用ai芯片上的运行性能。
60.由于算子的多样性和硬件架构的多样性,所以数据流部署的策略也呈现多样性。现有技术的方案如图3所示,图3是本技术一个实施例提供的不同算子部署到不同的硬件上的部署示意图,从图中可以看出,池化算子部署到硬件a上时,有对应的方案1,池化算子部署到硬件b上时,有对应的方案2,内积算子和逻辑回归算子也一样,也就是说,针对每一个算子和每一个硬件平台,都需要定制一套模板策略,例如,若存在n个算子和m个硬件平台时,则需定制n*m套模板策略,在编译时,当算子和硬件平台确定后,需要从这n*m套模板策略中去一一匹配,要匹配好多次,才能得到匹配后的模板策略,但是这种方式匹配效率低,进而导致编译效率低。
61.本技术针对不同算子部署到不同的硬件平台需要定制大量的模板策略且匹配效率低的问题提出了一种深度学习模型的编译方法,即为了实现不同的算子在不同的硬件上计算,不再依靠大量的模板策略来实现同一个算子跨硬件平台的计算实现,以及同一个硬件平台支撑不同的算子,该方法的部署示意图如图4所示。
62.从图4中可以看出,池化算子、内积算子和逻辑回归算子在部署到不同的硬件平台时,首先经过对算子的计算描述后,再经过数据流自动生成模块,可以为该算子在特定硬件上进行数据流部署。
63.图5为一种深度学习开发工具的示例性架构图,该架构包括昇腾张量编译器(ascend tensor compiler,atc),atc编译器是基于tvm框架而扩展的深度学习编译器,运行在主机中央处理器(central processing unit,cpu)上。atc编译器包括图优化和编译模
块以及算子编译模块,图优化和编译模块包括图引擎、融合和编译、人工智能处理器引擎和集合通信引擎,算子编译模块包括算子库和张量加速引擎(tensor boost engine,tbe)。本技术的编译方法应用在数据流自动生成模块,该模块被teb调用,为tbe的调度优化操作自动生成数据流,而tbe被atc编译器调用,为用户编译自定义算子。
64.图6为本技术一个实施例提供的深度学习模型的编译方法的流程图。如图6所示,该方法可以包括s601、s602和s603,且该方法由编译器执行,编译器运行在计算设备上。
65.作为一种示例,本技术的编译方法可以由atc编译器执行。
66.s601,获取计算芯片的硬件架构的描述信息,所述计算芯片为用于部署深度学习模型的计算芯片,所述描述信息包括所述计算芯片的缓冲区的名称、所述缓冲区的级别和所述缓冲区之间的连接关系。
67.作为一种示例,计算芯片可以是基于专用领域处理器架构(domain specific architecture,dsa)的ai芯片,例如张量处理单元(tensor processing unit,tpu)架构芯片或者昇腾ai处理器芯片。
68.对于硬件架构的建模,利用图的数据结构对ai芯片的硬件架构进行描述,主要包括以下步骤:
69.(1)利用一维数组存储各级缓冲区的名称。
70.(2)利用二维数组存储每个缓冲区对应的缓冲区层级,层级分为4种:l2层、l1层、l0层和补充层(supplement,sup),其中l0层表示与核心计算单元直连的缓冲区层级,l1层表示与l0层层级直接相连的缓冲区层级,l2层一般表示片外存储层级,补充层sup表示与辅助计算单元直连的缓冲区层级。
71.(3)利用邻接矩阵表示各级缓冲区间的通路。
72.可以理解的是,邻接矩阵是表示顶点之间相邻关系的矩阵,利用邻接矩阵很容易确定图中任意两个顶点是否有边相连,所以邻接矩阵只是一种比较好的表现方式。
73.图7为一种ai芯片的示例性硬件架构示意图。如图7所示,该ai芯片硬件架构包括4个缓冲区和1个计算单元,缓冲区的名称分别为缓冲区1、缓冲区2、缓冲区3和缓冲区4,其中接近计算单元的缓冲区归为l0层级(缓冲区2、缓冲区3、缓冲区4),远离计算单元的归为l1层级(缓冲区1),将动态随机存取存储器(dynamic random access memory,dram)归为l2层级,图中的有向箭头表示数据流向,对该硬件架构的建模结果如下表1、表2和表3所示。
74.表1缓冲区名称
75.dram缓冲区1缓冲区2缓冲区3缓冲区4
76.表2缓冲区层级
[0077][0078]
表3邻接矩阵
[0079] dram缓冲区1缓冲区2缓冲区3缓冲区4dram01100缓冲区110110缓冲区200001缓冲区300001缓冲区401000
[0080]
在表3的邻接矩阵中,缓冲区4行和缓冲区1列对应的单元格取值是1,说明数据可以从缓冲区4搬移到缓冲区1,而缓冲区1行和缓冲区4列对应的单元格取值是0,说明数据不能反过来从缓冲区1搬移到缓冲区4,图7中从缓冲区4指向缓冲区1的单向箭头说明了这一点。
[0081]
s602,获取所述深度学习模型中算子的描述信息。
[0082]
深度学习模型中算子的描述信息包括算子的输入数据、算子的输出数据、算子的输入数据和算子的输出数据之间的依赖关系以及算子的尺寸信息等。
[0083]
作为一种示例,通用矩阵乘法(general matrix multiplication,gemm)算子执行矩阵乘法运算,即假设算子的输入数据为a和b、算子的输出数据为c、算子的输入数据和算子的输出数据之间的依赖关系为c=a*b。
[0084]
作为另一种示例,累加求和(reduce_sum)算子对输入矩阵a每一行的元素执行累加操作,得到一个向量c,如图8所示,c的计算依赖于a。
[0085]
s603,根据所述算子的描述信息和所述缓冲区之间的连接关系,确定所述算子在所述计算芯片中的目标数据通路。
[0086]
获取到算子的描述信息和缓冲区之间的连接关系后,可以得到算子在计算芯片中的所有的可行数据通路,其中,所有可行的数据通路指的是算子在硬件上所有可以流通的路径,这些路径具有多样性,但不一定所有的路径都是正确和高效的,因此需要对这些路径进行筛选,根据预先设置的路径筛选规则,从所有可行数据通路中筛选得到备选数据通路,最后从备选数据通路中为算子选择所述目标数据通路。
[0087]
可以理解的是,预先设置的路径筛选规则包括以下规则中的一种或多种:删除重复搬移的路径、优先选择不经过补充sup级别的缓冲区的路径、若备选路径均不经过sup级别的缓冲区时选择最长路径、若备选路径均经过sup级别的缓冲区时选择最短路径,具体如下表4所示,这些规则的顺序不能改变。
[0088]
表4路径筛选规则
[0089][0090][0091]
本技术中,因为是编译器自动基于算子描述信息以及用于部署该算子的计算芯片的缓冲区的相关信息来确定该算子在计算芯片上的目标数据通路的,因此,针对每个算子在每个硬件架构上的部署策略,只需要修改算子的描述信息和硬件架构的结构信息就可。这与现有技术中需要在大量定制的模板策略一一去匹配相比,大大减少了工作量,从而能够提高编译效率,且能保证数据流的高效性和正确性。
[0092]
作为一种示例,将gemm算子部署到图7的硬件架构上的具体过程如下:
[0093]
(1)获取整个算子描述信息。gemm算子的描述如下:
[0094]
m,n,h=tvm.var('m'),tvm.var('n'),tvm.var('h')//在tvm编译器中定义变量m、n和h
[0095]
a=tvm.placeholder((m,h),name='a')//占位符的名称是a,a在tvm编译器中所占//的大小是一个m*h的矩阵
[0096]
b=tvm.placeholder((n,h),name='b')//占位符的名称是b,b在tvm编译器中所占的//大小是一个n*h的矩阵
[0097]
k=tvm.reduce_axis((0,h),name='k')//消减轴的名称是k,k的长度是0至h
[0098]
c=tvm.compute((m,n),lambda i,j:tvm.sum(a[i,k]*b[j,k],axis=k))//compute表示一//种计算表达,lambda中i表示在0到m-1下标去索//引,j表示在0到n-1下标去索引,tvm sum表示矩阵a和//矩阵b相乘之后相加,axis为累加方向为k的数。
[0099]
因为gemm算子执行矩阵乘法运算,即c=a*b,左矩阵数据a必须经过缓冲区2,右矩阵数据b必须经过缓冲区3,数据c的计算依赖于a和b,因此路径部署需要确定a至c的路径部署和b至c的路径部署,同时c的计算结果搬移到dram的路径也需要部署。
[0100]
(2)确定算子描述信息中a、b和c所属的缓冲区。由于a、b是占位符(placeholder),因此它们应该部署到dram(l2层,片外存储层级),c是由计算单元计算得到的结果,因此应该将它部署到缓冲区4上。
[0101]
(a)a至c的部署需要实现dram至缓冲区4的数据流,由表3的邻接矩阵可知,从dram到缓冲区4的路径有以下几种:
[0102]
1)dram至缓冲区1至dram至缓冲区1至dram(不断循环);
[0103]
2)dram至缓冲区1至dram至缓冲区1至缓冲区2至缓冲区4;
[0104]
3)dram至缓冲区1至dram至缓冲区1至缓冲区3至缓冲区4;
[0105]
4)dram至缓冲区1至缓冲区2至缓冲区4;
[0106]
5)dram至缓冲区1至缓冲区3至缓冲区4;
[0107]
6)dram至缓冲区2至缓冲区4。
[0108]
(b)应用表4的规则1和规则2后,上述路径1)、2)、3)直接删除;由于该架构中没有sup层次,因此规则3不需要应用;应用规则4后,路径6)被删除;由于未经过sup层次,规则5不需要应用;最后应用规则6,在该硬件架构中,前面提到a的数据必须经过缓冲区2,因此路径5)被删除,最终得到的是路径4):dram至缓冲区1至缓冲区2至缓冲区4。
[0109]
(c)同理b至c的最终路径可以确定为:dram至缓冲区1至缓冲区3至缓冲区4;c至dram的最终路径可以确定为:缓冲区4至缓冲区1至dram。
[0110]
作为另一种示例,将reduce_sum算子部署到图7的硬件架构上的具体过程如下:
[0111]
(1)获取整个算子描述信息。因为reduce_sum算子对输入矩阵a每一行的元素执行累加操作,得到一个向量c,c的计算依赖于a,因此路径部署需要确定a至c的路径部署,同时c的计算结果搬移到dram的路径也需要部署。
[0112]
reduce_sum算子的描述信息如下:
[0113]
m,h=tvm.var('m'),tvm.var('h')//在tvm编译器中定义变量m和h
[0114]
a=tvm.placeholder((m,h),name='a')//占位符的名称是a,a在tvm编译器中所占的大小是一个m*h的矩阵
[0115]
k=tvm.reduce_axis((0,h),name='k')//消减轴的名称是k,k的长度是0至h
[0116]
c=tvm.compute((m),lambda i:tvm.sum(a[i,k],axis=k))//compute表示一种计算表达,//lambda中i表示在0到m-1下标去索引,k表示0到h-1下标去索引,sum表示//累加,累加的关系指占位符a中i和k上的索引位置,通过a,可以获得索引//位置上所有的点,将所有的点累加之后得到的值的长度为m,c表示m长度的//向量,即大小为m,axis为累加方向为k的数。
[0117]
作为另一种示例,如图8中所示,用tvm.sum将矩阵a中的第一行(i=0)的数(k=1,2,3)累计起来,得到6;用tvm.sum将a中的第二行(i=1)的数(k=4,5,6)累计起来,得到15;用tvm.sum将a中的第三行(i=2)的数(k=7,8,9)累计起来,得到24。
[0118]
(2)确定表达式中a和c所属的缓冲区。由于a是占位符(placeholder),因此它应该部署到dram,c是由计算单元计算得到的结果,因此应该将它部署到缓冲区4上。
[0119]
(3)采用与gemm算子相同的做法来确定数据流,唯一不同的一点是,规则6不再适用于该算子,因此最终得到的a至c的路径有两条:
[0120]
dram至缓冲区1至缓冲区2至缓冲区4和dram至缓冲区1至缓冲区3至缓冲区4。
[0121]
这两条都是合法路径,任意选择一条即可(例如dram至缓冲区1至缓冲区2至缓冲区4),因此c至dram的路径最终可以确定为:缓冲区4至缓冲区1至dram。
[0122]
最后一步,使用tvm的访存优化原语去实现对应的数据流部署可以得到如图9所示的数据流图,其中访存优化原语操作为cache_read、cache_write、set_scope。图中的节点表示各种数据在不同buffer之间的搬移过程,例如a.b1表示数据a被搬移到缓冲区1,a.b1.b2表示数据a经过缓冲区1后被搬移到缓冲区2,其他节点的含义类似。数据流图两端的节点(即a、b、c所在的位置)代表输入数据a、b和输出数据c都在dram中。
[0123]
作为一种示例,以矩阵相乘(matmul)算子为例,利用本技术提供的编译方法实现其数据流部署,步骤如下:
[0124]
(1)基于ai芯片的硬件架构,得到三个数据结构,分别是各级缓冲区(buffer)的名称、各级缓冲区的等级、各级缓冲区的连接关系(即邻接矩阵),这些信息如下所示:
[0125]
buffer_name=(”ddr”,”l0c”,”ub”,”l0a”,”l0b”,”l1”)//各缓存区的名称
[0126]
buffer_level={”l2”:(”ddr”),
[0127]”l1”:(”l1”),
[0128]”l0”:(”l0a”,”l0b”,”l0c”),
[0129]”sup”:(”ub”),
[0130]
}//各缓冲区的级别
[0131]
adjacency_matrix=[[0,0,1,1,1,1],
[0132]
[0,0,1,0,0,0],
[0133]
[1,1,0,0,0,1],
[0134]
[0,1,0,0,0,0],
[0135]
[0,1,0,0,0,0],
[0136]
[0,0,1,1,1,0]]//缓冲区对应的邻接矩阵
[0137]
(2)matmul算子的描述信息,图10中的每个节点仅含有输入输出数据的依赖关系及其尺寸信息(即shape),并不含有缓冲区部署的信息(即与硬件无关)。
[0138]
(3)matmul数据流自动生成的分析过程如下所示,其中,“source_dest”表示源地_目的地,“producer:tensor”表示生产者:张量,“consumer:tensor”表示消费者:张量,“through_path”表示所有的候选路径,“select_through_path”表示从候选路径中选择出来的路径,“level”表示缓冲区层次,“chosen_path”表示经过过滤后最终选择的路径,“***cache_read***to《local.l1》”表示使用访存优化原语cache_read把数据搬移到缓冲区l1。
[0139]
source_dest:['ddr','l0c']
[0140]
producer:tensor(shape=[13,64,16,16],op.name=a)
[0141]
consumer:tensor(shape=[64,13,16,16],op.name=c)
[0142]
through_path:[['ddr','ub','l0c'],['ddr','ub",'l1','ub','l0c'],['ddr”ub','l1','l0a',l0c'],['ddr','l0a','l0c'],['ddr’,'l1','ub','loc'],
[0143]
select_through_path:[['ddr','ub','l1','l0a','l0c'],['ddr','l0a','l0c'],:['ddr','l1','l0a','l0c]]
[0144]
level:l2-》l0
[0145]
chosen_path:['ddr','l1','l0a','l0c']
[0146]
***cache_read***to《local.l1》
[0147]
***scache_read***to《local.l0a》
[0148]
source_dest:['ddr','l0c']
[0149]
producer:tensor(shape=[64,64,16,16],op.name=b),
‑‑‑
consumer:tensor(shape=[64,13,16,16],op.name=c)
[0150]
through_path:[['ddr','ub','l0c'],['ddr','ub','l1','ub','l0c'],['ddr','ub',"'l1','l0b','l0c'],['ddr','l0b','l0c'],['ddr','l1','ub','l0c'],
[0151]
select_through_path:[["ddr','ub",'l1','l0b','l0c'],['ddr','l0b','l0c'],['ddr','l1','l0b','l0c']]
[0152]
level:l2-》l0
[0153]
chosen_path:['ddr','l1','l0b','l0c']
[0154]
***cache_read***to《local.l1》
[0155]
***cache_read***to《local.l0b》
[0156]
source_dest:['l0c','ub']
[0157]
producer:tensor(shape=[64,13,16,16],op.name=c)
‑‑‑
consumer:tensor(shape=[64,13,16,16],op.name=d)
[0158]
through_path:[['l0c','ub']]
[0159]
select_through_path:[['l0c','ub']]
[0160]
level:l0-》sup
[0161]
chosen_path:['l0c','ub']
[0162]
(4)获得最终选择的路径后,使用tvm的访存优化原语进行数据流构建,本实施例使用访存优化原语操作:cache_read、cache_write和set_scope进行数据流构建,最终获得的整体数据流如图11所示,由图可知,每一个节点都已包含了硬件的缓冲区信息,整体数据流符合硬件架构设计。
[0163]
虽然本技术方法的实现是基于tvm编译器,但是业界还有很多其他的编译器,它们的软件架构是类似的,例如都提供了访存优化原语等,所以本技术的技术方案并不限于某种特定的编译器。
[0164]
图12为本技术一个实施例提供的深度学习模型的编译装置示意图。应理解,图12示出的装置1200仅是示例,本技术实施例的装置1200还可包括其他模块或单元。装置1200可以用于实现图6所示的方法。
[0165]
例如,装置1200可以包括获取模块1201、确定模块1202、筛选模块1203和选择模块1204。其中,获取模块1201用于执行s601和s602,确定模块1202、筛选模块1203和选择模块1204用于执行s603。
[0166]
应理解,这里的术语“模块”可以通过软件和/或硬件形式实现,对此不作具体限定。例如,“模块”可以是实现上述功能的软件程序、硬件电路或二者结合。所述硬件电路可能包括应用特有集成电路(application specific integrated circuit,asic)、电子电路、用于执行一个或多个软件或固件程序的处理器(例如共享处理器、专有处理器或组处理器等)和存储器、合并逻辑电路和/或其它支持所描述的功能的合适组件。
[0167]
图13为本技术一个实施例提供的装置示意性框图。图13所示的装置1300包括存储器1301、处理器1302、通信接口1303以及总线1304。其中,存储器1301、处理器1302、通信接口1303通过总线1304实现彼此之间的通信连接。
[0168]
存储器1301可以是只读存储器(read only memory,rom),静态存储设备,动态存储设备或者随机存取存储器(random access memory,ram)。存储器1301可以存储程序,当存储器1301中存储的程序被处理器1302执行时,处理器1302用于执行图6所示的方法的各个步骤。
[0169]
处理器1302可以采用通用的中央处理器(central processing unit,cpu),微处理器,应用专用集成电路(application specific integrated circuit,asic),或者一个或多个集成电路,用于执行相关程序,以实现本技术方法实施例中的方法。
[0170]
处理器1302还可以是一种集成电路芯片,具有信号的处理能力。在实现过程中,本技术实施例中的方法的各个步骤可以通过处理器1302中的硬件的集成逻辑电路或者软件形式的指令完成。
[0171]
上述处理器1302还可以是通用处理器、数字信号处理器(digital signal processing,dsp)、专用集成电路(asic)、现成可编程门阵列(field programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本技术实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0172]
结合本技术实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器1301,处理器1302读取存储器1301中的信息,结合其硬件完成本技术测温装置包括的单元所需执行的功能,例如,可以执行图6所示实施例的各个步骤/功能。
[0173]
通信接口1303可以使用但不限于收发器一类的收发装置,来实现装置1300与其他设备或通信网络之间的通信。
[0174]
总线1304可以包括在装置1300各个部件(例如,存储器1301、处理器1302、通信接口1303)之间传送信息的通路。
[0175]
应理解,本技术实施例所示的装置1300可以是电子设备,或者,也可以是配置于电子设备中的芯片。
[0176]
应理解,本技术实施例中的处理器可以为中央处理单元(central processing unit,cpu),该处理器还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0177]
还应理解,本技术实施例中的存储器可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read-only memory,rom)、可编程只读存储器(programmable rom,prom)、可擦除可编程只读存储器(erasable prom,eprom)、电可擦除可编程只读存储器(electrically eprom,eeprom)或闪存。易失性存储器可以是随机存取存储器(random access memory,ram),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的随机存取存储器(random access memory,ram)可用,例如静态随机存取存储器(static ram,sram)、动态随机存取存储器(dram)、同步动态随机存取存储器(synchronous dram,sdram)、双倍数据速率同步动态随机存取存储器(double data rate sdram,ddr sdram)、增强型同步动态随机存取存储器(enhanced sdram,esdram)、同步连接动态随机存取存储器(synchlink dram,sldram)和直接内存总线随机存取存储器(direct rambus ram,dr ram)。
[0178]
上述实施例,可以全部或部分地通过软件、硬件、固件或其他任意组合来实现。当使用软件实现时,上述实施例可以全部或部分地以计算机程序产品的形式实现。所述计算
机程序产品包括一个或多个计算机指令或计算机程序。在计算机上加载或执行所述计算机指令或计算机程序时,全部或部分地产生按照本技术实施例所述的流程或功能。所述计算机可以为通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集合的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质。半导体介质可以是固态硬盘。
[0179]
应理解,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况,其中a,b可以是单数或者复数。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系,但也可能表示的是一种“和/或”的关系,具体可参考前后文进行理解。
[0180]
本技术中,“至少一个”是指一个或者多个,“多个”是指两个或两个以上。“以下至少一项(个)”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a,b,或c中的至少一项(个),可以表示:a,b,c,a-b,a-c,b-c,或a-b-c,其中a,b,c可以是单个,也可以是多个。
[0181]
应理解,在本技术的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。
[0182]
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
[0183]
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0184]
在本技术所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0185]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0186]
另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0187]
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。
[0188]
以上所述,仅为本技术的具体实施方式,但本技术的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1