CN112783640B - 预先分配内存的方法与设备、电路、电子设备及介质 - Google Patents
预先分配内存的方法与设备、电路、电子设备及介质 Download PDFInfo
- Publication number
- CN112783640B CN112783640B CN201911092427.8A CN201911092427A CN112783640B CN 112783640 B CN112783640 B CN 112783640B CN 201911092427 A CN201911092427 A CN 201911092427A CN 112783640 B CN112783640 B CN 112783640B
- Authority
- CN
- China
- Prior art keywords
- memory block
- output
- identifier
- block identifier
- layer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/0292—User address space allocation, e.g. contiguous or non contiguous base addressing using tables or multilevel address translation means
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0629—Configuration or reconfiguration of storage systems
- G06F3/0631—Configuration or reconfiguration of storage systems by allocating resources to storage systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/064—Management of blocks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2212/00—Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
- G06F2212/10—Providing a specific technical effect
- G06F2212/1016—Performance improvement
- G06F2212/1024—Latency reduction
Abstract
提供一种预先分配内存的方法与设备、电路、电子设备及介质。所述方法包括:针对神经网络每一层,对于每个输出,尝试从空闲内存块标识符表获取内存块标识符,若获取到,则将该输出的标识符与获取的内存块标识符存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除,若未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系存入输出与内存块标识符映射表,将新建的该内存块标识符放入内存块标识符总表中,以便依照该内存块标识符总表来创建整个神经网络前向计算所需的内存块;针对当前层的每个输入,如果作为该输入的前面层的输出未作为后续层的输入,则将与作为该输入的前面层的输出对应的内存块标识符放入空闲内存块标识符表。
Description
技术领域
本公开涉及内存管理领域,特别涉及一种用于为神经网络前向计算预先分配内存的方法与设备、电子电路、电子设备及计算机可读存储介质。
背景技术
近年来,神经网络技术在各领域得到了广泛的应用,但是对于内存资源非常有限的设备而言,可供神经网络利用的内存较少,大大限制了神经网络在这种设备上的应用及其性能。
在此部分中描述的方法不一定是之前已经设想到或采用的方法。除非另有指明,否则不应假定此部分中描述的任何方法仅因其包括在此部分中就被认为是现有技术。类似地,除非另有指明,否则此部分中提及的问题不应认为在任何现有技术中已被公认。
发明内容
根据本公开的一方面,提供一种用于为神经网络前向计算预先分配内存的方法,包括:从神经网络第一层开始,针对依次排列的神经网络的每一层,执行以下的计算步骤:针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符,如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,其中,所述输出与内存块标识符映射表用于记录该层的每个输出的标识符与对应的内存块标识符,而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
根据本公开的另一方面,提供一种用于为神经网络前向计算预先分配内存的设备,包括:计算单元,被配置用于执行以下操作:针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符,如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,其中,所述输出与内存块标识符映射表用于记录该层的每个输出的标识符与对应的内存块标识符,而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
根据本公开的另一方面,提供一种电子电路,包括:被配置为执行上述的方法的步骤的电路。
根据本公开的另一方面,还提供一种电子设备,包括:处理器;以及存储程序的存储器,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行上述的方法。
根据本公开的另一方面,还提供一种存储程序的非暂态计算机可读存储介质,所述程序包括指令,所述指令在由电子设备的处理器执行时,致使所述电子设备执行上述的方法。
附图说明
附图示例性地示出了实施例并且构成说明书的一部分,与说明书的文字描述一起用于讲解实施例的示例性实施方式。所示出的实施例仅出于例示的目的,并不限制权利要求的范围。在所有附图中,相同的附图标记指代类似但不一定相同的要素。
图1是示出根据本公开的一个示例性实施例的用于为神经网络前向计算预先分配内存的方法的流程图;
图2示出了一个神经网络结构的图形示例;
图3示出了一个输出被引用多次的示例;
图4示出了一个示例性的空闲内存块标识符表801;
图5示出了一个示例性的输出与内存块标识符映射表802;
图6示出了一个示例性的内存块标识符总表803;
图7示出了根据本公开的示例性实施例的、在计算步骤S100之前执行的步骤的流程;
图8(a)和图8(b)分别示出了示例性的输入集合804与输出集合805;
图9示出了一个示例性的输出与被引次数对应表806;
图10示出了根据本公开示例性实施例的生成所述输出与被引次数对应表806的方法的流程图;
图11示出了根据本公开示例性实施例的更新所述输出与被引次数对应表806的方法的流程图;
图12示出了一个示例性的已用内存块标识符与容量映射表807;
图13示出了根据本公开示例性实施例的内存分配步骤S200的流程图;
图14示出了根据本公开示例性实施例的内存预先分配设备1的示意性框图;
图15是示出根据本公开示例性实施例的电子设备的结构框图。
具体实施方式
在本公开中,除非另有说明,否则使用术语“第一”、“第二”等来描述各种要素不意图限定这些要素的位置关系、时序关系或重要性关系,这种术语只是用于将一个元件与另一元件区分开。在一些示例中,第一要素和第二要素可以指向该要素的同一实例,而在某些情况下,基于上下文的描述,它们也可以指代不同实例。
在本公开中对各种所述示例的描述中所使用的术语只是为了描述特定示例的目的,而并非旨在进行限制。除非上下文另外明确地表明,如果不特意限定要素的数量,则该要素可以是一个也可以是多个。此外,本公开中所使用的术语“和/或”涵盖所列出的项目中的任何一个以及全部可能的组合方式。
神经网络计算对于内存的消耗需求较大,例如深度神经网络中经常有很多层的卷积运算,从输入开始,要经过几层、几十层甚至上百层的卷积运算。现有技术中,对神经网络中每层的输出都分配内存,会需要非常大的内存容量,这对于内存容量非常有限的设备是一个很大的挑战。
对于内存容量小的设备,如果想节省内存,可以在每一层的计算结束时释放内存,并且在下一层计算开始时,根据实时需求来申请内存,由此,通过实时分配内存来提高内存利用率。但是,这样在每一层都临时申请和分配内存,尤其在神经网络的卷积层较多的情况下,比较耗时,大大影响整个神经网络的性能。
本公开提供了一种用于为神经网络前向计算预先分配内存的方法。图1是示出根据本公开的示例性实施例的用于为神经网络前向计算预先分配内存方法的流程图。
在神经网络的前向计算过程中,从输入层获取数据,然后依序逐层进行计算,在逐层计算过程中,从存储前面层的输出的内存中获取所需的数据,进行本层的运算,并将作为本层的输出的计算结果存储在内存中,供后面层使用。
如图1所示,根据本公开的示例性实施例的用于为神经网络前向计算预先分配内存的方法包括:从神经网络第一层开始,针对依次排列的神经网络的每一层,执行计算步骤S100。
对于如图2所示的一个神经网络结构,数据首先进入层1进行处理,然后层1的输出可以作为输入进入层2,再接着,层2的输出又作为输入进入层3,然后层3的输出又作为输入进入后续层,一直到该神经网络的最后一个层。
在本文中,上述的“层”可以是在神经网络中使用的各种层,例如卷积层、池化层、激活层、批量归一化层等等。
另外,为了便于理解和描述,图2给出的是一种简单的输入输出连接关系,即,上一层的输出直接作为下一层的输入。实际上,还可能存在一个层的输出不是直接作为紧邻的下一层的输入,而是作为后面的另外一层的输入的情况。此外,也可能存在一个层的某个输出作为后面多个层的输入的情况。即,可能会存在一个输出被几个输入引用的情况。当一个输出作为某个层的一个输入时,称为“该输出被引用一次”,当一个输出被作为不同层的输入(此时为多个输入)时,称为“该输出被引用多次”,图3给出了一个输出被引用多次的示例。从图3可以看出,池化层1’的一个输出Out1分别作为卷积层2’的一个输入In1、卷积层3’的一个输入In2、激活层4’的一个输入In3,则表明池化层的该输出Out1被后续层的输入引用了三次。
每个输出被后续的输入引用的次数依神经网络的具体结构而定,换言之,可以基于神经网络的具体结构,确定每个输出被后续的输入引用的次数。
在神经网络的每一层上,可以只做一个运算,例如在每一层做一个复杂的卷积运算或进行激活函数的运算等。当然,本公开对此不作限制,在神经网络中的一层或多层上也可以做多个运算。该层上的运算的输入和输出即为该层的输入和输出,如图3所示。
在执行神经网络的前向计算之前,可以在每一层,针对该层的运算执行所述计算步骤S100,该计算步骤S100采取内存复用(reuse)方式,预先为该层的每个输出,计算要在执行前向计算时分配给该输出使用的内存、以及要释放的内存(以供后续层继续使用,从而实现内存复用)。
所述计算步骤S100可以包括如下的步骤S101~S104。
首先,针对当前层的每个输出,在步骤S101,尝试从用于记录空闲内存块标识符的空闲内存块标识符表(Idle List)中获取内存块标识符(memory ID)。换言之,在本步骤,判断空闲内存块标识符表中是否还有内存块标识符,以用于该输出,如图1所示。
在本公开的计算步骤S100开始执行之前,可以将空闲内存块标识符表设置为空,意味着此时空闲内存块标识符表中没有内存块标识符。
空闲内存块标识符表的示例形式可以如图4所示,该空闲内存块标识符表801包含内存块标识符[MID1,MID2,……,MIDn],即,共有n个空闲的内存块标识符。
请注意,只有在确定要开始神经网络的前向计算时,才需要真正分配内存,在此之前进行的是内存的预先分配,并不对于真实的内存空间进行实际操作,即,根据本公开的示例性实施例的内存预先分配方法预先对内存空间进行规划,计算出每一层的内存占用和释放,却并不发生实际的内存占用和释放操作。在预先分配时,真正的内存空间还没有被创建,只有在要执行神经网络前向计算时才会依据内存块标识符来创建与其对应的实际的内存块。
在本文中,空闲内存块标识符表801用于记录空闲的内存块标识符,即,空闲内存块标识符表801中记录了将来在真正执行神经网络的前向计算时,在已经创建的各内存块之中,空闲(不被使用)的内存块所对应的内存块标识符。换言之,如果一个内存块标识符没有与一个输入的标识符或者输出的标识符对应,则可以视为是空闲的内存块标识符。
根据一些实施例,可以在针对整个神经网络前向计算的内存预先分配过程中,使用同一个空闲内存块标识符表801,在空闲内存块标识符表801里存储的是未被占用的内存块标识符。不过,如前所述,在每一层都可以对空闲内存块标识符表801进行更新,以准确地记录空闲的内存块标识符,实现高效的内存复用。
本文使用了内存块标识符来代表将来在执行神经网络前向计算时的内存块,通过这种方式,既不用在前向计算过程中对内存的分配和释放实时地进行计算,又能清楚地明确在执行前向计算时,每个输入及每个输出所对应的内存块。比如,“空闲的”内存块标识符可以表示在真正执行前向计算时“空闲”的内存块,“使用”的内存块标识符可以表示在真正执行前向计算时“占用”(或者“已用”)的内存块。
在本公开中,每个内存块标识符可以对应一个内存块,该内存块具有一定的容量。
根据一些实施例,如果在图1所示的步骤S101中从空闲内存块标识符表中获取的内存块标识符对应的内存块容量小于该输出所需的容量,则可以扩大该内存块标识符对应的内存块容量,以使得该内存块容量满足该输出的容量要求。
根据一些实施例,图1所示的步骤S101中的所述从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符可以包括:
如果空闲内存块标识符表中有多个空闲内存块标识符,且所述多个空闲内存块标识符对应的内存块容量均小于该输出所需的容量(即,空闲内存块标识符表中没有其容量等于或大于该输出所需的容量的内存块标识符),则从所述多个空闲内存块标识符之中,选取对应的内存块容量为最大的空闲内存块标识符,作为与该输出具有映射关系的内存块标识符。
请注意,虽然从所述多个空闲内存块标识符之中选取的是容量最大的那个空闲内存块标识符,但是其仍然是小于该输出所需的容量。因此,根据一些实施例,可以如上所述,扩大所选取的该内存块标识符对应的内存块容量,以使其至少等于该输出所需的容量。
根据一些实施例,扩大该内存块标识符对应的内存块容量可以包括:根据该输出所需的容量,来扩大该内存块标识符对应的内存块容量,以使其至少等于该输出所需的容量。
上面介绍了空闲内存块标识符表中的内存块标识符对应的内存块容量小于该输出所需的容量的情况以及采取的措施,下面将介绍其等于或大于该输出所需的容量的情况以及采取的措施。
根据一些实施例,图1所示的步骤S101中的所述从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符还可以包括:
如果空闲内存块标识符表中有多个空闲内存块标识符,则比较所述多个空闲内存块标识符各自对应的内存块容量与该输出所需的容量,并选取大于或等于该输出所需的容量的内存块容量之中的、与该输出所需的容量的差值为最小的内存块容量所对应的空闲内存块标识符,作为与该输出具有映射关系的内存块标识符。
换言之,对于上述的一个输出,如果在空闲内存块标识符表中有多个空闲内存块标识符可供选择作为该输出的对应内存块标识符,则可以从这多个空闲内存块标识符中筛选大于或等于该输出所需的容量的内存块标识符,然后从大于或等于该输出所需的容量的内存块标识符之中,选取其容量最接近该输出所需要的容量的那个内存块标识符。
举例来说,假如对于一个输出OUT1,空闲内存块标识符表801中有3个内存块标识符ID1、ID2、ID3可供选择,这三个内存块标识符的容量分别为1K字节、5K字节、8K字节,输出OUT1所需的容量为4K字节,则此时可以确定内存块标识符ID2和ID3的容量均大于输出OUT1,然后,从ID2和ID3之中,选择容量更接近该输出OUT1所需的容量4K字节的内存块标识符ID2作为该输出OUT1所对应的内存块标识符。
根据一些实施例,该输出所需的容量可以通过该输出的数据量与数据类型来确定。
在神经网络每一层的计算中,可以确定该层上的每一个输出的数据量与数据类型。比如,某个卷积层的一个输出的数据类型为浮点型(float),假设一个浮点型数据占4字节,该输出的数据量为200*200*5,则该输出所需的内存空间(即,该输出所需的容量)为200*200*5*4=800000字节。
上面描述了空闲内存块标识符表中存在至少一个内存块标识符,供该输出来选择使用的情况。即使空闲内存块标识符表中存在至少一个内存块标识符,也只能为一个输出选择一个对应的内存块标识符。
如果在步骤S101从空闲内存块标识符表中获取到内存块标识符,则在步骤S102,将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入用于记录该层的每个输出与对应的内存块标识符的“输出与内存块标识符映射表”,并从空闲内存块标识符表中删除该内存块标识符。
上述的“输出与内存块标识符映射表”802记录一层的每个输出在真正执行神经网络的前向计算时要使用的内存块标识符,因此,在该表中除了应当记录要使用的内存块标识符(MID)之外,还应当记录每个输出的标识符(OID),以便在该层的每个输出与相应的内存块标识符之间建立一一对应关系(如图5所示),在本文中将这种一一对应关系称为“映射关系”。顺便指出,本文中不仅有输出的标识符OID与相应的内存块标识符MID之间的映射关系,还有输出的标识符OID与其被引次数之间的映射关系,通过这样的映射关系,建立输出的标识符与内存块标识符、以及输出的标识符与被引次数之间的关联,有助于在预先计算时就能够确定实际运行时的内存占用情况和内存释放情况。
如果在步骤S101从空闲内存块标识符表中获取到内存块标识符,则表明在该层有内存块空闲并且已获取到一个空闲的内存块标识符,此时可以转到步骤S102,将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入“输出与内存块标识符映射表”802,以表明在神经网络前向计算真正执行时,在该层,该输出将要使用该内存块标识符所对应的内存块,即,该输出将在该层占用该内存块(也即占用该内存块标识符)。
既然在该层将占用该内存块标识符,即该内存块标识符将不再空闲,则可以将该内存块标识符从空闲内存块标识符表801中删除,以及时反映内存块标识符的空闲情况。
步骤S102描述了空闲内存块标识符表中有内存块标识符的情况,反之,如果空闲内存块标识符表中没有内存块标识符,则需要新建一个内存块标识符,以便将来在神经网络前向计算执行时有可以存放该输出的内存块。
因此,如果在步骤S101未从空闲内存块标识符表中获取到内存块标识符,表示没有空闲的内存块标识符,则可以转到步骤S103,新建一个内存块标识符,并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述“输出与内存块标识符映射表”802。
如上所述,每一层的“输出与内存块标识符映射表”802中存储了该层的每个输出的标识符与相应的内存块标识符之间的一一对应关系,无论该内存块标识符是从空闲内存块标识符表中获取到的,还是新建的,每个输出的标识符与相应的内存块标识符之间的一一对应关系意味着该输出将在该层占用该内存块标识符对应的内存块,由此,实现为每个层的每个输出预先分配内存,而不必在神经网络的前向计算实际执行时,临时申请内存分配,然后临时计算和部署内存如何分配,避免了在神经网络前向计算中花费申请和分配内存的时间,加快了计算速度。
并且,还可以将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表,创建神经网络前向计算所需的内存块。
如图6所示,所述“内存块标识符总表”803用于记录在整个神经网络前向计算中所用到的内存块的内存块标识符MID,也就是新建的内存块标识符在新建之后都要放到该表中,以便不漏过神经网络前向计算过程中将要使用的每一个内存块。
在步骤S102或者S103之后,可以在步骤S123判断当前层是否还有下一个输出,如果有,则转到步骤S101继续判断,直到对于当前层的每个输出都执行了步骤S101,并且从步骤S101转到步骤S102或者S103。如果判断当前层已经没有下一个输出,即已经针对当前层所有输出执行了步骤S101的判断,则转到步骤S104。
在步骤S104,针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
如前所述,如果一个输出被作为后续层的输入,表示该输出被后续层的输入引用。在本步骤中,通过判断当前层的每个输入所对应的前面层的输出是否被当前层之后的其他层的输入引用,即,判断作为当前层的输入的前面层的输出的被引次数是否等于1(仅被当前层的输入引用),如果是,则表示作为当前层的一个输入的该输出所占用的内存块标识符将变为空闲,可以放入空闲内存块标识符表。
从本步骤可以清楚地看出如何确定要存放在空闲内存块标识符表中的内存块标识符,步骤S101中要从空闲内存块标识符表获取的内存块标识符即是通过该方式来存放到空闲内存块标识符表中的。
通过步骤S104,可以更新每一层的空闲内存块标识符表中的内存块标识符,更确切地说,可以确定本层的新空闲出来的内存块标识符,由此可以确定每一层的内存块标识符空闲情况。通过每一层的内存块标识符空闲情况,可以在执行神经网络前向计算时进行内存复用(在步骤S101和S102,判断有空闲的内存块标识符,便可以直接使用该空闲的内存块标识符,从而在真正执行神经网络前向计算时实现内存复用),由此大大节省了内存使用量,提高了内存利用率。
本公开通过为神经网络前向计算采用内存复用的方式,预先分配内存,减少了在整个神经网络的前向计算过程中使用的内存量。而且由于已经预先分配好内存,所以,能够在神经网络前向计算开始之前,就先创建好整个神经网络前向计算要使用的内存,由此完全避免了在神经网络前向计算过程中需要经常计算内存的分配和释放,从而大大地节省了神经网络前向计算时间,提高了前向计算的效率。
本公开通过在神经网络前向计算开始之前,对每一层要使用的内存进行预先分配,避免了在神经网络前向计算过程中临时请求和分配内存,大大缩短了计算处理时间,加快了神经网络前向计算过程,从而有效提升整个神经网络的性能。并且,还在预先分配内存时,结合内存复用来减少内存的使用量,从而最大化利用和节约了嵌入式设备上非常有限的内存资源。
根据一些实施例,如图7所示,根据本公开的示例性实施例的用于为神经网络前向计算预先分配内存的方法还可以包括:
在所述计算步骤S100之前,执行步骤S110,以便分别为神经网络的每一层构建该层的输入集合和输出集合。
如图8(a)所示,为神经网络的每一层所构建的所述输入集合804中的每个元素包括该层的每个输入的标识符IID、数据量Data-In、以及指向用于存储该输入的内存块地址的内存块指针In-Pointer。图8(a)中示例的该输入集合有k个元素,其中k大于等于1。
类似地,如图8(b)所示,为神经网络的每一层所构建的所述输出集合805的每个元素包括该层的每个输出的标识符OID、数据量Data-Out、以及指向用于存储该输出的内存块地址的内存块指针Out-Pointer。图8(b)中示例的该输出集合有m个元素,其中m大于等于1。
通过这样为每一层构建相应的输入集合804,将一个层的输入相关的输入标识符、数据量与内存块指针(内存块指针在开始执行神经网络前向计算之前都为空)共同存放在一个输入集合中,便于集中管理和灵活取用这些数据。类似地,通过这样为每一层构建相应的输出集合805,将一个层的输出相关的输出标识符、数据量与内存块指针(内存块指针在开始执行神经网络前向计算之前都为空)共同存放在一个输出集合中,同样便于集中管理和灵活取用这些数据。由此,可以简化内存预先分配的计算过程。在后面将举一个具体的示例来进一步详细描述,以使得更容易理解本公开的内容。
根据一些实施例,如图7所示,根据本公开的示例性实施例的用于为神经网络前向计算预先分配内存的方法还可以包括:
在所述计算步骤S100之前,执行步骤S120,以统计神经网络中每个输出作为该输出的后续层的输入的次数,作为该输出的被引次数,并生成用于记录每个输出与该输出的被引次数的映射关系的输出与被引次数对应表(如图9所示)。
根据一些实施例,可以通过输出与被引次数对应表806中记录(逐层更新)的一个输出的被引次数,来判断该输出对应的内存块标识符是否要变成空闲的内存块标识符。
根据一些实施例,如图10所示,步骤S120中的所述统计神经网络中每个输出作为该输出的后续层的输入的次数,作为该输出的被引次数,并生成用于记录每个输出与该输出的被引次数的映射关系的输出与被引次数对应表包括:
对于神经网络的每一层,
在步骤S1201,获取当前层的每个输入,并确定所述输出与被引次数对应表806中是否已有作为该输入的前面层的输出与该输出的被引次数的映射关系,如果有(表明在该层作为该输入的前面层的该输出在当前层之前已经被引用过),则将该前面层的输出的被引次数加上单位数量;如果没有,则表明该输入没有前面层的输出相对应,即,该输入不是从前面层的输出传递而来,此时不涉及输出与输出的被引次数的相关操作;以及
在步骤S1202,获取当前层的输出,并在所述输出与被引次数对应表806中新建作为一对映射关系的该输出与该输出的被引次数,其中,将与该输出具有映射关系的被引次数初始化为第一特定值。
这里,所述单位数量可以为1,所述第一特征值可以为0。
例如,作为当前层的输出,在本层尚未被任何一个输入引用,因此其被引次数可以初始化为0。如果该输出在后续层被一个输入引用,则其被引次数在该后续层时加1,即,变为1。
在这种情况下,作为某层的输入,如果输出与被引次数对应表806中已经有作为该输入的前面层的输出与该输出的被引次数的映射关系,则表明该输入是从输出传递而来,此时可以给该输出的被引次数加1,以表明本层的该输入对于该输出的引用。如果没有,则表明该输入不是从输出传递而来,因此可以不涉及输出与输出的被引次数的相关操作。
根据一些实施例,如图11所示,所述针对神经网络的每一层,执行所述计算步骤S100还可以包括步骤S1041,其中,步骤S1041通过将作为当前层的输入的前面层的输出的被引次数减去所述单位数量,更新所述输出与被引次数对应表;以及
步骤S1042,基于更新的所述输出与被引次数对应表中的每个输出的被引次数,来判断是否要将该输出对应的内存块标识符放入空闲内存块标识符表,由此来获得在实际执行神经网络前向计算时的内存复用。
如前所述,所述单位数量可以为1,即,每当一个输出被一个输入引用一次,该输出的被引次数就加1。反之,在逐层计算内存分配的过程中,每执行一个层的计算,该层的输入可能会引用前面层(不一定是紧挨在前面的那一层)的输出,所以进展到该层时,作为该输入的所述前面层的该输出的被引次数应该减1。
根据一些实施例,步骤S104中的所述如果作为该输入的前面层的输出未作为该当前层的后续层的输入(即,该输出的被引次数此时为1:该输出还在被该输入引用,所以为1),则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表包括:
如果所述前面层的输出的被引次数在减去所述单位数量后变为第二特定值,则将该前面层的输出对应的内存块标识符放入所述空闲内存块标识符表。
该操作可以看作是步骤S1042的具体化操作。例如,如果所述前面层的输出的被引次数在减去1(作为所述单位数量的一个示例)之后变为0(作为所述第二特定值的一个示例),表示该输出对应的内存块标识符可以成为空闲内存块标识符了,则将该输出对应的内存块标识符放入所述空闲内存块标识符表。
由此,通过预先基于神经网络的每一层的输入和输出的情况,计算每一层的每个输出对应的内存块标识符(在执行神经网络前向计算时,一个内存块标识符将对应于一个真正的内存块),由此大大节省了在执行神经网络前向计算时,在每一层实时地申请内存、实时地计算内存的分配以及实时地分配内存、实时地计算内存的释放并且实时地释放内存的时间,加快了处理速度,并且还更新空闲内存块标识符表中记录的内存块标识符,以便实现内存复用,高效利用设备中宝贵的内存资源。
根据一些实施例,所获取或创建的内存块标识符与对应的内存块容量作为一对映射关系存储在用于记录在当前层使用的内存块标识符与对应的内存块容量的已用内存块标识符与容量映射表中,并且,响应于内存块容量的所述扩大,在所述已用内存块标识符与容量映射表中更新相应的内存块标识符的内容块容量。
其中,所述已用内存块标识符与容量映射表807也可以称为内存块描述符,用于记录内存块标识符、内存块容量等,以便在内存块标识符与其对应的内存块容量之间建立关联如图12所示。前面提到的内存块标识符所对应的内存容量,可以从该表获取到。另外,该表807中还可以包括该内存块标识符对应的内存块中存储的数据的类型(图12所示的“数据类型”字段)。
在前面所述的扩大内存块容量的情况下,可以在所述已用内存块标识符与容量映射表807中更新相应的内存块标识符的内容块容量,由此使得预先规划的内存块标识符要对应的内存块的容量能够满足足够存储数据的要求。
根据一些实施例,所述输出与内存块标识符映射表802中存储所述神经网络的所有输出的标识符与相应的内存块标识符之间的映射关系。
通过在所述输出与内存块标识符映射表802中存储所述神经网络的所有输出的标识符与相应的内存块标识符之间的映射关系,用于记录每一层的输出所占用的内存块,可以在执行神经网络前向计算时,容易地直接给每个输出分配预先计算的内存块标识符对应的内存块。这里,可以每一层有一个输出与内存块标识符映射表802,也可以使得该表802是针对整个神经网络的所有层得到的一个总表。
根据一些实施例,根据本公开的用于为神经网络前向计算预先分配内存的方法还可以在计算步骤S100之后,包括内存分配步骤S200。
如图13所示,所述内存分布步骤S200可以包括如下的步骤S201和S202。
在步骤S201,为所述内存块标识符总表中的每个内存块标识符创建一个内存块指针。
如前所述,所述内存块标识符总表803中记录的是为神经网络的每个层创建的内存块标识符,因此在该表中出现的内存块标识符,其对应的内存块都将在神经网络前向计算中使用到。所以,作为神经网络前向计算开始执行的准备,可以先为其分配好所需的内存。而神经网络前向计算所需的内存可以依据所述内存块标识符总表803来创建,例如,为一个内存块标识符对应地创建一个内存块,所创建的内存块的容量可以根据与内存块标识符有关的内存块描述符来确定。
在本公开中,通过为内存块标识符创建内存块指针,使得该内存块指针指向真正的内存块,为内存块标识符一一对应地创建真正的内存块。
在步骤S202,依据所述输出与内存块标识符映射表中记录的映射关系,将每一层的输出与具有映射关系的内存块标识符的内存块指针关联。
如前所述,所述输出与内存块标识符映射表中记录的是每个输出与内存块标识符之间的映射关系,因此,通过将当前层的输出与具有映射关系的内存块标识符的内存块指针关联,为当前层的输出分配内存,由此实现了真正的内存分配。换言之,依据步骤S100中的内存预先分配,实现了步骤S200的内存真正分配。
在本步骤中,在每一层,参照所述输出与内存块标识符映射表802,即可得到本层的输出的内存分配结果,无需每一层都重新申请和重新计算与分配内存,节省了实时申请和分配内存的时间,加快了神经网络前向计算的速度。
下面将简要地举例说明如何实现根据本公开的一个示例性实施例的用于为神经网络前向计算预先分配内存的方法。请注意,在本例中,不一定能够涉及到上面描述的每一个详细的步骤或操作,但是本领域技术人员结合本文中描述的内容以及上下文关联,应该明白那些没有描述到的步骤或操作是如何实现的。
例如,可以通过TensorFlow(一种基于数据流编程符号数学系统),将一个神经网络中每一层的运算抽象成一个运算(operation)类,每个运算类中可以包含上述的输入集合804和输出集合805,所述输入集合804与输出集合805中的每个输入与每个输出都可以抽象成张量(tensor)类。张量类中包含张量的标识符(例如张量的名称)、张量的形状、以及该张量的地址指针。
TensorFlow使用张量来表示数据。张量是一种数据结构,可以看作n维数据。张量有三个属性:维数、形状(表示第i维的元素数量,i=1,2,……,n)、数据类型。
其中,张量的标识符例如可以是张量的名称。张量的形状用于表示第i维的元素数量,通过张量的形状,可以容易地得到其容量。张量的地址指针用于指向该张量所使用的内存地址,即前文描述的“内存块指针”。
对于神经网络而言,在一层上进行一个运算,比如卷积运算、池化运算等等。
对于每层上的运算,可以例如用以下所示的运算类来表示。
对于可用于表示上文所述的输入和输出的张量类,给出如下的示例形式。
其中,从张量的形状[300,300,3]以及该张量类中定义的数据类型int(假设每个int类型数据可以占用4个字节的内存),可以得到该张量(输入或输出)的数据量为:300*300*3*4=1080000字节。
对于张量的地址指针(内存块指针),在步骤S220进行内存分配之后,其不再为空,而是会指向对应内存块的地址,将给出一个示例如下。
上面给出了可作为输入和输出的张量的实施示例,以及可作为内存块指针的张量的地址指针的实施示例。
对于针对一个神经网络的前向计算的内存预先分配任务而言,可以先解析神经网络结构,确定该结构中包含的各个运算节点以及各个运算节点之间的关系,然后可以构造一个一维的运算向量表,例如[operation1,operation2,……]。此向量表中可以存储有该神经网络的所有运算以及这些运算的执行顺序。通过该向量表中的每个运算向量(运算类),获得每个运算类中的输入集合与输入集合。
对于上述的表801~807,其中的输入标识符与输出标识符可以是上面举例说明的张量的标识符,一个输入或者输出的数据量可以是通过在上面举例说明的方法确定的作为该输入或者输出的张量的数据量。
下面将举例描述基于根据本公开的示例性实施例的内存预先分配方法来为神经网络的前向计算分配内存的过程。请注意,下面示出的具体步骤及其先后顺序仅是一个为了使得容易理解而提供的示例性的实施方式,本公开不应受到该示例性的实施方式的限制,而是应该基于本文通篇的描述,以权利要求书限定的范围为准。
具体地,该例的步骤如下。
步骤1):基于上述的运算向量表,例如可以依次针对运算向量表中的每个运算,来统计输出的被引次数。
如上所述,可以使用输出与被引次数对应表806来记录并且更新输出与被引次数之间的映射关系。
其中,如前面所提到的,通过该运算向量表中的每个运算向量(运算类),可以获得每个运算类中的输入集合与输入集合。因此,基于运算本身(其输入与输出)以及运算之间的关系(比如运算顺序),可以得到输出与其被引次数之间的映射关系,由此可以得到输出与被引次数对应表806。
步骤2):基于上述的运算向量表,针对其中的每个运算,得到该运算的输出集合中的输出张量,针对每个输出张量,进行如下的用于为该运算(即该层)中的每个输出张量映射一个内存块标识符的操作:
i.尝试从上述的空闲内存块标识符表801中获取一个内存块标识符;
ii.如果从上述的空闲内存块标识符表801中,为该输出张量获取到一个内存块标识符,则基于内存块标识符来查找已用内存块标识符与容量映射表(内存块描述符)807,比较该输出张量的数据量(该输出所需的数据量)与内存块描述符807中记录的内存块容量。
这里,请注意,已用内存块标识符与容量映射表(内存块描述符)807中记录的是内存块标识符与其对应的内存块的容量,该表可以初始化为空。并且,在针对一个输出张量而新建一个内存块标识符之后,该表中记录的该内存块标识符对应的内存块容量是该输出的数据量,并且,如上所述,随着逐层预先计算,该内存块标识符对应的内存块容量可以随着所对应的输出不同而不同,更确切地说,如果该内存块标识符在后续对应的某个输出的数据量比之前对应的某个输出的数据量大,则该内存块标识符对应的内存块容量也可以随之变大,下面将进行描述。
iii.当内存块描述符807中记录的对应的内存块容量小于该输出张量的数据量时,可以基于该输出张量的数据量来更新该内存块容量,以使得该内存块容量至少等于该输出张量的数据量,然后可以将该内存块标识符从空闲内存块标识符表中移除,并且将该输出张量的标识符与该内存块标识符作为一对映射关系存放到输出与内存块标识符映射表802中,以表明在将来执行该运算时,该输出张量要占用该内存块标识符对应的内存块。
iv.如果从上述的空闲内存块标识符表801中,没有为该输出张量获取到一个内存块标识符,则可以创建新的内存块标识符,并将该新建的内存块标识符存放到内存块标识符总表803中,并且还将该输出张量的标识符和新建的该内存块标识符作为一对映射关系存放到输出与内存块标识符映射表802中,以表明在将来执行该运算时,该输出张量要占用该内存块标识符对应的内存块。
如前所述,该表803中存放所有新建的内存块标识符,即,在该神经网络的前向计算中要使用到的所有内存块标识符。
v.判断是否已针对该运算中每个输出张量进行上述操作,如果是,则转到步骤i)继续执行,如果不是,则转到下面的步骤3)。
步骤3):基于上述的运算向量表,针对其中的每个运算,得到该运算的输入集合中的输入张量,针对该运算的输入集合中的输入张量,进行如下的用于基于输入张量对于输出张量的引用关系,更新空闲内存块标识符表801的操作:
i.针对每个输入张量,在输出与被引次数对应表806中查找该输入张量的标识符(实际是其引用的前面层的输出张量的标识符,如果该输入张量是由前面层的输出张量传递而来)与被引次数的映射关系;
ii.如果在表806中查找到该映射关系,则使得该映射关系中的被引次数例如减1,以将本层的该输入对该输出的引用(本层的被引次数为1)先减去,如果被引次数减1之后为0,则表明前面层的该输出张量在后续没有再被引用,其对应的内存块标识符可以变为空闲,因此,可以将该内存块标识符放入空闲内存块标识符表,由此实现执行神经网络前向计算时的内存复用;
iii.如果没有查找到这样的映射关系,说明该输入张量没有引用任何输出张量,那么可以进入下述的步骤iv;
iv.判断该运算中是否还有输入张量,如果有,则转到上述的步骤i,如果没有,则进入下述的步骤4。
通过上面例示的步骤1)~3),可以实现根据本公开的示例性实施例的用于为神经网络前向计算预先分配内存的方法。如前所述,通过使用该方法,可以加快神经网络前向计算的速度,提高内存利用率。
下面的步骤4)将示例性地给出要执行神经网络前向计算之前进行的内存分配操作。
步骤4):针对所述输出与内存块标识符映射表802中的每个内存块标识符,创建该内存块标识符对应的内存块指针(张量的地址指针),然后依据所述输出与内存块标识符映射表802中记录每一层(每个运算)的每个输出与内存块标识符的映射关系,将每个输出与具有映射关系的内存块标识符的内存块指针(张量的地址指针)关联,这样就可以在例如神经网络前向计算的初始化过程中将内存分配好,在神经网络前向计算过程中可以直接使用分配好的内存,由此大大加速了神经网络的前向计算。
上面以TensorFlow为例说明了本公开的一个示例性实施方式。请注意,本公开不限制使用哪种方式来实现,无论哪种方式,只要能够实现本公开的实质即可。
根据一些实施例,如图14所示,本公开提供一种用于为神经网络前向计算预先分配内存的设备1(也可称为内存预先分配设备1),其可以包括:计算单元100、以及预先分配单元200。
其中,计算单元100可以被配置用于从神经网络的第一层开始,针对依次排列的神经网络的每一层,执行以下操作:
针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符,
如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入用于记录该层的每个输出的标识符与对应的内存块标识符的输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,
而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及
针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
计算单元100的操作与前面描述的步骤S100的操作类似,鉴于篇幅关系,在此不再赘述。
根据一些实施例,如图14所示,内存预先分配设备1还可以包括预先分配单元200。
其中,该预先分配单元200可以被配置用于:为所述内存块标识符总表中的每个内存块标识符创建一个内存块指针;以及依据所述输出与内存块标识符映射表中记录的映射关系,将每一层的输出与具有映射关系的内存块标识符的内存块指针关联。
预先分配单元200的操作与前面描述的步骤S200的操作类似,鉴于篇幅关系,在此也不再赘述。
如前所述,通过使用根据本公开的内存预先分配设备1,可以加快神经网络前向计算的速度,提高内存利用率。
根据本公开的另一方面,还提供一种电子电路2100,可以包括:被配置为执行上述的方法的步骤的电路。根据本公开的另一方面,还提供一种电子设备2000,包括:处理器;以及存储程序的存储器,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行上述的方法。根据本公开的另一方面,还提供一种存储程序的非暂态计算机可读存储介质,所述程序包括指令,所述指令在由电子设备的处理器执行时,致使所述电子设备执行上述的方法。
图15是示出根据本公开的示例性实施例的电子设备的示例的框图。要注意的是,图15所示出的结构仅是一个示例,根据具体的实现方式,本公开的电子设备可以仅包括图15所示出的组成部分中的一种或多个。
电子设备2000例如可以是通用计算机(例如膝上型计算机、平板计算机等等各种计算机)、移动电话、个人数字助理、以及各种智能设备。
根据一些实施方式,电子设备2000可以包括通信电路2010,所述通信电路2010可以是使得能够与外部设备和/或与网络通信的任何类型的设备或系统,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信设备和/或芯片组,例如蓝牙设备、1302.11设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
根据一些实施方式,电子设备2000还可以包括输入设备2011,所述输入设备2011可以是能向电子设备2000输入信息的任何类型的设备,并且可以包括但不限于各种传感器、鼠标、键盘、触摸屏、按钮、控制杆、麦克风和/或遥控器等等。
根据一些实施方式,电子设备2000还可以包括输出设备2012,所述输出设备2012可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、视觉输出终端、振动器和/或打印机等。尽管电子设备2000根据一些实施例用于视障辅助设备,基于视觉的输出设备可以方便用户的家人或维修工作人员等从电子设备2000获得输出信息。
根据一些实施方式,电子设备2000还可以包括处理器2001。所述处理器2001可以是任何类型的处理器,并且可以包括但不限于一个或多个通用处理器和/或一个或多个专用处理器(例如特殊处理芯片)。处理器2001例如可以是但不限于中央处理单元CPU或微处理器MPU等等。电子设备2000还可以包括工作存储器2002,所述工作存储器2002可以存储对处理器2001的工作有用的程序(包括指令)和/或数据(例如图像、文字、声音,以及其他中间数据等)的工作存储器,并且可以包括但不限于随机存取存储器和/或只读存储器设备。电子设备2000还可以包括存储设备2003,所述存储设备2003可以用于存储上述的各表801~807。存储设备2003可以包括任何非暂时性存储设备,非暂时性存储设备可以是非暂时性的并且可以实现数据存储的任何存储设备,并且可以包括但不限于磁盘驱动器、光学存储设备、固态存储器、软盘、柔性盘、硬盘、磁带或任何其他磁介质,光盘或任何其他光学介质、ROM(只读存储器)、RAM(随机存取存储器)、高速缓冲存储器和/或任何其他存储器芯片或盒、和/或计算机可从其读取数据、指令和/或代码的任何其他介质。工作存储器2002和存储设备2003可以被集合地称为“存储器”,并且在有些情况下可以相互兼用。
根据一些实施方式,处理器2001可以对通信电路2010、电子电路2100以及电子设备2000包括的其他各种装置和电路中的至少一个进行控制和调度。根据一些实施方式,图15中所述的各个组成部分中的至少一些可通过线路2013而相互连接和/或通信。
软件要素(程序)可以位于工作存储器2002中,包括但不限于操作系统2002a、一个或多个应用程序2002b、驱动程序和/或其他数据和代码。
根据一些实施方式,用于进行前述的控制和调度的指令可以被包括在操作系统2002a或者一个或多个应用程序2002b中。
根据一些实施方式,执行本公开所述的方法步骤的指令可以被包括在一个或多个应用程序2002b中,并且上述电子设备2000的各个模块可以通过由处理器2001读取和执行一个或多个应用程序2002b的指令来实现。换言之,电子设备2000可以包括处理器2001以及存储程序的存储器(例如工作存储器2002和/或存储设备2003),所述程序包括指令,所述指令在由所述处理器2001执行时使所述处理器2001执行如本公开各种实施例所述的方法。
根据一些实施方式,电子电路2100中的至少一个所执行的操作中的一部分或者全部可以由处理器2001读取和执行一个或多个应用程序2002b的指令来实现。
软件要素(程序)的指令的可执行代码或源代码可以存储在非暂时性计算机可读存储介质(例如所述存储设备2003)中,并且在执行时可以被存入工作存储器2002中(可能被编译和/或安装)。因此,本公开提供存储程序的计算机可读存储介质,所述程序包括指令,所述指令在由电子设备(例如视障辅助设备)的处理器执行时,致使所述电子设备执行如本公开各种实施例所述的方法。根据另一种实施方式,软件要素(程序)的指令的可执行代码或源代码也可以从远程位置下载。
还应该理解,可以根据具体要求而进行各种变型。例如,也可以使用定制硬件,和/或可以用硬件、软件、固件、中间件、微代码,硬件描述语言或其任何组合来实现各个电路、单元、模块或者元件。例如,所公开的方法和设备所包含的电路、单元、模块或者元件中的一些或全部可以通过使用根据本公开的逻辑和算法,用汇编语言或硬件编程语言(诸如VERILOG,VHDL,C++)对硬件(例如,包括现场可编程门阵列(FPGA)和/或可编程逻辑阵列(PLA)的可编程逻辑电路)进行编程来实现。
根据一些实施方式,电子设备2000中的处理器2001可以分布在网络上。例如,可以使用一个处理器执行一些处理,而同时可以由远离该一个处理器的另一个处理器执行其他处理。电子设备2000的其他模块也可以类似地分布。这样,电子设备2000可以被解释为在多个位置执行处理的分布式计算系统。
本公开提供一种用于为神经网络前向计算预先分配内存的方法,包括:从神经网络第一层开始,针对依次排列的神经网络的每一层,执行以下的计算步骤:针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符;如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,其中,所述输出与内存块标识符映射表用于记录该层的每个输出的标识符与对应的内存块标识符;而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
其中,每个内存块标识符对应一个内存块容量。根据一些实施例,如果从空闲内存块标识符表获取的内存块标识符对应的内存块容量小于该输出所需的容量,则扩大该内存块标识符对应的内存块容量。
根据一些实施例,所述从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符包括:如果空闲内存块标识符表中有多个空闲内存块标识符,且所述多个空闲内存块标识符对应的内存块容量均小于该输出所需的容量,则从所述多个空闲内存块标识符之中,选取对应的内存块容量最大的空闲内存块标识符,作为与该输出具有映射关系的内存块标识符。
根据一些实施例,所述如果从空闲内存块标识符表获取的内存块标识符对应的内存块容量小于该输出所需的容量,则扩大该内存块标识符对应的内存块容量包括:针对上述的从所述多个空闲内存块标识符之中所选取的、对应的内存块容量最大的空闲内存块标识符,将该内存块标识符对应的内存块容量扩大为至少等于该输出所需的容量。
根据一些实施例,所述如果从空闲内存块标识符表获取的内存块标识符对应的内存块容量小于该输出所需的容量,则扩大该内存块标识符对应的内存块容量包括:根据该输出所需的容量,扩大该内存块标识符对应的内存块容量,以使该内存块容量至少等于该输出所需的容量。
根据一些实施例,所述从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符包括:如果空闲内存块标识符表中有多个空闲内存块标识符,则比较所述多个空闲内存块标识符各自对应的内存块容量与该输出所需的容量,并选取大于或等于该输出所需的容量的内存块容量之中的、与该输出所需的容量的差值为最小的内存块容量所对应的空闲内存块标识符,作为与该输出具有映射关系的内存块标识符。
根据一些实施例,上述的该输出所需的容量通过该输出的数据量与数据类型来确定。
根据一些实施例,上述的方法还包括:在所述计算步骤之前,分别为神经网络的每一层构建该层的输入集合和输出集合,其中,每一层的所述输入集合中的每个元素包括该层的每个输入的标识符、数据量、以及指向用于存储该输入的内存块地址的内存块指针,每一层的所述输出集合的每个元素包括该层的每个输出的标识符、数据量、以及指向用于存储该输出的内存块地址的内存块指针。
根据一些实施例,上述的方法还包括:在执行所述计算步骤之前,统计神经网络中每个输出作为该输出的后续层的输入的次数,作为该输出的被引次数,并生成用于记录每个输出与该输出的被引次数的映射关系的输出与被引次数对应表。
根据一些实施例,所述统计神经网络中每个输出作为该输出的后续层的输入的次数,作为该输出的被引次数,并生成用于记录每个输出与该输出的被引次数的映射关系的输出与被引次数对应表包括:对于神经网络的每一层,获取当前层的输入,并确定所述输出与被引次数对应表中是否已有作为该输入的前面层的输出与该输出的被引次数的映射关系,如果是,则将该前面层的输出的被引次数加上单位数量;以及获取当前层的输出,并在所述输出与被引次数对应表中新建作为一对映射关系的该输出与该输出的被引次数,其中,将与该输出具有映射关系的被引次数初始化为第一特定值。
根据一些实施例,针对每一层,执行所述计算步骤还包括:通过将作为当前层的输入的前面层的输出的被引次数减去所述单位数量,更新所述输出与被引次数对应表。
根据一些实施例,所述如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表包括:如果所述前面层的输出的被引次数在减去所述单位数量后变为第二特定值,则将该前面层的输出对应的内存块标识符放入所述空闲内存块标识符表。
根据一些实施例,所获取或创建的内存块标识符与对应的内存块容量作为一对映射关系存储在用于记录在当前层使用的内存块标识符与对应的内存块容量的已用内存块标识符与容量映射表中,并且,响应于内存块容量的所述扩大,在所述已用内存块标识符与容量映射表中更新相应的内存块标识符的内容块容量。
根据一些实施例,所述输出与内存块标识符映射表中存储有所述神经网络的所有输出的标识符与相应的内存块标识符的映射关系。
根据一些实施例,上述的方法还包括以下的内存分配步骤:为所述内存块标识符总表中的每个内存块标识符创建一个内存块指针;以及依据所述输出与内存块标识符映射表中记录的映射关系,将每一层的输出与具有映射关系的内存块标识符的内存块指针关联。
本公开还提供一种用于为神经网络前向计算预先分配内存的设备,该设备包括:计算单元,被配置用于从所述神经网络的第一层开始,针对依次排列的神经网络的每一层,执行以下操作:从神经网络第一层开始,针对依次排列的神经网络的每一层,执行以下的计算步骤:针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符,如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,其中,所述输出与内存块标识符映射表用于记录该层的每个输出的标识符与对应的内存块标识符,而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
根据一些实施例,上述的设备还包括预先分配单元,该预先分配单元被配置用于:为所述内存块标识符总表中的每个内存块标识符创建一个内存块指针;以及依据所述输出与内存块标识符映射表中记录的映射关系,将每一层的输出与具有映射关系的内存块标识符的内存块指针关联。
本公开还提供一种电子电路,该电子电路包括被配置为执行上述的方法之一的步骤的电路。本公开还提供一种电子设备,该电子设备包括:处理器;以及存储程序的存储器,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行上述方法之一。本公开还提供一种存储程序的非暂态计算机可读存储介质,所述程序包括指令,所述指令在由电子设备的处理器执行时,致使所述电子设备执行上述方法之一。
虽然已经参照附图描述了本公开的实施例或示例,但应理解,上述的方法、系统和设备仅仅是示例性的实施例或示例,本公开的范围并不由这些实施例或示例限制,而是仅由权利要求书及其等同范围来限定。实施例或示例中的各种要素可以被省略或者可由其等同要素替代。此外,可以通过不同于本公开中描述的次序来执行各步骤。进一步地,可以用各种方式组合实施例或示例中的各种要素。重要的是随着技术的演进,在此描述的很多要素可以由本公开之后出现的等同要素进行替换。
Claims (19)
1.一种用于为神经网络前向计算预先分配内存的方法,包括:
从神经网络第一层开始,针对依次排列的神经网络的每一层,执行以下的计算步骤:
针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符;
如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,其中,所述输出与内存块标识符映射表用于记录该层的每个输出的标识符与对应的内存块标识符;
而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及
针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
2.根据权利要求1所述的方法,其中,每个内存块标识符对应一个内存块容量,
如果从空闲内存块标识符表获取的内存块标识符对应的内存块容量小于该输出所需的容量,则扩大该内存块标识符对应的内存块容量。
3.根据权利要求2所述的方法,其中,所述从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符包括:
如果空闲内存块标识符表中有多个空闲内存块标识符,且所述多个空闲内存块标识符对应的内存块容量均小于该输出所需的容量,则从所述多个空闲内存块标识符之中,选取对应的内存块容量最大的空闲内存块标识符,作为与该输出具有映射关系的内存块标识符;
其中,所述如果从空闲内存块标识符表获取的内存块标识符对应的内存块容量小于该输出所需的容量,则扩大该内存块标识符对应的内存块容量包括:
针对从所述多个空闲内存块标识符之中所选取的、对应的内存块容量最大的空闲内存块标识符,将该内存块标识符对应的内存块容量扩大为至少等于该输出所需的容量。
4.根据权利要求2所述的方法,其中,所述如果从空闲内存块标识符表获取的内存块标识符对应的内存块容量小于该输出所需的容量,则扩大该内存块标识符对应的内存块容量包括:
根据该输出所需的容量,扩大该内存块标识符对应的内存块容量,以使该内存块容量至少等于该输出所需的容量。
5.根据权利要求1所述的方法,其中,每个内存块标识符对应一个内存块容量,
其中,所述从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符包括:
如果空闲内存块标识符表中有多个空闲内存块标识符,则比较所述多个空闲内存块标识符各自对应的内存块容量与该输出所需的容量,并选取大于或等于该输出所需的容量的内存块容量之中的、与该输出所需的容量的差值为最小的内存块容量所对应的空闲内存块标识符,作为与该输出具有映射关系的内存块标识符。
6.根据权利要求2~5中的任一项所述的方法,其中,该输出所需的容量通过该输出的数据量与数据类型来确定。
7.根据权利要求1~5中的任一项所述的方法,还包括:
在所述计算步骤之前,分别为神经网络的每一层构建该层的输入集合和输出集合,
其中,每一层的所述输入集合中的每个元素包括该层的每个输入的标识符、数据量、以及指向用于存储该输入的内存块地址的内存块指针,每一层的所述输出集合的每个元素包括该层的每个输出的标识符、数据量、以及指向用于存储该输出的内存块地址的内存块指针。
8.根据权利要求1~5中的任一项所述的方法,还包括:
在执行所述计算步骤之前,统计神经网络中每个输出作为该输出的后续层的输入的次数,作为该输出的被引次数,并生成用于记录每个输出与该输出的被引次数的映射关系的输出与被引次数对应表。
9.根据权利要求8所述的方法,其中,所述统计神经网络中每个输出作为该输出的后续层的输入的次数,作为该输出的被引次数,并生成用于记录每个输出与该输出的被引次数的映射关系的输出与被引次数对应表包括:
对于神经网络的每一层,
获取当前层的输入,并确定所述输出与被引次数对应表中是否已有作为该输入的前面层的输出与该输出的被引次数的映射关系,如果是,则将该前面层的输出的被引次数加上单位数量;以及
获取当前层的输出,并在所述输出与被引次数对应表中新建作为一对映射关系的该输出与该输出的被引次数,其中,将与该输出具有映射关系的被引次数初始化为第一特定值。
10.根据权利要求9所述的方法,其中,针对每一层,执行所述计算步骤还包括:
通过将作为当前层的输入的前面层的输出的被引次数减去所述单位数量,更新所述输出与被引次数对应表。
11.根据权利要求10所述的方法,其中,所述如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表包括:
如果所述前面层的输出的被引次数在减去所述单位数量后变为第二特定值,则将该前面层的输出对应的内存块标识符放入所述空闲内存块标识符表。
12.根据权利要求2~4中的任一项所述的方法,其中,所获取或创建的内存块标识符与对应的内存块容量作为一对映射关系存储在用于记录在当前层使用的内存块标识符与对应的内存块容量的已用内存块标识符与容量映射表中,并且,响应于内存块容量的所述扩大,在所述已用内存块标识符与容量映射表中更新相应的内存块标识符的内容块容量。
13.根据权利要求1~5中的任一项所述的方法,其中,所述输出与内存块标识符映射表中存储有所述神经网络的所有输出的标识符与相应的内存块标识符的映射关系。
14.根据权利要求1所述的方法,还包括以下的内存分配步骤:
为所述内存块标识符总表中的每个内存块标识符创建一个内存块指针;以及
依据所述输出与内存块标识符映射表中记录的映射关系,将每一层的输出与具有映射关系的内存块标识符的内存块指针关联。
15.一种用于为神经网络前向计算预先分配内存的设备,包括:
计算单元,被配置用于从所述神经网络的第一层开始,针对依次排列的神经网络的每一层,执行以下操作:
从神经网络第一层开始,针对依次排列的神经网络的每一层,执行以下的计算步骤:
针对当前层的每个输出,尝试从用于记录空闲内存块标识符的空闲内存块标识符表获取内存块标识符,
如果获取到,则将该输出的标识符与所获取的内存块标识符作为一对映射关系,存入输出与内存块标识符映射表,并从空闲内存块标识符表中删除该内存块标识符,其中,所述输出与内存块标识符映射表用于记录该层的每个输出的标识符与对应的内存块标识符,
而如果未获取到,则新建一个内存块标识符并将该输出的标识符与新建的该内存块标识符作为一对映射关系,存入所述输出与内存块标识符映射表,并且,将新建的该内存块标识符放入用于记录所有新建的内存块标识符的内存块标识符总表中,以便在执行神经网络前向计算时,依照该内存块标识符总表来创建神经网络前向计算所需的内存块;以及
针对当前层的每个输入,如果作为该输入的前面层的输出未作为该当前层的后续层的输入,则将与作为该输入的前面层的输出所对应的内存块标识符放入空闲内存块标识符表。
16.根据权利要求15所述的设备,还包括:
预先分配单元,被配置用于:
为所述内存块标识符总表中的每个内存块标识符创建一个内存块指针;以及
依据所述输出与内存块标识符映射表中记录的映射关系,将每一层的输出与具有映射关系的内存块标识符的内存块指针关联。
17.一种电子电路,包括:
被配置为执行根据权利要求1~14中任一项所述的方法的步骤的电路。
18.一种电子设备,包括:
处理器;以及
存储程序的存储器,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行根据权利要求1~14中任一项所述的方法。
19.一种存储程序的非暂态计算机可读存储介质,所述程序包括指令,所述指令在由电子设备的处理器执行时,致使所述电子设备执行根据权利要求1~14中任一项所述的方法。
Priority Applications (6)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911092427.8A CN112783640B (zh) | 2019-11-11 | 2019-11-11 | 预先分配内存的方法与设备、电路、电子设备及介质 |
PCT/CN2020/121046 WO2021093507A1 (zh) | 2019-11-11 | 2020-10-15 | 预先分配内存的方法与设备、电路、电子设备及介质 |
EP20206791.4A EP3819772B8 (en) | 2019-11-11 | 2020-11-10 | Method for pre-allocating memory, the electronic device, and the computer program product |
JP2020186872A JP6993739B2 (ja) | 2019-11-11 | 2020-11-10 | 予めメモリを割り当てる方法及び装置、電子回路、電子機器並びに記憶媒体 |
KR1020200150547A KR102521099B1 (ko) | 2019-11-11 | 2020-11-11 | 메모리 사전 할당 방법과 장치, 회로, 전자장치 및 매체 |
US16/953,275 US20210142154A1 (en) | 2019-11-11 | 2020-11-19 | Memory pre-allocation for forward calculation in a neural network |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911092427.8A CN112783640B (zh) | 2019-11-11 | 2019-11-11 | 预先分配内存的方法与设备、电路、电子设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112783640A CN112783640A (zh) | 2021-05-11 |
CN112783640B true CN112783640B (zh) | 2023-04-04 |
Family
ID=73448779
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911092427.8A Active CN112783640B (zh) | 2019-11-11 | 2019-11-11 | 预先分配内存的方法与设备、电路、电子设备及介质 |
Country Status (5)
Country | Link |
---|---|
EP (1) | EP3819772B8 (zh) |
JP (1) | JP6993739B2 (zh) |
KR (1) | KR102521099B1 (zh) |
CN (1) | CN112783640B (zh) |
WO (1) | WO2021093507A1 (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117751350A (zh) * | 2021-11-24 | 2024-03-22 | 英特尔公司 | 神经网络的存储器内保护 |
CN114298294B (zh) * | 2021-12-28 | 2022-11-01 | 杭州雄迈集成电路技术股份有限公司 | 一种基于硬件加速器的神经网络内存优化方法和装置 |
CN114492775A (zh) * | 2022-01-13 | 2022-05-13 | 哲库科技(上海)有限公司 | 一种数据处理方法、装置、神经网络加速器及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018071546A1 (en) * | 2016-10-11 | 2018-04-19 | The Research Foundation For The State University Of New York | System, method, and accelerator to process convolutional neural network layers |
CN108304265A (zh) * | 2018-01-23 | 2018-07-20 | 腾讯科技(深圳)有限公司 | 内存管理方法、装置及存储介质 |
CN108829610A (zh) * | 2018-04-02 | 2018-11-16 | 浙江大华技术股份有限公司 | 一种神经网络前向计算过程中的内存管理方法及设备 |
CN109491784A (zh) * | 2018-10-18 | 2019-03-19 | 北京旷视科技有限公司 | 降低内存占用量的方法、装置、电子设备、可读存储介质 |
WO2019165316A1 (en) * | 2018-02-23 | 2019-08-29 | The Regents Of The University Of California | Architecture to compute sparse neural network |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9183151B2 (en) * | 2013-08-30 | 2015-11-10 | Vmware, Inc. | Thread cache allocation |
US10083395B2 (en) * | 2015-05-21 | 2018-09-25 | Google Llc | Batch processing in a neural network processor |
CN104951370B (zh) * | 2015-06-02 | 2018-08-21 | 大唐移动通信设备有限公司 | 一种内存管理方法及装置 |
KR20170000109A (ko) * | 2015-06-23 | 2017-01-02 | 주식회사 인프라웨어 | 메모리 블록 리스트가 병렬로 배열된 메모리 풀에서 메모리를 할당 및 해제하는 방법 및 장치 |
CN108874532B (zh) * | 2017-06-01 | 2020-11-06 | 北京旷视科技有限公司 | 内存分配方法及设备 |
US11468312B2 (en) | 2018-02-02 | 2022-10-11 | Samsung Electronics Co., Ltd. | Memory management for machine learning training on GPU |
CN110321999B (zh) * | 2018-03-30 | 2021-10-01 | 赛灵思电子科技(北京)有限公司 | 神经网络计算图优化方法 |
US11562213B2 (en) * | 2018-04-17 | 2023-01-24 | Intel Corporation | Methods and arrangements to manage memory in cascaded neural networks |
CN110597616B (zh) * | 2018-06-13 | 2022-07-29 | 华为技术有限公司 | 一种神经网络的内存分配方法及装置 |
CN109815162A (zh) * | 2019-01-28 | 2019-05-28 | Oppo广东移动通信有限公司 | 内存管理方法、装置、移动终端及存储介质 |
-
2019
- 2019-11-11 CN CN201911092427.8A patent/CN112783640B/zh active Active
-
2020
- 2020-10-15 WO PCT/CN2020/121046 patent/WO2021093507A1/zh active Application Filing
- 2020-11-10 EP EP20206791.4A patent/EP3819772B8/en active Active
- 2020-11-10 JP JP2020186872A patent/JP6993739B2/ja active Active
- 2020-11-11 KR KR1020200150547A patent/KR102521099B1/ko active IP Right Grant
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018071546A1 (en) * | 2016-10-11 | 2018-04-19 | The Research Foundation For The State University Of New York | System, method, and accelerator to process convolutional neural network layers |
CN108304265A (zh) * | 2018-01-23 | 2018-07-20 | 腾讯科技(深圳)有限公司 | 内存管理方法、装置及存储介质 |
WO2019165316A1 (en) * | 2018-02-23 | 2019-08-29 | The Regents Of The University Of California | Architecture to compute sparse neural network |
CN108829610A (zh) * | 2018-04-02 | 2018-11-16 | 浙江大华技术股份有限公司 | 一种神经网络前向计算过程中的内存管理方法及设备 |
CN109491784A (zh) * | 2018-10-18 | 2019-03-19 | 北京旷视科技有限公司 | 降低内存占用量的方法、装置、电子设备、可读存储介质 |
Non-Patent Citations (2)
Title |
---|
一种节约数据存储空间的数值处理方法;徐冉,于伟;《现代电子技术》;20011231;第2001卷(第8期);全文 * |
基于multimap映射的动态内存分配算法探究;曹海涛等;《电脑知识与技术》;20161031;第12卷(第30期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
JP2021077378A (ja) | 2021-05-20 |
KR20210057693A (ko) | 2021-05-21 |
KR102521099B1 (ko) | 2023-04-11 |
CN112783640A (zh) | 2021-05-11 |
EP3819772B8 (en) | 2022-11-30 |
WO2021093507A1 (zh) | 2021-05-20 |
EP3819772A1 (en) | 2021-05-12 |
JP6993739B2 (ja) | 2022-01-14 |
EP3819772B1 (en) | 2022-04-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112783640B (zh) | 预先分配内存的方法与设备、电路、电子设备及介质 | |
CN108959292B (zh) | 一种数据上传方法、系统和计算机可读存储介质 | |
KR20180050928A (ko) | 컨볼루션 신경망 처리 방법 및 장치 | |
US20210142154A1 (en) | Memory pre-allocation for forward calculation in a neural network | |
CN109299190B (zh) | 分布式存储系统中处理对象的元数据的方法及装置 | |
CN109324890B (zh) | 资源管理方法、装置及计算机可读存储介质 | |
CN112035266A (zh) | 资源分配方法、装置、设备及存储介质 | |
CN107741873B (zh) | 业务处理方法及装置 | |
CN111796937A (zh) | 基于内存的资源分配方法、计算机设备及存储介质 | |
CN115167992A (zh) | 任务处理方法、系统、装置、服务器、介质及程序产品 | |
CN111708634B (zh) | 一种端口分配方法、装置、设备及可读存储介质 | |
WO2021057811A1 (zh) | 网络节点处理方法、装置、存储介质及电子设备 | |
CN116260876A (zh) | 基于K8s的AI应用调度方法、装置及电子设备 | |
CN111966478B (zh) | 自定义任务排序方法和设备、电子设备和介质 | |
CN111143033B (zh) | 基于可伸缩操作系统的操作执行方法及装置 | |
US20170090820A1 (en) | Method and device for operating a many-core system | |
CN111026615B (zh) | 一种逻辑卷列表获取方法、装置及电子设备和存储介质 | |
CN109462543B (zh) | 邮件下载方法、装置、计算机设备和存储介质 | |
CN112631743B (zh) | 任务调度方法、装置及存储介质 | |
CN112966876B (zh) | 订单的生产调度方法、装置、电子设备及可读介质 | |
CN111582398B (zh) | 数据聚类方法、装置、系统、服务器以及存储介质 | |
CN111290850B (zh) | 一种数据存储方法、装置及设备 | |
CN109921957B (zh) | 机房端到端容量管理方法、电子装置及存储介质 | |
CN106934555B (zh) | 工作流的组织方法及装置、计算机设备及存储介质 | |
CN116974752A (zh) | 硬件资源的分配方法、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |