神经网络推理的内存管理方法及装置与流程

文档序号:23718196发布日期:2021-01-24 06:28阅读:145来源:国知局
神经网络推理的内存管理方法及装置与流程

[0001]
本发明涉及人工智能技术领域,特别是涉及一种神经网络推理的内存管理方法及装置。


背景技术:

[0002]
得益于深度神经网络的高效性和准确性,尤其在检测、识别分类等任务中表现优异,近几年,深度神经网络在生活中的应用不断扩展和发散。由此,各类嵌入式神经网路处理器(npu)应运而生。
[0003]
但是,深度神经网络通常会占用大量的内存,这就提高了对硬件的要求,也会直接导致硬件的生产成本提高。因此,如何降低深度神经网络的内存占用是目前亟需解决的问题,能够大幅降低深度神经网络对硬件的要求,并节约成本。
[0004]
现有的神经网路推理都是假设神经网络的输入、输出以及中间层的数据都不会相互干扰,并没有针对性的内存分配和优化,而是直接交给操作系统来做。那么在此情况下,神经网络的输入、输出及中间层的输入、输出所需要占用的内存大小与平铺的方式所需要占用的内存大小一样。
[0005]
上述方式占用的内存过于巨大,尤其是对于边缘计算设备而言,在此情况下,对于中间层数据比较大的神经网络(比如vgg19),甚至不能在边缘计算设备的处理器上运行。
[0006]
相关术语解释fm(feature map),特征图;ifm(input feature map),输入特征图;ofm(output feature map),输出特征图。


技术实现要素:

[0007]
本发明解决的技术问题是:如何降低神经网络推理的内存占用,以降低硬件消耗和运行神经网络所需的硬件成本。
[0008]
为了解决上述技术问题,本发明实施例提供一种神经网络推理的内存管理方法,包括:对内存空间进行划分,划分后的内存空间至少包括第一类区域和第二类区域;其中,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待分配内存空间的神经网络进行分析,得出该神经网络中存在多输入的层的数量;根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间;其中,在从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间的过程中,尽可能的最小化当前第二类区域的内存总和、且尽可能的最大化第二类区域的内存复用。
[0009]
可选的,所述对待分配内存空间的神经网络进行分析,得出该神经网络中存在多输入的层的数量包括:对待分配内存空间的神经网络中每一层的所有输入ifms进行统计,得出每一层的fm和生命周期终止点;根据待分配内存空间的神经网络中每一层的fm和生命周期终止点,统计得出该神经网络中存在多输入的层的数量。
[0010]
可选的,所述根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域包括:若该神经网络中所有层都不存在多输入的情况,则启用第一类区域进行内存分配,不启用第二类区域,该神经网络中所有层的fm数据的存储空间都从第一类区域中分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例不超过预定的第一阈值,则启用第一类区域和第二类区域进行内存分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例超过预定的第一阈值,则启用第二类区域进行内存分配,不启用第一类区域,该神经网络中所有层的fm数据的存储空间都从第二类区域中分配。
[0011]
可选的,所述第一阈值为10%。
[0012]
可选的,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间包括:初始化第一类区域;计算并统计该神经网络在各时刻最大需要占用的第一类区域的内存空间大小;从第一类区域中,为需要存放在第一类区域的各个网络层分配内存空间;其中,若flag为真,则从第一类区域的左侧开始分配内存空间,若flag为假,则从第一类区域的zoo1.size

x.size位置开始分配内存空间,所述zoo1.size表示该神经网络在各时刻最大需要占用的第一类区域的内存空间大小,x.size表示当前待分配内存fm的大小。
[0013]
可选的,所述计算该神经网络总共需要占用的第一类区域的内存空间大小包括:采用以下方式来计算该神经网络总共需要占用的第一类区域的内存空间大小:其中,zoo1表示该神经网络总共需要占用的第一类区域的内存空间大小,fm
n
表示第n层fm所需要占用的内存空间大小,fm
n+1
表示第n+1层fm所需要占用的内存空间大小,l表示该神经网络中所有需要存放在第一类区域的网络层的数量。
[0014]
可选的,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间包括:初始化第二类区域,设定tail=0,zoo2.size=0,候选区列表为空;其中,所述tail用于记录和指示第二类区域中当前已分配的内存空间中最后内存块的地址;从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间。
[0015]
可选的,所述从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间包括:在候选区列表中,筛选出合适的内存块用于存放当前待分配内存空间的网络层;其中,
筛选出的内存块满足以下条件:b.size>x.size并且minimize(b.size-x.size)。其中,b.size表示筛选出的内存块的大小,x.size表示当前待分配内存空间的网络层所需要占用的内存空间大小;根据筛选出的内存块,为当前待分配内存空间的网络层分配地址。
[0016]
可选的,所述根据筛选出的内存块,为当前待分配内存空间的网络层分配地址包括:采用以下方式来为当前待分配内存空间的网络层分配地址:其中,x.addr表示为当前待分配内存空间的网络层所分配的地址,b.addr表示筛选出的内存块的地址,b.size表示筛选出的内存块的大小,x.size表示当前待分配内存空间的网络层所需要占用的内存空间大小。
[0017]
可选的,所述从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间还包括:根据网络层被分配到的地址,检查该网络层的所有ifms的生命周期,判断各个ifm的生命周期是否终止;如果是,则释放该ifm所在网络层在第二类区域中所占用的内存空间,并记录这部分内存空间的状态为可用;在第二类区域中对于每个可释放内存空间的ifm,检查该ifm左右相邻的内存块是否为可用状态;如果该ifm左右相邻的内存块均不是可用状态,则将该ifm加入候选区列表;如果该ifm左右相邻的内存块中存在可用状态的内存块,则将该ifm所占用的内存块与该可用状态的内存块合并后作为一个新的内存块加入侯选列表。
[0018]
可选的,如果该ifm左右相邻的内存块均是可用状态的内存块,则将对应的连续可用状态的所有内存块合并。
[0019]
可选的,若未能找到合适的内存块用于存放当前待分配内存空间的网络层,则分配当前待分配内存空间的网络层的地址为tail+1,并更新tail的地址。
[0020]
可选的,如果内存中最后的内存块被标记为可用状态,则在其和左边可用状态的内存合并后,更新tail的地址为tail = tail
ꢀ–ꢀ
xx.size,其中,xx.size表示内存末尾连续的可用内存和并购后的内存块的大小。
[0021]
为了解决上述技术问题,本发明实施例还提供一种神经网络推理的内存管理装置,包括:处理器,适于加载并执行软件程序的指令;存储器,适于存储软件程序,所述软件程序包括用于执行以下步骤的指令:对内存空间进行划分,划分后的内存空间至少包括第一类区域和第二类区域;其中,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待分配内存空间的神经网络进行分析,得出该神经网络中存在多输入的层的数量;根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间;其中,在从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间的过程中,尽
可能的最小化当前第二类区域的内存总和、且尽可能的最大化第二类区域的内存复用。
[0022]
可选的,所述根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域包括:若该神经网络中所有层都不存在多输入的情况,则启用第一类区域进行内存分配,不启用第二类区域,该神经网络中所有层的fm数据的存储空间都从第一类区域中分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例不超过预定的第一阈值,则启用第一类区域和第二类区域进行内存分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例超过预定的第一阈值,则启用第二类区域进行内存分配,不启用第一类区域,该神经网络中所有层的fm数据的存储空间都从第二类区域中分配。
[0023]
可选的,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间包括:初始化第一类区域;计算并统计该神经网络在各时刻最大需要占用的第一类区域的内存空间大小;从第一类区域中,为需要存放在第一类区域的各个网络层分配内存空间;其中,若flag为真,则从第一类区域的左侧开始分配内存空间,若flag为假,则从第一类区域的zoo1.size

x.size位置开始分配内存空间,所述zoo1.size表示该神经网络在各时刻最大需要占用的第一类区域的内存空间大小,x.size表示当前待分配内存fm的大小。
[0024]
可选的,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间包括:初始化第二类区域,设定tail=0,zoo2.size=0,候选区列表为空;其中,所述tail用于记录和指示第二类区域中当前已分配的内存空间中最后内存块的地址;从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间。
[0025]
与现有技术相比,本发明的技术方案具有以下有益效果:将内存空间划分为第一类区域和第二类区域,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待分配内存空间的神经网络进行分析,根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间,从而根据神经网络的结构来自适应选择合适的内存管理策略,最优化内存使用。本发明使用贪婪算法逐层搜索最优化的内存分配方案,能够降低神经网络推理的内存占用(且包含了对中间层的内存优化),尽可能的最小化内存使用。
[0026]
进一步的,对于第一类区域和第二类区域分别设计了内存分配策略,采用贪婪算法寻找每一步最优的规划选择,从而优化整个神经网络推理所需要占用的内存空间。
[0027]
进一步的,对于第二类区域,通过检查并合并相邻的可用内存块,使得内存空间的复用率进一步提升。
附图说明
[0028]
图1为本发明实施例中神经网络推理的内存管理方法流程图;
图2为本发明实施例中第一类区域内存分配实例实施过程示意图;图3为本发明实施例中第二类区域内存分配流程图;图4为本发明实施例中第二类区域内存分配实例实施过程示意图。
具体实施方式
[0029]
根据背景技术部分的分析可知,现有技术中,神经网络推理所占用的内存过于巨大,难以在边缘计算设备上实施。
[0030]
发明人经研究后发现,神经网络推理的内存优化方案主要是在优化输入和输出的数据,并没有把中间层数据考虑在内,且内存复用的利用率不高。
[0031]
具体的,现有技术中,把神经网络向前推理所需要的输入、输出及中间层数据(blobs)抽象为n个block。每个block包含了所需要占用的内存大小、和该block内的各个节点(层或者layer)。每个block需要占用一块内存,且每块block不能相互干扰,这里的干扰指的是两个block的节点交集为0,这样才能保证推理结果正确。
[0032]
现有技术中,判断后一个block能不能复用前一个block的内存,如果不可以复用,那么分配新的内存。假如有block[b1, b2, b3]所需要占用的内存大小依次为10mb、1mb、5mb。b2和b3均可复用b1的内存,但b3不能复用b2的内存。那么系统会先为b1分配10mb,b2会复用b1的内存。由于b2已经复用了b1的内存,所以b3不可以复用b1的内存,只能新开辟5mb内存。这样总内存为15mb,与平铺模式所需要占用的总内存16mb相比提升不多。
[0033]
上述过程中内存复用的条件是:内存复用不会导致推理的正确性受到影响。判断是否会影响推理的正确性的条件是,判断blockbx和bn的交集是否为0。如果交集为0,说明前一个block的生命周期结束,占用它的数据不会对后续的推理结果造成影响。
[0034]
目前在神经网络推理方面,现有技术(参考cn110597616a)公开了一种神经网络的内存分配方法及装置,对输入、输出及中间层数据内存进行优化,该方案使用了基于排序和内存复用的内存管理方法,简单来说包括以下3个步骤:步骤a)按照block占用的内存,从大到小进行排序。即优先分配占用内存最大的block。比如排序后的内存块为[b1, b2, b3, b4, b5],且假设他们对应的ofm也是由前向后排列的。
[0035]
步骤b)分配占用内存最大的内存block, 即b1。
[0036]
步骤c)依次分配排序后的block。举例,如果b2和b1没有交集那么b2可以复用b1的内存空间。如果b3和b2有交集,那么需要对b3新分配内存空间。依次排列所有的block。
[0037]
该方案能够提高内存复用率,减少新开辟内存的大小,且可以优化中间层的数据的分配。
[0038]
发明人经研究后发现,该方案对于内存的复用并不充分,举例来说,假设b1需要10mb内存,b2需要3mb,b3需要5mb,且b2和b3均与b1没有交集,b2和b3有交集。那么在此情况下,采用上述方案从大到小进行排序后,只有b3可以复用b1的部分内存。即b3用了b1内存的5mb, 尚有5mb空余,而b2不能复用b1的剩下的5gb未用的内存,此时需要为b2新分配内存空间。
[0039]
本发明将内存空间划分为第一类区域和第二类区域,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待
分配内存空间的神经网络进行分析,根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间,从而根据神经网络的结构来自适应选择合适的内存管理策略,最优化内存使用。本发明使用贪婪算法逐层搜索最优化的内存分配方案,能够降低神经网络推理的内存占用(且包含了对中间层的内存优化),尽可能的最小化内存使用。
[0040]
采用本发明的方案,就上述实例而言,先为b1分配10mb内存,由于b2可以复用b1,所以b1的生命周期结束时,b2会占用b1中的靠右边的5mb,b3会占用b1的剩下的5 mb的内存块中的靠右边的3mb内存,这样总内存只需要10mb,可见本发明的方案能够更大限度地复用内存。
[0041]
为使本领域技术人员更好地理解和实现本发明,以下参照附图,通过具体实施例进行详细说明。
[0042]
实施例一如下所述,本发明实施例提供一种神经网络推理的内存管理方法。
[0043]
参照图1所示的神经网络推理的内存管理方法流程图,以下通过具体步骤进行详细说明:s101,对内存空间进行划分,划分后的内存空间至少包括第一类区域和第二类区域。
[0044]
其中,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据。
[0045]
在另一些实施例中,划分后的内存空间至少包括第一类区域和第二类区域其中一种。
[0046]
第一类区域的写入方式是:此内存区域用于储存生命周期只有1的fm数据,即神经网络第n层的ofm数据只会被它的下一层用到,所以接下来网络会开始计算它的后一层即第n+1层的fm,计算完成后第n层的ofm便没有作用,该内存空间可以被抹去或者覆盖。
[0047]
其中,下标范围从0开始,即采用和计算机软件一致的表示方式,比如0表示10mb内存中的第一块 1mb 内存,1 表示第二块1mb内存空间。
[0048]
第二类区域的写入方式是:把fm内存块写入第二类区域一块连续的、不和其他内存块重叠的、空间大小和自身一样大的内存空间里面,随着网络的前向推理,保留将回收生命周期终止的内存块,作为候选内存给后来的fm使用。
[0049]
因为第二类区域可以管理和分配所有fm的数据,无关它们的生命周期,所以我们的内存管理方案可以自适应的选择一个最佳的管理策略以达到更好的内存管理效果减少内存使用。
[0050]
以下通过一个具体的实例来作进一步的说明:假设当前有一个需要5mb的fm,且有3个内存候选地址可供写入,分别为2mb、6mb和8mb。那么2mb空间不够存放新的fm所以排除,6mb和8mb的候选空间都足够存放新fm,那么选择的标准是和目标fm大小最接近的内存块,所以目标fm将占用原6mb候选块的后5mb内存,前1mb内存将作为新的候选块供后来的fm选择或者和相邻的候选块合并为一个大的候选块。
[0051]
s102,对待分配内存空间的神经网络进行分析,得出该神经网络中存在多输入的层的数量。
[0052]
在一些实施例中,所述对待分配内存空间的神经网络进行分析,得出该神经网络中存在多输入的层的数量具体可以包括:对待分配内存空间的神经网络中每一层的所有输入ifms进行统计,得出每一层的fm和生命周期终止点;根据待分配内存空间的神经网络中每一层的fm和生命周期终止点,统计得出该神经网络中存在多输入的层的数量。
[0053]
本实施例的方案采用了贪婪算法和内存回收技术。具体的,在本实施例的方案中,贪婪算法被用于快速搜索适合目标fm的内存地址、或者说是候选内存块;内存回收的含义是当一个fm的生命周期终止的时候,其所占有的内存空间会被内存管理器回收及合并,以便分配给后来的fm;如前所述,第一类区域只用于存放和管理生命周期只有1的内存块,第二类区域用于存放所有的内存块。那么,为了达到最佳的内存分配方案,我们的内存管理系统可以针对不同的网络自适应选择分配策略。
[0054]
s103,根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域。
[0055]
在一些实施例中,所述根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域具体可以包括:若该神经网络中所有层都不存在多输入的情况,则启用第一类区域进行内存分配,不启用第二类区域,该神经网络中所有层的fm数据的存储空间都从第一类区域中分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例不超过预定的第一阈值,则启用第一类区域和第二类区域进行内存分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例超过预定的第一阈值,则启用第二类区域进行内存分配,不启用第一类区域,该神经网络中所有层的fm数据的存储空间都从第二类区域中分配。
[0056]
其中,所述第一阈值可以是10%。
[0057]
s104,从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间。
[0058]
其中,在第二类区域中分配内存过程中,根据最小化当前第二类区域总内存原则和最大化第二类区域内存的复用原则分配内存,也即尽可能的最小化当前第二类区域的内存总和、且尽可能的最大化第二类区域的内存复用。
[0059]
在一些实施例中,第一类区域(也可采用自定义术语,称为刷新区)内存分配流程图,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间具体可以包括:初始化第一类区域;计算并统计该神经网络在各时刻最大需要占用的第一类区域的内存空间大小;从第一类区域中,为需要存放在第一类区域的各个网络层分配内存空间;其中,若flag为真,则从第一类区域的左侧开始分配内存空间,若flag为假,则从第一类区域的zoo1.size-x.size位置开始分配内存空间,所述zoo1.size表示该神经网络在各时刻最大
需要占用的第一类区域的内存空间大小,x.size表示当前待分配内存fm的大小(起始位置为左flag真,下一个生命周期为1的fm分配在对立侧即右flag为真,以此类推)。
[0060]
所述计算该神经网络总共需要占用的第一类区域的内存空间大小具体可以采用以下方式来计算该神经网络总共需要占用的第一类区域的内存空间大小:其中,zoo1表示该神经网络总共需要占用的第一类区域的内存空间大小,fm
n
表示第n层fm所需要占用的内存空间大小,fm
n+1
表示第n+1层fm所需要占用的内存空间大小,l表示该神经网络中所有需要存放在第一类区域的网络层的数量。
[0061]
以下通过一个具体的实例来作进一步的说明:假设第一类区域的大小为8mb,下标范围为0-7,如果第一块数据fm
0
是1mb,参考图2所示的第一类区域(即刷新区)内存分配实例实施过程示意图,从左边(l)开始向右写,即占用第一类区域1mb的内存空间,第二块数据fm
1
大小为5mb,从 6=8-2开始写,即占用第6-7范围内存,因为它们的生命周期只有1,所以第三个输出fm
2
将从l开始写入,且会覆盖fm
0
,类似的,fm
3
会从4 = 8-4开始写,即占用第4-7内存块。
[0062]
所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间具体可以包括:初始化第二类区域,设定tail=0,zoo2.size=0,候选区列表为空;其中,所述tail用于记录和指示第二类区域中当前已分配的内存空间中最后内存块的地址;从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间,具体的,在候选区列表中,筛选出合适的内存块用于存放当前待分配内存空间的网络层,筛选出的内存块满足以下条件:b.size>x.size并且选择能够最小化(b.size-x.size)的候选内存块,即通过搜索每一层的最优化内存分配以达到优化整个神经网络推理所需要的内存大小。其中,b.size表示筛选出的内存块的大小,x.size表示当前待分配内存空间的网络层所需要占用的内存空间大小;根据筛选出的内存块,为当前待分配内存空间的网络层分配地址。
[0063]
可用内存块的拆分方式可以是:如果候选内存块大小大于待分配内存fm的大小,那么依据靠右分配原则将候选块分为左右两个内存块,左边的内存块仍然包留的候选列表中,右边的内存块大小和待分配内存fm的大小一致,用于分配给该待分配fm。
[0064]
所述根据筛选出的内存块,为当前待分配内存空间的网络层分配地址具体可以采用以下方式来为当前待分配内存空间的网络层分配地址:即采用靠右分配原则:在实际的实验中,我们发现如果在内存复用中靠右分配内存优化效果略高于靠左分配。因为左边的未使用的内存块可以有更多的机会和其它的可用内存块合并。
[0065]
其中,x.addr表示为当前待分配内存空间的网络层所分配的地址,b.addr表示筛选出的内存块的地址,b.size表示筛选出的内存块的大小,x.size表示当前待分配内存空间的网络层所需要占用的内存空间大小。
[0066]
所述从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间还可以进一步包括:
根据网络层被分配到的地址,检查该网络层的所有ifms的生命周期,判断各个ifm的生命周期是否终止;如果是,则释放该ifm所在网络层在第二类区域中所占用的内存空间,并记录这部分内存空间的状态为可用;在第二类区域中对于每个可释放内存空间的ifm,检查该ifm左右相邻的内存块是否为可用状态;如果该ifm左右相邻的内存块均不是可用状态,则将该ifm加入候选区列表;如果该ifm左右相邻的内存块中存在可用状态的内存块,则将该ifm所占用的内存块与该可用状态的内存块合并后作为一个新的内存块加入侯选列表。
[0067]
其中,如果该ifm左右相邻的内存块均是可用状态的内存块,则将对应的连续可用状态的所有内存块合并。
[0068]
若未能找到合适的内存块用于存放当前待分配内存空间的网络层,则分配当前待分配内存空间的网络层的地址为tail+1,并更新tail的地址。
[0069]
进一步的,如果内存中最后的内存块被标记为可用状态,则在其和左边可用状态的内存合并后(没有则跳过),更新tail的地址为tail = tail
ꢀ–ꢀ
xx.size,其中,xx.size表示内存末尾连续的可用内存和并购后的内存块的大小。
[0070]
参考图3所示的第二类区域(也可采用自定义术语,称为保留区)内存分配流程图:a1)初始化保存区,设定tail=0,保存区的大小zoo.size = 0,候选列表l为空。tail的作用是记录指示当前内存却的最后内存块的地址。如果要开辟新的内存空间,应该从tail+1的地方开始。
[0071]
a2)循环,对每一个第二类区域的层fm
x
进行分配内存;a3)在候选列表l中寻找合适的内存块用于存放x。筛选的方式是从后向前寻找,筛选的条件是b.size>x.size,即候选块b的大小大于x的大小、以及minimize(b.size-x.size),即选择和x的大小最接近的块。判断是否存在符合上述2个条件的b。
[0072]
a4)如果存在,把b分为两瓣b1, b2。x的地址就是b2的地址,就是那么b1的地址就是b的地址。我们用b1这个块替换l中的b。
[0073]
a5)x分配到地址后,检查x的所有ifm(s)的生命周期,判断ifm的生命周期是否终止。
[0074]
a6)如果终止那么释放它的内存,状态变成free。
[0075]
a7)如果ifm是最后的一个内存块,那么什么都不用做。
[0076]
a8)如果不是最后一个,自动检查它的相邻的内存块是否是free状态的。
[0077]
a9)如果它的左右相邻的内存块都不是free的,那么把它插入候选区列表l中。
[0078]
a10)如果存在free的相邻的内存块,那么把它们合并成一个新的内存块,合并方式是向地址更小的块合并。
[0079]
a11)在步骤a),如果不存在,那么就在就把tail+1地址分配给x,更新tail地址。
[0080]
a12)如果新的tail地址+1大于当前第二类区域的大小,那么更新第二类区域的大小为tail+1。
[0081]
a13)重复步骤a5)至 a10)。
[0082]
以下通过一个具体的实例来作进一步的说明,参考图4所示的第二类区域(即保留
区)内存分配实例实施过程示意图:s0)内存初始状态为空,没有数据占用内存。
[0083]
s1)将网络的输入数据fm
0
放在内存的第一块地址,fm
0 = 1mb。
[0084]
s2)由于没有可以复用的内存块,所以在fm
0
之后(即tail+1)新开辟内存输出fm
1
,fm
1
=1mb。tail变成3。fm
0
生命周期终止,所以其内存被回收,变为free状态,可以被复用。
[0085]
s3a)输出fm
2
,释放fm
1

[0086]
s3b)fm
1
内存释放后,会自动感知其左右相邻的内存块是否是free状态,如果是free状态,那么会和相邻的free的内存合并成一个大的free内存块。步骤s3a)和步骤s3b)是一起做的,所有在接下来的内存中,输出数据和合并free内存会直接写成一步。不再单独描述两个相邻的free内存空间合并过程。
[0087]
s4)输出fm
3
,释放fm
2
,由于fm
2
后没有non-free的内存块,所以此free的内存块不会被收集到候选内存块中。当前的tail是2,即fm
3
的末尾。
[0088]
s5)由于没有大小符合条件的free内存候选空间,所以fm
4
将会在tail+1 (指最后一个non-free fm的后面)开始写入,tail变成5。由于fm
3
和fm
4
都是fm
5
的ifm,所以fm
3
生命周期尚未结束,不可释放内存。
[0089]
s6)在tail+1新开辟内存输出fm
5
,tail变成9。同时释放fm
3
和fm
4
的内存,因为他们的生命周期都在fm
5
时候结束。
[0090]
s7)输出fm
6
,由于fm
6
占用内存大小为4mb,而当前最接近4mb的free内存为6mb,所以fm
6
的占用的内存地址范围是[2,5],即第2块到第5块的内存空间。[0,1]内存没有使用,仍是free状态,fm
5
内存释放。由于fm
5
后面没有non-free的内存块,所以不会被收集到候选内存块集合中,tail= 5。
[0091]
s8)fm
7 = 3mb,由于当前没有找到能够存放fm
7
的free候选内存块,所以fm
7
在tail+1处开始写入,tail变成8。
[0092]
在上述过程中,第二类区域所需要的总内存大小为记录的最大的tail的值加1,在上述实例中最大的tail是9,所以总内存大小为10。
[0093]
通过以上对技术方案的描述可以看出:本实施例中,将内存空间划分为第一类区域和第二类区域,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待分配内存空间的神经网络进行分析,根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间,从而根据神经网络的结构来自适应选择合适的内存管理策略,最优化内存使用。本发明使用贪婪算法逐层搜索最优化的内存分配方案,能够降低神经网络推理的内存占用(且包含了对中间层的内存优化),尽可能的最小化内存使用。
[0094]
进一步的,对于第一类区域和第二类区域分别设计了内存分配策略,采用贪婪算法寻找每一步最优的规划选择,从而优化整个神经网络推理所需要占用的内存空间。
[0095]
进一步的,对于第二类区域,通过检查并合并相邻的可用内存块,使得内存空间的复用率进一步提升。
[0096]
已经过实验、模拟,表明本实施例的方案对于不同的网络内存优化效果不同。
[0097]
较好的情况,对于inception_resnet_v2结构的网络可以节省约96%的内存,和
sequential的方案相比。sequential的方案相当于没有内存管理而是由操作系统进行内存分配和管理。
[0098]
较差的情况,对于ypr结构的网络可以节省约66%的内存。
[0099]
各种不同类型的网络累加起来平均内存节省率约为84%,可见是极大的降低了神经网络所需占用的内存。
[0100]
实施例二如下所述,本发明实施例提供一种神经网络推理的内存管理装置。
[0101]
所述神经网络推理的内存管理装置包括:处理器,适于加载并执行软件程序的指令;存储器,适于存储软件程序,所述软件程序包括用于执行以下步骤的指令:对内存空间进行划分,划分后的内存空间至少包括第一类区域和第二类区域;其中,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待分配内存空间的神经网络进行分析,得出该神经网络中存在多输入的层的数量;根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间;其中,在从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间的过程中,尽可能的最小化当前第二类区域的内存总和、且尽可能的最大化第二类区域的内存复用。
[0102]
在一些实施例中,所述根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域包括:若该神经网络中所有层都不存在多输入的情况,则启用第一类区域进行内存分配,不启用第二类区域,该神经网络中所有层的fm数据的存储空间都从第一类区域中分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例不超过预定的第一阈值,则启用第一类区域和第二类区域进行内存分配;若该神经网络中存在多输入的层的数量占该神经网络的总层数的比例超过预定的第一阈值,则启用第二类区域进行内存分配,不启用第一类区域,该神经网络中所有层的fm数据的存储空间都从第二类区域中分配。
[0103]
在一些实施例中,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间包括:初始化第一类区域;计算并统计该神经网络在各时刻最大需要占用的第一类区域的内存空间大小;从第一类区域中,为需要存放在第一类区域的各个网络层分配内存空间;其中,若flag为真,则从第一类区域的左侧开始分配内存空间,若flag为假,则从第一类区域的zoo1.size

x.size位置开始分配内存空间,所述zoo1.size表示该神经网络在各时刻最大需要占用的第一类区域的内存空间大小,x.size表示当前待分配内存fm的大小。
[0104]
在一些实施例中,所述从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间包括:初始化第二类区域,设定tail=0,zoo2.size=0,候选区列表为空;其中,所述tail用于
记录和指示第二类区域中当前已分配的内存空间中最后内存块的地址;从第二类区域中,为需要存放在第二类区域的各个网络层分配内存空间。
[0105]
通过以上对技术方案的描述可以看出:本实施例中,将内存空间划分为第一类区域和第二类区域,所述第一类区域只会被用于存储生命周期为1的fm数据,所述第二类区域能够被用于存储任意生命周期的fm数据;对待分配内存空间的神经网络进行分析,根据该神经网络中存在多输入的层的数量与该神经网络的总层数,来确定是否启用第一类区域、以及是否启用第二类区域;从第一类区域和/或第二类区域中为该神经网络中各个层的fm数据分配内存空间,从而根据神经网络的结构来自适应选择合适的内存管理策略,最优化内存使用。本发明使用贪婪算法逐层搜索最优化的内存分配方案,能够降低神经网络推理的内存占用(且包含了对中间层的内存优化),尽可能的最小化内存使用。
[0106]
进一步的,对于第一类区域和第二类区域分别设计了内存分配策略,采用贪婪算法寻找每一步最优的规划选择,从而优化整个神经网络推理所需要占用的内存空间。
[0107]
进一步的,对于第二类区域,通过检查并合并相邻的可用内存块,使得内存空间的复用率进一步提升。
[0108]
本领域普通技术人员可以理解,上述实施例的各种方法中,全部或部分步骤是可以通过程序指令相关的硬件来完成的,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:rom、ram、磁盘或光盘等。
[0109]
虽然本发明披露如上,但本发明并非限定于此。任何本领域技术人员,在不脱离本发明的精神和范围内,均可作各种更动与修改,因此本发明的保护范围应当以权利要求所限定的范围为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1