AI处理器的内存分配方法、计算机装置及计算机可读存储介质
文献发布时间:2023-06-19 11:55:48
技术领域
本发明涉及内存管理的技术领域,具体地,是一种AI处理器的内存分配方法以及实现这种方法的计算机装置、计算机可读存储介质。
背景技术
目前,深度神经网络技术在计算机视觉和自然语言处理等领域取得了巨大的成功。近年来,随着AIoT(Artificial Intelligence&Internet of Things,人工智能与物联网)技术的兴起,人工智能技术与物联网技术在实际应用中不断融合,越来越多的深度学习算法需要部署到资源受限的嵌入式端设备上。然而,由于嵌入式端设备的计算能力和内存资源受限,因此需要研究高性能和高效能的边缘推理方法便于神经网络模型的部署。
近年来,一部分研究人员聚焦于神经网络的模型推理性能,设计出高效的神经网络结构,如SqueezeNet、MobileNets和EfficientNet等,这些神经网络模型能够以较小的计算量获取较好的性能。此外,还有一部分研究人员侧重研究提高神经网络模型的效率,对神经网络模型进行压缩、裁剪和量化,在不明显降低神经网络模型性能的前提下,大幅减少计算量和内存消耗。
由于深度神经网络前向推理过程中涉及到大量矩阵乘法和加法的运算,而这些运算又可以高度并行化执行,因此研究人员开始研究具有并行计算能力的人工智能处理器,即AI处理器。AI处理器通过将整个神经网络的计算部分映射到硬件逻辑上,从而完成对神经网络模型计算部分的硬件加速,在一定程度上缓解了嵌入式端设备的计算能力受限问题。然而,深度神经网络在前向推理过程中仍需要储存大量的权重和激活,例如在Caffe框架下ResNet50模型在进行推理时就需要约170MB的内存空间,但是嵌入式端的储存空间通常有限,因此,亟需减少神经网络在模型推理时的内存消耗。
现有的一种方案是在神经网络的模型推理过程中采用动态分配内存的方法,该方法可以减少大量内存消耗,但是需要在每一次推理过程中频繁的分配和释放内存空间,不可避免地影响到模型推理时的执行效率,增加了模型推理的时间消耗。另一种方案是结合AI处理器的特点,将神经网络中卷积、归一化和池化等算子直接以in-place(原地处理)的方式进行计算,以减少神经网络中部分算子消耗的内存。此外,现有的更多方案是考虑设计静态内存池式分配方法来减小内存消耗,在模型进行推理前统一分配内存空间,并确定推理过程中所需内存块的大小和地址偏移,在模型最后一次推理完成后,统一释放之前申请的内存空间。
但是,由于上述方案都没有考虑神经网络的实际情况,要么影响神经网络的技术效率,要么仍占有大量的内存空间。为此,研发人员研究采用静态内存池分配方法与动态内存分配相结合的方式进行内存的分配,例如公开号为CN101968772A的中国发明专利申请公开的嵌入式系统高效内存池的实现方法。但是,该方法并未结合神经网络各算子的具体情况合理分配内存,导致内存占用量仍然很高。
技术问题
本发明的第一目的是提供一种减少神经网络进行推理过程中占用的内存空间的AI处理器的内存分配方法。
本发明的第二目的是提供一种实现上述AI处理器的内存分配方法的计算机装置。
本发明的第三目的是提供一种实现上述AI处理器的内存分配方法的计算机可读存储介质。
技术解决方案
为实现本发明的第一目的,本发明提供的AI处理器的内存分配方法包括获取神经网络的多个算子并且,计算分析多个算子中,算子的输入与输出占用的内存空间可重叠的算子;判断神经网络的输入的尺寸是否为固定尺寸,如是,采用静态内存池式分配算法确定多个内存块的存储地址,否则,则采用动态内存池式分配算法为多个内存块申请内存空间;其中,采用静态内存池式分配算法确定多个内存块的存储地址包括:计算神经网络模型推理过程中每一内存块的大小,确认每一内存块的生命周期;并判断内存块是否为可被重叠的内存块,如是,修正内存块的大小和生命周期,根据内存块修正后的大小和生命周期分配各内存块的存储地址。
一个优选的方案是,计算分析多个算子中输入与输出占用的内存空间可重叠的算子包括:判断一个算子的输入与输出激活是否只参与当前层算子的计算,如是,确认该算子的输入与输出占用的内存空间可重叠,否则,确认该算子的输入与输出占用的内存空间不可重叠。
优选的,被分析的算子为经过线性拆分的算子。
进一步的方案是,确认每一内存块的生命周期包括:根据内存块所存储的算子第一次访问时间以及最后一次访问时间计算该内存块的生命周期。
更进一步的方案是,根据内存块修正后的大小和生命周期分配各内存块的存储地址包括:根据内存块修正后的大小和生命周期,将各个内存块放入静态内存池中,应用启发式算法计算各个内存块的偏移地址。
更进一步的方案是,分配各内存块的存储地址前,确定静态内存池的大小:计算任意时刻下内存块集合的大小,以任意时刻下所需要内存块集合最小值作为静态内存池大小的下限值。
更进一步的方案是,采用动态内存池式分配算法为多个内存块申请内存空间包括:确认当前算子计算所需要的内存空间的大小,并判断内存链表中是否有满足要求的空闲内存块,如是,使用满足要求的空闲内存块作为当前算子计算所需的内存,并将该空闲内存块从内存链表中移除。
更进一步的方案是,在内存块的生命周期结束后,将内存块释放并插入内存链表中。
更进一步的方案是,如内存链表中没有满足要求的空闲内存块,申请满足当前算子计算所需的内存空间。
更进一步的方案是,使用满足要求的空闲内存块作为当前算子计算所需的内存包括:以内存链表中满足当前算子计算所需的内存空间要求且内存空间最小的空闲内存块作为当前算子对应的内存块。
更进一步的方案是,使用满足要求的空闲内存块作为当前算子计算所需的内存包括:确认当前算子占用的内存空间与所使用的内存块的大小之间的比值大于预设的内存占用比。
为实现上述的第二目的,本发明提供的计算机装置包括处理器以及存储器,存储器存储有计算机程序,计算机程序被处理器执行时实现上述AI处理器的内存分配方法的各个步骤。
为实现上述的第三目的,本发明提供计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述AI处理器的内存分配方法的各个步骤。
有益效果
本发明的方法根据神经网络的输入情况确定使用静态内存池式分配内存或者采用动态内存池式进行内存空间的分配,针对输入为固定尺寸的情况,可以提高AI处理器对神经网络推理的效率,而针对神经网络输入并不是固定尺寸的情况,采用动态内存池式的内存分配方式,能够最大限度的减少内存的占用空间,减少神经网络推理过程中占用的内存量。
并且,根据各算子的输入与输出来确定算子的生命周期,如果某一个算子仅仅在某一层使用,则该算子占用的内存空间可以重复使用,即某一个内存块在整个推理过程中可以在不同时间段内分别存储多个算子,从而减少神经网络推理过程中占用的内存量。
另外,应用启发式算法计算各个内存块的偏移地址,进而确定各个内存块的绝对地址,有利于实现神经网络的模型在推理过程中所占用的内存空间最小化。
此外,在动态内存池式进行内存空间的分配的过程中,选择满足存储需求且内存空间最小的内存块作为当前算子计算所需的内存空间,能够减少神经网络的模型在推理过程中所占用的内存空间。
并且,通过对当前算子计算过程中所占用的内存空间与所使用的内存块的大小之间的比值进行限制,避免当前算子占用的内存空间过大而导致内存空间的浪费,进一步减少神经网络的模型在推理过程中所占用的内存空间。
附图说明
图1是本发明AI处理器的内存分配方法实施例的流程图。
图2是本发明AI处理器的内存分配方法实施例中采用静态内存池式分配算法确定多个内存块的存储地址的流程图。
图3是本发明AI处理器的内存分配方法实施例中采用动态内存池式分配算法为多个内存块申请内存空间的流程图。
以下结合附图及实施例对本发明作进一步说明。
本发明的实施方式
本发明的AI处理器的内存分配方法应用在嵌入式端设备上,该嵌入式端设备包括有一个处理器,用于执行人工智能算法,因此该处理器被称为AI处理器。AI处理器作为一个计算机装置,内部设置有处理器以及存储器,该存储器存储有计算机程序,计算机程序被处理器执行时可以实现上述的AI处理器的内存分配方法的各个步骤。
AI处理器的内存分配方法实施例:
本实施例应用在AI处理器中,主要是解决AI处理器在处理神经网络计算过程中占用内存过大的问题。由于现有的AI处理器主要是采用静态内存池式分配方法来管理神经网络模型在推理过程中的内存分配,现在的方法存在一定的内存复用效率问题,无法最大程度地降低模型计算所需的内存资源消耗。此外,由于现有静态内存池式分配方法需要提前预分配内存,存在不够灵活的缺点,使其主要适用于具有固定输入尺寸的神经网络模型中,并不适用于需要变化输入尺寸的神经网络模型,如循环神经网络等,限制了神经网络的应用场景。
为此,本发明的主要构思是设计一种结合静态内存池和动态内存池的高效内存分配方法,两种不同的内存池式分配方式更加灵活,既能高效地管理模型内存,又能满足不同模型和应用场景需求。静态内存池式分配方法通过对神经网络模型进行计算和分析,实现计算节点之间内存的高效复用,适用于具有固定输入尺寸的神经网络模型;动态内存池式分配方法将所有内存块以链表形式组织起来,提高动态内存管理效率,减少内存碎片,适用于需要变长输入尺寸的神经网络模型。此外,本发明的另一个发明构思是充分考虑AI处理器的硬件特性,允许部分算子的输入和输出所使用的内存块进行重叠,即某些内存块在不同的时刻分别存储不同的算子,进一步减少了神经网络模型推理时的内存消耗。
其中,静态内存池式分配内存块时,首先分析神经网络模型中各个算子所需内存空间的大小和生命周期,然后将内存分配问题转化为非确定性多项式难问题,最后应用启发式算法来求解该问题,确定各个内存块地址偏移,以最小化模型推理时的内存池大小。
而动态内存池式分配算法则是将所有空闲内存通过链表的形式组织起来,在需要分配内存空间时,遍历链表的中的各个空闲内存块,直到找到一个大小符合要求的内存块,将内存块从空闲链表中移除。若当前内存块释放时,则该内存块会被重新插入到空闲链表中。
下面结合图1介绍本实施例对内存分配的具体过程。首先,执行步骤S1,遍历神经网络的多个算子,优选的,神经网络的多个算子先经过线性拆分,即遍历的算子是经过线性拆分的算子。经过步骤S1后,可以初步确定AI处理器可以支持in-place(原地)计算的算子。
然后,执行步骤S2,分析多个算子中,哪些算子所占用的内存空间可以重叠,具体的,根据AI处理器的硬件特性,确定神经网络中哪些算子的输入和输出所占用的内存空间可以进行重叠。由于AI处理器的硬件计算逻辑特性,AI处理器能够对卷积、激活和归一化等算子以in-place的方式进行运算。因此,本实施例在遍历线性拆分后的神经网络所有算子,并初步确定AI处理器可以支持in-place计算的算子后,进一步分析这些算子的输入和输出激活是否参与后续其它分支计算,如果某一算子的输入和输出激活只参与本层算子的计算,则确定该算子对应的输入和输出所占用的内存空间可以进行重叠,从而提高了内存利用率,减少了神经网络模型整体的内存消耗。
相比之下,传统的内存分配方法使用ping-pong缓存技术,将所有算子的输入和输出激活保存在分离的内存区域,以保证输入和输出的内存空间不会发生重叠。但是,该传统方法会限制了神经网络模型的大小,且AI处理器的内存使用率较低,加大了嵌入式的产品功耗和生产成本。
然后,执行步骤S3,判断神经网络的输入是否为固定尺寸,如果神经网络的输入是固定尺寸,则执行步骤S4,在神经网络进行模型推理前,采用静态内存池式分配算法确定各个内存块的偏移地址,如果步骤S3的判断结果为否,则执行步骤S5,则在神经网络模型进行推理时,采用动态内存池式分配算法为各个内存申请空间。
具体的,可以根据神经网络模型类型和实际业务场景需求,判断神经网络的模型输入是否为固定不变尺寸。目前在计算机视觉领域中普遍应用卷积神经网络(CNN)模型,大部分CNN模型采用固定尺寸的图像作为模型输入,因此,采用静态内存池式分配算法,能够最大程度地减少神经网络推理所需的内存消耗。而在自然语言处理领域主要应用循环神经网络(RNN)模型,RNN模型要求输入为变长尺寸,每次网络前向推理时所需分配的内存大小也不一样,故静态内存池式分配方法并不适用,此时需要采用动态内存池式分配方法。
如果确认神经网络的模型输入尺寸是固定的尺寸,采用静态内存池式分配算法确定各内存块的偏移地址的流程如图2所示。首先,执行步骤S11,获取经过线性拆分后的多个算子,然后,执行步骤S12,分析多个算子占用的内存块的大小与生命周期。针对给定输入的尺寸,统计神经网络的模型推理过程中所需每一个内存块的大小,并且确认该内存块被第一次访问时间和最后一次访问的时间,根据该内存块被第一次访问时间和最后一次访问的时间来确定该内存块的生命周期。具体的,在给定各个内存块的大小和生命周期后,可以得到在任意时刻t的内存块集合B(t),由此可以计算在t时刻所需的内存大小为S
S
其中s
M=max
使用公式2所计算的值M作为内存池大小的下限值,这样就可以满足神经网络模型前向推理所需的内存要求。
然后,执行步骤S13,对各个内存块的大小以及生命周期进行修正。具体的,结合步骤S2对各个算子所占用的内存空间是否可以被重叠来对各个内存块的大小以及生命周期进行修正。如果某一个内存块可以被重叠,则需结合与其重叠的内存块来修正相关内存块的大小和生命周期。
接着,需要对各个内存块进行地址分配,即确定各个内存块在内存池中的相对偏移地址。在已知各个内存块大小和生命周期、内存池大小的下限值,可以把内存块合适地放入静态内存池问题,可以转化为一种特殊二维条形装箱求解问题:即对于一系列给定矩形,需放入具有宽度固定且高度不受限的箱子中,并且使箱子高度最小。在条形装箱问题中,矩形集合类比于神经网络模型推理时所需内存块集合,箱子高度类比于静态内存池大小,箱子宽度类比于模型推理所需时间。由于每个内存块有固定的生命周期,对应着矩形需要放到箱子固定水平位置。
本实施例采用简单的启发式算法来解决装箱问题,以获取较优的解,例如根据各个内存块在箱子垂直方向的位置,确定各个内存块的相对偏移地址。本实施例所采用的启发式算法也可以采用经典的启发式算法,如best-fit decreasing height(BFDH)和floor-ceil(FC)等算法实现进而获得各个内存块的相对偏移地址。
最后,执行步骤S15,根据各个内存块的相对偏移地址,将各个内存块的大小和相对偏移值相加,并对结果进行降序排序,将排序结果中的最大值作为静态内存池的大小,并向系统申请相应内存空间,在确定内存空间的地址后,即可以确定内存池中各个内存块的绝对地址。
如果确认神经网络的模型输入尺寸不是固定的尺寸,采用动态内存池式分配算法为各个内存块分配内存空间的流程如图3所示。
首先,执行步骤S21,获取经过线性拆分后的多个算子,然后,执行步骤S22,确认当前算子计算过程中所需要的内存空间大小,也就是在神经网络的模型前向推理过程中,确定当前算子所需输出内存空间的大小。具体的,在神经网络的模型推理过程中,获取当前算子输入激活的形状大小,然后根据当前算子的相关配置参数,确定输出激活的形状大小,最后由输出激活的形状大小,获取当前算子所需的输出内存大小。以卷积算子为例,假设输入激活的形状大小为W
W
H
接着执行步骤S23,判断内存链表中是否有空闲的内存块,若内存链表中没有空闲内存块,则执行步骤S28,直接向系统申请相应大小的内存空间。
如果步骤S24的判断结果为是,表示内存链表中有空闲的内存块,则制作步骤S24,判断内存链表中空闲内存块大小是否满足要求,若不满足要求,则执行步骤S27,直接向系统申请相应大小内存空间;若满足要求,则执行步骤S25,将符合要求的空闲的内存块从内存链表中移除,并且将该内存块用作当前算子计算所需的内存块。
为了更加高效的动态分配各个内存块,本实施例采用一种有效的内存块匹配方法来判断内存链表中的空闲内存块大小是否满足要求,能够从内存链表的空闲内存块中选择最匹配内存块来存储输出激活。具体的,首先按照内存的大小对内存链表中的空闲内存块进行升序排序,然后,依次遍历内存链表中的空闲内存块,当输出激活的内存大小与空闲内存块大小之间的比值大于预先设定的内存占用比时,才会选择该空闲的内存块来储存输出激活。
本实施例中,内存占用比与具体的神经网络模型有关,选择合适的内存占用比的过程如下:首先,设定内存占用α的分布区间为[0,1),然后以预设的步长(预设的步长可以是0.01)分别统计当前神经网络模型在各个内存占用比α下的整体内存池占用空间大小M
α
可以看出,如果当前算子计算所需要的内存空间较小,则不会被分配较大内存空间的内存块,这样可以避免内存的浪费。
最后,执行步骤S26,判断当前算子的生命周期是否结束,如果已经结束,即当前算子对比的内存块不被后续分支计算所需要,则执行步骤S27,回收该内存块资源,当前算子对应的内存块重新插入到内存链表中,以便于该内存块被其它算子使用,从而实现内存块的复用,提高内存块的使用效率,减少神经网络模型所占用的整体内存空间。当整个神经网络模型的推理计算完成并退出应用程序时,内存池中所有向系统动态申请的内存块将依次进行释放归还。
本实施例通过分析了卷积神经网络模型推理时各个内存块的生命周期,采用静态内存池以管理神经网络模型的内存。并且,本实施例还充分考虑深度神经网络的场景及需求,结合静态内存池和动态内存池的内存分配方法以管理模型推理时的内存。因此,本发明的方法既可用于输入尺寸固定的卷积神经网络,又可用于输入尺寸变化的循环神经网络,满足了更多不同算法模型和应用场景的需求。此外,本发明还结合了AI处理器的硬件逻辑特性,允许部分算子的输入和输出内存可以进行重叠,进一步地减少一定内存的消耗。
由于神经网络模型推理计算过程需要申请大量不同大小的内存用于存储激活值,传统的内存分配方法极易造成内存碎片化问题,以ResNet50模型为例,该模型前向推理时正常需要动态申请一百多次内存,约25MB大小空间用于储存网络中间计算的激活值。采用本发明的动态内存池式分配方法,分析了各个内存块的生命周期并采用内存块匹配方法,对ResNet50进行推理计算时,只需要动态申请7次内存,约3MB大小内存空间。可见,本发明的方法能够减少申请的内存块数目以及内存池占用空间大小,缓解了神经网络模型推理计算时的内存碎片化问题,并且提高了内存利用率。
计算机装置实施例:
本实施例的计算机装置可以是嵌入式设备,例如是一个AI处理器,该计算机装置包括有处理器、存储器以及存储在存储器中并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述AI处理器的内存分配方法的各个步骤。
例如,计算机程序可以被分割成一个或多个模块,一个或者多个模块被存储在存储器中,并由处理器执行,以完成本发明的各个模块。一个或多个模块可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序在终端设备中的执行过程。
本发明所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,处理器是终端设备的控制中心,利用各种接口和线路连接整个终端设备的各个部分。
存储器可用于存储计算机程序和/或模块,处理器通过运行或执行存储在存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现终端设备的各种功能。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(SmartMedia Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
计算机可读存储介质实施例:
上述计算机装置所存储的计算机程序如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述AI处理器的内存分配方法的各个步骤。
其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
最后需要强调的是,本发明不限于上述实施方式,例如所采用的启发式算法的变化,或者动态分配内存块的具体流程的改变等,这些改变也应该包括在本发明权利要求的保护范围内。
工业实用性
本发明可以应用于嵌入式端设备执行神经网络推理过程中内存的分配与管理,具体的,可以应用在不同应用场景中多种深度神经网络模型,例如输入尺寸固定的人脸检测网络和人脸识别网络,或者是输入尺寸变化的人脸检测网络,本发明在这些模型推理过程中均体现良好的效果。
例如,以人脸检测网络模型以ResNet18作为基础模型,输入图像尺寸为320×320大小,应用传统的内存分配方法进行推理时模型需要消耗11.8MB的内存空间,采用本发明中静态内存池式分配算法仅需消耗1.2MB的内存空间,减少了89.8%的内存消耗。
以人脸识别网络模型以ResNet101作为基础模型,输入图像尺寸为112×112大小,应用传统的内存分配方法进行推理时模型需要消耗21.5MB的内存空间,采用本发明中静态内存池式分配算法仅需消耗1.5MB的内存空间,减少了93%的内存消耗。
另外,本发明还支持输入尺寸不是固定尺寸的场景,例如针对支持任意输入图像尺寸的人脸检测网络,模型输入图像尺寸为480×480和320×320两种大小,应用传统的内存分配方法进行推理时总共需要消耗18.7MB的内存空间,采用本发明中动态内存池式分配算法仅需消耗2.9MB的内存空间,减少了84.5%的内存消耗。
从上面的数据可以看出,采用本发明的方法可以减少神经网络模型推理时的内存消耗,并能满足不同算法模型和应用场景的需求。
- AI处理器的内存分配方法、计算机装置及计算机可读存储介质
- 一种内存分配方法、装置、设备及计算机可读存储介质