1.本技术属于深度学习技术领域,尤其涉及一种算子融合方法、装置、终端设备及存储介质。
背景技术:2.深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。为了提高深度学习模型的性能,需要对深度学习模型进行优化。
3.目前,在对深度学习模型进行优化时,往往只是进行简单的算子融合,导致深度学习模型的计算速度慢。
技术实现要素:4.本技术实施例提供了一种算子融合方法、装置、终端设备及存储介质,可以解决深度学习模型的计算速度慢的问题。
5.第一方面,本技术实施例提供了一种算子融合方法,包括:
6.获取待处理的深度学习模型的依赖图,其中,所述依赖图包括所述深度学习模型中各个算子的顺序;
7.基于预设的各类原子算子对应的算子数组,将所述依赖图中的算子进行分组,得到的每组算子为所述依赖图的一个原子算子,其中,若所述一个原子算子中包括至少两个算子,所述至少两个算子在所述依赖图中连续;
8.根据所述依赖图中的原子算子组成的原子算子序列,得到由所述依赖图中的原子算子组成的各个目标原子组,其中,一个目标原子组中若包括至少两个所述原子算子,所述至少两个所述原子算子在所述原子算子序列中连续;
9.将所述目标原子组中的算子进行融合,得到所述深度学习模型的计算图。
10.第二方面,本技术实施例提供了一种算子融合装置,包括:
11.数据获取模块,用于获取待处理的深度学习模型的依赖图,其中,所述依赖图包括所述深度学习模型中各个算子的顺序;
12.第一分组模块,用于基于预设的各类原子算子对应的算子数组,将所述依赖图中的算子进行分组,得到的每组算子为所述依赖图的一个原子算子,其中,若所述一个原子算子中包括至少两个算子,所述至少两个算子在所述依赖图中连续;
13.第二分组模块,用于根据所述依赖图中的原子算子组成的原子算子序列,得到由所述依赖图中的原子算子组成的各个目标原子组,其中,一个目标原子组中若包括至少两个所述原子算子,所述至少两个所述原子算子在所述原子算子序列中连续;
14.算子融合模块,用于将每个所述目标原子组中的算子进行融合,得到所述深度学习模型的计算图。
15.第三方面,本技术实施例提供了一种终端设备,包括:存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现上述第一方面中任一项所述的算子融合方法。
16.第四方面,本技术实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述第一方面中任一项所述的算子融合方法。
17.第五方面,本技术实施例提供了一种计算机程序产品,当计算机程序产品在终端设备上运行时,使得终端设备执行上述第一方面中任一项所述的算子融合方法。
18.本技术第一方面实施例与现有技术相比存在的有益效果是:本技术先获取深度学习模型的依赖图,基于预设的各类原子算子对应的算子数组,将依赖图中的算子进行分组,得到的每组算子为依赖图的一个原子算子,若一个原子算子中包括至少两个算子,至少两个算子在所述依赖图中连续;根据依赖图中的原子算子组成的原子算子序列,得到由依赖图中的原子算子组成的各个目标原子组;将目标原子组中的算子进行融合,得到深度学习模型的计算图。本技术先根据原子算子将深度学习模型中的算子组合成原子算子,然后再将原子算子进行组合,得到目标原子组,实现算子的多次组合,相较于现有技术中对算子的简单融合,本技术将多次组合后的算子进行融合,相较于现有技术得到的深度学习模型,本技术得到的深度学习模型的结构更简单,简单的深度学习模型的计算速度更快。
19.可以理解的是,上述第二方面至第五方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
20.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
21.图1是本技术一实施例提供的算子融合方法的流程示意图;
22.图2是本技术一实施例提供的原子算子确定方法的流程示意图;
23.图3是本技术一实施例提供的目标原子组确定方法的流程示意图;
24.图4是本技术一实施例提供的候选原子组确定方法的流程示意图;
25.图5是本技术一实施例提供的依赖图中原子的结构示意图;
26.图6是本技术一实施例提供的原子算子的结构示意图;
27.图7是本技术一实施例提供的原子算子组的结构示意图;
28.图8是本技术一实施例提供的目标算子组的结构示意图;
29.图9是本技术一实施例提供的算子融合装置的结构示意图;
30.图10是本技术一实施例提供的终端设备的结构示意图。
具体实施方式
31.以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本技术实施例。然而,本领域的技术人员应当清楚,在没有这些具体
细节的其它实施例中也可以实现本技术。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本技术的描述。
32.应当理解,当在本技术说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
33.还应当理解,在本技术说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
34.如在本技术说明书和所附权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当
……
时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
[0035]
另外,在本技术说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
[0036]
在本技术说明书中描述的参考“一个实施例”或“一些实施例”等意味着在本技术的一个或多个实施例中包括结合该实施例描述的特定特征、结构或特点。由此,在本说明书中的不同之处出现的语句“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
[0037]
在对深度学习模型进行优化时,对于依赖于芯片性能的优化,例如,算子融合,在算子融合时,由于忽略了芯片性能对深度学习模型的性能的影响,造成算子融合时没有根据芯片的性能进行融合,在算子融合结束后,深度学习模型运行在芯片上时,芯片的算力并不能最大的发挥出来,也就是深度学习模型的性能并不能达到最优。
[0038]
本技术提供的算子融合方法,在对深度学习模型的算子进行优化时,考虑了芯片的硬件特性对深度学习模型的影响,可以使得到的算子融合后的深度学习模型的性能最优,处理数据的速度更快。
[0039]
本技术提供的算子融合方法可以基于电子设备中的tvm框架实现。
[0040]
图1示出了本技术提供的算子融合方法的示意性流程图,参照图1,对该方法的详述如下:
[0041]
s101,获取待处理的深度学习模型的依赖图。
[0042]
在本实施例中,依赖图包括深度学习模型中各个算子的顺序。
[0043]
在本实施例中,深度学习模型可以为卷积神经网络模型、深度神经网络或图神经网络等。为了便于描述,本技术均以卷积神经网络模型为例进行说明,但卷积神经网络并不构成本技术的深度学习模型的限制。
[0044]
在本实施例中,电子设备可以从外部存储设备中获取深度学习模型的依赖图(dependencygraph)。电子设备还可以通过获取用户的输入数据,根据用户的输入数据得到深度学习模型的依赖图。
[0045]
另外,电子设备还可以获取深度学习模型的表达式,基于表达式生成深度学习模型的依赖图。依赖图中包括表达式中各个节点的依赖关系,依赖图中每个节点均记录了其
父节点和子节点,以及该节点在后续深度优先搜索(depth first search,dfs)中的索引,因此,从任一节点出发,均可以恢复整张依赖图。根据深度学习模型的依赖图可以得到深度学习模型中算子的算子序列。具体的,由于依赖图中记录了每个子节点和父节点,以及各个节点的索引,先找出子节点的索引,根据子节点的索引找出尾节点、分叉节点等,最后根据各个节点顺序可以得到算子序列。
[0046]
s102,基于预设的各类原子算子对应的算子数组,将依赖图中的算子进行分组,得到的每组算子为依赖图的一个原子算子,其中,若一个原子算子中包括至少两个算子,至少两个算子在所述依赖图中连续。
[0047]
在本实施例中,原子在计算机中表征不可分开的过程。原子算子表征同一个原子中的算子。
[0048]
在本实施例中,原子算子(atomic operator,atomicop)的类型可以包括卷积层算子(atomi_conv)、池化层算子(atomi_fc)、全连接层算子(atomi_pool)等。在本实施例中,为各类原子算子预先设置可定义的细则,并用算子数组进行保存。一个算子数组由同一类型的算子组成。算子数组可以为字符串类型的二维数组。二维数组中规定了每级算子的先后顺序。
[0049]
作为举例,atomi_conv对应的算子数组为:{{"cast",""},{"nn.insert",""},{"nn.pad",""},{"nn.conv2d",},{"nn.bias_add","nn.batch_norm",""},{"right_shift",""},{"clip",""},{"nn.relu","nn.prelu","nn.leaky_relu"},{"nn.relu","right_shift",""},{"clip",""}}。上述算子数组是一个字符串类型的二维数组,里面的一维数组,例如{"nn.relu","right_shift",""}代表同一级的所有算子,算子数组中的""表示空,可以用来跳过同一层次的其他算子。
[0050]
在本实施例中,将依赖图中的算子进行分组也就是将依赖图中的算子序列化。
[0051]
在本实施例中,一个原子算子可以包括深度学习模型中的一个算子,还可以包括多个算子。组成一个原子算子的算子需要是连续的算子,若两个算子不连续,则不能组成一个原子算子。
[0052]
作为举例,若a、b和c是连续的算子。a和c不能组成一个原子算子。a和b可以组成一个原子算子,b和c可以组成一个原子算子,a、b和c也可以组成一个原子算子。
[0053]
在本实施例中,各类原子算子对应的算子数组还可以根据目标芯片的硬件特性进行设置。目标芯片为运行深度学习模型的芯片。硬件特性可以包括芯片的算力、规格和协同方式等。
[0054]
s103,根据所述依赖图中的原子算子组成的原子算子序列,得到由所述依赖图中的原子算子组成的各个目标原子组,其中,一个目标原子组中若包括至少两个所述原子算子,所述至少两个所述原子算子在所述原子算子序列中连续。
[0055]
在本实施例中,将原子算子进行组合,得到满足要求的目标原子组,具体的,目标原子组的获得方法可以参照下述,在此不再赘述。
[0056]
一个目标原子组可以包括一个原子算子,还可以包括多个原子算子。
[0057]
在本实施例中,将依赖图中的算子分成原子算子后,依赖图可以变成由原子算子组成的图。根据原子算子在依赖图中的顺序可以得到原子算子序列。同一个目标原子组中的原子算子连续。
[0058]
作为举例,若原子算子a、b、c和d为连续的原子算子。则a和b可以组成一个目标原子组,c和d可以组成一个目标原子组,b和d不能组成一个目标原子组。
[0059]
s104,将目标原子组中的算子进行融合,得到所述深度学习模型的计算图。
[0060]
在本实施例中,若目标原子组中包括至少两个算子,则将目标原子组包括的至少两个算子进行融合得到计算图。
[0061]
具体的,一个原子算子可以融合成一个子图,根据目标原子组将各个子图进行融合,可以得到计算图。可选的,在得到子图后,还可以提取子图信息,通过预设的transform方法改变子图的结构,例如,跳过primitive function,改变callnode等。最后利用dfs算法融合各个子图。
[0062]
在本实施例中,得到的深度学习模型的计算图可以搭载在目标芯片上进行运行。例如,若深度学习模型为图像识别的模型,则将待识别的图像输入深度学习模型中,可以得到识别结果。
[0063]
本技术实施例中,先获取深度学习模型的依赖图,基于预设的各类原子算子对应的算子数组,将依赖图中的算子进行分组,得到的每组算子为依赖图的一个原子算子,若一个原子算子中包括至少两个算子,至少两个算子在所述依赖图中连续;根据依赖图中的原子算子,得到由依赖图中的原子算子组成的各个目标原子组,依赖图中的原子算子组成原子算子序列;将目标原子组中的算子进行融合,得到深度学习模型的计算图。本技术先根据原子算子将深度学习模型中的算子组合成原子算子,然后再将原子算子进行组合,得到目标原子组,实现算子的多次组合,相较于现有技术中对算子的简单融合,本技术将多次组合后的算子进行融合,相较于现有技术得到的深度学习模型,本技术得到的深度学习模型的结构更简单,简单的深度学习模型的计算速度更快。
[0064]
如图2所示,在一种可能的实现方式中,步骤s102的实现过程可以包括:
[0065]
s1021,利用深度优先搜索算法遍历所述算子数组,得到各类原子算子对应的算子序列集。
[0066]
在本实施例中,利用dfs算法遍历算子数组,对算子数组中的算子进行组合,得到该类原子算子对应的算子序列集。根据一个算子数组至少可以得到一个算子序列集。算子序列集中算子的排列表征算子连接的先后顺序。
[0067]
作为举例,若atomi_conv对应的算子数组为:{{"cast",""},{"nn.insert",""},{"nn.pad",""},{"nn.conv2d"},{"nn.bias_add","nn.batch_norm",""},{"right_shift",""},{"clip",""},{"nn.relu","nn.prelu","nn.leaky_relu"},{"nn.relu","right_shift",""},{"clip",""}}。经过dfs算法可以得到的atomi_conv对应的算子序列集可以包括:{"cast","nn.pad","nn.conv2d","nn.batch_norm","nn.relu","clip"}。
[0068]
s1022,从算子序列集中筛选出满足目标芯片的硬件特性的算子序列集,将满足目标芯片的硬件特性的算子序列集作为第一序列集。
[0069]
在本实施例中,对dfs算法得到的算子序列集进行筛选,得到符合硬件特性的算子序列集。
[0070]
作为举例,若算子序列集a和b均为atomi_conv对应的算子序列集。a不符合硬件特性,b符合硬件特性,则将a去除,将b作为第一序列集。
[0071]
s1023,将依赖图中的算子序列与各个第一序列集进行匹配。
[0072]
在本实施例中,在依赖图中查找是否存在与第一序列集相同的序列。
[0073]
s1024,若依赖图中的算子序列与第一序列集相匹配,将依赖图中与第一序列集相匹配的算子序列作为一组算子。
[0074]
在本实施例中,若依赖图中存在与第一序列集相同的序列,则将依赖图中与第一序列集相同的序列归为一组,该组序列为一个原子算子,该原子算子与该组序列中的算子建立对应关系。
[0075]
作为举例,若atomi_conv对应的第一序列集为{"cast","nn.pad","nn.conv2d","nn.batch_norm","nn.relu","clip"},依赖图中也存在"cast","nn.pad","nn.conv2d","nn.batch_norm","nn.relu","clip"序列,则将依赖图中的"cast","nn.pad","nn.conv2d","nn.batch_norm","nn.relu","clip"序列组成一个原子算子,该组原子算子的类型为atomi_conv。
[0076]
在本实施例中,若依赖图中不存在与第一序列集相同的序列,则查找依赖图中是否存在与下一个第一序列集相同的序列,直至将依赖图与所有的第一序列集对比完成,得到依赖图中的所有原子算子。
[0077]
在本实施例中,在对所有第一序列集进行匹配后,可以得到依赖图中的所有原子算子,得到由原子算子组成的依赖图。另外,在得到原子算子后,还可以生成原子算子对应的数字,用数字表征各个原子算子。
[0078]
在本实施例中,一个原子算子可以表征一个原子图(atomic graph)或深度学习模型中的一个子图。
[0079]
本技术实施例中,在对算子进行初步的融合时,考虑了芯片的硬件特性对深度学习模型的影响,选择与芯片的硬件特性相匹配的算子进行融合,可以使得到的深度学习模型的运算速度更快,性能更好。
[0080]
如图3所示,在一种可能的实现方式中,步骤s103的实现过程可以包括:
[0081]
s1031,确定原子算子序列中的尾节点原子算子,其中,尾节点原子算子为预设类型的原子算子。
[0082]
在本实施例中,在确定了依赖图中的原子算子后,可以根据原子算子的先后顺序得到原子算子序列。查找原子算子序列中的尾节点原子算子,例如,atomic_concat和atomic_tuple类型的原子算子均可以作为尾节点原子算子。
[0083]
s1032,基于所述尾节点原子算子,确定所述依赖图中的候选原子组。
[0084]
在本实施例中,候选原子组包括依赖图中的至少一个原子算子,在候选原子组中包括至少两个所述原子算子时,所述至少两个所述原子算子在原子算子序列中连续。
[0085]
在本实施例中,由于尾节点原子算子为适合切分的原子算子,因此,在确定了尾节点原子算子后,可以在原子算子序列中的尾节点原子算子处进行切分,得到各个原子算子组,根据原子算子组得到各个候选原子组。一个候选原子组可以记为一个原子算子模式(atomicoppatterns)。
[0086]
如图4所示,具体的,步骤s1032的实现过程可以包括:
[0087]
s10321,基于尾节点原子算子对原子算子序列进行切分,得到各个原子算子组,每个原子算子组包括一个尾节点原子算子、且尾节点原子算子为原子算子组中的原子算子序列的最后一个原子算子。
[0088]
在本实施例中,一个原子算子组包括至少一个原子算子。若一个原子算子中包括一个原子算子,则该原子算子为尾节点原子算子。若一个原子算子中包括至少两个原子算子,则至少两个原子算子为连续的原子算子,且最后一个原子算子为尾节点原子算子。
[0089]
作为举例,若原子算子序列为g、h、i、j、k和l,尾节点原子算子包括h、j和l,则可以将原子算子序列切分成三个原子算子组,切分得到的原子算子组包括{g,h},{i,j}和{k,l}。
[0090]
s10322,基于各个原子算子组,确定依赖图中的候选原子组,其中,在候选原子组包括至少两个原子算子时,候选原子组包括的至少两个原子算子属于同一原子算子组。
[0091]
在本实施例中,候选原子组包括至少一个原子算子。在得到原子算子组后,可以将同一个原子算子组中的原子算子进行任意组合,得到候选原子组。另外,每个原子算子也可以组成一个候选原子组。
[0092]
作为举例,若一个原子算子组为{g、h、i、j},则可以得到的候选原子组包括{g}、{h}、{i}、{j}、{g,h}、{g,h,i}、{g,h,i,j}、{h,i}、{h,i,j}和{i,j}。
[0093]
可选的,可以根据组合公式得到候选原子组,其中,m为原子算子组中的原子算子数,j=1,2
……
m。
[0094]
作为举例,若一个原子算子组为{g、h、i、j},m=4,j取1,2,3和4。在j=1时,根据可以得到{g}、{h}、{i}、{j}。在j=2时,根据可以得到{g,h}、{h,i}和{i,j}。在j=3时,根据可以得到{g,h,i}和{h,i,j}。在j=4时,根据可以得到{g,h,i,j}。
[0095]
本技术实施例中,通过尾节点原子算子对原子算子序列进行切分,可以避免将不能切分的序列切分为两个原子算子组。对原子算子组中的原子算子进行多种组合,得到多种候选原子组,提供了多种算子融合方式,为后续查找最优的融合方式提供支持。
[0096]
s1033,计算各个候选原子组的收益值。
[0097]
在本实施例中,候选原子组的收益值可以用于评估组成的该组算子融合的优劣情况。收益值越小说明将该组算子融合后可以得到更优的计算图。
[0098]
具体的,步骤s1033的实现过程可以包括:
[0099]
s10331,确定第i个候选原子组中各个原子算子的第一成本值。
[0100]
在本实施例中,i=1,2,
……
n,n为候选原子组的总个数。
[0101]
在本实施例中,利用成本模型(costmodel)计算第i个候选原子组中各个原子算子的第一成本值。
[0102]
在本实施例中,原子算子的成本值可以用指令(cycle)数目表征。
[0103]
s10332,确定第i个候选原子组的第二成本值。
[0104]
在本实施例中,利用成本模型(costmodel)计算第i个候选原子组的第二成本值。
[0105]
在本实施例中,候选原子组的成本值可以用指令(cycle)数目表征。
[0106]
s10333,基于各个第一成本值和第二成本值,得到第i个候选原子组的收益值。
[0107]
具体的,计算各个所述第一成本值的和,得到第一和值。计算第一和值减去所述第二成本值的差值,第一和值减去第二成本值的差值为第i个候选原子组的收益值。
[0108]
可选的,利用收益计算公式yi为第i个候选原子组的收益值,
c为第i个候选原子组中第c个原子算子,t为第i个候选原子组中原子算子的总数,r1为第一成本值,为第i个候选原子组中各个原子算子的第一成本值之和。r2为第i个候选原子组的第二成本值。
[0109]
本技术实施例中,利用指令数目表征成本值,可以直观的反应一个原子算子或一个候选原子组的计算快慢,基于指令数目得到的候选原子组的收益值更能反应该组候选原子组在运算时所需的时长,进而确定该组候选原子算子是否为最优组合。
[0110]
s1034,基于各个收益值,确定候选原子组中的最优原子组,最优原子组为目标原子组。
[0111]
在本实施例中,利用整数线性规划算法(integer linear programming,ilp)从候选原子组中查找全局最优解,得到最优原子组。
[0112]
作为举例,若一个原子算子组为{g、h、i},该原子算子组得到的候选算子组包括:{g}、{h}、{i}、{g、h}、{h、i}和{g、h、i}。根据各个候选算子组的收益值,可以确定{g}和{h、i}为最优原子组,{g}和{h、i}为目标原子组。
[0113]
在本实施例中,在评估全局最优解时,还可以结合目标芯片的硬件特性求得全局最优解。
[0114]
本技术实施例中,先构建候选原子组,基于候选原子组的收益值,从候选原子组中确定原子算子的最佳组合方式,得到最优原子组。本技术从候选原子组中确定原子算子的最佳组合方式是从全局出发,得到的全局最优解,相比于仅片面的对原子算子进行组合,本技术得到的目标原子组可以使深度学习模型的性能更优。
[0115]
在一种可能的实现方式中,步骤s1034的实现过程可以包括:
[0116]
s10341,确定各个所述收益值中大于预设值的收益值。
[0117]
在本实施例中,若收益值小于或等于预设值,则确定该原子算子组不是优良的组合方式,该组原子算子不能进行融合,因此,需要先查找出大于预设值的收益值。
[0118]
在本实施例中,预设值可以根据需要进行设置,例如,预设值可以设置为0、1或2等。
[0119]
s10342,基于各个大于预设值的收益值对应的候选原子组,确定所述最优原子组。
[0120]
在本实施例中,从大于预设值的收益值对应的候选原子组中确定最优的组合方式,可以提高深度学习模型的性能。
[0121]
在一种可能的实现方式中,上述方法还可以包括:
[0122]
s201,获取深度学习模型的关系式。
[0123]
s202,根据关系式,生成依赖图,如图5所示,依赖图中包括a、b、c、d、e、f、g、h、v和m,一共十个算子。
[0124]
s203,利用深度优先搜索算法遍历算子数组,得到各类原子算子对应的算子序列集,将依赖图中的算子序列与各个算子序列集进行匹配,若依赖图中的算子序列与算子序列集相匹配,将依赖图中与算子序列集相匹配的算子序列作为一组算子,并记录该原子算子的类型。如图6所示,可以将依赖图中的a和b算子组成原子算子a,将依赖图中的c和d算子组成原子算子b,将依赖图中的e和f算子组成原子算子c,将依赖图中的g和h算子组成原子算子d,将依赖图中的v和m算子组成原子算子e。a、b、c、d和e组成原子算子序列。
[0125]
s204,确定原子算子序列中的尾节点原子算子为b和d。
[0126]
s205,将原子算子序列切分成原子算子组,原子算子组包括{a、b}、{c、d}和{e}。如图7所示,{a、b}记为原子算子组ⅰ,{c、d}记为原子算子组ⅱ,{e}记为原子算子组ⅲ。
[0127]
s206,基于原子算子组,得到候选原子组,具体的,由原子算子组ⅰ得到候选原子包括:{a}、{b}和{a、b}。由原子算子组ⅱ得到候选原子包括:{c}、{d}和{c、d}。由原子算子组ⅲ得到候选原子包括:{e}。
[0128]
s207,计算各个候选原子组中各个原子算子的指令数,以及各个候选原子组的指令数。基于候选原子组中各个原子算子的指令数和候选原子的指令数,计算各个候选原子组的收益值。
[0129]
s208,利用ilp算法和候选原子组,得到全局最优解,也就是最优的组合方式,得到目标原子组。如图8所示,{a}为一个目标原子组ⅳ,{b}为目标原子组
ⅴ
,{c、d、e}为目标原子组ⅵ。
[0130]
s209,融合目标原子组中的算子,得到深度学习模型的计算图。
[0131]
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。
[0132]
对应于上文实施例所述的算子融合方法,图9示出了本技术实施例提供的算子融合装置的结构框图,为了便于说明,仅示出了与本技术实施例相关的部分。
[0133]
参照图9,该装置300可以包括:数据获取模块310、第一分组模块320、第二分组模块330和算子融合模块340。
[0134]
其中,数据获取模块310,用于获取待处理的深度学习模型的依赖图,其中,所述依赖图包括所述深度学习模型中各个算子的顺序;
[0135]
第一分组模块320,用于基于预设的各类原子算子对应的算子数组,将所述依赖图中的算子进行分组,得到的每组算子为所述依赖图的一个原子算子,其中,若所述一个原子算子中包括至少两个算子,所述至少两个算子在所述依赖图中连续;
[0136]
第二分组模块330,用于根据所述依赖图中的原子算子组成的原子算子序列,得到由所述依赖图中的原子算子组成的各个目标原子组,其中,一个目标原子组中若包括至少两个所述原子算子,所述至少两个所述原子算子在所述原子算子序列中连续;
[0137]
算子融合模块340,用于将每个所述目标原子组中的算子进行融合,得到所述深度学习模型的计算图。
[0138]
在一种可能的实现方式中,第一分组模块320具体可以用于:
[0139]
利用深度优先搜索算法遍历所述算子数组,得到各类原子算子对应的算子序列集;
[0140]
从所述算子序列集中筛选出满足目标芯片的硬件特性的算子序列集,将满足所述目标芯片的硬件特性的算子序列集作为第一序列集,其中,所述目标芯片为运行所述深度学习模型的芯片;
[0141]
将所述依赖图中的算子序列与各个所述第一序列集进行匹配;
[0142]
若所述依赖图中的算子序列与所述第一序列集相匹配,将所述依赖图中与所述第一序列集相匹配的算子序列作为一组算子。
[0143]
在一种可能的实现方式中,第二分组模块330具体包括:
[0144]
尾节点确定单元,用于确定所述原子算子序列中的尾节点原子算子,其中,所述尾节点原子算子为预设类型的原子算子;
[0145]
候选组确定单元,用于基于所述尾节点原子算子,确定所述依赖图中的候选原子组,其中,所述候选原子组包括所述依赖图中的至少一个原子算子,在所述候选原子组中包括至少两个所述原子算子时,所述至少两个所述原子算子在所述原子算子序列中连续;
[0146]
计算单元,用于计算各个所述候选原子组的收益值;
[0147]
目标组确定单元,用于基于各个所述收益值,确定所述候选原子组中的最优原子组,所述最优原子组为所述目标原子组。
[0148]
在一种可能的实现方式中,候选组确定单元具体可以用于:
[0149]
基于所述尾节点原子算子对所述原子算子序列进行切分,得到各个原子算子组,其中,每个原子算子组包括一个尾节点原子算子、且所述尾节点原子算子为所述原子算子组中的原子算子序列的最后一个原子算子;
[0150]
基于各个所述原子算子组,确定所述依赖图中的候选原子组,其中,在所述候选原子组包括至少两个原子算子时,所述候选原子组包括的所述至少两个原子算子属于同一所述原子算子组。
[0151]
在一种可能的实现方式中,计算单元具体可以用于:
[0152]
确定第i个候选原子组中各个原子算子的第一成本值,其中,i=1,2,
……
n,n为所述候选原子组的总个数;
[0153]
确定所述第i个候选原子组的第二成本值;
[0154]
基于各个所述第一成本值和所述第二成本值,得到所述第i个候选原子组的收益值。
[0155]
在一种可能的实现方式中,计算单元具体可以用于:
[0156]
计算各个所述第一成本值的和,得到第一和值;
[0157]
计算所述第一和值减去所述第二成本值的差值,所述第一和值减去所述第二成本值的差值为所述第i个候选原子组的收益值。
[0158]
在一种可能的实现方式中,目标组确定单元具体可以用于:
[0159]
确定各个所述收益值中大于预设值的收益值;
[0160]
基于各个大于预设值的收益值对应的候选原子组,确定所述最优原子组。
[0161]
需要说明的是,上述装置/单元之间的信息交互、执行过程等内容,由于与本技术方法实施例基于同一构思,其具体功能及带来的技术效果,具体可参见方法实施例部分,此处不再赘述。
[0162]
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本技术的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0163]
本技术实施例还提供了一种终端设备,参见图10,该终端设备400可以包括:至少一个处理器410、存储器420以及存储在所述存储器420中并可在所述至少一个处理器410上运行的计算机程序,所述处理器410执行所述计算机程序时实现上述任意各个方法实施例中的步骤,例如图1所示实施例中的步骤s101至步骤s104。或者,处理器410执行所述计算机程序时实现上述各装置实施例中各模块/单元的功能,例如图9所示模块310至模块340的功能。
[0164]
示例性的,计算机程序可以被分割成一个或多个模块/单元,一个或者多个模块/单元被存储在存储器420中,并由处理器410执行,以完成本技术。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序段,该程序段用于描述计算机程序在终端设备400中的执行过程。
[0165]
本领域技术人员可以理解,图10仅仅是终端设备的示例,并不构成对终端设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如输入输出设备、网络接入设备、总线等。
[0166]
处理器410可以是中央处理单元(central processing unit,cpu),还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0167]
存储器420可以是终端设备的内部存储单元,也可以是终端设备的外部存储设备,例如插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。所述存储器420用于存储所述计算机程序以及终端设备所需的其他程序和数据。所述存储器420还可以用于暂时地存储已经输出或者将要输出的数据。
[0168]
总线可以是工业标准体系结构(industry standard architecture,isa)总线、外部设备互连(peripheral component,pci)总线或扩展工业标准体系结构(extended industry standard architecture,eisa)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本技术附图中的总线并不限定仅有一根总线或一种类型的总线。
[0169]
本技术实施例提供的算子融合方法可以应用于计算机、平板电脑、笔记本电脑、上网本、个人数字助理(personal digital assistant,pda)等终端设备上,本技术实施例对终端设备的具体类型不作任何限制。
[0170]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
[0171]
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
[0172]
在本技术所提供的实施例中,应该理解到,所揭露的终端设备、装置和方法,可以通过其它的方式实现。例如,以上所描述的终端设备实施例仅仅是示意性的,例如,所述模
块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
[0173]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0174]
另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0175]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被一个或多个处理器执行时,可实现上述各个方法实施例的步骤。
[0176]
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被一个或多个处理器执行时,可实现上述各个方法实施例的步骤。
[0177]
同样,作为一种计算机程序产品,当计算机程序产品在终端设备上运行时,使得终端设备执行时实现可实现上述各个方法实施例中的步骤。
[0178]
其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括是电载波信号和电信信号。
[0179]
以上所述实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的精神和范围,均应包含在本技术的保护范围之内。