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

内存管理方法、装置、电子设备及存储介质与流程

2022-03-19 22:32:33 来源:中国专利 TAG:


1.本技术涉及人工智能技术领域,尤其涉及一种内存管理方法、装置、电子设备及存储介质。


背景技术:

2.当前,随着人工智能推理模型的日益复杂,加载推理模型所占用的内存空间也变得越来越大,同时,一个人工智能的应用往往需要多个推理模型才能完成,进一步加剧了内存压力。
3.现有技术中,为了降低运行推理模型的内存压力,一方面是通过增加硬件投入,提高运行模型的内存总量,另一方面,是在模型运行过程中对内存进行动态的分配和释放,从而提高内存的复用率。
4.然而,现有技术中的方案,除了造成成本上升的问题外,在模型运行过程中对内存进行动态分配和释放,会影响内存运行速度,从而导致模型运行效率降低的问题,影响模型的使用效果。


技术实现要素:

5.本技术提供一种内存管理方法、装置、电子设备及存储介质,用以解决由于内存占用过大导致的模型运行效率降低的问题。
6.第一方面,本技术提供了一种内存管理方法,包括:
7.根据预设的待执行模型,获取算子执行队列,所述算子执行队列中包括至少两个模型算子,所述模型算子用于在被执行时,实现所述待执行模型中的一个处理步骤;根据所述算子执行队列中各模型算子的执行次序,生成预分配内存信息,所述预分配内存信息表征所述各模型算子的目标内存区域,所述目标内存区域用于执行模型算子,至少两个所述模型算子对应的目标内存区域相同;根据所述预分配内存信息,生成内存分配信息,并基于所述内存分配信息运行所述待执行模型,所述内存分配信息用于表征执行所述算子执行队列中的各模型算子所需的内存地址。
8.在一种可能的实现方式中,所述目标内存区域包括复用内存区域,所述复用内存区域对应至少两个相同的模型算子,根据所述算子执行队列中各模型算子的执行次序,生成预分配内存信息,包括:根据所述算子执行队列中各模型算子的执行次序,生成生命周期队列,所述生命周期队列中包括生命周期信息,所述生命周期信息与模型算子一一对应,所述生成周期信息用于表征模型算子在内存中的生命周期;根据所述生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域。
9.在一种可能的实现方式中,所述生命周期信息包括起始点标识和终止点标识;根据所述算子执行队列中各模型算子的执行次序,生成生命周期队列,包括:获取所述算子执行队列中各模型算子的执行次序标识;根据各所述模型算子的执行次序标识,确定所述生命周期队列中各生命周期信息的起始点标识;根据与各模型算子的输出连接的下游模型算
子的起始点标识,确定所述生命周期队列中各生命周期信息的终止点标识,其中,所述算子执行队列中末位的模型算子的下位模型算子为所述末位的模型算子本身。
10.在一种可能的实现方式中,根据所述生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域,包括:根据所述算子执行队列中的各模型算子的执行次序,遍历各模型算子,并在各模型算子的遍历周期内执行以下步骤:基于预设的可用内存链表和所述生命周期队列中的各生命周期信息,获取预分配可用内存块,所述预分配可用内存块为前置模型算子的生命周期结束后释放的内存区域,所述前置模型算子为所述算子执行队列中排在当前的模型算子之前的模型算子;若所述预分配可用内存块能够容纳所述当前的模型算子的内存需求,则根据所述预分配可用内存块对应的内存区域,确定所述当前的模型算子对应的复用内存区域。
11.在一种可能的实现方式中,所述生命周期信息包括起始点标识和终止点标识,基于预设的可用内存链表和所述生命周期队列中的各生命周期信息,获取预分配可用内存块,包括:获取所述前置模型算子的终止点标识和所述当前的模型算子的起始点标识;若所述前置模型算子的终止点标识小于与所述当前的模型算子的起始点标识,且所述前置模型算子的终止点标识与所述当前的模型算子的起始点标识相邻,则将所述前置模型算子对应的预分配可用内存块,存入可用内存链表。
12.在一种可能的实现方式中,在将所述前置模型算子对应的预分配可用内存块,存入可用内存链表之后,所述方法还包括:将所述可用内存链表内连续的至少两个预分配可用内存块,合并为一个预分配可用内存块。
13.在一种可能的实现方式中,所述预分配可用内存块包括至少两个,所述根据所述预分配可用内存块对应的内存区域,确定所述当前的模型算子对应的复用内存区域,包括:将各所述预分配可用内存块中,内存空间最近接所述内存需求的预分配可用内存块,确定为目标内存块;根据所述目标内存块的内存区域,确定为所述当前的模型算子对应的复用内存区域。
14.在一种可能的实现方式中,在基于预设的可用内存链表和所述生命周期队列中的各生命周期信息,获取预分配可用内存块之后,所述方法还包括:若所述预分配可用内存块不能容纳所述当前的模型算子的内存需求,则基于所述内存需求,对各所述预分配可用内存块中内存空间最大的预分配可用内存块进行扩充,生成目标内存块;根据所述目标内存块的内存区域,确定为所述当前的模型算子对应的复用内存区域。
15.在一种可能的实现方式中,所述方法还包括:在每一所述模型算子的遍历周期结束后,获取累计内存空间,所述累计内存空间用于表征遍历至所述当前的模型算子时,各模型算子所对应的目标内存区域的累计占用的内存空间;在所有模型算子的遍历周期结束后,根据所述累计内存空间,生成内存偏移量,所述内存偏移量用于表征执行所述算子执行队列中各模型算子所需的总内存空间;所述根据所述算子执行队列中各模型算子的执行次序,生成预分配内存信息,包括:根据所述内存偏移量和各所述模型算子对应的目标内存区域,生成预分配内存信息。
16.在一种可能的实现方式中,所述预分配内存信息中包括各模型算子对应的内存起始地址和内存偏移量;根据所述预分配内存信息,生成内存分配信息,包括:根据各模型算子对应的内存起始地址和内存偏移量,生成内存分配信息。
17.在一种可能的实现方式中,所述根据预设的待执行模型,获取算子执行队列,包括:加载所述待执行模型,生成所述待执行模型的推理网络,所述推理网络用于表征各模型算子的执行次序;根据所述推理网络,生成所述算子执行队列。
18.第二方面,本技术提供了一种内存管理装置,包括:
19.获取模块,用于根据预设的待执行模型,获取算子执行队列,所述算子执行队列中包括至少两个模型算子,所述模型算子用于在被执行时,实现所述待执行模型中的一个处理步骤;
20.生成模块,用于根据所述算子执行队列中各模型算子的执行次序,生成预分配内存信息,所述预分配内存信息表征所述各模型算子的目标内存区域,所述目标内存区域用于执行模型算子,至少两个所述模型算子对应的目标内存区域相同;
21.分配模块,用于根据所述预分配内存信息,生成内存分配信息,并基于所述内存分配信息运行所述待执行模型,所述内存分配信息用于表征执行所述算子执行队列中的各模型算子所需的内存地址。
22.在一种可能的实现方式中,所述目标内存区域包括复用内存区域,所述复用内存区域对应至少两个相同的模型算子,所述生成模块,具体用于:根据所述算子执行队列中各模型算子的执行次序,生成生命周期队列,所述生命周期队列中包括生命周期信息,所述生命周期信息与模型算子一一对应,所述生成周期信息用于表征模型算子在内存中的生命周期;根据所述生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域。
23.在一种可能的实现方式中,所述生命周期信息包括起始点标识和终止点标识;所述生成模块在根据所述算子执行队列中各模型算子的执行次序,生成生命周期队列时,具体用于:获取所述算子执行队列中各模型算子的执行次序标识;根据各所述模型算子的执行次序标识,确定所述生命周期队列中各生命周期信息的起始点标识;根据与各模型算子的输出连接的下游模型算子的起始点标识,确定所述生命周期队列中各生命周期信息的终止点标识,其中,所述算子执行队列中末位的模型算子的下位模型算子为所述末位的模型算子本身。
24.在一种可能的实现方式中,所述生成模块在根据所述生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域时,具体用于:根据所述算子执行队列中的各模型算子的执行次序,遍历各模型算子,并在各模型算子的遍历周期内执行以下步骤:基于预设的可用内存链表和所述生命周期队列中的各生命周期信息,获取预分配可用内存块,所述预分配可用内存块为前置模型算子的生命周期结束后释放的内存区域,所述前置模型算子为所述算子执行队列中排在当前的模型算子之前的模型算子;若所述预分配可用内存块能够容纳所述当前的模型算子的内存需求,则根据所述预分配可用内存块对应的内存区域,确定所述当前的模型算子对应的复用内存区域。
25.在一种可能的实现方式中,所述生命周期信息包括起始点标识和终止点标识,所述生成模块在基于预设的可用内存链表和所述生命周期队列中的各生命周期信息,获取预分配可用内存块时,具体用于:获取所述前置模型算子的终止点标识和所述当前的模型算子的起始点标识;若所述前置模型算子的终止点标识小于与所述当前的模型算子的起始点标识,且所述前置模型算子的终止点标识与所述当前的模型算子的起始点标识相邻,则将
所述前置模型算子对应的预分配可用内存块,存入可用内存链表。
26.在一种可能的实现方式中,在将所述前置模型算子对应的预分配可用内存块,存入可用内存链表之后,所述生成模块还用于:将所述可用内存链表内连续的至少两个预分配可用内存块,合并为一个预分配可用内存块。
27.在一种可能的实现方式中,所述预分配可用内存块包括至少两个,所述生成模块在在根据所述预分配可用内存块对应的内存区域,确定所述当前的模型算子对应的复用内存区域时,具体用于:将各所述预分配可用内存块中,内存空间最近接所述内存需求的预分配可用内存块,确定为目标内存块;根据所述目标内存块的内存区域,确定为所述当前的模型算子对应的复用内存区域。
28.在一种可能的实现方式中,所述生成模块在基于预设的可用内存链表和所述生命周期队列中的各生命周期信息,获取预分配可用内存块之后,还用于:若所述预分配可用内存块不能容纳所述当前的模型算子的内存需求,则基于所述内存需求,对各所述预分配可用内存块中内存空间最大的预分配可用内存块进行扩充,生成目标内存块;根据所述目标内存块的内存区域,确定为所述当前的模型算子对应的复用内存区域。
29.在一种可能的实现方式中,所述生成模块,还用于:在每一所述模型算子的遍历周期结束后,获取累计内存空间,所述累计内存空间用于表征遍历至所述当前的模型算子时,各模型算子所对应的目标内存区域的累计占用的内存空间;在所有模型算子的遍历周期结束后,根据所述累计内存空间,生成内存偏移量,所述内存偏移量用于表征执行所述算子执行队列中各模型算子所需的总内存空间;所述生成模块,具体用于:根据所述内存偏移量和各所述模型算子对应的目标内存区域,生成预分配内存信息。
30.在一种可能的实现方式中,所述预分配内存信息中包括各模型算子对应的内存起始地址和内存偏移量;所述分配模块,具体用于:根据各模型算子对应的内存起始地址和内存偏移量,生成内存分配信息。
31.在一种可能的实现方式中,所述获取模块,具体用于:加载所述待执行模型,生成所述待执行模型的推理网络,所述推理网络用于表征各模型算子的执行次序;根据所述推理网络,生成所述算子执行队列。
32.第三方面,本技术提供了一种电子设备,包括:处理器,以及与所述处理器通信连接的存储器;
33.所述存储器存储计算机执行指令;
34.所述处理器执行所述存储器存储的计算机执行指令,以实现如本技术实施例第一方面任一项所述的内存管理方法。
35.第四方面,本技术提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如本技术实施例第一方面任一项所述的内存管理方法。
36.根据本技术实施例的第五方面,本技术提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如上第一方面任一项所述的内存管理方法。
37.本技术提供的内存管理方法、装置、电子设备及存储介质,通过根据预设的待执行模型,获取算子执行队列,所述算子执行队列中包括至少两个模型算子,所述模型算子用于在被执行时,实现所述待执行模型中的一个处理步骤;根据所述算子执行队列中各模型算
子的执行次序,生成预分配内存信息,所述预分配内存信息表征所述各模型算子的目标内存区域,所述目标内存区域用于执行模型算子,至少两个所述模型算子对应的目标内存区域相同;根据所述预分配内存信息,生成内存分配信息,并基于所述内存分配信息运行所述待执行模型,所述内存分配信息用于表征执行所述算子执行队列中的各模型算子所需的内存地址。由于待执行模型对应的模型算子的内存通过预分配内存信息进行了预分配,是不同的模型算子共用一组目标内存区域,从而实现了内存复用,提高内存使用效率,同时避免了内存动态分配和释放带来的效率损失问题,提高了模型的运行速度。
附图说明
38.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
39.图1为本技术实施例提供的内存管理方法的一种应用场景图;
40.图2为本技术一个实施例提供的内存管理方法的流程图;
41.图3为图2所示实施例中步骤s102的具体实现步骤示意图;
42.图4为本技术实施例提供的一种各模型算子的逻辑关系示意图;
43.图5为本技术另一个实施例提供的内存管理方法的流程图;
44.图6为步骤s203中在各模型算子的遍历周期内执行步骤的流程图;
45.图7为本技术一个实施例提供的内存管理装置的结构示意图;
46.图8为本技术一个实施例提供的电子设备的示意图;
47.图9是本技术一个示例性实施例示出的一种终端设备的框图。
48.通过上述附图,已示出本技术明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本技术构思的范围,而是通过参考特定实施例为本领域技术人员说明本技术的概念。
具体实施方式
49.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
50.首先对本技术所涉及的名词进行解释:
51.模型推理框架:运行在终端设备上的软件程序,主要用于读取模型,例如深度学习模型,并在内存中形成由各个算子组成的计算网络,其中包括一个算子队列,推理框架按照算子队列的先后顺序依次执行各个算子,最中得到推理结果。
52.模型算子:模型的最小组成单元,通常会有0个到多个输入以及最少一个输出,表示一次特征转换。
53.下面对本技术实施例的应用场景进行解释:
54.图1为本技术实施例提供的内存管理方法的一种应用场景图,本技术实施例提供的内存管理方法可以应用于运行大规模神经网络模型场景下,示例性地,本技术实施例提供的方法的执行主体可以为服务器或终端设备,如图1所示,本实施例以终端设备为例进行
说明,当终端设备接收到待执行模型后,会基于本实施例提供的内存管理方法,对待执行模型所需的内存进行内存预分配,即在本地内存中开辟出一个细化至模型算子的内存池供模式使用,之后执行模型,在运行过程中,模型中的各模型算子(图中示为模型算子1-7)通过预分配的静态内存,而无需进行动态的内存分配,从而使模型能够高效运行。
55.现有技术中,为了降低运行推理模型的内存压力,除了通过增加硬件投入,提高运行模型的内存总量外,通常是在模型运行过程中对内存进行动态的分配和释放,从而提高内存的复用率。然而,在对内存进行动态的分配和释放过程中,需要预留一段内存,并通过内存拷贝的方式,实现内存的动态分配和释放,这会影响内存运行速度,从而导致模型运行效率降低的问题,影响模型的使用效果。
56.下面以具体地实施例对本技术的技术方案以及本技术的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本技术的实施例进行描述。
57.图2为本技术一个实施例提供的内存管理方法的流程图,如图2所示,本实施例提供的内存管理方法包括以下几个步骤:
58.步骤s101,根据预设的待执行模型,获取算子执行队列,算子执行队列中包括至少两个模型算子,模型算子用于在被执行时,实现待执行模型中的一个处理步骤。
59.示例性地,本实施例以终端设备为执行主体进行说明,其中,待执行模型为存储在终端设备内,等待执行的模型,可以为上述应用场景介绍中的大规模神经网络模型,通过模型推理框架,对待执行模型进行处理,即可获得算子执行队列,具体地,例如,加载待执行模型,生成待执行模型的推理网络,推理网络用于表征各模型算子的执行次序;根据推理网络,生成算子执行队列。其中,推理网络是用于表征各模型算子的执行逻辑的信息。模型推理框架为本领域技术人员知晓的现有技术,基于模型推理框架获取算子执行队列的具体实现方法此处不再赘述。
60.进一步地,算子执行队列中包括至少两个模型算子,分别对应待执行模型中的一个处理步骤,算子执行队列中的各模型算子是有序的,各模型算子之间的执行次序,即为模型运行各步骤的次序。
61.步骤s102,根据算子执行队列中各模型算子的执行次序,生成预分配内存信息,预分配内存信息表征各模型算子的目标内存区域,目标内存区域用于执行模型算子,至少两个模型算子对应的目标内存区域相同。
62.示例性地,算子执行队列中包括表征各模型算子的执行次序的信息,例如模型算子的标识。各模型算子对应一个目标内存区域,该目标内存区域用于执行模型算子。其中,由于各模型算子的执行次序的不同,一些模型算子先执行,先结束,而另一些模型算子后执行,后结束,因此,模型算子的执行在时间上存在不重叠的可能性。基于该原因,根据各模型算子的执行次序,可以确定两个对应的目标内存区域相同模型算子,也即,有两个以上的模型算子由于运行次序的差异,可以共用一组内存区域。进一步地,基于该共用的内存区间生成预分配内存信息,以静态设置的方式实现内存空间的复用。
63.其中,具体地,目标内存区域包括复用内存区域,复用内存区域对应至少两个相同的模型算子。如图3所示,步骤s102的具体实现步骤包括:
64.步骤s1021,根据算子执行队列中各模型算子的执行次序,生成生命周期队列,生
命周期队列中包括生命周期信息,生命周期信息与模型算子一一对应,生成周期信息用于表征模型算子在内存中的生命周期。
65.步骤s1022,根据生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域。
66.示例性地,生命周期信息是表征模型算子在内存中的生命周期,声明周期信息包括起始节点和终止节点,用来表征模型算子在内存中的存续阶段。当不同的模型算子的生命周期不重叠时,则可以进行内存复用。在一种可能的实现方式中,根据算子执行队列中各模型算子的执行次序,生成生命周期队列的具体步骤包括:
67.获取算子执行队列中各模型算子的执行次序标识;根据各模型算子的执行次序标识,确定生命周期队列中各生命周期信息的起始点标识;根据与各模型算子的输出连接的下游模型算子的起始点标识,确定生命周期队列中各生命周期信息的终止点标识,其中,算子执行队列中末位的模型算子的下位模型算子为末位的模型算子本身。
68.具体地,例如,图4为本技术实施例提供的一种各模型算子的逻辑关系示意图,如图4所示,算子执行队列包括模型算子a、模型算子b、模型算子c、模型算子d、模型算子e。其中,模型算子a执行次序标识为1、模型算子b执行次序标识为2、模型算子c执行次序标识为3、模型算子c执行次序标识为4、模型算子c执行次序标识为5。模型算子a的输出连接的下游模型算子为模型算子b、模型算子c,将其中延续周期更长的模型算子c的起始点标识3,确定为模型算子a的终止点标识。同理,模型算子b的终止点标识为5,模型算子c的终止点标识4,模型算子d的终止点标识为5。
69.进一步地,在每一个模型算子的生命周期内,运行模型算子需要一部分内存,该内存的大小即模型算子的内存需求。当不重叠的至少两个生命周期对应的模型算子中,执行次序靠前的模型算子的内存需求大于执行次序靠后的模型算子的内存需求时,该至少两个模型算子可以进行内存复用,因此,根据生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,在满足条件时,可以确定至少一个复用内存区域。
70.进一步地,示例性地,根据确定复用内存区域,以及可能存在的非复用内存区域,即模型算子单独使用的内存区域,可以生成对应的预分配内存信息,用于在后续步骤中,对模型算子进行内存分配。
71.步骤s103,根据预分配内存信息,生成内存分配信息,并基于内存分配信息运行待执行模型,内存分配信息用于表征执行算子执行队列中的各模型算子所需的内存地址。
72.示例性地,在确定预分配内存信息后,基于该预分配内存信息所描述的各模型算子对应的目标内存空间的地址,对各模型算子所需要的内存进行静态分配,之后,根据该静态分配的结果,执行算子执行队列中的各模型算子,实现运行待执行模型的目的。
73.其中,示例性地,预分配内存信息中包括各模型算子对应的内存起始地址和内存偏移量;根据预分配内存信息,生成内存分配信息,包括:根据各模型算子对应的内存起始地址和内存偏移量,生成内存分配信息。其中,内存偏移量表征总共需要的内存空间大小,用于开辟一段连续的内存空间。而各模型算子对应的内存起始地址,用于确定各模型算子对应的内存地址,从而实现对各模型算子进行精确的静态内存分配。
74.本实施例中,通过根据预设的待执行模型,获取算子执行队列,算子执行队列中包括至少两个模型算子,模型算子用于在被执行时,实现待执行模型中的一个处理步骤;根据
算子执行队列中各模型算子的执行次序,生成预分配内存信息,预分配内存信息表征各模型算子的目标内存区域,目标内存区域用于执行模型算子,至少两个模型算子对应的目标内存区域相同;根据预分配内存信息,生成内存分配信息,并基于内存分配信息运行待执行模型,内存分配信息用于表征执行算子执行队列中的各模型算子所需的内存地址。由于待执行模型对应的模型算子的内存通过预分配内存信息进行了预分配,是不同的模型算子共用一组目标内存区域,从而实现了内存复用,提高内存使用效率,同时避免了内存动态分配和释放带来的效率损失问题,提高了模型的运行速度。
75.图5为本技术另一个实施例提供的内存管理方法的流程图,如图5所示,本实施例提供的内存管理方法在图2所示实施例提供的内存管理方法的基础上,对步骤s102进一步细化,则本实施例提供的内存管理方法包括以下几个步骤:
76.步骤s201,根据预设的待执行模型,获取算子执行队列。
77.步骤s202,根据算子执行队列中各模型算子的执行次序,生成生命周期队列,生命周期队列中包括生命周期信息,生命周期信息与模型算子一一对应,生成周期信息用于表征模型算子在内存中的生命周期。
78.步骤s203,根据算子执行队列中的各模型算子的执行次序,遍历各模型算子,并确定各模型算子对应的目标内存区域。
79.具体地,如图6所示,在各模型算子的遍历周期内执行步骤包括:
80.步骤s2031,基于预设的可用内存链表和生命周期队列中的各生命周期信息,获取预分配可用内存块,预分配可用内存块为前置模型算子的生命周期结束后释放的内存区域,前置模型算子为算子执行队列中排在当前的模型算子之前的模型算子。
81.示例性地,可用内存链表为一种预设的链表,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。本实施例中预设的内存链表,用于存储预分配可用内存块,具体地,例如,内存链表包括{(0,2048)},其中(0,2048)表示一个预分配可用内存块(结点),其中,0表示预分配可用内存块的内存地址偏移量,2048表示预分配可用内存块大小。
82.其中,前置模型算子为算子执行队列中排在当前的模型算子之前的模型算子,预分配可用内存块是通过释放前置模型算子所占用的预分配可用内存块而得到的。
83.示例性地,生命周期信息包括起始点标识和终止点标识,基于预设的可用内存链表和生命周期队列中的各生命周期信息,获取预分配可用内存块的具体步骤,包括:
84.获取前置模型算子的终止点标识和当前的模型算子的起始点标识;若前置模型算子的终止点标识小于与当前的模型算子的起始点标识,且前置模型算子的终止点标识与当前的模型算子的起始点标识相邻,则将前置模型算子对应的预分配可用内存块,存入可用内存链表。
85.具体地,例如,前置模型算子的生命周期信息为(1,2),其中,起始点标识为1,终止点标识为2,当前的模型算子的生命周期信息为(3,5),其中,起始点标识为3,终止点标识为5。此种情况下,将前置模型算子对应的预分配可用内存块,存入可用内存链表。
86.示例性地,上述步骤可以基于预设的内存预分配队列实现。具体地,内存预分配队
列用于记录模型算子的内存偏移量和内存需求,其中内存偏移量初始化为-1,内存需求初始化为该算子执行过程中所需内存的大小(可从模型算子类型和输入数据的维度中获得),例如,即内存预分配队列memqueue={(-1,2048),(-1,2048),(-1,1024),(-1,2048),(-1,1024),(-1,4096)};其中,内存预分配队列中包括算子执行队列的6个模型算子对应的预分配可用内存块,分别为(-1,2048),(-1,2048),(-1,1024),(-1,2048),(-1,1024),(-1,4096)。之后,通过在遍历各模型算子的过程中,更新初始的内存偏移量(-1),确定该内存预分配队列。
87.可选地,在将前置模型算子对应的预分配可用内存块,存入可用内存链表之后,若可用内存链表内存在连续的预分配可用内存块,则将可用内存链表内连续的至少两个预分配可用内存块,合并为一个预分配可用内存块。本实施例中,通过合并多个预分配可用内存块,组成更大的内存块,从而可以承载更大的内存需求,避免扩展新的内存空间,提高内存的使用效率。
88.步骤s2032,若预分配可用内存块能够容纳当前的模型算子的内存需求,则根据预分配可用内存块对应的内存区域,确定当前的模型算子对应的复用内存区域。
89.具体地,若预分配可用内存块能够容纳当前的模型算子的内存需求,说明之前的前置模型算子所释放的预分配可用内存块,可以直接进行复用来运行当前的模型算子。根据当前的模型算子所对应的具体内存需求,在使用该预分配可用内存块后,可能会剩余部分的预分配可用内存块,或者被完全使用,根据具体的使用结果,相应的更改,
90.具体地,预分配可用内存块包括至少两个,确定当前的模型算子对应的复用内存区域的具体步骤包括:将各预分配可用内存块中,内存空间最近接内存需求的预分配可用内存块,确定为目标内存块;根据目标内存块的内存区域,确定为当前的模型算子对应的复用内存区域。本实施例中,通过将能够容纳当前的模型算子的内存需求,并最接近该内存需求的预分配可用内存块,使预分配可用内存块的利用率最大化,避免内存碎片。
91.可选地,步骤s203还包括:
92.步骤s2033,若预分配可用内存块不能容纳当前的模型算子的内存需求,则基于内存需求,对各预分配可用内存块中内存空间最大的预分配可用内存块进行扩充,生成目标内存块;根据目标内存块的内存区域,确定为当前的模型算子对应的复用内存区域。
93.示例性地,当预分配可用内存块不能容纳当前的模型算子的内存需求时,则对预分配可用内存块中内存空间最大的预分配可用内存块进行扩充,从而得到一个能够容纳当前的模型算子的内存需求的内存块,并且保证扩充量最小,提高内存的利用率。
94.可选地,步骤s203还包括:
95.步骤s2034,在每一模型算子的遍历周期结束后,获取累计内存空间,累计内存空间用于表征遍历至当前的模型算子时,各模型算子所对应的目标内存区域的累计占用的内存空间。
96.步骤s2035,在所有模型算子的遍历周期结束后,根据累计内存空间,生成内存偏移量,内存偏移量用于表征执行算子执行队列中各模型算子所需的总内存空间。
97.示例性地,在每次遍历周期结束后,根据上述步骤中不同的执行结果(扩充内存空间或确定复用内存区域),各模型算子所占用的总内存空间可以会发生变化,通过预设的变量值对累计内存空间进行统计,之后,在,在所有模型算子的遍历周期结束后,生成表征执
行算子执行队列中各模型算子所需的总内存空间的内存偏移量,从而实现后续总内存空间的静态分配。
98.步骤s204,根据内存偏移量和各模型算子对应的目标内存区域,生成预分配内存信息。
99.示例性地,通过上述实施例步骤,可以得到表征执行算子执行队列中各模型算子所需的总内存空间的内存偏移量以及各模型算子对应的目标内存区域的内存地址,基于该内存偏移量和各模型算子对应的目标内存区域的内存地址,生成预分配内存信息,在后续的步骤中,基于该预分配内存信息进行内存分配,可以实现对待执行模型中的各模型算子所需内存的静态分配,从而在执行各模型算子时,可以通过预分配的内存运行各模型算子,提高内存利用率,并避免进行动态内存分配,提高内存的整体使用效率,提高待处理模型运行速度。
100.步骤s205,根据预分配内存信息,生成内存分配信息,并基于内存分配信息运行待执行模型。
101.本实施例中,步骤s201-步骤s202、步骤s205的实现方式与本技术图2所示实施例中的步骤s101-s103的具体实现方式中已进行过介绍,此处不再赘述。
102.下面以一个更具体的实施例对本实施例中生成预分配内存信息并进行分配的过程进行说明。
103.s1、推理框架读取网络模型,并在内存中生成由各个算子组成的推理网络;此时会形成一个算子执行队列,记为execqueue={算子0,算子1,算子2,算子3,算子4,算子5},推理过程将按照算子在队列中的顺序依次执行;
104.s2、创建算子生命周期队列lifequeue,长度与execqueue相同,其中包含对应算子生命周期的开始点和结束点,其开始点和结束点初始化为为当前算子在execqueue中的下标,即为lifequeue={(0,0),(1,1),(2,2),(3,3),(4,4),(5,5)}。遍历execqueue的每个算子,对其中的每个算子(记作算子b,其下标indxeb),将其对应的每个输入算子的生命周期的结束点更新为indexb。对于算子0,没有输入不需要处理;算子1的输入是算子0,因此将算子0的生命周期结束点更新为1;算子2的输入是算子0,将算子0的生命周期结束点更新为2;算子3的输入是算子2,将算子2的生命周期结束点更新为3;算子4的输入为算子1和算子3,将算子1和算子3的生命周期结束点更新为4。遍历结束时,得到各算子的最终生命周期为lifequeue={(0,2),(1,4),(2,3),(3,4),(4,5),(5,5)};
105.s3、创建一个内存预分配队列memqueue,记录每个算子内存偏移量和所需内存大小,其中内存偏移量初始化为-1,内存块大小初始化为该算子执行过程中所需内存的大小(可从算子类型和输入数据的维度中获得),即memqueue={(-1,2048),(-1,2048),(-1,1024),(-1,2048),(-1,1024),(-1,4096)};
106.s4、创建一个可用内存链表availmemlist,每个链表节点记录一个可用内存块的大小和偏移地址,初始值为空;
107.s5、创建一个变量nextoffset,记录下次预分配的内存块的地址偏移量,初始化为0;
108.s6、内存预分配。依次遍历execqueue的每个算子,(1)对于算子d之前的每个算子(记作算子c),如果其生命周期结束点等于算子d在execqueue中的下标减1,则认为其生命
周期刚刚结束,将其在memqueue中对应的内存块的大小及偏移量复制到availmemlist中,并按照偏移量的从小到大进行排列,此时如果该内存块和其他内存块相邻,则进行内存块合并;(2)假定当前算子d所需要的内存块大小sized,从availmemlist中找到一个容量大于sized的最小的内存块,从该内存块取出所需大小保存在memqueue中算子d的位置;(3)如果找不到满足要求的可用内存块,则从availmemlist中找一块最大的内存块并将其扩充到所需大小sized,分配给算子d,并在memqueue中对应算子d的位置进行记录,同时nextoffset增加sized-原最大内存块的大小,同时更新memqueue中已分配算子的内存块偏移量。当遍历结束时,nextoffset的大小即为整个网络所需的内存块的大小。首先算子0的需求为2048字节,此时availmemlist为空,nextoffset为0,因此预分配(0,2048)的内存给算子0,nextoffset更新为2048;算子1需要的内存为2048字节,其执行时前面的算子0的生命周期并没有结束,也就不需要释放,此时availmemlist为空,nextoffset=2048,预分配(2048,2048)的内存给算子1,nextoffset更新为4096;算子2运行时并没有算子的生命周期结束,此时nextoffset=4096,预分配(4096,1024)的内存给算子2,nextoffset更新为5120;算子3执行时,算子0的生命周期结束,相应的内存释放,availmemlist中更新为{(0,2048)},算子3的内存需求为2048,算子3直接复用内存(0,2048),availmemlist为空,nextoffset保持为5120不变;算子4执行时,算子2的生命周期结束,将(4096,1024)的内存释放availmemlist中更新为{(4096,1024)},此时算子4需要1024的内存空间,直接复用(4096,1024)的内存空间,availmemlist为空,nextoffset保持为5120不变;算子5执行时,算子1和算子3的生命周期结束,释放内存(2048,2048)、(0,2048)到availmemlist,此时availmemlist的内存池更新为{(0,2048),(2048,2048)},合并后变为{(0,4096)},算子5的内存需求4096,直接复用availmemlist的内存,因此availmemlist为空,nextoffset保持为5120不变。
109.s7、分配内存。从系统中分配大小为nextoffset的内存5120字节,记录内存地址为baseaddr,将baseaddr与memqueue队列中每个算子的偏移量相加得到该算子实际分配的内存地址。此时,各个算子分配的内存块分别为{(baseaddr 0,2048),(baseaddr 2048,2048),(baseaddr 4096,1024),(baseaddr 0,2048),(baseaddr 4096,1024),(baseaddr 0,4096)}。
110.图7为本技术一个实施例提供的内存管理装置的结构示意图,如图7所示,本实施例提供的内存管理装置3包括:
111.获取模块31,用于根据预设的待执行模型,获取算子执行队列,算子执行队列中包括至少两个模型算子,模型算子用于在被执行时,实现待执行模型中的一个处理步骤;
112.生成模块32,用于根据算子执行队列中各模型算子的执行次序,生成预分配内存信息,预分配内存信息表征各模型算子的目标内存区域,目标内存区域用于执行模型算子,至少两个模型算子对应的目标内存区域相同;
113.分配模块33,用于根据预分配内存信息,生成内存分配信息,并基于内存分配信息运行待执行模型,内存分配信息用于表征执行算子执行队列中的各模型算子所需的内存地址。
114.在一种可能的实现方式中,目标内存区域包括复用内存区域,复用内存区域对应至少两个相同的模型算子,生成模块32,具体用于:根据算子执行队列中各模型算子的执行
次序,生成生命周期队列,生命周期队列中包括生命周期信息,生命周期信息与模型算子一一对应,生成周期信息用于表征模型算子在内存中的生命周期;根据生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域。
115.在一种可能的实现方式中,生命周期信息包括起始点标识和终止点标识;生成模块32在根据算子执行队列中各模型算子的执行次序,生成生命周期队列时,具体用于:获取算子执行队列中各模型算子的执行次序标识;根据各模型算子的执行次序标识,确定生命周期队列中各生命周期信息的起始点标识;根据与各模型算子的输出连接的下游模型算子的起始点标识,确定生命周期队列中各生命周期信息的终止点标识,其中,算子执行队列中末位的模型算子的下位模型算子为末位的模型算子本身。
116.在一种可能的实现方式中,生成模块32在根据生命周期队列中的各生命周期信息,以及对应的模型算子的内存需求,确定至少一个复用内存区域时,具体用于:根据算子执行队列中的各模型算子的执行次序,遍历各模型算子,并在各模型算子的遍历周期内执行以下步骤:基于预设的可用内存链表和生命周期队列中的各生命周期信息,获取预分配可用内存块,预分配可用内存块为前置模型算子的生命周期结束后释放的内存区域,前置模型算子为算子执行队列中排在当前的模型算子之前的模型算子;若预分配可用内存块能够容纳当前的模型算子的内存需求,则根据预分配可用内存块对应的内存区域,确定当前的模型算子对应的复用内存区域。
117.在一种可能的实现方式中,生命周期信息包括起始点标识和终止点标识,生成模块32在基于预设的可用内存链表和生命周期队列中的各生命周期信息,获取预分配可用内存块时,具体用于:获取前置模型算子的终止点标识和当前的模型算子的起始点标识;若前置模型算子的终止点标识小于与当前的模型算子的起始点标识,且前置模型算子的终止点标识与当前的模型算子的起始点标识相邻,则将前置模型算子对应的预分配可用内存块,存入可用内存链表。
118.在一种可能的实现方式中,在将前置模型算子对应的预分配可用内存块,存入可用内存链表之后,生成模块32还用于:将可用内存链表内连续的至少两个预分配可用内存块,合并为一个预分配可用内存块。
119.在一种可能的实现方式中,预分配可用内存块包括至少两个,生成模块32在在根据预分配可用内存块对应的内存区域,确定当前的模型算子对应的复用内存区域时,具体用于:将各预分配可用内存块中,内存空间最近接内存需求的预分配可用内存块,确定为目标内存块;根据目标内存块的内存区域,确定为当前的模型算子对应的复用内存区域。
120.在一种可能的实现方式中,生成模块32在基于预设的可用内存链表和生命周期队列中的各生命周期信息,获取预分配可用内存块之后,还用于:若预分配可用内存块不能容纳当前的模型算子的内存需求,则基于内存需求,对各预分配可用内存块中内存空间最大的预分配可用内存块进行扩充,生成目标内存块;根据目标内存块的内存区域,确定为当前的模型算子对应的复用内存区域。
121.在一种可能的实现方式中,生成模块32,还用于:在每一模型算子的遍历周期结束后,获取累计内存空间,累计内存空间用于表征遍历至当前的模型算子时,各模型算子所对应的目标内存区域的累计占用的内存空间;在所有模型算子的遍历周期结束后,根据累计内存空间,生成内存偏移量,内存偏移量用于表征执行算子执行队列中各模型算子所需的
总内存空间;生成模块32,具体用于:根据内存偏移量和各模型算子对应的目标内存区域,生成预分配内存信息。
122.在一种可能的实现方式中,预分配内存信息中包括各模型算子对应的内存起始地址和内存偏移量;分配模块32,具体用于:根据各模型算子对应的内存起始地址和内存偏移量,生成内存分配信息。
123.在一种可能的实现方式中,获取模块32,具体用于:加载待执行模型,生成待执行模型的推理网络,推理网络用于表征各模型算子的执行次序;根据推理网络,生成算子执行队列。
124.其中,获取模块31、生成模块32和分配模块33依次连接。本实施例提供的内存管理装置可以执行如图2-图6任一所示的方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
125.图8为本技术一个实施例提供的电子设备的示意图,如图8所示,本实施例提供的电子设备4包括:处理器41,以及与处理器41通信连接的存储器42。
126.其中,存储器42存储计算机执行指令;
127.处理器41执行存储器42存储的计算机执行指令,以实现本技术图2-图6所对应的实施例中任一实施例提供的内存管理方法。
128.其中,存储器41和处理器42通过总线43连接。
129.相关说明可以对应参见图2-图6所对应的实施例中的步骤所对应的相关描述和效果进行理解,此处不做过多赘述。
130.本技术一个实施例提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行以实现本技术图2-图6所对应的实施例中任一实施例提供的内存管理方法。
131.其中,计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。
132.本技术一个实施例提供一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现本技术图2-图6所对应的实施例中任一实施例提供的内存管理方法。
133.图9是本技术一个示例性实施例示出的一种终端设备的框图,该终端设备800可以是移动电话,计算机,数字广播终端,消息收发设备,游戏控制台,平板设备,医疗设备,健身设备,个人数字助理等。
134.终端设备800可以包括以下一个或多个组件:处理组件802,存储器804,电源组件806,多媒体组件808,音频组件810,输入/输出(i/o)接口812,传感器组件814,以及通信组件816。
135.处理组件802通常控制终端设备800的整体操作,诸如与显示,电话呼叫,数据通信,相机操作和记录操作相关联的操作。处理组件802可以包括一个或多个处理器820来执行指令,以完成上述的方法的全部或部分步骤。此外,处理组件802可以包括一个或多个模块,便于处理组件802和其他组件之间的交互。例如,处理组件802可以包括多媒体模块,以方便多媒体组件808和处理组件802之间的交互。
136.存储器804被配置为存储各种类型的数据以支持在终端设备800的操作。这些数据的示例包括用于在终端设备800上操作的任何应用程序或方法的指令,联系人数据,电话簿
数据,消息,图片,视频等。存储器804可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。
137.电源组件806为终端设备800的各种组件提供电力。电源组件806可以包括电源管理系统,一个或多个电源,及其他与为终端设备800生成、管理和分配电力相关联的组件。
138.多媒体组件808包括在终端设备800和用户之间的提供一个输出接口的屏幕。在一些实施例中,屏幕可以包括液晶显示器(lcd)和触摸面板(tp)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与触摸或滑动操作相关的持续时间和压力。在一些实施例中,多媒体组件808包括一个前置摄像头和/或后置摄像头。当终端设备800处于操作模式,如拍摄模式或视频模式时,前置摄像头和/或后置摄像头可以接收外部的多媒体数据。每个前置摄像头和后置摄像头可以是一个固定的光学透镜系统或具有焦距和光学变焦能力。
139.音频组件810被配置为输出和/或输入音频信号。例如,音频组件810包括一个麦克风(mic),当终端设备800处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器804或经由通信组件816发送。在一些实施例中,音频组件810还包括一个扬声器,用于输出音频信号。
140.i/o接口812为处理组件802和外围接口模块之间提供接口,上述外围接口模块可以是键盘,点击轮,按钮等。这些按钮可包括但不限于:主页按钮、音量按钮、启动按钮和锁定按钮。
141.传感器组件814包括一个或多个传感器,用于为终端设备800提供各个方面的状态评估。例如,传感器组件814可以检测到终端设备800的打开/关闭状态,组件的相对定位,例如组件为终端设备800的显示器和小键盘,传感器组件814还可以检测终端设备800或终端设备800一个组件的位置改变,用户与终端设备800接触的存在或不存在,终端设备800方位或加速/减速和终端设备800的温度变化。传感器组件814可以包括接近传感器,被配置用来在没有任何的物理接触时检测附近物体的存在。传感器组件814还可以包括光传感器,如cmos或ccd图像传感器,用于在成像应用中使用。在一些实施例中,该传感器组件814还可以包括加速度传感器,陀螺仪传感器,磁传感器,压力传感器或温度传感器。
142.通信组件816被配置为便于终端设备800和其他设备之间有线或无线方式的通信。终端设备800可以接入基于通信标准的无线网络,如wifi,3g、4g、5g或其他标准通信网络,或它们的组合。在一个示例性实施例中,通信组件816经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,通信组件816还包括近场通信(nfc)模块,以促进短程通信。例如,在nfc模块可基于射频识别(rfid)技术,红外数据协会(irda)技术,超宽带(uwb)技术,蓝牙(bt)技术和其他技术来实现。
143.在示例性实施例中,终端设备800可以被一个或多个应用专用集成电路(asic)、数字信号处理器(dsp)、数字信号处理设备(dspd)、可编程逻辑器件(pld)、现场可编程门阵列(fpga)、控制器、微控制器、微处理器或其他电子元件实现,用于执行上述本技术图2-图6所对应的实施例中任一实施例提供的方法。
144.在示例性实施例中,还提供了一种包括指令的非临时性计算机可读存储介质,例如包括指令的存储器804,上述指令可由终端设备800的处理器820执行以完成上述方法。例如,非临时性计算机可读存储介质可以是rom、随机存取存储器(ram)、cd-rom、磁带、软盘和光数据存储设备等。
145.本技术实施例还提供了一种非临时性计算机可读存储介质,当该存储介质中的指令由终端设备的处理器执行时,使得终端设备800能够执行上述本技术图2-图6所对应的实施例中任一实施例提供的方法。
146.在本技术所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
147.本领域技术人员在考虑说明书及实践这里公开的申请后,将容易想到本技术的其它实施方案。本技术旨在涵盖本技术的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本技术的一般性原理并包括本技术未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本技术的真正范围和精神由下面的权利要求书指出。
148.应当理解的是,本技术并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本技术的范围仅由所附的权利要求书来限制。
再多了解一些

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

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

相关文献