CN112463159B - 编译方法、装置、电子设备和存储介质 - Google Patents
编译方法、装置、电子设备和存储介质 Download PDFInfo
- Publication number
- CN112463159B CN112463159B CN202011337532.6A CN202011337532A CN112463159B CN 112463159 B CN112463159 B CN 112463159B CN 202011337532 A CN202011337532 A CN 202011337532A CN 112463159 B CN112463159 B CN 112463159B
- Authority
- CN
- China
- Prior art keywords
- operator
- operand
- optimizable
- address
- operands
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开涉及一种编译方法、装置、电子设备和存储介质。所述计算机设备包括计算处理装置、接口装置、其他处理装置和存储装置。计算处理装置可以配置成执行用户指定的操作,该计算处理装置可以实现为单核人工智能处理器或者多核人工智能处理器。计算处理装置可以通过接口装置与其他处理装置进行交互,以共同完成用户指定的操作。根据本申请的实施方式,减小了逐个算子优化对其他算子的影响,减少残留可以进行优化的算子,实现优化最大化,从而提高整个网络的运算性能。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种编译方法、装置、电子设备和存储介质。
背景技术
在人工智能技术领域,神经网络算法是非常流行的一种机器学习算法,在各种领域中都取得了非常好的效果,比如图像识别,语音识别,自然语言处理等。随着神经网络算法的发展,算法的复杂度也越来越高,为了提高识别度,模型的规模也在逐渐增大。
神经网络中包含一类算子,这类算子的语义中不涉及任何计算逻辑,其输入数据和输出数据不管是数值的数量,亦或是数值本身都没有发生任何变化,这类算子通常是用来对神经网络的计算图中的张量数据的格式、形状以及内存中的排布进行调整,为的是把神经网络上游计算得到的张量数据调整成对下游的计算更好和方便的形式。处理器在运行这类算子的程序代码时将产生大量的数据搬移开销,影响运算性能。
发明内容
有鉴于此,本公开提出了一种编译方法、装置、电子设备和存储介质,减小了逐个算子优化对其他算子的影响,减少残留可以进行优化的算子,实现优化最大化,从而提高整个网络的运算性能。
根据本公开的一方面,提供了一种编译方法,所述方法用于对神经网络对应的程序进行编译,所述方法包括:
提取神经网络的计算图的可优化子图,其中,所述可优化子图中的算子能够被优化;
从最大数据块开始,遍历可优化子图中算子的输入操作数和输出操作数,根据可优化子图中算子的输入操作数和输出操作数构建可优化子图的地址回填有向图;其中,所述最大数据块为可优化子图中张量大小最大的操作数,所述地址回填有向图是用于地址回填的有向图;
根据最大数据块的地址、可优化子图以及地址回填有向图,对可优化子图中算子的操作数进行地址回填。
在一种可能的实现方式中,提取神经网络的计算图的可优化子图,包括:
根据指定算子的输入操作数和输出操作数的关系、以及指定算子的输入操作数与指定算子的输出操作数以及其他指定算子的操作数的关系确定计算图中的可优化算子;
根据计算图中的可优化算子之间的连接关系,用可优化算子构建可优化子图。
在一种可能的实现方式中,根据指定算子的输入操作数和输出操作数的关系、以及指定算子的输入操作数或者输出操作数与其他指定算子的操作数的关系确定计算图中的可优化算子,包括:
若指定算子的输入操作数和输出操作数在内存中摆放的方式一致,并且指定算子的输入操作数能够避免使用两个相邻的操作数的地址进行回填,则所述指定算子为可优化算子。
在一种可能的实现方式中,根据计算图中的可优化算子之间的关系,用可优化算子构建可优化子图,包括:
根据计算图中的可优化算子之间的关系,采用并查集算法构建可优化算子的可优化子图。
在一种可能的实现方式中,从最大数据块开始,遍历可优化子图中算子的输入操作数和输出操作数,根据可优化子图中算子的输入操作数和输出操作数构建可优化子图的地址回填有向图,包括:
在构建可优化子图的地址回填有向图时,以最大数据块为父节点,按照可优化子图中算子的连接顺序,将回填地址时作为依据的操作数确定为父节点、被回填地址的操作数确定为子节点。
在一种可能的实现方式中,根据最大数据块的地址、可优化子图以及地址回填有向图,回填可优化子图中算子的操作数的地址,包括:
根据地址回填有向图确定待回填操作数;
根据待回填操作数与父节点之间的可优化算子类型、以及已回填的父节点的地址对待回填操作数进行地址回填。
根据本公开的另一方面,提供了一种编译装置,所述装置用于对神经网络对应的程序进行编译,所述装置包括:
提取模块,用于提取神经网络的计算图的可优化子图,其中,所述可优化子图中的算子能够被优化;
构建模块,用于从最大数据块开始,遍历可优化子图中算子的输入操作数和输出操作数,根据可优化子图中算子的输入操作数和输出操作数构建可优化子图的地址回填有向图;其中,所述最大数据块为可优化子图中张量大小最大的操作数,所述地址回填有向图是用于地址回填的有向图;
地址回填模块,用于根据最大数据块的地址、可优化子图以及地址回填有向图,对可优化子图中算子的操作数进行地址回填。
在一种可能的实现方式中,所述提取模块,包括:
第一确定单元,用于根据指定算子的输入操作数和输出操作数的关系、以及指定算子的输入操作数与指定算子的输出操作数以及其他指定算子的操作数的关系确定计算图中的可优化算子;
第一构建单元,用于根据计算图中的可优化算子之间的连接关系,用可优化算子构建可优化子图。
在一种可能的实现方式中,所述确定单元,还用于若指定算子的输入操作数和输出操作数在内存中摆放的方式一致,并且指定算子的输入操作数能够避免使用两个相邻的操作数的地址进行回填,则所述指定算子为可优化算子。
在一种可能的实现方式中,所述第一构建单元还用于根据计算图中的可优化算子之间的关系,采用并查集算法构建可优化算子的可优化子图。
在一种可能的实现方式中,所述构建模块包括:
第二构建单元,用于在构建可优化子图的地址回填有向图时,以最大数据块为父节点,按照可优化子图中算子的连接顺序,将回填地址时作为依据的操作数确定为父节点、被回填地址的操作数确定为子节点。
在一种可能的实现方式中,所述地址回填模块包括:
第二确定单元,用于根据地址回填有向图确定待回填操作数;
地址回填单元,用于根据待回填操作数与父节点之间的可优化算子类型、以及已回填的父节点的地址对待回填操作数进行地址回填。
根据本公开的一方面,提供了一种电子设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述可执行指令时实现上述方法。
根据本公开的一方面,提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。
根据本申请实施例的编译方法或装置,通过整体提取计算图中的可优化子图,以及根据可优化子图中的最大数据块的地址回填其他操作数的地址,减小了逐个算子优化对其他算子的影响,减少残留可以进行优化的算子,实现优化最大化,从而提高整个网络的运算性能。并且,通过使用最大数据块的地址回填其他操作数的地址的方式,还可以保证存储空间的连续性,节省内存空间。
根据下面参考附图对示例性实施例的详细说明,本公开的其它特征及方面将变得清楚。
附图说明
包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本公开的示例性实施例、特征和方面,并且用于解释本公开的原理。
图1A示出根据本申请一实施例的reshape运算的示例。
图1B示出根据本申请一实施例的transpose运算的示例。
图1C示出根据本申请一实施例的concat运算的示例。
图1D示出根据本申请一实施例的split运算的示例。
图1E示出根据本申请一实施例的move运算的示例。
图1F示出根据本申请一实施例的存储张量数据的示例。
图2示出根据本申请一实施例的编译方法的流程图。
图3A-图3C示出根据本申请一实施例的转置过程的示例。
图4示出根据本申请一实施例的拆分运算过程的示意图。
图5A示出根据本申请一些实施例的应用场景的示意图。
图5B示出根据本申请一些实施例的应用场景的示意图。
图6示出根据本申请一实施例的步骤S20的方法的流程图。
图7A示出根据本申请一实施例的神经网络的计算图的示例。
图7B示出根据本申请一实施例的回填有向图的示例。
图8示出根据本申请一实施例的神经网络的计算图的示例。
图9A示出从图8的示例中提取的可优化第一类算子的示意图。
图9B示出从图8的示例中提取的可优化子图的示意图。
图10示出根据图9B的可优化子图构建的回填有向树的示意图。
图11示出根据本申请一实施例的编译装置的框图。
图12是示出根据本披露实施例的一种组合处理装置1200的结构图。
图13是示出根据本披露实施例的一种板卡1300的结构示意图。
具体实施方式
以下将参考附图详细说明本公开的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本公开,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本公开同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本公开的主旨。
为了便于更好的理解本申请所描述的技术方案,下面先解释本申请实施例所涉及的技术术语:
(1)张量(tensor)
在本申请中,张量是对存储的一块数据的特征描述,张量记录了数据的形状、类型等信息。
本申请实施例中,张量应该理解为张量数据,可以包括神经网络中输入张量数据、输出张量数据,也可以包括特征张量数据等。
以人工智能深度学习框架TensorFlow为例,一般使用阶(rank)、形状(shape)和维数(dimension number)来描述张量的维度,其关系可以表示为表1所示:
表1
阶 | 形状 | 维数 | 例子 |
0 | [] | 0 | 1 |
1 | [D1] | 1 | [2] |
2 | [D1,D2] | 2 | [2,3] |
3 | [D1,D2,D3] | 3 | [2,3,4] |
… | [] | … | [] |
n | [D1,D2,D3,…,Dn] | n | [1,2,3,…n] |
如表1所示,张量A=1,其表示一个数。
如表1所示,张量A=[2,3],其表示二维矩阵,具体地,该矩阵为2行3列的矩阵。
在神经网络的模型中可以包含多个算子,以及与算子关联的多个张量数据,根据算子与算子之间、以及算子与张量数据的关系可以搭建神经网络的计算图(ComputationalGraph)。计算图是通过图论语言表示数据函数的一种方式,在图论中节点通过边连接,节点代表事物,连接两节点的边表示两个事物间具有的关系,而计算图中用节点代表神经网络中的输入数据或者算子,连接两节点的边表示两点之间的输入输出关系,边还可以附有权值等。
(2)算子的划分
在本申请实施例中,可以把目前深度学习中的算子分为两类。下面对其进行详细阐述:
第一类算子的语义中不涉及任何计算逻辑,其输入数据和输出数据不管是数值的数量,亦或是数值本身都没有发生任何变化,这类算子通常是用来对神经网络的计算图中的张量数据的格式、形状以及在内存中的排布进行调整,为的是把神经网络上游计算得到的张量数据调整成对下游的计算更好和方便的形式。比如说,算子transpose、reshape、split、concat、move都属于第一类算子。
另一类算子中包含逻辑运算,他们有着各自特定的计算任务,会对输入数据进行乘法、加法、非线性计算、比较挑选以及其他的数学运算。例如,卷积算子使用卷积核对输入数据的局部区域进行卷积计算得到输出特征;又例如,全连接算子使用矩阵乘法的方式对输入的所有特征进行线性组合;又例如,池化算子对输入数据进行采样得到输出数据,等等。
(3)第一类算子
在本申请实施例中,第一类算子可以包括如上所述的reshape算子、transpose算子、concat算子、split算子、move算子。接下来对其一一进行介绍:
reshape算子
在本申请实施例中,reshape算子,也即张量重构算子,是指对张量的形状进行调整。
在实际应用中,reshape算子可以用于对张量数据的形状进行调整。具体地,reshape算子可以表示为:reshape(tensor,shape),用于将tensor变换为参数shape的形式。
图1A示出根据本申请一实施例的reshape运算的示例。
以张量A=[2,4,2]为例,reshape(A,[2,2,4]),当对张量A执行reshape算子操作之后,得到三阶张量,张量的形状、维数为[2,2,4]。具体地,可以参见如图1A所示的reshape算子语义的示意图,图1A中,左侧为原始张量数据,右侧为重构之后的张量数据。
transpose算子
在本申请实施例中,transpose算子,也即,张量转置算子或者叫转置算子,是指对张量进行转置的运算。
在实际应用中,transpose算子可以用于调整张量数据的维度顺序。具体地,transpose算子可以表示为:transpose(tensor,perm),用于按照perm参数调换tensor的顺序。这里,perm参数为自然数列[1,2,3,...,n]的一个全排列,不同的全排列表示不同的transpose算子。
图1B示出根据本申请一实施例的transpose运算的示例。
一般情况下,多维张量有多个维度且彼此之间存在先后顺序,transpose算子可以改变维度的先后顺序。此外,需要说明的是,在一些场景下,transpose算子又被称为permute算子。
以张量A=[3,2,4]为例,当对张量A执行transpose算子运算之后,得到张量B,其中,张量B=[4,2,3]。具体地,可以参见如图1B所示的transpose算子运算过程的示意图。
concat算子
图1C示出根据本申请一实施例的concat运算的示例。
在本申请实施例中,concat算子,也即,拼接算子,用于将多个张量数据沿着指定的维度拼接成一个张量。除了在指定维度外,输入张量的其他维度应该保持一致。通过concat算子,神经网络将代表来自上游不同位置的特征的多个张量拼接成一个,从而可以在下游计算中对这些特征共同进行处理。具体地,可以参见图1C所示的concat算子运算过程的示意图,拼接之前的张量数据分别为[a0,b,c]、[a1,b,c],拼接的维度为高维度a0和a1,另外两个对应的维度相同,分别为b和c,拼接后的张量数据为[a0+a1,b,c]。
split算子
图1D示出根据本申请一实施例的split运算的示例。
在本申请实施例中,split算子,也即拆分算子,用于将一个张量在指定维度上拆分成多个张量。拆分后的多个张量除了指定维度之外,在其他维度上保持一致。通过split算子,可以把属于同一张量数据的特征拆成多份,从而在后续计算中分别进行针对性处理。具体地,可以参见图1D所示的split算子语义的示意图,拆分之前的张量数据为[a0+a1,b,c],在高维度a方向尽心拆分,拆分后额的张量数据分别为[a0,b,c]、[a1,b,c]。
move算子
图1E示出根据本申请一实施例的move运算的示例。
在本申请实施例中,move算子用于将split算子拆分成的多个张量进行进一步的拼接操作。比如说,在split算子和卷积算子之间的move算子,为了提高并行度,move算子需要对split算子拆分成的多个张量进行重新拼接,才能使卷积算子并行完成运算。
具体地,可以参见图1E所示的move算子语义的示意图。move算子的输入操作数包括Tensor10、Tensor11、Tensor12、Tensor13,其中,根据卷积核的大小对Tensor10进行move运算后得到Tensor20,如图1E所示,在Tensor10的下侧拼接了一部分数据,这部分数据属于Tensor11和Tensor10相邻的部分数据。比如说,假设Tensor10、Tensor11、Tensor12、Tensor13都是5×5的矩阵,卷积核为3×3的矩阵,这种情况下,拼接后的Tensor20为7×5的矩阵,Tensor20的第六行和第七行数据分别是Tensor11的第一行和第二行数据。根据卷积核的大小对Tensor11进行move运算后得到Tensor21,以上述示例为例,Tensor21可以为7×5的矩阵,Tensor21最后两行可以是Tensor12的前两行,以此类推,可以得到Tensor22和Tensor23。
总的来说,在本申请实施例中,第一类算子用于对神经网络中的张量数据的格式、张量数据的形状和张量数据在内存中的排布中的至少一种进行调整。
需要说明的是,在本申请实施例中,第一类算子可以包括但不限于上述5种不同类型的算子,还可以包括其他算子,本申请实施例不作具体限定。
(4)张量数据在存储中的数据排布
图1F示出根据本申请一实施例的存储张量数据的示例。
神经网络计算中使用多维张量作为算子间数据传递的基本单位。一般情况下,数据以连续存储的方式存储在内存中。例如,如图1F所示,数据存储在a0-a15间连续的16个比特位中。
在本申请实施例中,存储数据的顺序与张量由外到内(由低纬度到高维度)把所有维度依次展开得到的一维数据中元素的顺序相同,访问张量中数据的地址根据元素在不同维度的坐标以及维度本身来决定。例如,形状为(D0,D1,D2)的张量,存储在大小为D0×D1×D2的连续内存中,要访问张量中坐标(n0,n1,n2)的数据,可以基于数据在内存中的起始地址和通过计算得到的数据偏移(n0×D1+n1)×D2+n2来确定数据在内存中的实际地址。
可以理解的是,使用这种紧密连续的存储方式来存储多维张量数据非常直观且方便,元素坐标和其在内存中的偏移的换算也非常简洁。相关技术中,深度学习框架,例如,以Caffe、MXNet为例,都是使用这种方式来管理神经网络中张量数据的管理内存,并在此基础上实现卷积、池化等各种算子在通用处理器、人工智能处理器(例如,GPU)上的函数。
如前文所述,为了把神经网络的计算图中算子输出的操作数调整成便于算子之后的算子计算的形式,会在神经网络的算子之间插入有第一类算子,处理器在运行第一类算子的程序代码时将产生大量的数据搬移开销,影响运算性能。
为了提高运算的性能,虽然相关技术中已经设计了遍历整个计算图提取出可以优化的算子,对提取出来的算子分析其约束条件一个一个的优化,或者,一边遍历计算图一边分析算子的约束条件,若符合条件则对其进行优化。这种优化策略的缺陷在于优化了前面的算子导致后面的算子无法优化,从而导致网络中残留很多可优化的算子。这样处理不但会对其他算子产生影响,而且并不能适用某些网络,比如说循环网络、控制流网络等等。从而导致内存空间的浪费以及运算时间延长。
为了解决上述技术问题,本申请提供了一种编译方法及装置。所述方法应用于编译器,用于对神经网络对应的程序进行编译。图2示出根据本申请一实施例的编译方法的流程图,如图2所示,本申请实施例的编译方法可以包括:
步骤S20,提取神经网络的计算图的可优化子图,其中,可优化子图中的算子能够被优化;
步骤S21,从最大数据块开始,遍历可优化子图中算子的输入操作数和输出操作数,根据可优化子图中算子的输入操作数和输出操作数构建可优化子图的地址回填有向图;其中,所述最大数据块为可优化子图中张量大小最大的操作数,所述地址回填有向图是用于地址回填的有向图;
步骤S22,根据最大数据块的地址、可优化子图以及地址回填有向图,对可优化子图中算子的操作数进行地址回填。
在一种可能的实现方式中,从神经网络的计算图中可以提取一个或两个以上可优化子图,每个可优化子图中可以包括一个或者两个以上算子。
若一个可优化子图中包括一个算子,那么该算子为第一类算子、而且该算子的输入操作数和输出操作数满足算子对应的第一优化条件即可。
若一个可优化子图中包括两个以上算子,那么可优化子图中的算子与同一个可优化子图中的另外至少一个算子之间存在边相连接。并且可优化子图中的算子都能够被优化需要满足两方面的条件:一方面是,算子的输入操作数和输出操作数满足算子对应的第一优化条件,另一方面是,算子的输入操作数或者输出操作数与可优化子图中的其他算子的操作数也满足对应的第二优化条件。
下面分别说明算子的输入操作数和输出操作数需要满足的算子对应的第一优化条件,以及算子的输入操作数或者输出操作数与可优化子图中的其他算子的操作数需要满足对应的第二优化条件。
第一优化条件
如上文所述,在神经网络中,第一类算子是可以通过地址优化的方式进行优化的。本申请的实施例中主要是对第一类算子进行优化。在本申请的实施例中,为了便于说明,可以将第一类算子称作指定算子,也就是说,若遍历到计算图中的算子是第一类算子,则该算子为指定算子。
在本申请的实施例中,不同的指定算子对应的第一优化条件可以不同。在一种可能的实现方式中,指定算子和指定算子的输入操作数对应的第一优化条件可以为指定算子的输入操作数和输出操作数在内存中存储(摆放)的方式一致。也就是说,经过指定算子的运算得到的输出操作数在内存中存储(摆放)的方式与运算之前的输入操作数是一样的。这样,可以通过修改输入操作数或者输出操作数的首地址(起始地址)使两个操作数指向同一块内存,从而实现不需要进行数据搬移,实现对指定算子的优化。
在另一种可能的实现方式中,对于有一些指定算子,比如说如上图1E所示的move算子,输出操作数是进行了拼接之后的张量数据,存在数据冗余,这时候无法将输入操作数和输出操作数的摆放方式完全一致作为move算子的优化条件。但可以通过输入操作数和输出操作数的其他特征设定第一优化条件。
下面介绍针对不同的指定算子对应的具体的优化条件。
reshape算子
reshape算子对应的第一优化条件可以为:在存储张量重构算子的输入操作数和输出操作数时未进行数据对齐。由于reshape算子并未对输入操作数进行拆分,因此,不需要考虑不同块之间存储是否连续的问题,需要考虑的是存储输入操作数和输出操作数时是否进行了数据对齐。
为了满足硬件平台存取效率等的要求,有些时候,在存储张量数据时会进行数据对齐,是否进行数据对齐需要考虑张量数据的形状、数据类型、操作系统的字长等。
如果输入操作数和/或输出操作数进行了数据对齐,那么优化的过程将变得非常复杂,会极大地降低编译的效率,相比于运算性能的提高,可能会降低整个程序运行过程,是不可取的。
在一种可能的实现方式中,编译器可以通过读取已经分配了内存的指定算子(张量重构算子)的操作数(输入操作数、输出操作数)的描述信息,根据描述信息中的数据对齐信息判断指定算子(张量重构算子)的输入操作数、输出操作数是否进行了数据对齐。
上述操作数可以是张量数据,操作数的描述信息可以包括描述张量数据的形状的参数、数据对齐信息、操作数的大小、操作数存储的地址信息的用于描述操作数的信息。
其中,数据对齐信息可以包括描述没进行数据对齐的张量数据的原始大小的参数以及张量数据在内存中的实际大小的参数,比如说c维度和logic_c维度参数,其中,logic_c表示没进行数据对齐的原始大小,c表示在内存中的实际大小,根据c和logic_c是否一致可以判断是否进行了数据对齐。比如说,c维度和logic_c维度参数,比较两者大小是否一致,判断是否进行了数据对齐。其中,logic_c表示没进行数据对齐的原始大小,c表示在内存中的实际大小。如果logic_c和c相等,则表示未进行数据对齐;如果logic_c和c不相等,则表示进行了数据对齐。
操作数存储的地址信息可以是指操作数存储的起始地址,在一种可能的实现方式中,该起始地址可以用相对于为神经网络的操作数分配的内存空间的基地址的偏移量表示,本申请不限于此。
举例来说,结合图1A以及图1E对reshape算子对应的优化条件进行说明。如图1A所示,左侧的数据表示reshape算子的输入操作数,右侧的数据表示reshape算子的输出操作数,如果存储时未进行数据对齐,那么存储的方式都是如图1E所示,每一个数据相对于第一个数据的偏移量是没有变化的,只不过两块数据存储的起始地址是不同的。因此,可以通过修改输入操作数或者输出操作数的起始地址使两块数据指向一块内存空间,从而不需要进行数据搬移,提高运算性能。
transpose算子
transpose算子对应的第一优化条件可以为:在存储转置算子的输入操作数和输出操作数时未进行数据对齐,且转置后的输出操作数和输入操作数相比,非1维度的相对顺序不变。
关于数据是否进行对齐仍然可以参见上文中reshape算子部分的介绍。
假设输入操作数和输出操作数都是3维张量数据,三个维度分别为H、W、C(height,width,channels),其中,H表示高度方向的维度,W表示宽度方向的维度,C表示通道数。张量数据通常可以表示为[H,W,C],对于张量数据[H,W,C],在存储和读取时,是按照C、H、W的维度顺序进行的。
假设C维度为1,对[H,W,1]进行转置后的操作数为[H,1,W],其中,非1维度H和W的顺序保持不变,这种情况下,可以对转置算子进行优化。如果对[H,W,1]进行转置后的操作数为[W,1,H],这种情况下,不满足非1维度H和W的顺序保持不变,无法对转置算子进行优化。
举例来说,图3A-图3C示出根据本申请一实施例的转置过程的示例。假设H为2、W为4,张量数据[H,W,1]可以表示为如图3A所示,如果转置后的操作数为[H,1,W],可以表示为如图3B所示。对于图3A所示,在存储和读取数据时是按照C,W,H的顺序,也就是按照a0,a1,a2,a3,a4,a5…a7,对于图3B所示,在存储和读取数据时是按照W,C,H的顺序,也就是先读W维度方向a0,a1,a2,a3,C维度方向为1,因此,沿着H维度方向向下,然后读W维度方向数据a4,a5…a7。可见,进行如上转置后,输入操作数和输出操作数的存储方式是完全一致的,可以通过修改输入操作数或者输出操作数的地址信息实现优化。
如果转置后的操作数为[W,1,H],如图3C所示。对于图3C的操作数,在存储和读取数据时是按照H,C,W的顺序,也就是先读H方向a0,a4,然后沿C维度方向为1,因此,沿着W维度方向向下读H维度方向a1,a5。重复前述过程,最终读取数据的顺序为a0,a4,a1,a5,a2,a6,a3,a7。可见和转置之前是不同的,无法通过修改输入操作数或者输出操作数的地址信息实现优化。
split算子和concat算子
这两种算子的第一优化条件是类似的:指定算子的输入操作数和输出操作数在存储时未进行数据对齐、且拆分\拼接的是高维度或者比拆分\拼接的维度更高的维度为1。
对于split算子来说,第一优化条件可以为:拆分算子的输入操作数和输出操作数在存储时未进行数据对齐、且拆分算子用于对输入操作数的高维度进行拆分或者比拆分的维度更高的维度为1。
其中,拆分算子的输入操作数和输出操作数在存储时未进行数据对齐可以参见上文的解释,不再赘述。
拆分算子用于对输入操作数的高维度进行拆分可以是指,拆分算子拆分的是输入操作数的最高维度,以图1D为例,输入操作数的最高维度为维度a,拆分算子对维度a进行了拆分,这种情况下,符合优化条件。比拆分的维度更高的维度为1可以是指比拆分的维度更高的维度都是1维,以图1D为例,如果要对维度b进行拆分,如果维度a为1维,拆分算子是可以被优化的。
对于concat算子来说,第一优化条件可以为:拼接算子的输入操作数和输出操作数在存储时未进行数据对齐、且拼接算子用于对输入操作数的高维度进行拼接或者比拼接的维度更高的维度为1。拼接算子的输入操作数可以由多块张量数据组成,如图1C所示的两块张量数据[a0,b,c]和[a1,b,c]。
拼接算子用于对输入操作数的高维度进行拼接可以是指,拼接算子拼接的是输入操作数的最高维度,以图1D为例,输入操作数的最高维度为维度a,拼接算子对维度a进行了拼接,这种情况下,符合优化条件。比拼接的维度更高的维度为1可以是指比拼接的维度更高的维度都是1维,以图1C为例,如果要对维度b进行拼接,如果维度a为1维,拼接算子是可以被优化的。
对拆分和拼接的维度的限定同样是由于对张量数据存储方式,如上文所述,在本申请实施例中,存储数据的顺序与张量由外到内(由低纬度到高维度)把所有维度依次展开得到的一维数据的元素的顺序相同。如果拆分\拼接的不是最高维度,或者拆分\拼接的维度更高的维度不是1维,那么就无法仅通过修改地址的方式优化算子。
以一个二维矩阵为例进行说明,以拆分算子为例。图4示出根据本申请一实施例的拆分运算过程的示意图。如图4所示,对于一个二维张量数据,可以拆分张量数据的行或者列。二维矩阵的行是高维度、列是低维度,如果对二维张量数据的行进行拆分,得到的结果如图4中右侧的两块数据,在进行存储时,如果拆分后的两块数据连续存储,那么拆分后的操作数和拆分前的操作数存储方式是完全一样的,因此,可以进行算子优化。如果对二维张量数据的列进行拆分,得到的结果如图4中下侧的两块数据,在进行存储时,即使拆分后的两块数据连续存储而且不进行数据对齐,和拆分前的操作数的存储方式也是不一样的,因为对列进行了拆分,原来的一行数据被拆分成了两部分,如图4下侧的两块数据所示,在存储第一块的时候,一行一行进行存储,接着再存储第二块,仍然是一行一行进行存储,拆分前操作数的同一行数据已经不是连续存储的了。
举例来说,假设拆分前的张量数据为如果对列进行拆分,拆分成两个张量数据: 那么拆分之前的张量数据存储的顺序为1、2、3、4、5、6、7、8、9,而拆分后的张量数据存储的顺序为1、2、4、5、7、8、3、6、9,可见拆分前和拆分后的张量数据存储的方式是不一样的。因此,无法仅通过修改操作数的描述信息优化算子。
通常存储数据的地址空间都是连续的,对于拆分算子和拼接算子,拆分之后的数据和拼接之前的数据,在申请存储空间时,没办法保证数据块是连续的。因此,对于拆分算子,通常是根据拆分算子的输入数据对输出数据进行优化,而对于拼接算子,通常是根据拼接算子的输出数据对输入数据进行优化。
move算子
move算子对应的第一优化条件可以为:move算子之前为split算子、之后为卷积算子,在存储move算子的输入操作数和输出操作数时未进行数据对齐,而且输入操作数在存储器中连续存储,拆分算子用于对输入操作数的高维度进行拆分或者比拆分的维度更高的维度为1。
如图1E所示,move算子的四块输入操作数在存储空间中是连续存储的,输出操作数可以是不连续的,本申请对此不作限定。但在存储move算子的输入操作数和输出操作数时未进行数据对齐,具体判断的方式可以参见上文的描述,不再赘述。对拆分算子的拆分方式的限定也可以参见上文对拆分算子的限定的解释,不再赘述。
对于move算子的优化和拆分算子类似,通常是根据输入操作数对输出操作数进行优化。
对于计算图中单个的指定算子,如果满足指定算子对应的第一优化条件,那么就是可以单独对指定算子进行优化的。如果指定算子还与其他指定算子连接,也就是指定算子与指定算子之间存在边相连接,这种情况下还需要考虑第二优化条件。
第二优化条件
针对一个操作数,如果无法避免使用两个相邻的操作数的地址对该操作数进行地址优化(回填)的情况,那么以该操作数作为输入操作数的算子不满足第二优化条件。
因此,对于一个指定算子来说,第二优化条件可以是指,指定算子的输入操作数能够避免使用两个相邻的操作数的地址进行回填。
举例来说,图5A和图5B示出根据本申请一些实施例的应用场景的示意图。如图5A所示,在上文提到的相关技术中,如果采用一边遍历计算图一边分析算子的约束条件,若符合条件则对算子进行优化的方式,很有可能无法对最后一个算子concat进行优化。比如说,如果reshape算子满足对应的第一优化条件,根据操作数A对操作数B进行了地址回填可以对reshape算子进行优化,将操作数B的地址修改为和操作数A一样,省去数据搬移的过程。对于操作数C,如果transpose算子满足对应的第一优化条件,根据操作数B对操作数C进行地址回填,将操作数C的地址修改为和操作数B(A)一样,省去数据搬移的过程。对于这种情况,就无法对concat算子进行优化了,因为要根据concat算子的输出操作数对输入操作数进行地址回填。但这种情况是可以避免的,比如说,可以根据操作数E对操作数C和D进行地址回填优化concat算子,然后根据操作数C对操作数B进行地址回填优化transpose算子,再根据操作数B对操作数A进行地址回填优化reshape算子。
但是对于图5B所示的情况,对于concat算子的输入操作数G,无法避免使用两个相邻的操作数的地址进行地址优化。因此,对于操作数G,要根据split算子的输入操作数F进行地址回填,就无法采用操作数K对操作数G进行地址回填,也就无法对concat算子进行优化。
根据以上分析可知,图5A中的concat算子满足第二优化条件,图5B中的concat算子不满足第二优化条件。
根据以上第一优化条件和第二优化条件可以提取出神经网络的计算图的可优化子图。
图6示出根据本申请一实施例的步骤S20的方法的流程图。在一种可能的实现方式中,步骤S20可以包括:
步骤S200,根据指定算子的输入操作数和输出操作数的关系、以及指定算子的输入操作数与指定算子的输出操作数以及其他指定算子的操作数的关系确定计算图中的可优化算子;
步骤S201,根据计算图中的可优化算子之间的连接关系,用可优化算子构建可优化子图。
对于步骤S200,具体的方式可以参见上文对于第一优化条件和第二优化条件的说明。具体地,步骤S200可以包括:根据第一优化条件确定神经网络的计算图中的可优化第一类算子;根据第二优化条件确定可优化第一类算子中的可优化算子。
也就是说,在一种可能的实现方式中,若指定算子的输入操作数和输出操作数满足指定算子对应的第一优化条件、并且指定算子的输入操作数与指定算子的输出操作是以及其他指定算子的操作数满足第二优化条件,那么该指定算子为可优化算子。
对于步骤S201,同一个可优化子图中的相邻的可优化算子在计算图中也是直接连接的,中间不存在进行逻辑运算的算子。如果两个可优化算子之间还连接有逻辑算子,那么这两个可优化算子不属于同一个可优化子图,分别属于两个不同的可优化子图。因此,在步骤A201中,根据计算图中的可优化算子之间的连接关系,可以用可优化算子构建可优化子图。
图7A示出根据本申请一实施例的神经网络的计算图的示例。如图7A所示,假设OP1和OP2都是进行逻辑运算的算子,假设根据第一优化条件可确定图7A所示的计算图中的可优化第一类算子为split、transpose、concat以及reshape。根据第二优化条件可以从可优化第一类算子中确定可优化算子包括split、transpose以及reshape。根据图7A所示的计算图中可优化算子之间的连接关系可以构建两个可优化子图,其中一个可优化子图包含reshape算子以及reshape算子的输入操作数G、输出操作数I,如图7A中的虚线框1所示,另外一个可优化子图包含split算子和transpose算子以及对应的操作数A、B、C和F,如图7A所示的虚线框2所示。
在一种可能的实现方式中,步骤S201,根据计算图中的可优化算子之间的连接关系,用可优化算子构建可优化子图,可以包括:
根据计算图中的可优化算子之间的连接关系,采用并查集算法构建可优化算子的可优化子图。
具体地,可以先将每个可优化算子初始化为一个集合,然后根据计算图中可优化算子之间的连接关系对集合进行合并,直到遍历完所有可优化算子之间的连接关系。
仍然以图7A为例,如上所述确定的可优化算子包括split、transpose以及reshape,分别将每个可优化算子初始化微一个集合{split}、{transpose}、{reshape}。在图7A所示的计算图中,split算子和transpose算子连接,并且两者之间没有逻辑算子,因此,可以合并{split}、{transpose}得到{split,transpose},reshape算子和split算子之间连接有OP1、和transpose算子没有连接关系。因此,reshape算子以及reshape算子的操作数组成一个可优化子图,split算子和transpose算子以及对应的操作数组成一个可优化子图。
对于步骤S21,其中的最大数据块可以是指可优化子图中size最大的数据块。在一种可能的实现方式中,可以计算可优化子图中每一个算子的每个操作数的大小,选择最大的操作数确定为最大数据块。确定最大数据块,根据最大数据块分配地址,然后根据最大数据块回填其他操作数的地址,可以保证内存空间的连续性,优化内存空间。
举例来说,以图7A所示的示例为例,在可优化子图2中,操组数F和B大小相同,操作数B和C的大小都小于操作数A,因此操作数A为可优化子图2中的最大数据块。可优化子图1中,操作数G和操作数I大小相同,都可以作为最大数据块。
需要说明的是,可优化子图中的最大数据块可能不止一块,或者说可能存在多个操作数的大小相同、并且是可优化子图中最大的数据块,这种情况下,可以任选一个大小最大的操作数作为最大数据块,本申请对此不作限定。
对于步骤S21,在构建可优化子图的地址回填有向图时,回填地址时作为依据的操作数作为父节点、被回填地址的操作数作为子节点。
在一种可能的实现方式中,可以以最大数据块为父节点,按照可优化子图中算子的连接顺序,将相邻的操作数作为子节点,构建可优化子图的地址回填有向图。
举例来说,如图7A所示,对于可优化子图2,最大数据块为操作数A,因此,以操作数A作为父节点,操作数B和操作数C为操作数A的子节点,操作数F为操作数B的子节点。图7B示出根据本申请一实施例的回填有向图的示例。根据图7A中的可优化子图2构建的回填有向树如图7B所示。
对于步骤S22,在为最大数据块分配内存空间后可以得到最大数据块的地址。根据最大数据块的地址以及可优化子图和地址回填有向图可以对可优化子图中的其他操作数进行地址回填,实现可优化算子的优化。
具体地,编译器可以根据地址回填有向图确定要回填地址的操作数(待回填操作数,为便于描述将要回填地址的操作数称作待回填操作数)。根据待回填操作数与父节点之间的可优化算子类型、以及已回填的父节点的地址对待回填操作数进行地址回填。
不同的可优化算子对应的地址回填的方式不同,下面分别说明每一种可优化算子对应的地址回填方式:
concat算子:根据输出操作数的地址回填输入操作数的地址,因为concat算子是对输入操作数进行了拼接,所以输出操作数的数据块比较大,为了保证存储空间的连续性,因此在本申请的实施例中是通过输出操作数的地址回填输入操作数的地址。在一种可能的实现方式中,可以通过以下公式计算输入操作数存储的起始地址:
In(n)=Out+offset(n);
其中,Out表示输出操作数的起始地址,offset(n)可以表示第n个输入操作数的存储地址相对于Out的偏移量,In(n)可以表示第n个输入操作数存储的起始地址。其中,Out是已知的,offset(n)可以根据前n-1个操作数的大小计算,比如说可以根据offset(1)+offset(2)+……+offset(n-1)计算得到。
split算子:根据输入操作数的地址回填输出操作数的地址,因为split算子是对输入操作数进行了拆分,所以输入操作数的数据块比较大,为了保证存储空间的连续性,因此,在本申请的实施例中是通过输出操作数的地址会天输入操作数的地址。在一种可能的实现方式中,可以通过以下公式计算输出操作数存储的起始地址:
Out(n)=In+offset(n);
其中,In表示split算子的输入操作数存储的起始地址,offset(n)表示拆分得到的第n个操作数相对于输入操作数存储的地址地址的偏移量,out(n)表示拆分得到的第n个操作数存储的起始地址。In是已知的,offset(n)可以根据拆分得到的前n-1个操作数的大小计算得到,比如说,可以根据offset(1)+offset(2)+……+offset(n-1)计算得到。
Move算子:根据输入操作数的地址回填输出操作数的地址,拼接方式的不同,move算子对应的地址回填的方式也不同。
在一种可能的实现方式中,可以直接根据输入操作数的地址回填输出操作数的地址。举例来说,如图1E所示的move运算的示例中,可以直接将输入操作数的地址回填输出操作数的地址。
在另一种可能的实现方式中,可以根据输入操作数的地址以及卷积核的尺寸计算得到输出操作数的地址。举例来说,如图1E所示的输入操作数Tensor10、Tensor11、Tensor12、Tensor13,在一种可能的实现方式中,还可以在Tensor11的上侧拼接一部分Tensor10下侧的数据得到Tensor21,这部分数据属于Tensor10和Tensor11相邻的部分,在Tensor12的上侧拼接一部分Tensor11下侧的数据得到Tensor22,在Tensor13的上侧拼接一部分Tensor12下侧的数据得到Tensor23。
比如说,假设Tensor10、Tensor11、Tensor12、Tensor13都是5×5的矩阵,卷积核为3×3的矩阵,这种情况下,拼接后的Tensor21为7×5的矩阵,Tensor21的第1行和第2行数据分别是Tensor10的第4行和第5行数据。根据卷积核的大小对Tensor12进行move运算后得到Tensor22,Tensor22可以为7×5的矩阵,Tensor22前两行可以是Tensor11的最后两行,以此类推,可以得到Tensor23。
在上述move运算的实现方式中,可以根据输入操作数的地址以及卷积核的尺寸计算得到输出操作数的地址。
transpose/reshape算子:可以直接根据输入操作数(输出操作数)的地址回填输出操作数(输入操作数)的地址。在一种可能的实现方式中,可以直接将transpose/reshape算子的输入操作数(输出操作数)的地址回填给输出操作数(输入操作数)。transpose/reshape的双向地址回填,保证了可优化子图的最大化。
举例来说,如图7A和图7B所示的示例,在图7B中,首先要根据操作数A的地址对操作数B和操作数C进行地址回填。根据可优化子图2可知,操作数B和操作数C是由操作数A拆分得到的。由上文可知,操作数的描述信息中包括操作数的形状的参数、操作数的大小、操作数存储的地址信息,在本申请的实施例中,可以通过修改操作数的描述信息中的地址信息对算子进行优化。因此,对于操作数B和操作数C可以通过以下公式修改操作数B和操作数C的地址:Out(n)=In+offset(n)。其中,In表示split算子的输入操作数存储的起始地址,offset(n)表示拆分得到的第n个操作数相对于输入操作数存储的地址地址的偏移量,out(n)表示拆分得到的第n个操作数存储的起始地址。In是已知的,offset(n)可以根据拆分得到的前n-1个操作数的大小计算得到。
根据上述过程完成操作数B和操作数C的地址回填之后,继续根据操作数B的地址对操作数F进行地址回填。根据图7A中的可优化子图可知操作数F是经过对操作数B的转置操作得到的,这种情况下直接将操作数F的地址回填为操作数B的地址即可。
根据本申请实施例的编译方法,通过整体提取计算图中的可优化子图,以及根据可优化子图中的最大数据块的地址回填其他操作数的地址,减小了逐个算子优化对其他算子的影响,减少残留可以进行优化的算子,实现优化最大化,从而提高整个网络的运算性能。并且,通过使用最大数据块的地址回填其他操作数的地址的方式,还可以保证存储空间的连续性,节省内存空间。
另外,需要说明的是,在本申请的实施例中,编译器还可以省略生成可优化算子对应的指令。经过上文对可优化算子的操作数进行地址回填的过程,将可优化算子的输入操作数和输出操作数指向了存储对应的操作数的同一块内存地址,这样,就不需要生成对应的数据搬移的指令,减少第一类算子产生的数据搬移开销,提高运算性能。并且,由于省略生成了指定算子对应的指令,可以少存储一部分指令,节省了存储空间。
举例来说,以图7A中的可优化子图1为例对上述效果进行说明。在一个示例中,可以根据操作数G的地址对操作数I进行地址回填。如果在存储reshape算子的输入操作数和输出操作数时未进行数据对齐,那么,输出操作数和输入操作数存储的方式是完全一样的,因此,没有必要进行数据搬移。这种情况下,可以直接将reshape算子的输出操作数的地址修改为与输入操作数的地址完全一样,也就是说,对于满足上述条件的reshape算子,根据所述输入操作数的地址信息,修改张量重构算子的输出操作数的地址信息可以是指,将张量重构算子的输出操作数的地址修改为输入操作数的地址。
修改完地址,同时,省略生成张量重构算子对应的指令,也就是省略生成由于需要重构张量算子而需要的数据搬移指令。
如果图7A中可优化子图1中的reshape算子之后还有其他算子,以上优化过程完全不影响该其他算子获取输入操作数I的过程。由于上述其他算子读取张良重构算子的输出操作数是根据输出操作数的描述信息中记录的输出操作数存储的起始地址(偏移量)以及输出操作数中某一具体数据相对于上述起始地址的偏移量计算得到该数据的实际地址的,而且,张良重构算子的输出操作数都没有进行数据对齐,由于根据输入操作数的地址信息修改了输出操作数的地址信息,因此,根据上述计算地址的方式直接访问输入操作数仍然可以得到正确的数据。
举例来说,结合图1A以及图1E对本申请的编译方法进行具体的说明。如图1A所示,左侧的数据表示reshape算子的输入操作数,右侧的数据表示reshape算子的输出操作数,如果存储时未进行数据对齐,那么存储的方式都是如图1E所示,每一个数据相对于第一个数据的偏移量是没有变化的。只不过两块数据存储的起始地址是不同的,假设输入操作数的起始地址为b0,输出操作数的起始地址为b1,那么,算子OP2读取输出操作数时计算地址的方式为b1+i*ds,其中,i为0~15的整数,ds表示数据大小,算子OP2读取数据的指令中包括i*ds,根据输出操作数的描述信息可以得到b1。比如说,读取a4,计算得到的地址b1+4*ds可以读取a4。
而根据本申请的实施方式,将输出操作数的起始地址直接修改为输入操作数的起始地址,也就是说,将输出操作数的起始地址修改为b0。此时,算子OP2读取数据的指令中包括i*ds,根据输出操作数的描述信息可以得到b0,计算得到的地址b0+4*ds,根据该地址仍然可以正确读取a4。
需要说明的是,虽然上述以可优化子图中包括一个可优化算子为例对本申请的编译方法的效果进行了说明,但对于包括多个可优化算子的可优化子图,根据本申请实施例的方式进行优化之后,由于对操作数进行了地址回填,因此,完全不会影响计算图中其他操作数获取操作数的过程,不会影响整个运算的结果,仅仅是省去了一些数据搬移的过程,提高了运算性能。
如图7A所示,在根据操作数A对操作数B和操作数C进行地址回填后,操作数C指向操作数A所在的存储地址中与操作数C相对应的数据的地址,这样算子OP1根据操作数C的地址可以直接从操作数A中对应的部分读取操作数C。不需要为操作数A中的部分数据(操作数C)重新分配内存地址进行存储并进行数据搬移,提高了运算性能,节省了内存空间。
应用示例
为了使得本申请的编译方法更易于理解,下面结合图8-图10的应用示例对本申请的编译方法进行说明。图8示出根据本申请一实施例的神经网络的计算图的示例。图9A示出从图8的示例中提取的可优化第一类算子的示意图,图9B示出从图8的示例中提取的可优化子图的示意图。图10示出根据图9B的可优化子图构建的回填有向树的示意图。需要说明的是图8、图9A、图9B以及图10仅仅是本申请的一些示例,不以任何方式限制本申请。
如图8所示,可以根据第一优化条件可以从计算图中提取可优化第一类算子。在一种可能的实现方式中,可以根据算子类型先识别出计算图中的第一类算子,根据第一类算子的输入操作数和输出操作数、以及第一类算子对应的第一优化条件,可以判断第一类算子是否为可优化第一类算子。
其中,算子类型可以根据算子的名称或者标识确定,计算图中每个节点都有对应的nodedef,节点对应的nodedef中可以记录有节点的操作类型(即算子类型),节点的输入操作数、输出操作数等信息。编译器可以根据算子类型识别出计算图中的第一类算子。
举例来说,如图8所示,假设OP1和OP2都是逻辑算子,计算图中还包括两个卷积算子,其他都是第一类算子。可以根据计算图中节点对应的nodedef中记录的节点的操作类型确定计算图中的第一类算子。
编译器可以逐个遍历识别出的第一类算子,根据每个第一类算子对应的第一优化条件判断第一类算子是否为可优化第一类算子。假设图8的第一类算子都满足对应的第一优化条件,可以得到图9A所示的子图。
图9A所示的子图包括两部分,上面一部分包括多个可优化第一类算子,下面一部分包括一个可优化第一类算子concat。
对于这两个子图,再根据第二优化条件从可优化第一类算子中确定可优化算子。如图9A所示,对于上面一部分的子图,其中concat算子的操作数K无法避免使用两个相邻的操作数(操作数E和操作数O)的地址对该操作数进行地址优化(回填)的情况,不满足第二优化条件。另外一个concat算子的操作数M和操作数N也无法避免使用两个相邻的操作数(操作数Q、操作数I和操作数J)的地址对该操作数进行地址优化(回填)的情况,不满足第二优化条件。因此,可以排除以上两个concat算子得到可优化子图如图9B所示。
对于图9A中下面一部分的子图,只有一个concat算子,不需要判断是否满足第二优化条件,该concat算子组成一个可优化子图。
以图9B为例,可以确定可优化子图中的最大数据块为L、P和T。这三个操作数的任意一个都可以确定为地址回填有向图的父节点,下面以L作为父节点为例说明构建地址回填有向图的过程。
如图10所示,操作数L可以作为父节点,根据图9B可知要根据操作数L的地址对操作数P、操作数F和操作数G进行地址回填。根据上文可知,在构建可优化子图的地址回填有向图时,将回填地址时作为依据的操作数确定为父节点、被回填地址的操作数确定为子节点。因此,操作数P、操作数F和操作数G分别作为操作数L的子节点。
根据图9B可知,对于操作数T,可以根据操作数P的地址进行地址回填,因此,可以确定操作数T为操作数P的子节点,按照可优化子图中算子的连接顺序次向下,可以确定操组数U和操作偶数V为操作数T的子节点,操作数W为操作数U的子节点、操作数X是操作数V的子节点,如图10中所示。
根据图9B可知,对于操作数C,可以根据操作数G的地址进行回填,因此,可以确定操作数C为操作数G的子节点。对于操作数B,可以根据操作数F的地址进行地址回填,因此,可以确定操作数B为操作数F的子节点。对于操作数A、操作数D和操作数E,可以根据操作数B的地址进行地址回填,因此,可以确定操作数A、操作数D和操作数E为操作数B的子节点,按照可优化子图中算子的连接顺序次向下,可以确定操作数H和操作数I为操作数D的子节点,操作数J和操作数K为操作数E的子节点,操作数M为操作数I的子节点,操作数N为操作数J的子节点。
根据图9B的可优化子图最终构建的地址回填有向树如图10所示。
在构建好地址回填有向树后,可以根据最大数据块L的地址、可优化子图以及地址回填有向树对可优化子图中的操作数进行地址回填。
其中最大数据块L的地址是在内存中为操作数L分配存储空间后确定的。在一种可能的实现方式中,最大数据块L的地址可以为一个相对于内存中的基地址的偏移量,本申请不限于此。
结合图9B和图10,要根据操作数L的地址对操作数P、操作数F和操作数G进行地址回填,根据图9B(可优化子图)可以确定操作数P和操作数L之间为transpose算子,也就是说操作数P是由操作数L转置得到的、且满足转置算子对应的第一优化条件,根据上文可知,可以直接将转置算子的输入操作数L的地址回填给输出操作数P。另外,根据图9B可以确定操作数F和操作数G与操作数L之间为concat算子,也就是说操作数L是将操作数F和操作数G拼接得到的,根据上文中的concat算子的地址回填公式可以对操作数F和操作数G进行地址回填。依次重复以上过程,可以对可优化子图中所有的操作数完成地址回填。
图11示出根据本申请一实施例的编译装置的框图。所述装置用于对神经网络对应的程序进行编译,如图11所示,所述装置包括:
提取模块91,用于提取神经网络的计算图的可优化子图,其中,所述可优化子图中的算子够被优化;
构建模块92,用于从最大数据块开始,遍历可优化子图中算子的输入操作数和输出操作数,根据可优化子图中算子的输入操作数和输出操作数构建可优化子图的地址回填有向图;其中,所述最大数据块为可优化子图中张量大小最大的操作数,所述地址回填有向图是用于地址回填的有向图;
地址回填模块93,用于根据最大数据块的地址、可优化子图以及地址回填有向图,对可优化子图中算子的操作数进行地址回填。
根据本申请实施例的编译装置,通过整体提取计算图中的可优化子图,以及根据可优化子图中的最大数据块的地址回填其他操作数的地址,减小了逐个算子优化对其他算子的影响,减少残留可以进行优化的算子,实现优化最大化,从而提高整个网络的运算性能。并且,通过使用最大数据块的地址回填其他操作数的地址的方式,还可以保证存储空间的连续性,节省内存空间。
在一种可能的实现方式中,所述提取模块,包括:
第一确定单元,用于根据指定算子的输入操作数和输出操作数的关系、以及指定算子的输入操作数与指定算子的输出操作数以及其他指定算子的操作数的关系确定计算图中的可优化算子;
第一构建单元,用于根据计算图中的可优化算子之间的连接关系,用可优化算子构建可优化子图。
在一种可能的实现方式中,所述确定单元,还用于若指定算子的输入操作数和输出操作数在内存中摆放的方式一致,并且指定算子的输入操作数能够避免使用两个相邻的操作数的地址进行回填,则所述指定算子为可优化算子。
在一种可能的实现方式中,所述第一构建单元还用于根据计算图中的可优化算子之间的关系,采用并查集算法构建可优化算子的可优化子图。
在一种可能的实现方式中,所述构建模块包括:
第二构建单元,用于在构建可优化子图的地址回填有向图时,以最大数据块为父节点,按照可优化子图中算子的连接顺序,将回填地址时作为依据的操作数确定为父节点、被回填地址的操作数确定为子节点。
在一种可能的实现方式中,所述地址回填模块包括:
第二确定单元,用于根据地址回填有向图确定待回填操作数;
地址回填单元,用于根据待回填操作数与父节点之间的可优化算子类型、以及已回填的父节点的地址对待回填操作数进行地址回填。
本申请还提供了一种电子设备,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行所述可执行指令时实现上述方法。
本申请还提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。
图12是示出根据本披露实施例的一种组合处理装置1200的结构图。如图12中所示,该组合处理装置1200包括计算处理装置1202、接口装置1204、其他处理装置1206和存储装置1208。根据不同的应用场景,计算处理装置中可以包括一个或多个计算装置1210,该计算装置可以配置用于执行本文结合附图2、图6所描述的操作。
在不同的实施例中,本披露的计算处理装置可以配置成执行用户指定的操作。在示例性的应用中,该计算处理装置可以实现为单核人工智能处理器或者多核人工智能处理器。类似地,包括在计算处理装置内的一个或多个计算装置可以实现为人工智能处理器核或者人工智能处理器核的部分硬件结构。当多个计算装置实现为人工智能处理器核或人工智能处理器核的部分硬件结构时,就本披露的计算处理装置而言,其可以视为具有单核结构或者同构多核结构。
在示例性的操作中,本披露的计算处理装置可以通过接口装置与其他处理装置进行交互,以共同完成用户指定的操作。根据实现方式的不同,本披露的其他处理装置可以包括中央处理器(Central Processing Unit,CPU)、图形处理器(Graphics ProcessingUnit,GPU)、人工智能处理器等通用和/或专用处理器中的一种或多种类型的处理器。这些处理器可以包括但不限于数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,并且其数目可以根据实际需要来确定。如前所述,仅就本披露的计算处理装置而言,其可以视为具有单核结构或者同构多核结构。然而,当将计算处理装置和其他处理装置共同考虑时,二者可以视为形成异构多核结构。
在一个或多个实施例中,该其他处理装置可以作为本披露的计算处理装置(其可以具体化为人工智能例如神经网络运算的相关运算装置)与外部数据和控制的接口,执行包括但不限于数据搬运、对计算装置的开启和/或停止等基本控制。在另外的实施例中,其他处理装置也可以和该计算处理装置协作以共同完成运算任务。
在一个或多个实施例中,该接口装置可以用于在计算处理装置与其他处理装置间传输数据和控制指令。例如,该计算处理装置可以经由所述接口装置从其他处理装置中获取输入数据,写入该计算处理装置片上的存储装置(或称存储器)。进一步,该计算处理装置可以经由所述接口装置从其他处理装置中获取控制指令,写入计算处理装置片上的控制缓存中。替代地或可选地,接口装置也可以读取计算处理装置的存储装置中的数据并传输给其他处理装置。
附加地或可选地,本披露的组合处理装置还可以包括存储装置。如图中所示,该存储装置分别与所述计算处理装置和所述其他处理装置连接。在一个或多个实施例中,存储装置可以用于保存所述计算处理装置和/或所述其他处理装置的数据。例如,该数据可以是在计算处理装置或其他处理装置的内部或片上存储装置中无法全部保存的数据。
在一些实施例里,本披露还公开了一种芯片(例如图13中示出的芯片1302)。在一种实现中,该芯片是一种系统级芯片(System on Chip,SoC),并且集成有一个或多个如图12中所示的组合处理装置。该芯片可以通过对外接口装置(如图13中示出的对外接口装置1306)与其他相关部件相连接。该相关部件可以例如是摄像头、显示器、鼠标、键盘、网卡或wifi接口。在一些应用场景中,该芯片上可以集成有其他处理单元(例如视频编解码器)和/或接口模块(例如DRAM接口)等。在一些实施例中,本披露还公开了一种芯片封装结构,其包括了上述芯片。在一些实施例里,本披露还公开了一种板卡,其包括上述的芯片封装结构。下面将结合图13对该板卡进行详细地描述。
图13是示出根据本披露实施例的一种板卡1300的结构示意图。如图13中所示,该板卡包括用于存储数据的存储器件1304,其包括一个或多个存储单元1310。该存储器件可以通过例如总线等方式与控制器件1308和上文所述的芯片1302进行连接和数据传输。进一步,该板卡还包括对外接口装置1306,其配置用于芯片(或芯片封装结构中的芯片)与外部设备1312(例如服务器或计算机等)之间的数据中继或转接功能。例如,待处理的数据可以由外部设备通过对外接口装置传递至芯片。又例如,所述芯片的计算结果可以经由所述对外接口装置传送回外部设备。根据不同的应用场景,所述对外接口装置可以具有不同的接口形式,例如其可以采用标准PCIE接口等。
在一个或多个实施例中,本披露板卡中的控制器件可以配置用于对所述芯片的状态进行调控。为此,在一个应用场景中,该控制器件可以包括单片机(Micro ControllerUnit,MCU),以用于对所述芯片的工作状态进行调控。
根据上述结合图12和图13的描述,本领域技术人员可以理解本披露也公开了一种电子设备或装置,其可以包括一个或多个上述板卡、一个或多个上述芯片和/或一个或多个上述组合处理装置。
根据不同的应用场景,本披露的电子设备或装置可以包括服务器、云端服务器、服务器集群、数据处理装置、机器人、电脑、打印机、扫描仪、平板电脑、智能终端、PC设备、物联网终端、移动终端、手机、行车记录仪、导航仪、传感器、摄像头、相机、摄像机、投影仪、手表、耳机、移动存储、可穿戴设备、视觉终端、自动驾驶终端、交通工具、家用电器、和/或医疗设备。所述交通工具包括飞机、轮船和/或车辆;所述家用电器包括电视、空调、微波炉、冰箱、电饭煲、加湿器、洗衣机、电灯、燃气灶、油烟机;所述医疗设备包括核磁共振仪、B超仪和/或心电图仪。本披露的电子设备或装置还可以被应用于互联网、物联网、数据中心、能源、交通、公共管理、制造、教育、电网、电信、金融、零售、工地、医疗等领域。进一步,本披露的电子设备或装置还可以用于云端、边缘端、终端等与人工智能、大数据和/或云计算相关的应用场景中。在一个或多个实施例中,根据本披露方案的算力高的电子设备或装置可以应用于云端设备(例如云端服务器),而功耗小的电子设备或装置可以应用于终端设备和/或边缘端设备(例如智能手机或摄像头)。在一个或多个实施例中,云端设备的硬件信息和终端设备和/或边缘端设备的硬件信息相互兼容,从而可以根据终端设备和/或边缘端设备的硬件信息,从云端设备的硬件资源中匹配出合适的硬件资源来模拟终端设备和/或边缘端设备的硬件资源,以便完成端云一体或云边端一体的统一管理、调度和协同工作。
需要说明的是,为了简明的目的,本披露将一些方法及其实施例表述为一系列的动作及其组合,但是本领域技术人员可以理解本披露的方案并不受所描述的动作的顺序限制。因此,依据本披露的公开或教导,本领域技术人员可以理解其中的某些步骤可以采用其他顺序来执行或者同时执行。进一步,本领域技术人员可以理解本披露所描述的实施例可以视为可选实施例,即其中所涉及的动作或模块对于本披露某个或某些方案的实现并不一定是必需的。另外,根据方案的不同,本披露对一些实施例的描述也各有侧重。鉴于此,本领域技术人员可以理解本披露某个实施例中没有详述的部分,也可以参见其他实施例的相关描述。
在具体实现方面,基于本披露的公开和教导,本领域技术人员可以理解本披露所公开的若干实施例也可以通过本文未公开的其他方式来实现。例如,就前文所述的电子设备或装置实施例中的各个单元来说,本文在考虑了逻辑功能的基础上对其进行划分,而实际实现时也可以有另外的划分方式。又例如,可以将多个单元或组件结合或者集成到另一个系统,或者对单元或组件中的一些特征或功能进行选择性地禁用。就不同单元或组件之间的连接关系而言,前文结合附图所讨论的连接可以是单元或组件之间的直接或间接耦合。在一些场景中,前述的直接或间接耦合涉及利用接口的通信连接,其中通信接口可以支持电性、光学、声学、磁性或其它形式的信号传输。
在本披露中,作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元示出的部件可以是或者也可以不是物理单元。前述部件或单元可以位于同一位置或者分布到多个网络单元上。另外,根据实际的需要,可以选择其中的部分或者全部单元来实现本披露实施例所述方案的目的。另外,在一些场景中,本披露实施例中的多个单元可以集成于一个单元中或者各个单元物理上单独存在。
在一些实现场景中,上述集成的单元可以采用软件程序模块的形式来实现。如果以软件程序模块的形式实现并作为独立的产品销售或使用时,所述集成的单元可以存储在计算机可读取存储器中。基于此,当本披露的方案以软件产品(例如计算机可读存储介质)的形式体现时,该软件产品可以存储在存储器中,其可以包括若干指令用以使得计算机设备(例如个人计算机、服务器或者网络设备等)执行本披露实施例所述方法的部分或全部步骤。前述的存储器可以包括但不限于U盘、闪存盘、只读存储器(Read Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
在另外一些实现场景中,上述集成的单元也可以采用硬件的形式实现,即为具体的硬件电路,其可以包括数字电路和/或模拟电路等。电路的硬件结构的物理实现可以包括但不限于物理器件,而物理器件可以包括但不限于晶体管或忆阻器等器件。鉴于此,本文所述的各类装置(例如计算装置或其他处理装置)可以通过适当的硬件处理器来实现,例如CPU、GPU、FPGA、DSP和ASIC等。进一步,前述的所述存储单元或存储装置可以是任意适当的存储介质(包括磁存储介质或磁光存储介质等),其例如可以是可变电阻式存储器(Resistive Random Access Memory,RRAM)、动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)、静态随机存取存储器(Static Random Access Memory,SRAM)、增强动态随机存取存储器(Enhanced Dynamic Random Access Memory,EDRAM)、高带宽存储器(High Bandwidth Memory,HBM)、混合存储器立方体(Hybrid Memory Cube,HMC)、ROM和RAM等。
虽然本文已经示出和描述了本披露的多个实施例,但对于本领域技术人员显而易见的是,这样的实施例只是以示例的方式来提供。本领域技术人员可以在不偏离本披露思想和精神的情况下想到许多更改、改变和替代的方式。应当理解的是在实践本披露的过程中,可以采用对本文所描述的本披露实施例的各种替代方案。所附权利要求书旨在限定本披露的保护范围,并因此覆盖这些权利要求范围内的等同或替代方案。
本公开可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本公开的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。
这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (15)
1.一种编译方法,其特征在于,所述方法用于对神经网络对应的程序进行编译,所述方法包括:
提取神经网络的计算图的可优化子图,其中,所述可优化子图中的指定算子满足优化条件能够被优化;所述优化条件包括:所述指定算子的输入操作数和输出操作数满足所述指定算子对应的第一优化条件,以及所述指定算子的输入操作数或者输出操作数与可优化子图中的其他算子的操作数也满足对应的第二优化条件;所述第一优化条件为:所述指定算子的输入操作数和输出操作数在内存中存储的方式一致;或所述指定算子为张量重构算子或转置算子,在存储张量重构算子或转置算子的输入操作数和输出操作数时未进行数据对齐;或所述指定算子为拆分算子或拼接算子,拆分算子或拼接算子的输入操作数和输出操作数在存储时未进行数据对齐、且拆分\拼接的是高维度或者比拆分\拼接的维度更高的维度为1;或所述指定算子为move算子,move算子之前为拆分算子、之后为卷积算子,在存储move算子的输入操作数和输出操作数时未进行数据对齐,而且输入操作数在存储器中连续存储,拆分算子用于对输入操作数的高维度进行拆分或者比拆分的维度更高的维度为1;所述第二优化条件为:所述指定算子的输入操作数能够避免使用两个相邻的操作数的地址进行回填;
从最大数据块开始,遍历可优化子图中指定算子的输入操作数和输出操作数,根据可优化子图中指定算子的输入操作数和输出操作数构建可优化子图的地址回填有向图;其中,所述最大数据块为可优化子图中张量大小最大的操作数,所述地址回填有向图是用于地址回填的有向图;
根据最大数据块的地址、可优化子图以及地址回填有向图,对可优化子图中指定算子的操作数进行地址回填。
2.根据权利要求1所述的方法,其特征在于,提取神经网络的计算图的可优化子图,包括:
根据指定算子的输入操作数和输出操作数的关系以及指定算子的输入操作数或者输出操作数与其他指定算子的操作数的关系确定计算图中的可优化算子;
根据计算图中的可优化算子之间的连接关系,用可优化算子构建可优化子图。
3.根据权利要求2所述的方法,其特征在于,根据指定算子的输入操作数和输出操作数的关系、以及指定算子的输入操作数或者输出操作数与其他指定算子的操作数的关系确定计算图中的可优化算子,包括:
若指定算子的输入操作数和输出操作数在内存中摆放的方式一致,并且指定算子的输入操作数能够避免使用两个相邻的操作数的地址进行回填,则所述指定算子为可优化算子。
4.根据权利要求2所述的方法,其特征在于,根据计算图中的可优化算子之间的关系,用可优化算子构建可优化子图,包括:
根据计算图中的可优化算子之间的关系,采用并查集算法构建可优化算子的可优化子图。
5.根据权利要求1所述的方法,其特征在于,从最大数据块开始,遍历可优化子图中指定算子的输入操作数和输出操作数,根据可优化子图中指定算子的输入操作数和输出操作数构建可优化子图的地址回填有向图,包括:
在构建可优化子图的地址回填有向图时,以最大数据块为父节点,按照可优化子图中算子的连接顺序,将回填地址时作为依据的操作数确定为父节点、被回填地址的操作数确定为子节点。
6.根据权利要求5所述的方法,其特征在于,根据最大数据块的地址、可优化子图以及地址回填有向图,对可优化子图中指定算子的操作数进行地址回填,包括:
根据地址回填有向图确定待回填操作数;
根据待回填操作数与父节点之间的可优化算子类型、以及已回填的父节点的地址对待回填操作数进行地址回填。
7.根据权利要求1所述的方法,其特征在于,所述可优化子图中的指定算子满足优化条件能够被优化进一步包括:
若神经网络中的指定算子和指定算子的操作数满足优化条件时,则修改所述指定算子的操作数的描述信息,并省略生成所述指定算子对应的指令。
8.根据权利要求7所述的方法,其特征在于,修改所述指定算子的操作数的描述信息,包括:
根据所述指定算子在神经网络的计算图中的位置、以及指定算子的输入操作数或输出操作数的地址信息修改所述指定算子的输出操作数或者输入操作数的地址信息。
9.根据权利要求8所述的方法,其特征在于,根据所述指定算子在神经网络的计算图中的位置、以及指定算子的输入操作数或输出操作数的地址信息修改所述指定算子的输出操作数或者输入操作数的地址信息,包括:
若所述指定算子在神经网络中的第一层或者中间层,则根据所述指定算子的输入操作数的地址信息,修改所述指定算子的输出操作数的地址信息;
若所述指定算子在神经网络中的最后一层,则根据所述指定算子的输出操作数的地址信息,修改所述指定算子的输入操作数的地址信息。
10.根据权利要求1所述的方法,其特征在于,若所述指定算子为转置算子,则所述第一优化条件进一步为:在存储所述转置算子的输入操作数和输出操作数时未进行数据对齐,且转置后的输出操作数和输入操作数相比,非1维度的相对顺序不变。
11.根据权利要求1所述的方法,其特征在于,若所述指定算子为拆分算子,所述第一优化条件进一步为:拆分算子的输入操作数和输出操作数在存储时未进行数据对齐、且拆分后的输出操作数在存储器中连续存储;其中,拆分算子用于对输入操作数的高维度进行拆分或者比拆分的维度更高的维度为1。
12.根据权利要求1所述的方法,其特征在于,若所述指定算子为拼接算子,所述第一优化条件进一步为:拼接算子的输入操作数和输出操作数在存储时未进行数据对齐、且拼接前的输入操作数在存储器中连续存储;其中,所述拼接算子用于对输入操作数的高维度进行拼接或者比拼接的维度更高的维度为1。
13.根据权利要求7所述的方法,其特征在于,修改所述指定算子的操作数的描述信息,包括:
根据move算子的输入操作数的地址信息、形状和卷积核的形状,修改输出操作数的地址信息。
14.一种电子设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述可执行指令时实现权利要求1至13中任意一项所述的方法。
15.一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1至13中任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011337532.6A CN112463159B (zh) | 2020-11-25 | 2020-11-25 | 编译方法、装置、电子设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011337532.6A CN112463159B (zh) | 2020-11-25 | 2020-11-25 | 编译方法、装置、电子设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112463159A CN112463159A (zh) | 2021-03-09 |
CN112463159B true CN112463159B (zh) | 2023-05-09 |
Family
ID=74798412
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011337532.6A Active CN112463159B (zh) | 2020-11-25 | 2020-11-25 | 编译方法、装置、电子设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112463159B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113011585B (zh) * | 2021-03-19 | 2023-09-26 | 上海西井科技股份有限公司 | 消除拼接算子的编译优化方法、系统、设备及存储介质 |
WO2023093623A1 (zh) * | 2021-11-29 | 2023-06-01 | 中科寒武纪科技股份有限公司 | 计算图的优化方法、数据处理方法及相关产品 |
CN115495095B (zh) * | 2022-11-18 | 2023-03-21 | 上海燧原科技有限公司 | 张量程序的整程序编译方法、装置、设备、介质及集群 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH1139307A (ja) * | 1997-07-15 | 1999-02-12 | Fuji Xerox Co Ltd | 有向グラフ編集装置、有向グラフ編集方法及び有向グラフ編集プログラムを格納した記録媒体 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8327345B2 (en) * | 2008-12-16 | 2012-12-04 | International Business Machines Corporation | Computation table for block computation |
US20200249998A1 (en) * | 2019-02-01 | 2020-08-06 | Alibaba Group Holding Limited | Scheduling computation graph heterogeneous computer system |
US20190391796A1 (en) * | 2019-06-28 | 2019-12-26 | Intel Corporation | Control of scheduling dependencies by a neural network compiler |
-
2020
- 2020-11-25 CN CN202011337532.6A patent/CN112463159B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH1139307A (ja) * | 1997-07-15 | 1999-02-12 | Fuji Xerox Co Ltd | 有向グラフ編集装置、有向グラフ編集方法及び有向グラフ編集プログラムを格納した記録媒体 |
Also Published As
Publication number | Publication date |
---|---|
CN112463159A (zh) | 2021-03-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112463159B (zh) | 编译方法、装置、电子设备和存储介质 | |
WO2021190127A1 (zh) | 一种数据处理方法和数据处理设备 | |
WO2018171717A1 (zh) | 面向神经网络处理器的自动化设计方法和系统 | |
CN109219821A (zh) | 运算装置和方法 | |
CN112463160A (zh) | 编译方法、装置、电子设备和存储介质 | |
US11521076B2 (en) | Architecture-independent approximation discovery | |
WO2023093623A1 (zh) | 计算图的优化方法、数据处理方法及相关产品 | |
CN112070202B (zh) | 一种融合图的生成方法、生成装置和计算机可读存储介质 | |
CN115221102B (zh) | 用于优化片上系统的卷积运算操作的方法和相关产品 | |
CN113469336A (zh) | 优化神经网络模型的编译方法、执行方法及相关产品 | |
CN112416433A (zh) | 一种数据处理装置、数据处理方法及相关产品 | |
CN111667060B (zh) | 深度学习算法的编译方法、装置及相关产品 | |
CN116185377A (zh) | 计算图的优化方法、计算装置及相关产品 | |
CN112465116B (zh) | 编译方法、运算方法、电子设备和存储介质 | |
CN115840894A (zh) | 一种用于处理多维张量数据的方法及其相关产品 | |
CN115329923A (zh) | 用于神经网络模型的编译方法和相关产品 | |
CN113760380A (zh) | 网络模型的运行代码的确定方法、装置、设备及存储介质 | |
CN112463158B (zh) | 编译方法、装置、电子设备和存储介质 | |
CN109542837A (zh) | 运算方法、装置及相关产品 | |
CN113469365B (zh) | 基于神经网络模型的推理和编译方法及其相关产品 | |
CN109558565A (zh) | 运算方法、装置及相关产品 | |
US11809849B1 (en) | Global modulo allocation in neural network compilation | |
CN116185378A (zh) | 计算图的优化方法、数据处理方法及相关产品 | |
US11809981B1 (en) | Performing hardware operator fusion | |
WO2022134688A1 (zh) | 数据处理电路、数据处理方法及相关产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |