一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种内存分配方法、部署方法及相关装置与流程

2022-07-23 02:18:24 来源:中国专利 TAG:


1.本技术涉及人工智能技术领域,特别涉及一种内存分配方法、部署方法及相关装置。


背景技术:

2.近几年,基于移动端的深度学习推理框架成为机器学习中重点研究方向,各大厂商纷纷推出了相应的推理框架,如,腾讯的ncnn、tnn,阿里的mnn,百度的mdl,谷歌的tf lite等等。但是,由于嵌入式设备会受内存资源的限制,使得应用于嵌入式设备的深度学习推理框架会受到内存资源的限制,从而影响深度学习推理框架在嵌入式设备上的应用。
3.因而现有技术还有待改进和提高。


技术实现要素:

4.本技术要解决的技术问题在于,针对现有技术的不足,提供一种内存分配方法、部署方法及相关装置。
5.为了解决上述技术问题,本技术实施例第一方面提供了一种内存分配方法,所述的方法包括:
6.获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子,其中,所述依赖算子不复用所述算子内存,所述局部内存共享算子复用所述算子内存;
7.根据所述算子内存以及所述执行顺序,在所述网络模型的各未分配算子内存的参照算子中选取目标算子;
8.读取所述目标算子的所述局部内存共享算子的依赖算子;
9.根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存;
10.在一个实现方式中,所述方法还包括:继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。
11.在一个实现方式中,所述根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存具体包括:
12.当所述目标算子为不可剔除算子时,基于所述依赖算子为所述目标算子分配算子内存;
13.当所述目标算子为可剔除算子时,为所述目标算子分配与其输入算子的算子内存相同的算子内存;
14.当所述目标算子为合并算子时,基于所述依赖算子为所述目标算子分配算子内存,并且按照执行顺序依次为所述目标算子的输入算子分配算子内存。
15.在一个实现方式中,所述基于所述依赖算子为所述目标算子分配算子内存具体包括:
16.检测所述依赖算子中是否存在已分配算子内存的目标依赖算子;
17.当存在目标依赖算子时,为所述目标算子分配与所述目标依赖算子的算子内存不重叠的算子内存;
18.当未存在目标依赖算子时,将位置0作为所述目标算子的起始位置,从所述起始位置开始为所述目标算子分配算子内存。
19.在一个实现方式中,所述根据所述算子内存以及所述执行顺序,在所述网络模型的各未分配算子内存的参照算子中选取目标算子具体包括:
20.在所述网络模型的各未分配算子内存的参照算子中选取算子内存最大的参照算子;
21.当所述算子内存最大的参照算子为多个时,将按照执行顺序将位于最前的算子内存最大的参照算子作为目标算子。
22.在一个实现方式中,所述依赖算子的确定过程具体包括:
23.对于所述网络模型中的每个算子,按照执行顺序在位于所述算子之前的算子以及所述算子中选取所述算子对应的第一依赖算子,以得到各算子各自对应的第一依赖算子;
24.对于所述网络模型中的每个算子,按照执行顺序在位于所述算子之后的各算子中选取第二依赖算子,其中,第二依赖算子对应的第一依赖算子包含所述算子;
25.将选取到的第一依赖算子以及第二依赖算子作为所述算子对应的依赖算子,以得到各算子对应的依赖算子。
26.在一个实现方式中,所述按照执行顺序在位于所述算子之前的算子以及所述算子中选取所述算子对应的第一依赖算子具体包括:
27.获取按照执行顺序位于所述算子之前的候选算子;
28.基于所述算子的算子特征在获取到的候选算子中选取所述算子对应的第一候选依赖算子,其中,所述第一候选依赖算子的输出项为所述算子的输入项;
29.在除所述第一候选依赖算子外的候选算子中选取算子内存未回收的第二候选依赖算子;
30.将所述算子、选取到的第一候选依赖算子和第二候选依赖算子,作为所述算子对应的第一依赖算子。
31.在一个实现方式中,所述局部内存共享算子的确定过程具体包括:
32.对于所述网络模型中的每个算子,按照执行顺序在位于所述算子之后的算子中选取复用所述算子的算子内存的第一局部内存共享算子;
33.按照执行顺序在位于所述算子之前的算子中选取被所述算子复用算子内存的第二局部内存共享算子;
34.将所述算子、选取到的第一局部内存共享算子以及第二局部内存共享算子作为所述算子对应的局部内存共享算子,以得到各算子对应的局部内存共享算子。
35.本技术实施例第二方面提供了一种内存分配装置,所述的内存分配装置包括:
36.确定模块,获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子,其中,所述依赖算子不复用所述算子内存,所述局部内存共享算子复用所述算子内存;
37.选取模块,用于根据所述算子内存以及所述执行顺序在所述网络模型的各未分配
算子内存的参照算子中选取目标算子;
38.读取模块,用于读取所述目标算子的所述局部内存共享算子的依赖算子;
39.分配模块,用于根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存;
40.执行模块,用于继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。
41.本技术实施例第三方面提供了一种网络模型的部署方法,所述的方法包括:
42.将网络模型部署于目标设备,并在离线模型上采用如上所述的内存分配方法为所述网络模型的各算子分配算子内存;
43.将所述网络模型中复用输入算子的算子内存的算子剔除,并采用剔除后的网络模型进行在线推理。
44.本技术实施例第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如上所述的内存分配方法中的步骤,和/或以实现如上所述的网络模型的部署方法。
45.本技术实施例第五方面提供了一种终端设备,其包括:处理器、存储器及通信总线;所述存储器上存储有可被所述处理器执行的计算机可读程序;
46.所述通信总线实现处理器和存储器之间的连接通信;
47.所述处理器执行所述计算机可读程序时实现如上所述的内存分配方法中的步骤,和/或实现如上所述的网络模型的部署方法。
48.有益效果:与现有技术相比,本技术提供了一种内存分配方法、部署方法及相关装置,方法包括获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子;根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子;读取所述目标算子的所述局部内存共享算子的依赖算子;根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存;继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。本技术通过获取各算子的依赖算子及局部内存共享算子,并基于局部内存共享算子的依赖算子为算子以及算子的输入算子分配内存,并控制可复用其输入算子的算子复用其输入算子的算子内存,减少了网络模型所需的内存资源。同时,当在线使用网络模型时,将复用输入算子的算子内存的算子从网络模型中剔除,这样可以减少网络模型执行过程中的数据搬运次数,提高网络模型的推理速度。
附图说明
49.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员而言,在不符创造性劳动的前提下,还可以根据这些附图获得其他的附图。
50.图1为本技术提供的内存分配方法的流程图。
51.图2为本技术提供的内存分配方法的网络模型的一个示例图。
52.图3为图2所示的网络模型中的各算子的第一依赖算子的示意图。
53.图4为图2所示的网络模型中的各算子的依赖算子的示意图。
54.图5为图2所示的网络模型中的各算子的第一局部内存共享算子的示意图。
55.图6为图2所示的网络模型中的各算子的局部内存共享算子的示意图。
56.图7为图2所示的网络模型中concat、conv0、conv2和conv3分配算子内存的示意图。
57.图8为图2所示的网络模型中conv4分配算子内存的示意图。
58.图9为图2所示的网络模型中input和split0分配算子内存的示意图。
59.图10为图2所示的网络模型中conv1和split分配算子内存的示意图。
60.图11为本技术提供的内存分配方法的网络模型的一个示例图。
61.图12为通过本技术提供的内存分配方法为图11中的各算子分配算子内存的示意图。
62.图13为通过现有内存分配方法为图11中的各算子分配算子内存的示意图。
63.图14为本技术提供内存分配装置的结构原理图。
64.图15为本技术提供的终端设备的结构原理图。
具体实施方式
65.本技术提供一种内存分配方法、部署方法及相关装置,为使本技术的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本技术进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本技术,并不用于限定本技术。
66.本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本技术的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
67.本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本技术所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
68.应理解,本实施例中各步骤的序号和大小并不意味着执行顺序的先后,各过程的执行顺序以其功能和内在逻辑确定,而不应对本技术实施例的实施过程构成任何限定。
69.发明人经过研究发现,近几年,基于移动端的深度学习推理框架成为机器学习中重点研究方向,各大厂商纷纷推出了相应的推理框架,如,腾讯的ncnn、tnn,阿里的mnn,百度的mdl,谷歌的tf lite等等。但是,由于嵌入式设备会受内存资源的限制,使得应用于嵌入式设备的深度学习推理框架会受到内存资源的限制,从而影响深度学习推理框架在嵌入
式设备上的应用。
70.为了解决上述问题,在本技术实施例中,获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子;根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子;读取所述目标算子的所述局部内存共享算子的依赖算子;根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存;继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。本技术实施例通过获取各算子的依赖算子及局部内存共享算子,并基于局部内存共享算子的依赖算子为算子以及算子的输入算子分配内存,并控制可复用其输入算子的算子复用其输入算子的算子内存,减少了网络模型所需的内存资源。同时,当在线使用网络模型时,将复用输入算子的算子内存的算子从网络模型中剔除,这样可以减少网络模型执行过程中的数据搬运次数,提高网络模型的推理速度。
71.下面结合附图,通过对实施例的描述,对申请内容作进一步说明。
72.本实施例提供的一种内存分配方法,所述内存分配方法可以应用于深度学习推理框架,以优化深度学习推理框架所需的内存资源,降低内存资源对深度学习推理框架的限制,从而可以提高深度学习推理框架的应用范围。例如,当深度学习推理框架进行内存优化后,可以避免嵌入式设备的内存资源对深度学习推理框架的限制,使得深度学习推理框架可以被广泛应用于嵌入式设备内。在一个实现方式中,所述内存分配方法可以用于采用深度学习推理框架的网络模型上,并在离线模型采用本实施例提供的内存分配方法为网络模型中的各算子分配内存算子。
73.本实施例提供了一种内存分配方法,如图1所示,所述方法包括:
74.s10、获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子。
75.具体地,网络模型为深度学习推理框架,网络模型包括若干算子,若干算子中的每个算子均对应有执行顺序,其中,执行顺序用于反映算子在网络模型推理过程中的执行顺序,算子的执行顺序越靠前,算子越先被执行。例如,网络模型为如图2所示的网络模型,网络模型中的input算子的执行顺序为1,split0算子的执行顺序为2,input算子先于split0算子被执行。算子所需的算子内存为执行算子时所需的内存空间,例如,网络模型为如图11所示的网络模型,网络模型中的input算子所需的算子内存为40,conv2d算子的所需的算子内存为80。
76.依赖算子为基于算子间的依赖关系确定的,依赖算子不复用算子内存。假设网络模型中有算子a,算子a的依赖算子为基于算子间的依赖关系确定的,算子a的依赖算子包括于网络模型中,并且依赖算子不复用算子a的算子内存。可以理解的是,在为算子a的依赖算子分配算子内存时,不可以将算子a的算子内存分配给算子a的依赖算子。在一个实现方式中,依赖关系的建议原则为:1)、网络模型中的算子a对算子a具有依赖关系;
77.2)、当网络模型中的算子a的输入项和输出项不可以共享内存,且算子a执行算子计算时需要依赖网络模型中算子b的算子内存时,算子a和算子b具有依赖关系;3)、算子a与在算子a被执行计算时未被回收算子内存的算子c具有依赖关系。
78.在本发明的一个实施例中,各算子的依赖算子的确定过程具体可以包括如下步
骤:
79.s11、对于所述网络模型中的每个算子,按照执行顺序在位于所述算子之前的算子以及所述算子中选取所述算子对应的第一依赖算子,以得到各算子各自对应的第一依赖算子;
80.s12、对于所述网络模型中的每个算子,按照执行顺序在位于所述算子之后的各算子中选取第二依赖算子,其中,第二依赖算子对应的第一依赖算子包含所述算子;
81.s13、将选取到的第一依赖算子以及第二依赖算子作为所述算子的依赖算子,以得到各算子对应的依赖算子。
82.具体地,在所述步骤s11中,假设网络模型包括算子a,算子a对应的第一依赖算子按照执行顺序位于算子a之前,算子a的算子内存依赖于算子a对应的第一依赖算子,换句话说,算子a自身的执行过程需要使用算子a依赖的第一依赖算子的算子内存中所存储的数据。例如,如图2所示的网络模型中,conv0算子的第一依赖算子包括conv0算子和split0算子,那么conv0算子的算子内存依赖conv0算子的算子内存和split0算子的算子内存。可以理解的是,在执行conv0算子时,conv0算子自身的推理过程需要使用其依赖的conv0算子和split0算子的算子内存中所存储的数据,从而不可以复用其对应的conv0算子和split0算子的算子内存。
83.在本实施例的一个实现方式中,所述按照执行顺序在位于所述算子之前的算子以及所述算子中选取所述算子对应的第一依赖算子具体包括:
84.获取按照执行顺序位于所述算子之前的候选算子;
85.基于所述算子的算子特征在获取到的候选算子中选取所述算子对应的第一候选依赖算子,其中,所述第一候选依赖算子的输出项为所述算子的输入项;
86.在除所述第一候选依赖算子外的候选算子中选取算子内存未回收的第二候选依赖算子;
87.将所述算子、选取到的第一候选依赖算子和第二候选依赖算子,作为所述算子对应的第一依赖算子。
88.具体地,假设网络模型包括算子a,算子a的候选算子指的是按照执行顺序位于算子a之前的所有算子,其中,候选算子可以为空,可以为1个,也可以为多个。例如,如图2所示的网络模型中,input算子的候选算子为空,split0算子的候选算子为1个,conv0算子的候选算子为2个。
89.算子特征用于反映算子的计算方式,通过计算方式可以确定算子a的输入项和输出项是否可以共享内存,进而确定算子a的依赖算子。其中,当算子a的输入项和输出项可以共享内存时,算子a执行时不需要依赖输出算子a的输入项的候选算子;当算子a的输入项和输出项不可以共享内存时,算子a执行是需要依赖输出算子a的输入项的候选算子,例如:卷积算子对输出卷积算子输入项的上算子存在依赖关系,vpu算子和软件算子对输出算子输入项的算子不存在依赖关系。也就是说,在获取到算子a的算子特征后,基于算子特征来检测算子a的输入项和输出项是否可以共享内存,然后基于检测结果在候选算子中选取算子a对应的第一候选依赖算子,因此,算子a与其对应的第一候选依赖算子不可以共享内存。例如,如图2所示的网络模型中,conv0算子的每一个输出项都与每一个输入项有关,从而conv0算子的输入项和输出项不可以共享内存,从而输出conv0算子的输入项的split0算子
为conv0算子的第一候选依赖算子。
90.算子a的第二候选依赖算子指的是在执行算子a时,第二候选依赖算子的算子内存未被回收。也就是说,按照执行顺序位于算子a之后的算子中存在一个算子c,在执行算子c时需要使用算子内存未回收的第二候选依赖算子的输出项。可以理解的是,在执行算子a时,第二候选依赖算子的算子内存不可以被回收,从而算子a不能复用第二候选依赖算子的算子内存。例如,如图2所述的网络模型中,执行conv1算子时,conv0算子的输出项会被位于conv1算子之后的concat算子使用,从而conv0算子的算子内存未被回收,从而conv0算子为conv1算子的第二候选依赖算子。
91.此外,在获取到的第一候选依赖算子和第二候选依赖算子之后,由于每个算子都需要依赖其自身的输入项,即每个算子都与其自身具有依赖关系,从而将算子、选取的第一候选依赖算子和第二候选依赖算子作为该算子的第一依赖算子。
92.举例说明:网络模型为图2所示的网络模型,网络模型中的input算子无输入项,仅对自身输出有依赖,从而input算子对应的第一依赖算子为input算子;split0算子的输入项和输出项可以共享内存,split0算子仅对自身输出有依赖,从而split0算子对应的第一依赖算子为split0算子;conv0算子的输入项和输出项不可以共享内存,并且conv0算子对其自身输出有依赖,从而conv0算子对应的第一依赖算子包括split0算子和conv0算子;conv1算子的输入项和输出项不可以共享内存,conv1算子对其自身输出有依赖,并且在执行conv1算子时conv0算子的内存无法回收,从而conv1算子对应的第一依赖算子包括split0算子、conv0算子和conv1算子;依次类推,各算子各自对应的第一依赖算子如图3所示。
93.在所述步骤s12中,假设网络模型包括算子a,算子a的第二依赖算子为按照执行顺序位于算子a之后的算子b,其中,算子a之后的算子b已经在执行步骤s11时建立了与算子a之间的依赖关系,即算子a是算子b的第一依赖算子,则在本步骤中,算子b即为算子a的第二依赖算子。例如,在如图2所示的网络模型中,conv4算子对应的第一依赖算子包括concat算子,从而,conv4算子为concat算子的第二依赖算子。
94.在所述步骤s13中,在选取到第一依赖算子和第二依赖算子之后,将选取到的第一依赖算子和第二依赖算子作为算子的依赖算子。本实施例通过将第一依赖算子与按照推理位于算子之前的各算子建立依赖关系,并通过第二依赖算子与按照推理位于算子之后的各算子建立依赖关系,从而确定了网络模型中的各算子之间的相互依赖关系,具有相互依赖关系的算子不能共享内存,以便于基于相互依赖关系为各算子分配连续内存。例如,如图2所示的网络模型中的各算子各自对应的依赖算子可以如图4所示。
95.局部内存共享算子为基于局部内存复用关系确定的,局部内存共享算子复用算子内存。假设网络模型包括算子a,算子a的局部内存共享算子为基于局部内存复用关系确定的,算子a的局部内存共享算子为网络模型中可以复用算子a的算子内存的算子,换句话说,局部内存共享算子可以共用算子a的算子内存。在一个实现方式中,局部内存复用关系的确定原则可以为:1)、算子a对算子a自身具有局部内存复用关系;2)、当网络模型中的算子b与算子a相连接,且算子b为输出项和输入项可复用内存的算子时(根据算子b的算子特性确定),算子a与算子b之间具有局部内存复用关系。
96.在本发明的一个实施例中,各算子对应的局部内存共享算子的确定过程具体包括
如下步骤:
97.对于所述网络模型中的每个算子,按照执行顺序在位于所述算子之后的算子中选取复用所述算子的算子内存的第一局部内存共享算子;
98.按照执行顺序在位于所述算子之前的算子中选取被所述算子复用算子内存的第二局部内存共享算子;
99.将所述算子、选取到的第一局部内存共享算子以及第二局部内存共享算子作为所述算子对应的局部内存共享算子,以得到各算子对应的局部内存共享算子。
100.具体地,假设网络模型包括算子a,算子a的第一局部内存共享算子按照执行顺序位于算子a之后,第二局部内存共享算子按照执行顺序位于算子a之前,其中,第一局部内存共享算子可以复用算子a的算子内存,第二局部内存共享算子的算子内存可以被算子a复用,并且算子a与对应的第一局部内存共享算子和第二局部内存共享算子均具有连接关系。也就是说,第一局部内存共享算子与算子a连接且为算子a的输出算子,第一局部内存共享算子的输入项复用所述算子的输出项的算子内存;第二局部内存共享算子为与算子a连接且为算子a的输入算子,第二局部内存共享算子的输出项的算子内存被所述算子的输出项复用。
101.本实施例在获取到各算子对应的依赖算子后,又获取各算子的局部内存共享算子,这样可以重复获取各算子在网络模型的连接关系,可以避免仅获取到算子对应的依赖算子而导致的按照输出内存大小关系为各算子分配内存可能会出现内存分配错误的问题。例如,假设优先分配concat,随后根据依赖关系为其对应的三个输入算子分配内存,接下来为input分配内存,根据依赖关系它和其他输出内存不具有依赖关系,然后为split0分配内存,它复用input的输出内存,但同时又和conv0、conv1的输出内存有依赖,导致内存分配错误。
102.举例说明:如图2所示的网络模型,网络模型中的每个算子均为其自身的局部内存共享算子,input算子连接split0算子并且split0算子为输入输出复用内存的算子,从而split0算子为input算子的第一局部内存共享算子,再向下层连接,由于split0算子的输出项复用input算子的输出项的算子内存,从而可以将split0算子的连接算子算作input算子的连接算子,即conv0算子和conv1算子为input算子的连接算子,而conv0算子和conv1算子根据算子特性判断出输出项不复用输入项的算子内存,从而conv0算子和conv1算子不为input算子的第一局部算子,并且conv0算子和conv1算子的连接算子不可以算作input算子的连接算子,由此,input算子的第一局部内存共享算子为split0算子;依次类推,图2所示的网络模型中的各算子的第一局部内存共享算子可以如图5所示。上述获取第一局部内存共享算子的完成后,还需要按照推理顺序,反向遍历一遍,获取各算子的第二局部内存共享算子,例如conv4算子连接concat算子且concat算子不是输出项复用输入项内存的算子,则concat算子不是conv4算子的第二局部内存共享算子;继续遍历concat算子连接的算子conv0、conv2和conv3,根据内存复用确定原则可知均为concat算子的第二局部内存共享算子。在反向遍历完成后,图2所述的网络模型中的各算子各自对应的局部内存共享算子可以如图6所示。
103.s20、根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子。
104.具体地,所述参照算子为网络模型中的未分配算子内存的算子,目标算子为网络模型中的参照算子中算子内存最大的算子。例如,如图2所示的网络模型,当网络模型中的所有算子均未分配算子内存时,concat算子的算子内存最大,concat算子为目标算子。此外,在实际应用中,网络模型中可能存在算子内存相同的算子,从而在网络模型中选取目标算子时,可能会选取到多个目标算子。基于此,根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子具体为:
105.在所述网络模型的各未分配算子内存的参照算子中选取算子内存最大的参照算子;
106.当所述算子内存最大的参照算子为多个时,将按照执行顺序将位于最前的算子内存最大的参照算子作为目标算子。
107.具体地,参照算子为网络模型中未分配算子内存的算子,其中,参照算子的数量可以为1个,也可以为多个。其中,当参照算子的数量为1时,可以直接将参照算子作为目标算子;当参照算子的数量大于1时,按照执行顺序将最前的参照算子作为目标算子。例如,如图2所示的网络模型,当网络模型中未分配算子内存中算子的算子内存最大为90时,concat算子为参照算子,当网络模型中未分配算子内存中算子的算子内存最大为40时,那么选取到的参照算子可以包括input算子、split0算子、conv1算子以及split1算子。本实施例首先按照算子内存大小确定内存分配顺序,然后在算子内存大小相同时,按照执行顺序确定算子内存大小相同的算子的执行顺序,这样可以在分配内存时,优先为算子内存大的算子分配内存,分配顺序位于其后的算子内存小,更容易放置于已分配未回收的算子内存的间隙,从而可以降低网络模型对于内存资源的占用量。当然,本实施例仅是给出一个典型实现方式,在实际应用中,也可以采用其他方式分配,例如,首先按照算子内存大小确定内存分配顺序,然后在算子内存大小相同时,按照算子对应的依赖算子的数量确定算子内存大小相同的算子的执行顺序等。
108.s30、读取所述目标算子的所述局部内存共享算子的依赖算子。
109.具体地,目标算子的局部内存共享算子和局部内存共享算子的依赖算子为通过上述步骤获取的,也就是说,在选取到目标算子后,可以直接的读取目标算子对应的局部内存共享算子,然后在读取各局部内存共享算子各自对应的依赖算子。局部共享算子的依赖算子为目标算子的内存分配时所依赖的所有依赖算子,这是由于局部内存共享算子复用目标算子的算子内存,而局部内存共享算子的依赖算子不复用局部内存共享算子的算子内存,从而目标算子的算子内存不能与其对应的依赖算子和其对应的局部内存共享算子的依赖算子的算子内存重叠。此外,由于目标算子为其自身的局部共享算子,从而在获取到目标算子对应的局部共享算子的依赖算子时,也获取到目标算子自身的依赖算子。由此,在为目标算子分配算子内存时,仅需要获取目标算子对应的各局部内存共享算子的算子内存,就获取到影响目标算子的算子内存分配的所有依赖算子。
110.s40、根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存。
111.具体地,输入算子与目标算子相连接,并且输入算子的输出项为目标算子的输入项。在获取到依赖算子时,由于目标算子的算子内存不复用依赖算子的算子内存,从而在为目标算子分配算子内存时,目标算子所分配的算子内存不与依赖算子的算子内存重叠。此外,网络模型中的各算子的算子特性不同,在基于依赖算子为目标算子和目标算子的输入
算子分配内存时,可以直接为目标算子分配内,或者为目标算子和目标算子的输入算子分内存。
112.基于此,在一个实现方式中,所述步骤s40:所述根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存具体包括:
113.s41、当所述目标算子为不可剔除算子时,基于所述依赖算子为所述目标算子分配算子内存;
114.s42、当所述目标算子为可剔除算子时,为所述目标算子分配与其输入算子的算子内存相同的算子内存;
115.s43、当所述目标算子为合并算子时,基于所述依赖算子为所述目标算子分配算子内存,并且按照执行顺序依次为所述目标算子的输入算子分配算子内存
116.具体地,在所述步骤s41中,不可剔除算子为算子本身进行算子计算的算子,其中,不可剔除算子可以基于算子特性确定的,也可以根据预先设置的可剔除算子集合确定。当基于算子特性确定时,在获取到目标算子时,可以获取所述目标算子的算子特性,当算子特性为本身进行算子计算时,目标算子为不可剔除算子;当基于预先设置的可剔除算子集合确定时,获取到的目标算子时,检测目标算子是否包含于可剔除算子集合,当未包含于可剔除算子集合且不为合并算子时,目标算子为不可剔除算子。
117.在一个典型实现方式中,由于预设的网络模型为已知的,从而在为网络模型分配内存之前,可以预先获取网络模型所包括的各算子,并为各算子分配算子类型,其中,算子类型包括可剔除算子、不可剔除算子以及合并算子;然后,在为算子分配内存时,可以直接读取算子所携带的算子类型,并基于提取到的算子类型为各算子分配内存,这样一方面可以避免内存分配过程中的算子类型确定过程,可以提高内存分配速度;另一方面还可以避免因算子类型确定错误而导致的内存分配错误的问题。
118.在本实施例的一个实现方式中,所述基于所述依赖算子为所述目标算子分配算子内存具体包括:
119.检测所述依赖算子中是否存在已分配算子内存的目标依赖算子;
120.当存在目标依赖算子时,为所述目标算子分配与所述目标依赖算子的算子内存不重叠的算子内存;
121.当未存在目标依赖算子时,将位置0作为所述目标算子的起始位置,从所述起始位置开始为所述目标算子分配算子内存。
122.具体地,所述依赖算子为目标算子对应的局部内存共享算子的依赖算子,其中,依赖算子中可以存在已经分配算子内存的,也可以存在未分配算子内存。例如,目标算子为在如图2所示的网络模型中concat算子,concat算子对应的获取到的依赖算子包括concat算子、conv3算子、conv2算子以及conv0算子,concat算子为如图2所示的网络模型中算子内存最大的算子,从而在为concat算子分配内存时,concat算子、conv3算子、conv2算子以及conv0算子均未分配算子内存,concat算子对应的获取到的依赖算子中不存在目标依赖算子;目标算子为在如图2所示的网络模型中conv4算子,conv4算子对应的获取到的依赖算子包括concat算子,concat算子已经分配算子内存,conv4算子对应的获取到的依赖算子中存在目标依赖算子concat算子。
123.当存在目标依赖算子时,由于目标算子不复用目标依赖算子的算子内存,从而目
标算子的算子内存不能于目标依赖算子的算子内存重叠。由此,目标算子的算子位置可以设置于目标依赖算子的算子内存之后。在一个实现方式中,在存在目标依赖算子时,将与目标依赖算子相邻且位于其后的位置作为所述目标算子的起始位置,从所述起始位置开始为所述目标算子分配算子内存,这样将与目标依赖算子相邻且位于其后的位置作为所述目标算子的起始位置,可以使得网络模型所占用尽量少的内存资源。当然,在实际应用中,也可以采用目标依赖算子的算子内存所占用的内存资源之后的任意位置的内存资源为目标算子分配算子内存等。此外,在未存在目标依赖算子时,说明目标算子内存的算子内存可以分配为任意位置,此时可以以位置0作为所述目标算子的起始位置来为目标算子分配算子指令。当然,在实际应用中,也可以以其他位置为起始位置,例如,位置1,位置2等。
124.在所述步骤s42中,可剔除算子为可以复用其输入算子的算子内存的算子,当目标算子为可剔除算子时,目标算子可以复用其输入算子的算子内存,从而分配与输入算子相同的算子内存,其中,所述输入算子的输出项为所述目标算子的输入项。例如,如图2所示的网络模型中的split0算子,split0算子为可剔除算子,split0算子的输入算子为input算子,从而为split0算子与input算子相同的内存。此外,值得说明的时,由于可剔除算子可以复用其输入算子的算子内存,从而可剔除算子的算子内存大小与其输入算的算子内存相同;而本实施例中在算子内存大小相同时,会按照执行顺序为算子内存大小相同的算子分配内存,而目标算子的输入算子的执行顺序先于目标算子的执行顺序,由此,在为目标算子分配内存时,目标算子的输入算子已经分配算子内存,从而可以为所述目标算子分配与其输入算子的算子内存相同的算子内存。
125.在所述步骤s43中,合并算子为用于执行合并操作的算子,合并算子本身不进行算子执行,仅是将输入项进行数据合并,从而在进行算子剔除时,也可以将合并算子剔除。然而,在将合并算子剔除时,需要保证合并算子的各输入算子的算子内存连续,以使得以合并算子的输出项作为输入的算子可以正确获取到合并算子的各输入算子的输出项。由此,在目标算子为合并算子时,在获取所述目标算子的局部内存共享算子,并基于所述依赖算子为所述目标算子分配算子内存后,还会为合并算子对应的输入算子分配算子内存,其中,合并算子对应的输入算子分配算子可以与合并算子的算子内存重叠,但是各输入算子之间的算子内存不可以重叠。其中,在获取所述目标算子的局部内存共享算子,并基于所述依赖算子为所述目标算子分配算子内存与步骤s41中的过程相同,这里就不在赘述,具体可以参照步骤s41的说明。
126.在本发明的一个实施例中,所述方法还包括:
127.s50、继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。
128.具体地,在继续执行在网络模型的各未分配算子内存的参照算子中选取算子内存最大的目标算子的步骤之前,可以检测所述网络模型中是否存在未分配算子内存的算子;当存在未分配算子内存的算子时,则继续执行在所述网络模型的参照算子中选取算子内存最大的目标算子的步骤;当不存在未分配算子内存的算子时,说明已经完成网络模型的内存分配,则停止执行在所述网络模型的参照算子中选取算子内存最大的目标算子的步骤。
129.为了进一步说明本实施例提供的内存分配方法,下面给出一个具体例子对本实施
例提供的内存分配方法进行具体说明。
130.预设的网络模型为如图2所述的网络模型,网络模型中各算子各自对应的依赖算子如图4所示,各算子各自对应的局部内存共享算子如图6所示。网络模型中的各算子的内存分配过程为:
131.concat分配内存,concat为合并算子,concat对应的依赖算子以及其对应的局部内存共享算对应的依赖算子包括concat、conv3、conv2、conv0,concat、conv3、conv2以及conv0均未分配算子内存,所以concat不受内存限制,可以从offset=0位置放置;concat的输入算子包括conv3、conv2、conv0,在concat的输入算子分别内存后,依次为conv3、conv2、conv0分配算子内存,如图7所示;
132.conv4分配内存,conv4对应的依赖算子以及其对应的局部内存共享算对应的依赖算子包括conv4和concat,concat已分配算子内存,从而从offset=0的位置开始找一块能够存放conv4的输出且不与concat内存重叠的内存,如图8所示;
133.input、split0、conv1和split1的算子内存相同,按照执行顺序先为input分配内存,input对应的依赖算子以及其对应的局部内存共享算对应的依赖算子包括input、split0、conv0、conv1,conv0已经分配算子内存,input算子从offset=0位置开始,找一块能够存放input的输出且不与conv0内存重叠的内存;split0分配内存,split0分配和输入算子input一样的内存,如图9所示;
134.conv1分配内存,conv1对应的依赖算子以及其对应的局部内存共享算子的依赖算子中已分配内存的算子包括split0、conv0、conv2、conv3,从offset=0的位置开始,找一块能够存放conv1的输出且不与split0、conv0、conv2、conv3发生内存重叠的内存;split1算子分配和输入算子conv1一样的内存,如图10所示。
135.为了进一步说明本实施例提供的内存分配方法的效果,采用本实施例提供的内存分配方法以及现有内存分配方法(greedy by size for offset calculation方法)分别对如图11所示的网络模型进行内存分配,其中,本实施例的内存分配方法的内存使用情况如图12所示,现有内存分配方法的内存使用情况如图13所示。由图12和图13所示可以知道,本实施例提供的内存方法所使用的内存大小为160,现有内存分配方法所使用的内存大小为180,本实施例提供的内存分配方法可以使用更好的内存资源。
136.综上所述,本实施例提供了一种内存分配方法,所述的内存分配方法包括获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子;根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子;读取所述目标算子的所述局部内存共享算子的依赖算子;根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存;继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。本技术通过获取各算子的依赖算子及局部内存共享算子,并基于局部内存共享算子的依赖算子为算子以及算子的输入算子分配内存,并控制可复用其输入算子的算子复用其输入算子的算子内存,减少了网络模型所需的内存资源。同时,当在线使用网络模型时,将复用输入算子的算子内存的算子从网络模型中剔除,这样可以减少网络模型执行过程中的数据搬运次数,提高网络模型的推理速度。
137.基于上述内存分配方法,本实施例提供了一种网络模型的部署方法,所述的方法包括:
138.将网络模型部署于目标设备,并在离线模型上采用如上所述的内存分配方法为所述网络模型的各算子分配算子内存;
139.将所述网络模型中复用输入算子的算子内存的算子剔除,并采用剔除后的网络模型进行在线推理。
140.具体地,所述复用输入算子的算子为网络模型中的可剔除算子和合并算子,在将复用输入算子的算子内存的算子剔除之后,可以将被剔除的算子对应的输入算子与被剔除的算子对应的输出算子相连接,这样网络模型在进行在线推理时,被剔除的算子对应的输出算子可以直接使用被剔除的算子对应的输入算子的算子内存中的算子,这样可以减少网络模型执行过程中的数据搬运,提高网络模型的推理速度。
141.基于上述内存分配方法,本实施例提供了一种内存分配装置,如图14所示,所述的内存分配装置包括:
142.确定模块100,获取预设的网络模型,确定所述网络模型中各算子的执行顺序、算子内存、对应的依赖算子及局部内存共享算子,其中,所述依赖算子不复用所述算子内存,所述局部内存共享算子复用所述算子内存;
143.选取模块200,用于根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子;
144.读取模块300,用于读取所述目标算子的所述局部内存共享算子的依赖算子;
145.分配模块400,用于根据所述依赖算子为所述目标算子以及所述目标算子的输入算子分配内存;
146.执行模块500,用于继续执行根据所述算子内存以及所述执行顺序在所述网络模型的各未分配算子内存的参照算子中选取目标算子的步骤,直至所述网络模型中的每个算子均分配算子内存。
147.基于上述内存分配方法,本实施例提供了一种计算机可读存储介质,所述计算机可读存储介质存储有一个或者多个程序,所述一个或者多个程序可被一个或者多个处理器执行,以实现如上述实施例所述的内存分配方法中的步骤。
148.基于上述内存分配方法,本技术还提供了一种终端设备,如图15所示,其包括至少一个处理器(processor)20;显示屏21;以及存储器(memory)22,还可以包括通信接口(communications interface)23和总线24。其中,处理器20、显示屏21、存储器22和通信接口23可以通过总线24完成相互间的通信。显示屏21设置为显示初始设置模式中预设的用户引导界面。通信接口23可以传输信息。处理器20可以调用存储器22中的逻辑指令,以执行上述实施例中的方法。
149.此外,上述的存储器22中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。
150.存储器22作为一种计算机可读存储介质,可设置为存储软件程序、计算机可执行程序,如本公开实施例中的方法对应的程序指令或模块。处理器20通过执行存储在存储器22中的软件程序、指令或模块,从而执行功能应用以及数据处理,即实现上述实施例中的方法。
151.存储器22可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端设备的使用所创建的数据等。此外,存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器。例如,u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等多种可以存储程序代码的介质,也可以是暂态存储介质。
152.此外,上述存储介质以及终端设备中的多条指令处理器加载并执行的具体过程在上述方法中已经详细说明,在这里就不再一一陈述。
153.最后应说明的是:以上实施例仅用以说明本技术的技术方案,而非对其限制;尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本技术各实施例技术方案的精神和范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献