CN116049029B - 一种内存共享方法、装置、设备及可读存储介质 - Google Patents
一种内存共享方法、装置、设备及可读存储介质 Download PDFInfo
- Publication number
- CN116049029B CN116049029B CN202310203652.4A CN202310203652A CN116049029B CN 116049029 B CN116049029 B CN 116049029B CN 202310203652 A CN202310203652 A CN 202310203652A CN 116049029 B CN116049029 B CN 116049029B
- Authority
- CN
- China
- Prior art keywords
- memory
- operator
- function
- input
- mark
- 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
- 230000015654 memory Effects 0.000 title claims abstract description 727
- 238000000034 method Methods 0.000 title claims abstract description 64
- 230000014509 gene expression Effects 0.000 claims abstract description 167
- 238000004364 calculation method Methods 0.000 claims abstract description 128
- 238000013136 deep learning model Methods 0.000 claims abstract description 87
- 230000006870 function Effects 0.000 claims description 242
- 238000013139 quantization Methods 0.000 claims description 41
- 238000013507 mapping Methods 0.000 claims description 16
- 238000004590 computer program Methods 0.000 claims description 10
- 238000004883 computer application Methods 0.000 abstract description 2
- 230000008571 general function Effects 0.000 description 20
- 238000007726 management method Methods 0.000 description 16
- 238000010586 diagram Methods 0.000 description 8
- 238000013135 deep learning Methods 0.000 description 7
- 238000012545 processing Methods 0.000 description 5
- 238000004422 calculation algorithm Methods 0.000 description 4
- 238000013500 data storage Methods 0.000 description 3
- 238000003062 neural network model Methods 0.000 description 3
- 101100481876 Danio rerio pbk gene Proteins 0.000 description 2
- 101100481878 Mus musculus Pbk gene Proteins 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 2
- 238000012937 correction Methods 0.000 description 2
- 238000006073 displacement reaction Methods 0.000 description 2
- 238000012549 training Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000011176 pooling Methods 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 238000011002 quantification Methods 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
Images
Classifications
-
- 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
- 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
- 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/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Machine Translation (AREA)
Abstract
本申请在计算机应用技术领域,公开了一种内存共享方法、装置、设备及可读存储介质,该方法包括:获取深度学习模型中各个计算表达式所需的内存大小;结合内存大小,创建计算表达式的内存标记;基于内存标记,确定深度学习模型中异构计算单元间共享内存设置;完成内存设置后,进行内存排布,得到内存排布方案,并按照内存排布方案实施内存共享。在本申请中,依赖于内存标记从而实现深度学习模型中的异构计算单元间共享内存,可以避免同一数据的存储占用多块内存空间,能够有效节省内存空间,能够有效提升深度信息模型的执行效率。
Description
技术领域
本申请涉及计算机应用技术领域,特别是涉及一种内存共享方法、装置、设备及可读存储介质。
背景技术
神经网络模型在硬件设备(如AI芯片)上执行的过程中会涉及到内存管理。具体来说,神经网络模型中算子的输入输出会占据一定的存储空间,这种对内存的占据具有时效性,当后续计算不会再用到这部分存储的数据时,该内存块即可重用,该部分存储的数据即可被后面计算数据所覆盖。
为了提高模型的推理速度,计算单元通常被设计成读取内存空间中的数据,执行相应的计算指令,会减少推理过程中的判断,动态管理内存等操作。因此需要深度学习编译器在编译神经网络模型的过程中安排好各个算子的内存使用情况,也就是每个算子所占用的内存空间大小,它在内存空间中的位移(即内存块编号)。
但是,目前的算子内存的管理存在明显缺陷。举例说明:TVM作为深度学习编译器的典型代表,它支持多种设备运行时的内存管理。它将整个模型进行剖分,得到分配到各个设备上运行的函数(func),在host端(编译器运行端)内存空间管理各个func的输入输出。但是,若在模型中添加伪量化算子,则会导致TVM的深度学习模型中携带的数据类型(dtype)与计算单元运行时的真实dtype不一致,这种情况下,TVM自身提供的内存管理方法存在问题。另外,TVM支持host端的内存空间管理,但对于函数内部算子的内存管理,它依赖于设备自身的软件栈(编译器),若设备的软件栈不支持内存管理,则需要对该设备内部及其输入输出进行内存管理
综上所述,如何有效地解决深度学习模型的内存管理等问题,是目前本领域技术人员急需解决的技术问题。
发明内容
本申请的目的是提供一种内存共享方法、装置、设备及可读存储介质,能够对自身软件栈不支持内存管理的设备提供一种设备内部及其输入输出的内存管理方法,可解决设备厂商软件开发中内存管理的问题。
为解决上述技术问题,本申请提供如下技术方案:
一种内存共享方法,包括:
获取深度学习模型中各个计算表达式所需的内存大小;
结合所述内存大小,创建所述计算表达式的内存标记;
基于所述内存标记,确定所述深度学习模型中异构计算单元间共享内存设置;
完成内存设置后,进行内存排布,得到内存排布方案,并按照所述内存排布方案实施内存共享。
优选地,所述获取深度学习模型中各个计算表达式所需的内存大小,包括:
将所述深度学习模型分为:模型层、函数层和算子层;所述函数层中的函数对应所述异构计算单元;
从所述模型层、函数层和算子层中获取各个所述计算表达式的数据维度;
对所述深度学习模型的输入和各个所述计算表达式进行遍历,得到各个所述计算表达式的数据类型和对齐方式;
利用所述数据维度、所述数据类型和所述对齐方式,确定各个计算表达式所需的内存大小。
优选地,对所述深度学习模型的输入和各个所述计算表达式进行遍历,得到各个所述计算表达式的数据类型和对齐方式,包括:
在所述函数层,对各个函数进行遍历,若函数与专用计算单元对应,则按照所述专用计算单元的要求计算数据类型和对齐方式,若函数未与专用计算单元对应,则按照所述深度学习模型的信息计算数据类型和对齐方式;
在所述算子层,对各个算子进行遍历,算子初始的数据类型和对齐方式按照所述深度学习模型的信息计算,与函数输入相对应的算子输入的数据类型和对齐方式更改为与该函数输入的数据类型和对齐方式相同;与函数输出相对应的算子输出的数据类型和对齐方式更改为与该函数输出的数据类型和对齐方式相同;若算子的后续算子为伪量化算子,则该算子输出的数据类型更改为按伪量化的要求计算;
在所述模型层,深度学习模型输入的数据类型和对齐方式确定为与对应函数输入的数据类型和对齐方式相同;深度学习模型输出的数据类型和对齐方式确定为与对应函数输出的数据类型和对齐方式相同。
优选地,结合所述内存大小,创建所述计算表达式的内存标记,包括:
结合所述内存大小,为各个所述计算表达式创建一个所述内存标记,并初始化所述内存标记。
优选地,为各个所述计算表达式创建一个所述内存标记,包括:
若所述计算表达式为张量类型节点,则为所述计算表达式创建包括一个张量内存标记的所述内存标记;
若所述计算表达式为元组类型节点,则为所述计算表达式创建包括多个张量内存标记的所述内存标记;
其中,所述张量内存标记包括:内存编号、内存复用标识、张量占用内存大小和内存分配大小;其中,内存复用标识初始值为0。
优选地,初始化所述内存标记,包括:
利用所述内存大小对所述内存标记中的张量占用内存大小进行赋值;
以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化。
优选地,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于输入型节点、常数节点或输出型节点,将所述计算表达式的所述内存复用标识值加1。
优选地,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于普通计算节点,获取所述计算表达式的输入的内存标记,并将所述内存复用标识值加1。
优选地,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于元组节点,将所述计算表达式对应的若干个普通分支节点的内存标记进行合并,得到合并结果;
利用所述合并结果,为所述内存标记中的内存复用标识进行初始化。
优选地,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于元组分支节点,获取与所述计算表达式相对应的元组节点类型中普通分支节点的内存标记;
利用所述普通分支节点的内存标记为所述计算表达式的所述内存复用标识进行初始化。
优选地,基于所述内存标记,确定所述深度学习模型中异构计算单元间共享内存设置,包括:
将所述深度学习模型分为:模型层、函数层和算子层;所述函数层中的函数对应所述异构计算单元;
基于所述内存标记,依次对所述模型层进行内存分配,对所述函数层进行内存分配,对所述算子层中的每一个算子进行内存分配;
确定所述模型层、所述函数层和所述算子层对应所述异构计算单元共享内存的共享信息。
优选地,对所述模型层进行内存分配,对所述深度学习模型的输入,以标志位为假,计算对应所述计算表达式的内存标记。
优选地,对所述函数层进行内存分配,包括:
以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配。
优选地,所述以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配,包括:
对应普通节点,则递归地遍历当前函数的每个输入参数,获取每个所述输入参数的内存标记;
判断所述当前函数是否满足所述输入参数的内存标记的复用条件;
如果是,则复用所述输入参数的内存标记,并为内存复用标识加1;
如果否,则以标志位为真,计算所述计算表达式的张量内存标记;
若当前函数的内存标记中的内存复用标识为0,则将对应的张量内存标记对应的内存块放入可复用内存块列表;
对当前函数的每个输入参数的张量内存标记中内存复用标识分别减1,若对应结果为0,则将该张量内存标记对应的内存块放入所述可复用内存块列表中。
优选地,所述以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配,包括:
对应元组节点,该计算表达式对应多个普通节点,将所述多个普通节点的内存标记合并为一个内存标记,并将合并所得的内存标记确定为所述计算表达式的内存标记。
优选地,所述以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配,包括:
对应元组分支节点,计算表达式的内存标记为与该计算表达式对应的元组中普通分支节点的内存标记。
优选地,对所述算子层中的每一个算子进行内存分配,包括:
对于通用计算单元的每个输入,以标志位为假,计算内存标记,并将所有输入计算表达式放入输入输出算子标志映射表中,并更新输入输出标号。
优选地,对所述算子层中的每一个算子进行内存分配,包括:
以节点类型进入分支,为每个算子确定内存标记并更新输入输出算子标志映射表。
优选地,确定所述模型层、所述函数层和所述算子层对应所述异构计算单元共享内存的共享信息,包括:
对所述输入输出算子标志映射表中的算子重新分配内存编号,并找出与该算子共享内存地址的对应函数输入输出的算子表达式;
根据输入输出算子标志映射表中算子的输入输出标号值,对内存编号重新分配至不同区间;其中,相同的输入输出标号值重新分配相同的内存编号;不相同的输入输出标号值重新分配不相同的内存编号,并使内存编号与内部算子的内存编号均不相同;算子的内存编号对应两个区间,分别为内部算子区间和输入输出算子区间;
根据函数的输入和函数输入算子对应同一个对象,找到与该函数输入算子相应的函数,建立该输入算子的内存编号与所找到的相应函数的对应关系;
根据函数的输出和函数输出算子对应同一个对象,找到与该函数输出算子相应的函数,建立该输出算子的内存编号与所找到的相应函数的对应关系。
一种内存共享装置,包括:
信息获取单元,用于获取深度学习模型中各个计算表达式所需的内存大小;
初始化单元,用于结合所述内存大小,创建所述计算表达式的内存标记;
内存规划单元,用于基于所述内存标记,确定所述深度学习模型中异构计算单元间共享内存设置;
内存排布单元,用于完成内存设置后,进行内存排布,得到内存排布方案;
内存共享单元,用于按照所述内存排布方案实施内存共享。
一种电子设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现上述内存共享方法的步骤。
一种可读存储介质,所述可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述内存共享方法的步骤。
应用本申请实施例所提供的方法,获取深度学习模型中各个计算表达式所需的内存大小;结合内存大小,创建计算表达式的内存标记;基于内存标记,确定深度学习模型中异构计算单元间共享内存设置;完成内存设置后,进行内存排布,得到内存排布方案,并按照内存排布方案实施内存共享。
在本申请中,首先获取到深度学习模型中各个计算表达式所需的内存大小,然后,再结合该内存大小,对计算表达式的内存标记进行初始化。结合内存标记可确定深度信息模型中异构计算单元间共享内存设置,并在完成内存设置之后,进行内存排布,得到内存排布方案,最终可按照该内存排布方案实施内存共享。即,在本申请中,依赖于内存标记从而实现深度学习模型中的异构计算单元间共享内存,可以避免同一数据的存储占用多块内存空间,能够有效节省内存空间,能够有效提升深度信息模型的执行效率。
相应地,本申请实施例还提供了与上述内存共享方法相对应的内存共享装置、设备和可读存储介质,具有上述技术效果,在此不再赘述。
附图说明
为了更清楚地说明本申请实施例或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例中一种内存共享方法的实施流程图;
图2为本申请实施例中一种深度学习模型分层示意图;
图3为本申请实施例中一种内存排布示意图;
图4为本申请实施例中一种内存共享装置的结构示意图;
图5为本申请实施例中一种电子设备的结构示意图;
图6为本申请实施例中一种电子设备的具体结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面结合附图和具体实施方式对本申请作进一步的详细说明。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
为了便于理解,下面将下文涉及的相关技术用语进行解释说明:
AI芯片:专门用于处理人工智能应用中的大量计算任务的模块,是一种针对AI算法的专用芯片。
深度学习编译器:以一种深度学习框架描述的深度学习模型为输入,生成为某些硬件平台优化的代码。
IR:全称是Intermediate Representation,中间表示。
shape:数据的维度信息。
dtype:全称是digital type,元素数据类型,包括int32、float、bool、int8等。
数据对齐:指计算在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放。各个硬件平台的存储空间的数据对齐方式有很大的不同,一些平台对某些特定类型的数据只能从某些特定地址开始存取,如NVDLA编译器对数据进行32byte对齐,RISC-V编译器默认对数据进行byte对齐。
op:全拼是operation,算子,在本文中同深度学习算子,指在深度学习领域完成特定功能的计算单元,如卷积(convolution)、池化(pooling)、加法(add)等。
func:全拼是function,由一个或多个op封装而成。
expr:全拼是expression,计算表达式,本专利中包括func和op两种类型。
model:深度学习模型。
CallNode:普通计算节点,与一个op或一个func相对应。
VarNode:model或func的输入形参节点。
TupleNode:元组节点,一般由多个CallNode构成。
TupleGetItemNode:获取元组分支节点,获取TupleNode的某一分支。
ConstantNode:常数节点。
量化:使用较低精度的数据类型来存储模型权重和执行计算。
伪量化算子:通过在模型训练中插入假量化操作来模拟算子(数据和参数)的量化,将量化误差包含在训练损失中。这些运算被称为“假”运算,因为它们对数据进行量化,然后立即对数据进行去量化,这样运算的计算就保持浮点精度。
非伪量化算子:除伪量化算子之外的普通算子。
offset:位移、偏移,本申请用来表示以基地址为标准时目标的地址。
TensorTypeNode:张量类型节点,标识某个节点(或expr的输出)数据格式为张量。
TupleTypeNode:元组类型节点,标识某个节点(或expr的输出)数据格式为元组,且该元组的每个分支为TensorTypeNode。
内存块编号:某段内存空间的编号,与offset对应。
请参考图1,图1为本申请实施例中一种内存共享方法的流程图,该方法可应用于深度学习编译器中,在下文中以通用计算单元和专用计算单元的典型软件栈为例阐述内存共享方法。这两个软件栈各进行假设如下:专用计算单元支持内存管理功能,但输入输出dtype均为int8,数据对齐方式为32byte对齐;通用计算单元不支持内存管理功能,可支持多种dtype,默认数据对齐方式为byte对齐,也可以支持其他对齐方式。在本申请中,伪量化算子产生的实际数据类型为int8。本申请所用的模型为已经过函数剖分的模型,模型中的每个函数已确定运行在专用计算单元或通用计算单元。
该方法包括以下步骤:
S101、获取深度学习模型中各个计算表达式所需的内存大小。
计算表达式所需的内存大小,即计算表达式的输入数据/输出数据的所需占用的内存空间大小。
需要注意的是,计算表达式的输入数据所占内存大小和输出数据内存大小是不同的,但是根据表达式间的输入输出依赖关系,使用输入数据或使用输出数据同样可以确定模型所需的内存大小。因而,在本文中以输出数据为例进行内存大小计算,当然通过输入数据也可计算所需的内存大小,以输出数据计算所需的内存大小可以参考基于输出数据计算内存大小,因而在此不再重复赘述。
数据占用内存空间大小计算考虑3个因子,分别是数据维度(shape)、数据类型(dtype)和数据对齐方式(同对齐方式,不同的对齐方式内存所占空间不同)。其中,shape信息可从深度学习模型(model)中直接得到,每个计算表达式(expr)输出的dtype和数据对齐方式可通过遍历获得。其中,expr包括函数(func)和算子(op)两种类型。
在本申请中的一种具体实施方式中,获取深度学习模型中各个计算表达式所需的内存大小,包括:
步骤一、将深度学习模型分为:模型层、函数层和算子层;函数层中的函数对应异构计算单元;
步骤二、从模型层、函数层和算子层中获取各个计算表达式的数据维度;
步骤三、对深度学习模型的输入和各个计算表达式进行遍历,得到各个计算表达式的数据类型和对齐方式;
步骤四、利用数据维度、数据类型和对齐方式,确定各个计算表达式所需的内存大小。
其中,步骤四对各个计算表达式进行遍历,得到各个计算表达式的数据类型和对齐方式,包括:递归地对每个计算表达式进行遍历,执行当前节点类型对应的获取方式,得到各个计算表达式的数据类型和对齐方式。
具体的,在函数层,对各个函数进行遍历,若函数与专用计算单元对应,则按照专用计算单元的要求计算数据类型和对齐方式,若函数未与专用计算单元对应,则按照深度学习模型的信息计算数据类型和对齐方式;
在算子层,对各个算子进行遍历,算子初始的数据类型和对齐方式按照深度学习模型的信息计算,与函数输入相对应的算子输入的数据类型和对齐方式更改为与该函数输入的数据类型和对齐方式相同;与函数输出相对应的算子输出的数据类型和对齐方式更改为与该函数输出的数据类型和对齐方式相同;若算子的后续算子为伪量化算子,则该算子输出的数据类型更改为按伪量化的要求计算;
在模型层,深度学习模型输入的数据类型和对齐方式确定为与对应函数输入的数据类型和对齐方式相同;深度学习模型输出的数据类型和对齐方式确定为与对应函数输出的数据类型和对齐方式相同。
也就是说,对函数层,对各个函数进行遍历,执行当前节点类型对应的获取方式,与专用计算单元对应函数的输入输出的数据类型和对齐方式按照专用计算单元的要求计算;其他函数的输入或输出的数据类型和对齐方式按照深度学习模型的信息计算,得到各个函数的数据类型和对齐方式。
对算子层,对各个算子进行遍历,执行当前节点类型对应的获取方式,算子初始的数据类型和对齐方式按照深度学习模型的信息计算,与函数输入想对应的算子输入的数据类型和对齐方式改为与函数输入的数据类型和对齐方式相同;与函数输出相对应的算子输出的数据类型和对齐方式改为与函数输出的数据类型和对齐方式相同;当某个算子后续算子为伪量化算子时,该算子输出的数据类型改为按照伪量化的要求计算,得到各个算子的数据类型和对齐方式。
对模型层,深度学习模型输入的数据类型和对齐方式与对应函数输入的数据类型和对齐方式相同;深度学习模型输出的数据类型和对齐方式与对应函数输出的数据类型和对齐方式相同。
为便于理解,下面将上述四个步骤结合起来进行说明。
从上文描述可知,确定计算表达式所需的内存大小,主要在于获取每个计算表达式输出(或输入)的dtype和数据对齐方式。
考虑依赖关系,一般情况下,一个func的输出为其他func的输入,因此在模型和函数层面,只需计算模型的输入(即为对应的func的输入)和每个func的输出信息。为便于说明,在本文中,无特殊说明,函数或算子的dtype即为其输出的dtype。和专用计算单元相关的函数输入输出的相关信息按照专用计算单元的方式计算,即专用计算单元的输入输出数据dtype均为int8,数据对齐方式也按专用计算单元的对齐方式进行计算。
算子层面与函数层面类似,值得注意的是:通用计算单元的函数中,函数输入op的dtype及对齐方式与该函数输入的dtype及对齐方式相同;最后作为输出的op与该函数输出的dtype及对齐方式相同;当某个普通op(非伪量化算子)后续算子为伪量化算子时,该op的输出dtype为int8,否则为其原始的dtype;但当输出op为普通op,但该通用计算单元函数输出作为专用计算单元函数的输入时,其该输出dtype为int8,对齐标识为32btype格式。
具体的,获取对象真实数据类型和对齐方式,可递归地对每个计算表达式进行遍历,并对每个计算表达式进行遍历,执行当前节点类型对应的获取方式,得到各个计算表达式的数据类型和对齐方式。可具体执行以下步骤:
步骤1.1、对模型输入进行遍历,计算模型输入的dtype和对齐方式。
模型输入的数据类型为深度学习模型对应的数据类型,对齐方式为默认byte对齐。
步骤1.2、递归地对每个expr进行遍历,获取每个expr的dtype和对齐方式。
在遍历过程中,主要遇到CallNode、TupleNode、TupleGetItemNode、ConstantNode、VarNode等节点。下面分情况讨论:当节点为CallNode时,进入步骤1.2.1,当为其他类型时进入步骤1.2.2。
步骤1.2.1、该步骤分6个分支,以c_name_为标志位,来决定进入某些分支,c_name_的初始值为"func_"。这六个分支分别为"last_func_"分支、"last_general_"分支、重复遍历判断分支、递归分支、"func_"分支和"general_"分支,其中6个分支与c_name_标志位相对应。
(1)、"last_func_"分支:当c_name_标志位为"last_func_",且expr的具体类型为CallNode时,进入对应"last_func_"分支,该分支是校验上一个func(即该func的输入)的dtype和对齐方式。当前func运行于专用计算单元时,则需校验上一func的dtype是否为int8,对齐方式为32byte对齐(若不是,则进行更正)。同时校验上一func中输出算子对应的非伪量化算子的dtype和对齐方式,当输出算子为CallNode类型时,校验它指向的非伪量化算子是否为int8和32byte对齐(若不是,则进行更正);当输出算子op为TupleNode类型时,校验它每个分支节点指向的非伪量化算子为int8和32byte对齐(若不是,则进行更正)。完成此分支时,不会进入其他分支,直接返回。
(2)、"last_general_"分支:当c_name_标志位为"last_general_",且expr的具体类型为CallNode时,进入对应"last_general_"分支,该分支作用是调整上一个op(即该op的输入)的dtype和对齐方式,若当前op为伪量化算子时,则为上一非伪量化op修改为int8和byte对齐。完成此分支时,不会进入其他分支,直接返回。
(3)、重复遍历判断分支:当c_name_标志位为"func_"或者"general_"时,判断该CallNode是否已经遍历,若已经遍历,则直接返回,否则进入递归部分。当c_name_标志位为"func_"或者"general_"会进入此分支。
(4)、递归分支:递归地遍历当前expr的输入参数。当c_name_标志位为"func_"或者"general_"时,均会进入此分支。
(5)、"func_"分支:当c_name_标志位为"func_",且expr的具体类型为CallNode时,进入对应"func_"分支。进入该分支表明当前的CallNode可转化为function类型。通过获取该函数运行的计算单元名称,包括"general"(通用计算单元)和"special"(专用计算单元),分别进入两个子部分。
1)、当计算单元名称为"general"时,c_name_标志位赋值为"general_",对该func中的每个op进行遍历,待遍历结束后c_name_标志位重新赋值为"fun_"。根据该func的输出算子是否为伪量化算子进行赋值:当为伪量化算子时,该算子类型赋值为int8和32byte对齐,同时算子指向的实体算子同样赋值为int8和32byte对齐;否则dtype赋值为深度学习模型对应的数据类型,对齐方式为byte对齐。当该general函数的非伪量化算子指向该函数输入时,表明该general函数输入为量化输入,general函数输入需赋值为int8和32byte对齐,根据general函数输入与上一func输出相对应的原则,上一func输出(即该func输入)同样赋值为int8和32byte对齐;否则,根据上一func输出与general函数输入对应相同,对general函数的输入op进行dtype和对齐方式赋值。
2)、当计算单元名称为"special"时,对该func的类型为int8和32byte对齐,然后将c_name_标志位赋值为"last_func_",对该func每个输入的dtype和对齐方式进行校验(进入"last_func_"分支),待校验结束后c_name_标志位重新赋值为"fun_"。
(6)、"general_"分支:当c_name_标志位为"general_",且expr的具体类型为CallNode时,进入对应"general_"分支。当该op为伪量化算子时,将c_name_标志位赋值为"last_general_",对上一个非伪量化算子的dtype和对齐方式进行赋值(进入"last_general_"分支),返回后c_name_标志位重新赋值为"general_";当该算子为非伪量化算子时,该op的dtype赋值为深度学习模型对应的数据类型,对齐方式为byte对齐。
步骤1.2.2、该步骤分3个分支,以节点类型进入某些分支,分别为TupleNode类型分支、TupleGetItemNode分支、ConstantNode分支。
(1)、TupleNode类型分支:针对TupleNode类型,该expr有多个普通分支节点,每个普通分支节点的dtype和对齐方式赋值为与其指向的非伪量化算子的dtype和对齐方式的相同值;
(2)、TupleGetItemNode类型分支:针对TupleGetItemNode类型,将该expr的dtype和对齐方式赋为与其相对应的TupleNode分支的dtype和对齐方式的相同值;
(3)、ConstantNode类型分支:针对ConstantNode类型,将其dtype值赋为从深度学习模型对应的数据类型,对齐方式为byte对齐。
得到了计算表达式的数据维度、数据类型和数据对齐方式之后,便可基于数据维度、数据类型和数据对齐方式计算出计算表达式所需的内存大小。
例如:(1)若计算表达式为张量类型节点,则根据张量维度、数据类型和数据对齐方式计算出计算表达式所需的内存大小。
(2)若计算表达式为元组类型节点,则分别计算元组每个分支的内存大小。元组的分支为张量类型数据,可则根据该数据的张量维度、数据类型形状和数据对齐方式计算出该分支所需的内存大小。
也就是说,在本实施例中,可以根据计算单元特性,处理由于伪量化算子引起的数据类型的改变,获取计算表达式输入输出的真实数据类型和对齐方式的方法,进而计算出计算表达式所需的内存大小。
S102、结合内存大小,创建计算表达式的内存标记。
在本申请中可以为每一个计算表达式创建一个内存标记,该内存标记的作用,即对每个expr预先进行一些内存管理的相关信息计算,在本文中将这些信息称为tokens(数据内存标记,简称内存标记),一个expr对应一个tokens,每个tokens包含一个或者多个tok(张量内存标记)。每一个tok中可以具体包括多种用于内存管理的信息。
在得到内存大小之后,可结合内存大小创建出计算表达式的内存标记。即,创建出计算表达式的内存标记,并结合该内存大小,对内存标记进行赋值。
在本申请中的一种可选实施方式中,结合内存大小,创建计算表达式的内存标记,包括:
结合内存大小,为各个计算表达式创建一个内存标记,并初始化内存标记。具体的,为各个计算表达式创建一个内存标记,包括:
情况1:若计算表达式为张量类型节点,则为计算表达式创建包括一个张量内存标记的内存标记;
情况2:若计算表达式为元组类型节点,则为计算表达式创建包括多个张量内存标记的内存标记;
其中,张量内存标记包括:内存编号、内存复用标识、张量占用内存大小和内存分配大小;其中,内存复用标识初始值为0。
即,当该expr格式为TensorTypeNode时,tokens中只有一个tok;当该expr格式为TupleTypeNode时,tokens中有n个tok(n为元组的普通分支节点数)。
每个tok包括如下信息:storage_id(内存编号),用于表示此expr的内存编号,编号相同的expr共享复用一段内存空间;ref_counter(内存复用标识),用于表示此expr对应的内存能否被复用的标识位,初始值为0;memory_size(张量占用内存大小);max_bytes(内存分配大小),用于表示分配的内存空间大小(与storage_id相对应,大于等于此expr对应数据的memory_size)。
其中,初始化内存标记,包括:
步骤一、利用内存大小对内存标记中的张量占用内存大小进行赋值。
张量占用内存大小直接用S101计算得到的内存大小进行赋值。
步骤二、以节点类型进入分支,并为内存标记中的内存复用标识进行初始化。
即,步骤一和步骤二,即针对内存标记中的张量占用内存大小和内存复用标识进行初始化赋值,而内存标记中的内存编号和内存分配大小,在进行内存设置时进行确定。
下面以不同类型节点为例,对上述步骤二进行解释说明:
对于输入型节点,将计算表达式的内存复用标识值加1。
对于普通计算节点,获取计算表达式的输入的内存标记,并将内存复用标识值加1
对于元组节点,将计算表达式对应的若干个普通分支节点的内存标记进行合并,得到合并结果;利用合并结果,为内存标记中的内存复用标识进行初始化。
元组分支节点:获取与计算表达式相对应的元组节点类型中普通分支节点的内存标记;利用普通分支节点的内存标记为计算表达式的内存复用标识进行初始化。
对于常数节点,将计算表达式的每一个内存复用标识值加1。
对于输出型节点,将计算表达式的内存复用标识值加1。
也就是说,步骤S102,即可对每一个expr并对其进行初始化,从步骤S101获取memory_size信息,并为ref_counter赋值。max_bytes和storage_id信息在步骤S103内存规划步骤计算。本步骤中,步骤2.1-步骤2.3为申请实施例中执行步骤,步骤2-x为步骤2中多次调用的特殊子步骤。
步骤2.1、初始化模型输入或函数输入的tokens;
通过步骤2-x为模型输入或函数输入创建tokens,并将tokens中每个tok的ref_counter值加1。
步骤2.2、以遍历方式对每个expr的tokens进行初始化。
该步骤分4个分支,以节点类型进入某些分支,分别为CallNode类型分支、TupleNode类型分支、TupleGetItemNode分支、ConstantNode分支。
(1)、CallNode类型分支:此分支主要包括两部分,一是通过步骤2-x为当前expr创建tokens;二是进行递归遍历,通过步骤2-x获取当前expr每个输入的tokens,并为每一个tok的ref_counter值加1。
(2)、TupleNode类型分支:该expr对应多个普通分支节点,每个普通分支节点的tokens共享对应分支指向的非伪量化算子的tokens,将多个普通分支节点的tokens合并为一个tokens,合并后的tokens即为该expr对应的tokens;
(3)、TupleGetItemNode类型分支:获取与该expr相对应的TupleNode类型普通分支节点指向的非伪量化算子的tokens,该expr的tokens共享上述获得的tokens;
(4)、ConstantNode类型分支:针对ConstantNode类型,通过步骤2-x为该常量expr创建tokens,并将tokens中每个tok的ref_counter值加1。
步骤2.3、初始化模型输入出或函数输出的tokens;
获取模型输出或函数输出的tokens,并将tokens中每个tok的ref_counter值加1。
步骤2-x:创建tokens;
为当前expr分配一个tokens,当该expr为TensorTypeNode时,tokens中只有一个tok,从步骤S101直接获取对应的memory_size信息;当该expr为TupleTypeNode时,tokens中有多个tok,从步骤S101直接获取对应的内存大小信息,为每个tok的memory_size赋值。
S103、基于内存标记,确定深度学习模型中异构计算单元间共享内存设置。
为便于描述,下面将深度学习模型分为异构计算单元进行描述。具体的,请参考图2,图2为本申请实施例中一种深度学习模型分层示意图。即,在本申请中,可将深度学习模型分为三层,分别为模型层、函数层和算子层。
其中,模型层从整个模型(深度学习模型)分析该模型,它主要包括模型的输入和输出。
将模型进行剖分得到多个函数,不同函数可运行于不同设备,每个函数是函数层的分析对象。一般情况下,一个函数的输出为另一个函数的输入,两者表示同一个数据,同用一段内存地址。特别地,有的函数的输入为模型的输入,这些函数可称为首函数,有的函数的输出为模型的输入,这些函数可称为尾函数,可能存在一个或多个首函数或尾函数。为了方便说明,函数的相关信息一般指输出数据的相关信息,而函数输入的相关信息会显示说明。为方便表述,类似于图之间的链接关系,当函数A的输出作为函数B的输入时,称函数A为函数B的上一函数,称函数B为函数A的下一函数。
每个函数由一个或多个算子构成,算子层以每个算子为分析对象。一般情况下,一个算子的输出为另一个算子(op)的输入,两者表示同一个数据,同用一段内存地址。特别地,与函数的输入匹配的算子称为输入算子,与函数的输出匹配的算子称为输出算子,可能存在一个或多个输入算子或输出算子。为了方便说明,算子的相关信息一般指输出数据的相关信息,而算子输入的相关信息会显示说明。为方便表述,类似于图之间的链接关系,当算子A的输出作为算子B的输入时,称算子A为算子B的上一算子,称算子B为函数A的下一算子。
从上文可知,上一函数的输出与下一函数的输入对应同一数据,上一算子的输出与下一算子的输入也对应同一数据,模型的输入与首函数的输入对应同一数据,因而,在实际应用中,不同的两个及两个以上的对象(模型输入、函数和算子)会对应同一个数据。为了减少同一数据占用不同的内存,在本申请中实现了基于内存标记来实现不同对象对同一数据的共享设置。
基于内存标记,确定深度学习模型中异构计算单元间共享内存设置。即,共享内存设置,即基于内存标记,指明同一块内存中存储的数据可以被哪些对象共享使用。
在本申请中的一种具体实施方式中,基于内存标记,确定深度学习模型中异构计算单元间共享内存设置,包括:
步骤一、将深度学习模型分为:模型层、函数层和算子层;函数层中的函数对应异构计算单元;
其中,步骤一可参照图2及对应描述,在此不再一一赘述。
步骤二、基于内存标记,依次对模型层进行内存分配,对函数层进行内存分配,对算子层中的每一个算子进行内存分配;
对模型层进行内存分配,对深度学习模型的输入,以标志位为假,计算对应计算表达式的内存标记。对模型输入进行遍历,计算模型输入的dtype和对齐方式。具体的,模型输入的数据类型为深度学习模型对应的数据类型,对齐方式为默认byte对齐。
对函数层进行内存分配,包括:以节点类型进入分支,并对每个函数对应的计算表达式进行内存分配。递归地对每个expr进行遍历,获取每个expr的dtype和对齐方式。
以节点类型进入分支,并对每个函数对应的计算表达式进行内存分配,包括:
步骤一、对应普通节点,则递归地遍历当前函数的每个输入参数,获取每个输入参数的内存标记;
步骤二、判断当前函数是否满足输入参数的内存标记的复用条件;
步骤三、如果是,则复用输入参数的内存标记,并为内存复用标识加1;
步骤四、如果否,则以标志位为真,计算计算表达式的张量内存标记;
步骤五、若当前函数的内存标记中的内存复用标识为0,则将对应的张量内存标记对应的内存块放入可复用内存块列表;
步骤六、对当前函数的每个输入参数的张量内存标记中内存复用标识分别减1,若对应结果为0,则将该张量内存标记对应的内存块放入可复用内存块列表中。
对应元组节点,该计算表达式对应多个普通节点,将多个普通节点的内存标记合并为一个内存标记,并将合并所得的内存标记确定为计算表达式的内存标记。
对应元组分支节点,计算表达式的内存标记为与该计算表达式对应的元组中普通分支节点的内存标记。
对算子层中的每一个算子进行内存分配,包括:
对于通用计算单元的每个输入,以标志位为假,计算内存标记,并将所有输入计算表达式放入输入输出算子标志映射表中,并更新输入输出标号。
具体的,对算子层中的每一个算子进行内存分配,包括:
以节点类型进入分支,为每个算子确定内存标记并更新输入输出算子标志映射表。
具体的,进行内存设置,即对func的输入输出以及general函数内部算子的输入输出两个层级进行内存规划(分配storage_id),计算max_bytes。两个层级内存规划主要思路一致,但是由于general函数的输入输出算子内存应与对应的func的输入输出共享内存(内存地址一致,参考图2),因此还需考虑不同层级的内存对应。本申请实施例中,先对func层级进行内存分配,后对每个general函数中的算子进行内存分配,最后确定异构计算单元间共享内存的相关信息。另外,为提高内存使用效率,此步骤根据expr的类型以及ref_counter值等信息,进行内存复用(分配已分配的storage_id)。
在初始化阶段已计算memory_size和ref_counter信息的基础上,对max_bytes和storage_id信息进行计算。下文中的步骤3.1-步骤3.3为本申请实施例所需执行步骤,步骤3-x为步骤3中多次调用的特殊子步骤。
步骤3.1、func层级的内存规划;
步骤3.1.1、模型输入的内存规划;
对于模型的每个输入,以标志位为假,进入步骤3-x,计算tokens信息,得到每个tok的max_byte,并分配独立的storage_id,完成模型输入的内存规划。
步骤3.1.2、以遍历方式对每个func进行内存规划;
该步骤分4个分支,以节点类型进入某些分支,分别为CallNode类型分支、TupleNode类型分支、TupleGetItemNode分支。
分支3.1.2-1:针对CallNode类型分支:
步骤3.1.2-1.1:递归地遍历当前func每个输入参数,用于获取每个输入参数的tokens信息;
步骤3.1.2-1.2:判断当前func是否可以复用其输入的tokens,若当前func中仅包含伪量化算子和reshape、expand_dims、squeeze等不改变数据存储的算子,则可以复用输入的tokens,并将每个tok中的ref_counter(内存复用标识)值加1;否则以标志位为真,进入步骤3-x,计算当前func的tokens信息,得到每个tok的max_byte,并分配独立的storage_id,完成当前expr的内存规划。
步骤3.1.2-1.3:对当前func的tokens,检查每一个tok中的ref_counter值,若ref_counter为0,则将该tok对应的内存块放入可复用内存块列表;对当前func的每个输入参数的tokens,将每一个tok中的ref_counter值减1,若ref_counter为0,则将该tok对应的内存块放入可复用内存块列表。
分支3.1.2-2:针对TupleNode类型分支,该expr对应多个普通分支节点,每个普通分支节点的tokens为对应分支指向的函数的tokens,将多个普通分支节点的tokens合并为一个tokens,合并后的tokens即为该expr对应的tokens;
分支3.1.2-3:针对TupleGetItemNode类型分支,获取expr对应tokens为与其相对应的TupleNode类型普通分支节点指向的函数的tokens。
步骤3.2、general(通用计算单元)算子层级的内存规划:
general函数算子层级的内存规划与func层级类似。除此之外,此步骤新定义了变量名为io_expr_的map结构作为输入输出算子标志,该map的键(key)为expr,值(value)为输入输出标号(简称io_num_),从0开始累加标识expr的tokens中的第一个tok的输入输出标号。在每个expr标识后,若当前expr格式为TensorTypeNode,io_num_的值加1;若当前expr的type为TupleTypeNode,io_num_的值加n(n为该元组普通分支节点数),将作为io_expr_中后面一个expr的输入输出标号。
步骤3.2.1、general函数输入的内存规划:
对于general函数的每个输入,以标志位为假,进入步骤3-x,计算tokens信息,得到每个tok的max_byte,并分配独立的storage_id,完成函数输入的内存规划。同时将所有输入expr放入io_expr_这一map中,并相应的更新io_num_值。
步骤3.2.2、以遍历方式对每个op进行内存规划:
该步骤分4个分支,以节点类型进入某些分支,分别为CallNode类型分支、TupleNode类型分支、TupleGetItemNode分支、ConstantNode分支。
分支3.2.2-1:针对CallNode类型分支,
步骤3.2.2-1.1:递归地遍历当前op的每个输入参数,用于获取每个参数的tokens信息;
步骤3.2.2-1.2:判断是否可以复用其输入的tokens,若当前op中仅为reshape、expand_dims、squeeze等不改变数据存储的算子,则复用输入的tokens,并将tok中的ref_counter值加1,并进入步骤3.2.2-1.3;否则进入步骤3.2.2-1.4。
步骤3.2.2-1.3:若当前op的输入在io_expr_这一map中,则将当前op加入io_expr_中,其value值与当前op的输入的io_num_值相同,此处无需更新io_num_值,完成此步骤后,跳过步骤3.2.2-1.4,进入步骤3.2.2-1.5。
步骤3.2.2-1.4:以标志位为真,进入步骤3-x,计算当前op的tokens信息,得到每个tok的max_byte,并分配独立的storage_id,完成当前expr的内存规划。
步骤3.2.2-1.5:对当前func的tokens,检查每一个tok中的ref_counter值,若ref_counter为0,则将该tok对应的内存块放入可复用内存块列表;对当前func的每个输入参数的tokens,将每一个tok中的ref_counter值减1,若ref_counter为0,则将该tok对应的内存块放入可复用内存块列表。
分支3.2.2-2:针对TupleNode类型分支,该expr对应多个普通分支节点,每个普通分支节点的tokens为对应分支指向的非伪量化算子的tokens,将多个普通分支节点的tokens合并为一个tokens,合并后的tokens即为该expr对应的tokens;
分支3.2.2-3:针对TupleGetItemNode类型分支,针对TupleGetItemNode类型,获取expr对应tokens为与其相对应的TupleNode类型普通分支节点指向的非伪量化算子的tokens;
分支3.2.2-4:针对ConstantNode类型分支,以标志位为假,进入步骤3-x,计算tokens信息,得到每个tok的max_byte,并分配独立的storage_id,完成常量数据的内存规划。
步骤3.2.3:general函数输出的处理:
若general函数的输出算子为CallNode类型,判断该算子是否为伪量化算子,若是伪量化算子,则将伪量化算子指向的实体算子加入io_expr_,否则将该算子加入io_expr_;若general函数的输出算子为TupleNode类型,则将该算子加入io_expr_,同时将该元组每个普通分支节点指向的非伪量化算子加入io_expr_;若general函数的输出算子为TupleGetItemNode类型,则将该算子加入io_expr_,同时将与其相对应的TupleNode类型普通分支节点指向的非伪量化算子加入io_expr_。
步骤三、确定模型层、函数层和算子层对应异构计算单元共享内存的共享信息。
即,异构计算单元间共享内存的内存规划。具体的,确定模型层、函数层和算子层对应异构计算单元共享内存的共享信息,包括:
对输入输出算子标志映射表中的算子重新分配内存编号,并找出与该算子共享内存地址的对应函数输入输出的算子表达式;
根据输入输出算子标志映射表中算子的输入输出标号值,对内存编号重新分配至不同区间;其中,相同的输入输出标号值重新分配相同的内存编号;不相同的输入输出标号值重新分配不相同的内存编号,并使内存编号与内部算子的内存编号均不相同;算子的内存编号对应两个区间,分别为内部算子区间和输入输出算子区间;
根据函数的输入和函数输入算子对应同一个对象,找到与该函数输入算子相应的函数,建立该输入算子的内存编号与所找到的相应函数的对应关系;
根据函数的输出和函数输出算子对应同一个对象,找到与该函数输出算子相应的函数,建立该输出算子的内存编号与所找到的相应函数的对应关系。
也就是说,由于func的输入和func内对应op的输入是同一个对象,func的输出和func内输出算子的输出是同一个对象,这些对象的内存地址当然也应该是一致的,因此需要对上述步骤3.2计算得到的io_expr_这一map中的op重新分配storage_id,并找到与该op共享内存地址的func输入输出的expr。具体的实施过程,包括:
3.3.1、根据io_expr_中op的输入输出标号值,对它们的storage_id进行重新分配至不同区间,相同的输入输出标号值重新分配相同的storage_id,不相同的输入输出标号值重新分配不相同的storage_id,并使其与内部op的storage_id均不相同,至此op的storage_id分为两个区间,分别称为内部算子区间和输入输出算子区间。
3.3.2、根据函数的输入和函数输入op的是同一个对象,找到与该函数输入op相应的func,建立该op的storage_id与func的对应关系;根据函数的出和函数出op的是同一个对象,找到与该函数输出op相应的func,建立该op的storage_id与func的对应关系,供后续调用。
步骤3-x:计算tokens信息:
根据该expr的某一tok已有信息,分配storage_id,计算max_bytes。当标志位为真时,进入分支3-x-1,当标志位为假时,进入子分支3-x-2。
分支3-x-1:
当标志位为真时,通过判断是否存在内存复用的可能性计算tok的max_byte和storage_id信息。首先对于某一tok,根据步骤S101的计算结果直接获取对应的memory_size信息。然后在可复用内存块列表中查找max_byte值与当前tok的memory_size值最相近的内存块,若最接近max_byte值小于memory_size值的m倍且大于memory_size值的1/m,则当前tok复用此内存块,当前tok的storage_i赋值为与被复用内存块相同的storage_id,该tok和被复用内存块的max_byte取值更新为当前tok的memory_size和被复用内存块max_byte两者的较大值,最后将被复用内存块移出可复用内存块列表;若可复用内存块列表为空,或者未有满足上面条件的内存块,对于该tok,此时memory_size即为max_byte值,为其storage_id分配一个新值。
分支3-x-2:
当标志位为假时(expr为模型或函数输入,或ConstantNode类型时),对于tokens中的每个tok,此时memory_size即为max_byte值;为storage_i分配一个新值。同时将ref_counter值加1,以确保此expr对应内存不会被复用。
S104、完成内存设置后,进行内存排布,得到内存排布方案,并按照内存排布方案实施内存共享。
一个设备中的通用计算单元和专用计算单元同时共享同一块内存。即,根据之前计算得到的每个expr的max_byte和storage_id等信息,对该expr的输入输出地址在内存中进行排布。此步骤首先对func层级的输入输出进行排布,可整体占用内存空间;然后对op层级的输入输出进行排布,不同func的op相当于临时变量,为其分配的内存空间可以覆盖。内存排布方案如图3所示,图3为本申请实施例中一种内存排布示意图,即函数输入输出数据存储在函数层级内存地址空间,并且不会被其他层级数据覆盖,函数层级内存地址空间可累加所有函数级storage_id对应的max_byte确定;每个常量算子均存储在常量算子层级内存地址空间中,且不会被其他算子覆盖,常量算子层级内存地址空间可累加每个常量算子max_byte确定;函数内的非常量算子存储在非常量算子层级内存地址空间,此部分区域相当于临时变量区,不同函数间的非常量算子在此区域可相互覆盖。
在具体实施过程中,可执行以下步骤进行内存排布(当然,也可以采用其他方式进行内存排布)。
步骤4.1、func层级的内存排布;
检查每个storage_id与其对应max_bytes是否一致,如果不一致取多max_bytes中的最大值,生成{storage_id,max_bytes}的map结构;为每个storage_id分配max_bytes大小的独立内存空间;计算模型输入参数和每个func输出数据的memory_size。至此得到了模型输入参数和每个func输出数据的offset及其数据存储大小(memory_size),相关数据存储至在内存中开辟的函数层级内存地址空间,以供计算单元调用。
步骤4.2、general函数的算子层级内存排布;
general函数的op可分为常量op和非常量op,其中常量op指ConstantNode类型op,其他op为非常量op。步骤4.2.1和步骤4.2.2中的offset具有相同的首地址。
步骤4.2.1、内部非常量op的内存排布;
检查每个内部非常量op的storage_id与其对应max_bytes是否一致,如果不一致取多max_bytes中的最大值,生成{storage_id,max_bytes}的map结构;然后为每个内部非常量op的storage_id分配max_bytes大小的独立内存空间,至此得到了每个内部非常量op数据的offset及其memory_size。至此得到了general函数内部非常量op的offset及其memory_size,相关数据存储至在内存中开辟的非常量算子输入输出地址空间,供计算单元计算调用。不同general函数的内部非常量op共用一段内存空间,相互间可覆盖。
步骤4.2.2、输入输出op的内存排布;
根据步骤3.3的计算结果,找到位于输入输出算子区间的storage_id对应的func,将其offset及其memory_size赋值给标记为该storage_id的op。
步骤4.2.3、常量op的内存排布;
每个常量op有独立的storage_id,为每个常量op分配max_bytes大小的独立内存空间,均分配至常量算子层级内存地址空间,不会被非常量的地址空间op覆盖,不会被其他general的常量op的地址空间覆盖。
至此完成每个expr输入输出的内存地址分配,供计算单元计算调用。
应用本申请实施例所提供的方法,获取深度学习模型中各个计算表达式所需的内存大小;结合内存大小,创建计算表达式的内存标记;基于内存标记,确定深度学习模型中异构计算单元间共享内存设置;完成内存设置后,进行内存排布,得到内存排布方案,并按照内存排布方案实施内存共享。
在本申请中,首先获取到深度学习模型中各个计算表达式所需的内存大小,然后,再结合该内存大小,对计算表达式的内存标记进行初始化。结合内存标记可确定深度信息模型中异构计算单元间共享内存设置,并在完成内存设置之后,进行内存排布,得到内存排布方案,最终可按照该内存排布方案实施内存共享。即,在本申请中,依赖于内存标记从而实现深度学习模型中的异构计算单元间共享内存,可以避免同一数据的存储占用多块内存空间,能够有效节省内存空间,能够有效提升深度信息模型的执行效率。
相应于上面的方法实施例,本申请实施例还提供了一种内存共享装置,下文描述的内存共享装置与上文描述的内存共享方法可相互对应参照。
参见图4所示,该装置包括以下模块:
信息获取单元101,用于获取深度学习模型中各个计算表达式所需的内存大小;
初始化单元102,用于结合内存大小,创建计算表达式的内存标记;
内存规划单元103,用于基于内存标记,确定深度学习模型中异构计算单元间共享内存设置;
内存排布单元104,用于完成内存设置后,进行内存排布,得到内存排布方案;
内存共享单元105,用于按照内存排布方案实施内存共享。
应用本申请实施例所提供的装置,获取深度学习模型中各个计算表达式所需的内存大小;结合内存大小,创建计算表达式的内存标记;基于内存标记,确定深度学习模型中异构计算单元间共享内存设置;完成内存设置后,进行内存排布,得到内存排布方案,并按照内存排布方案实施内存共享。
在本申请中,首先获取到深度学习模型中各个计算表达式所需的内存大小,然后,再结合该内存大小,对计算表达式的内存标记进行初始化。结合内存标记可确定深度信息模型中异构计算单元间共享内存设置,并在完成内存设置之后,进行内存排布,得到内存排布方案,最终可按照该内存排布方案实施内存共享。即,在本申请中,依赖于内存标记从而实现深度学习模型中的异构计算单元间共享内存,可以避免同一数据的存储占用多块内存空间,能够有效节省内存空间,能够有效提升深度信息模型的执行效率。
在本申请的一种具体实施方式中,信息获取单元101,具体用于将深度学习模型分为:模型层、函数层和算子层;函数层中的函数对应异构计算单元;
从模型层、函数层和算子层中获取各个计算表达式的数据维度;
对深度学习模型的输入和各个计算表达式进行遍历,得到各个计算表达式的数据类型和对齐方式;
利用数据维度、数据类型和对齐方式,确定各个计算表达式所需的内存大小。
在本申请的一种具体实施方式中,信息获取单元101,具体用于在函数层,对各个函数进行遍历,若函数与专用计算单元对应,则按照专用计算单元的要求计算数据类型和对齐方式,若函数未与专用计算单元对应,则按照深度学习模型的信息计算数据类型和对齐方式;
在算子层,对各个算子进行遍历,算子初始的数据类型和对齐方式按照深度学习模型的信息计算,与函数输入相对应的算子输入的数据类型和对齐方式更改为与该函数输入的数据类型和对齐方式相同;与函数输出相对应的算子输出的数据类型和对齐方式更改为与该函数输出的数据类型和对齐方式相同;若算子的后续算子为伪量化算子,则该算子输出的数据类型更改为按伪量化的要求计算;
在模型层,深度学习模型输入的数据类型和对齐方式确定为与对应函数输入的数据类型和对齐方式相同;深度学习模型输出的数据类型和对齐方式确定为与对应函数输出的数据类型和对齐方式相同。
在本申请的一种具体实施方式中,初始化单元102,具体用于结合内存大小,为各个计算表达式创建一个内存标记,并初始化内存标记。
在本申请的一种具体实施方式中,初始化单元102,具体用于若计算表达式为张量类型节点,则为计算表达式创建包括一个张量内存标记的内存标记;
若计算表达式为元组类型节点,则为计算表达式创建包括多个张量内存标记的内存标记;
其中,张量内存标记包括:内存编号、内存复用标识、张量占用内存大小和内存分配大小;其中,内存复用标识初始值为0。
在本申请的一种具体实施方式中,初始化单元102,具体用于利用内存大小对内存标记中的张量占用内存大小进行赋值;
以节点类型进入分支,并为内存标记中的内存复用标识进行初始化。
在本申请的一种具体实施方式中,初始化单元102,具体用于对于输入型节点、常数节点或输出型节点,将计算表达式的内存复用标识值加1。
在本申请的一种具体实施方式中,初始化单元102,具体用于对于普通计算节点,获取计算表达式的输入的内存标记,并将内存复用标识值加1。
在本申请的一种具体实施方式中,初始化单元102,具体用于对于元组节点,将计算表达式对应的若干个普通分支节点的内存标记进行合并,得到合并结果;
利用合并结果,为内存标记中的内存复用标识进行初始化。
在本申请的一种具体实施方式中,初始化单元102,具体用于对于元组分支节点,获取与计算表达式相对应的元组节点类型中普通分支节点的内存标记;
利用普通分支节点的内存标记为计算表达式的内存复用标识进行初始化。
在本申请的一种具体实施方式中,内存规划单元103,具体用于将深度学习模型分为:模型层、函数层和算子层;函数层中的函数对应异构计算单元;
基于内存标记,依次对模型层进行内存分配,对函数层进行内存分配,对算子层中的每一个算子进行内存分配;
确定模型层、函数层和算子层对应异构计算单元共享内存的共享信息。
在本申请的一种具体实施方式中,内存规划单元103,具体用于对模型层进行内存分配,对深度学习模型的输入,以标志位为假,计算对应计算表达式的内存标记。
在本申请的一种具体实施方式中,内存规划单元103,具体用于以节点类型进入分支,并对每个函数对应的计算表达式进行内存分配。
在本申请的一种具体实施方式中,内存规划单元103,具体用于对应普通节点,则递归地遍历当前函数的每个输入参数,获取每个输入参数的内存标记;
判断当前函数是否满足输入参数的内存标记的复用条件;
如果是,则复用输入参数的内存标记,并为内存复用标识加1;
如果否,则以标志位为真,计算计算表达式的张量内存标记;
若当前函数的内存标记中的内存复用标识为0,则将对应的张量内存标记对应的内存块放入可复用内存块列表;
对当前函数的每个输入参数的张量内存标记中内存复用标识分别减1,若对应结果为0,则将该张量内存标记对应的内存块放入可复用内存块列表中。
在本申请的一种具体实施方式中,内存规划单元103,具体用于对应元组节点,该计算表达式对应多个普通节点,将多个普通节点的内存标记合并为一个内存标记,并将合并所得的内存标记确定为计算表达式的内存标记。
在本申请的一种具体实施方式中,内存规划单元103,具体用于对应元组分支节点,计算表达式的内存标记为与该计算表达式对应的元组中普通分支节点的内存标记。
在本申请的一种具体实施方式中,内存规划单元103,具体用于对于通用计算单元的每个输入,以标志位为假,计算内存标记,并将所有输入计算表达式放入输入输出算子标志映射表中,并更新输入输出标号。
在本申请的一种具体实施方式中,内存规划单元103,具体用于以节点类型进入分支,为每个算子确定内存标记并更新输入输出算子标志映射表。
在本申请的一种具体实施方式中,内存规划单元103,具体用于对输入输出算子标志映射表中的算子重新分配内存编号,并找出与该算子共享内存地址的对应函数输入输出的算子表达式;
根据输入输出算子标志映射表中算子的输入输出标号值,对内存编号重新分配至不同区间;其中,相同的输入输出标号值重新分配相同的内存编号;不相同的输入输出标号值重新分配不相同的内存编号,并使内存编号与内部算子的内存编号均不相同;算子的内存编号对应两个区间,分别为内部算子区间和输入输出算子区间;
根据函数的输入和函数输入算子对应同一个对象,找到与该函数输入算子相应的函数,建立该输入算子的内存编号与所找到的相应函数的对应关系;
根据函数的输出和函数输出算子对应同一个对象,找到与该函数输出算子相应的函数,建立该输出算子的内存编号与所找到的相应函数的对应关系。
相应于上面的方法实施例,本申请实施例还提供了一种电子设备,下文描述的一种电子设备与上文描述的一种内存共享方法可相互对应参照。
参见图5所示,该电子设备包括:
存储器332,用于存储计算机程序;
处理器322,用于执行计算机程序时实现上述方法实施例的内存共享方法的步骤。
具体的,请参考图6,图6为本实施例提供的一种电子设备的具体结构示意图,该电子设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processing units,CPU)322(例如,一个或一个以上处理器)和存储器332,存储器332存储有一个或一个以上的计算机程序342或数据344。其中,存储器332可以是短暂存储或持久存储。存储在存储器332的程序可以包括一个或一个以上模块(图示没标出),每个模块可以包括对数据处理设备中的一系列指令操作。更进一步地,处理器322可以设置为与存储器332通信,在电子设备301上执行存储器332中的一系列指令操作。
电子设备301还可以包括一个或一个以上电源326,一个或一个以上有线或无线网络接口350,一个或一个以上输入输出接口358,和/或,一个或一个以上操作系统341。
上文所描述的内存共享方法中的步骤可以由电子设备的结构实现。
相应于上面的方法实施例,本申请实施例还提供了一种可读存储介质,下文描述的一种可读存储介质与上文描述的一种内存共享方法可相互对应参照。
一种可读存储介质,可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述方法实施例的内存共享方法的步骤。
该可读存储介质具体可以为U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可存储程序代码的可读存储介质。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
本领域技术人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应该认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系属于仅仅用来将一个实体或者操作与另一个实体或者操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语包括、包含或者其他任何变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本申请的限制。
Claims (22)
1.一种内存共享方法,其特征在于,包括:
获取深度学习模型中各个计算表达式所需的内存大小;
结合所述内存大小,创建所述计算表达式的内存标记;
基于所述内存标记,确定所述深度学习模型中异构计算单元间共享内存设置;其中,所述共享内存设置,为基于所述内存标记,指明同一块内存中存储的数据可以被哪些对象共享使用;
完成内存设置后,进行内存排布,得到内存排布方案,并按照所述内存排布方案实施内存共享。
2.根据权利要求1所述的内存共享方法,其特征在于,所述获取深度学习模型中各个计算表达式所需的内存大小,包括:
将所述深度学习模型分为:模型层、函数层和算子层;所述函数层中的函数对应所述异构计算单元;
从所述模型层、函数层和算子层中获取各个所述计算表达式的数据维度;
对所述深度学习模型的输入和各个所述计算表达式进行遍历,得到各个所述计算表达式的数据类型和对齐方式;
利用所述数据维度、所述数据类型和所述对齐方式,确定各个计算表达式所需的内存大小。
3.根据权利要求2所述的内存共享方法,其特征在于,对所述深度学习模型的输入和各个所述计算表达式进行遍历,得到各个所述计算表达式的数据类型和对齐方式,包括:
在所述函数层,对各个函数进行遍历,若函数与专用计算单元对应,则按照所述专用计算单元的要求计算数据类型和对齐方式,若函数未与专用计算单元对应,则按照所述深度学习模型的信息计算数据类型和对齐方式;
在所述算子层,对各个算子进行遍历,算子初始的数据类型和对齐方式按照所述深度学习模型的信息计算,与函数输入相对应的算子输入的数据类型和对齐方式更改为与该函数输入的数据类型和对齐方式相同;与函数输出相对应的算子输出的数据类型和对齐方式更改为与该函数输出的数据类型和对齐方式相同;若算子的后续算子为伪量化算子,则该算子输出的数据类型更改为按伪量化的要求计算;
在所述模型层,深度学习模型输入的数据类型和对齐方式确定为与对应函数输入的数据类型和对齐方式相同;深度学习模型输出的数据类型和对齐方式确定为与对应函数输出的数据类型和对齐方式相同。
4.根据权利要求1所述的内存共享方法,其特征在于,结合所述内存大小,创建所述计算表达式的内存标记,包括:
结合所述内存大小,为各个所述计算表达式创建一个所述内存标记,并初始化所述内存标记。
5.根据权利要求4所述的内存共享方法,其特征在于,为各个所述计算表达式创建一个所述内存标记,包括:
若所述计算表达式为张量类型节点,则为所述计算表达式创建包括一个张量内存标记的所述内存标记;
若所述计算表达式为元组类型节点,则为所述计算表达式创建包括多个张量内存标记的所述内存标记;
其中,所述张量内存标记包括:内存编号、内存复用标识、张量占用内存大小和内存分配大小;其中,内存复用标识初始值为0。
6.根据权利要求5所述的内存共享方法,其特征在于,初始化所述内存标记,包括:
利用所述内存大小对所述内存标记中的张量占用内存大小进行赋值;
以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化。
7.根据权利要求6所述的内存共享方法,其特征在于,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于输入型节点、常数节点或输出型节点,将所述计算表达式的所述内存复用标识值加1。
8.根据权利要求6所述的内存共享方法,其特征在于,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于普通计算节点,获取所述计算表达式的输入的内存标记,并将所述内存复用标识值加1。
9.根据权利要求6所述的内存共享方法,其特征在于,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于元组节点,将所述计算表达式对应的若干个普通分支节点的内存标记进行合并,得到合并结果;
利用所述合并结果,为所述内存标记中的内存复用标识进行初始化。
10.根据权利要求6所述的内存共享方法,其特征在于,所述以节点类型进入分支,并为所述内存标记中的内存复用标识进行初始化,包括:
对于元组分支节点,获取与所述计算表达式相对应的元组节点类型中普通分支节点的内存标记;
利用所述普通分支节点的内存标记为所述计算表达式的所述内存复用标识进行初始化。
11.根据权利要求1所述的内存共享方法,其特征在于,基于所述内存标记,确定所述深度学习模型中异构计算单元间共享内存设置,包括:
将所述深度学习模型分为:模型层、函数层和算子层;所述函数层中的函数对应所述异构计算单元;
基于所述内存标记,依次对所述模型层进行内存分配,对所述函数层进行内存分配,对所述算子层中的每一个算子进行内存分配;
确定所述模型层、所述函数层和所述算子层对应所述异构计算单元共享内存的共享信息。
12.根据权利要求11所述的内存共享方法,其特征在于,对所述模型层进行内存分配,对所述深度学习模型的输入,以标志位为假,计算对应所述计算表达式的内存标记。
13.根据权利要求11所述的内存共享方法,其特征在于,对所述函数层进行内存分配,包括:
以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配。
14.根据权利要求13所述的内存共享方法,其特征在于,所述以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配,包括:
对应普通节点,则递归地遍历当前函数的每个输入参数,获取每个所述输入参数的内存标记;
判断所述当前函数是否满足所述输入参数的内存标记的复用条件;
如果是,则复用所述输入参数的内存标记,并为内存复用标识加1;
如果否,则以标志位为真,计算所述计算表达式的张量内存标记;
若当前函数的内存标记中的内存复用标识为0,则将对应的张量内存标记对应的内存块放入可复用内存块列表;
对当前函数的每个输入参数的张量内存标记中内存复用标识分别减1,若对应结果为0,则将该张量内存标记对应的内存块放入所述可复用内存块列表中。
15.根据权利要求13所述的内存共享方法,其特征在于,所述以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配,包括:
对应元组节点,该计算表达式对应多个普通节点,将所述多个普通节点的内存标记合并为一个内存标记,并将合并所得的内存标记确定为所述计算表达式的内存标记。
16.根据权利要求13所述的内存共享方法,其特征在于,所述以节点类型进入分支,并对每个函数对应的所述计算表达式进行内存分配,包括:
对应元组分支节点,计算表达式的内存标记为与该计算表达式对应的元组中普通分支节点的内存标记。
17.根据权利要求11所述的内存共享方法,其特征在于,对所述算子层中的每一个算子进行内存分配,包括:
对于通用计算单元的每个输入,以标志位为假,计算内存标记,并将所有输入计算表达式放入输入输出算子标志映射表中,并更新输入输出标号。
18.根据权利要求17所述的内存共享方法,其特征在于,对所述算子层中的每一个算子进行内存分配,包括:
以节点类型进入分支,为每个算子确定内存标记并更新输入输出算子标志映射表。
19.根据权利要求17或18所述的内存共享方法,其特征在于,确定所述模型层、所述函数层和所述算子层对应所述异构计算单元共享内存的共享信息,包括:
对所述输入输出算子标志映射表中的算子重新分配内存编号,并找出与该算子共享内存地址的对应函数输入输出的算子表达式;
根据输入输出算子标志映射表中算子的输入输出标号值,对内存编号重新分配至不同区间;其中,相同的输入输出标号值重新分配相同的内存编号;不相同的输入输出标号值重新分配不相同的内存编号,并使内存编号与内部算子的内存编号均不相同;算子的内存编号对应两个区间,分别为内部算子区间和输入输出算子区间;
根据函数的输入和函数输入算子对应同一个对象,找到与该函数输入算子相应的函数,建立该输入算子的内存编号与所找到的相应函数的对应关系;
根据函数的输出和函数输出算子对应同一个对象,找到与该函数输出算子相应的函数,建立该输出算子的内存编号与所找到的相应函数的对应关系。
20.一种内存共享装置,其特征在于,包括:
信息获取单元,用于获取深度学习模型中各个计算表达式所需的内存大小;
初始化单元,用于结合所述内存大小,创建所述计算表达式的内存标记;
内存规划单元,用于基于所述内存标记,确定所述深度学习模型中异构计算单元间共享内存设置;其中,所述共享内存设置,为基于所述内存标记,指明同一块内存中存储的数据可以被哪些对象共享使用;
内存排布单元,用于完成内存设置后,进行内存排布,得到内存排布方案;
内存共享单元,用于按照所述内存排布方案实施内存共享。
21.一种电子设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序时实现如权利要求1至19任一项所述内存共享方法的步骤。
22.一种可读存储介质,其特征在于,所述可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至19任一项所述内存共享方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310203652.4A CN116049029B (zh) | 2023-03-06 | 2023-03-06 | 一种内存共享方法、装置、设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310203652.4A CN116049029B (zh) | 2023-03-06 | 2023-03-06 | 一种内存共享方法、装置、设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116049029A CN116049029A (zh) | 2023-05-02 |
CN116049029B true CN116049029B (zh) | 2023-07-14 |
Family
ID=86127512
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310203652.4A Active CN116049029B (zh) | 2023-03-06 | 2023-03-06 | 一种内存共享方法、装置、设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116049029B (zh) |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113127181B (zh) * | 2019-12-30 | 2024-02-20 | 杭州海康威视数字技术股份有限公司 | 内存管理方法、装置及存储介质 |
CN113168349A (zh) * | 2021-03-26 | 2021-07-23 | 珠海全志科技股份有限公司 | Ai处理器的内存分配方法、计算机装置及计算机可读存储介质 |
CN114816752A (zh) * | 2022-04-26 | 2022-07-29 | 山东云海国创云计算装备产业创新中心有限公司 | 一种内存管理方法、系统、设备及计算机可读存储介质 |
-
2023
- 2023-03-06 CN CN202310203652.4A patent/CN116049029B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN116049029A (zh) | 2023-05-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107918666B (zh) | 一种区块链上的数据同步方法和系统 | |
CN101634567B (zh) | 地图数据更新的装置、程序、方法 | |
JP3047998B2 (ja) | 並列計算機におけるプロセッサ割り当て方法、及び装置 | |
CN116501503B (zh) | 负载任务的架构映射方法、装置、计算机设备及介质 | |
Böckenhauer et al. | Online algorithms with advice: The tape model | |
CN110866029A (zh) | sql语句构建方法、装置、服务器及可读存储介质 | |
CN111462287A (zh) | 游戏中骨骼动画的数据处理方法、装置以及电子设备 | |
CN102158533B (zh) | 基于QoS的分布式web服务选择方法 | |
CN110399124B (zh) | 一种代码生成方法、装置、设备及可读存储介质 | |
JP3051972B2 (ja) | 並列計算機のプロセッサ間通信方法 | |
CN116049029B (zh) | 一种内存共享方法、装置、设备及可读存储介质 | |
CN111191778B (zh) | 深度学习网络处理方法、装置与编译器 | |
CN115016938A (zh) | 一种基于强化学习的计算图自动划分方法 | |
US9940267B2 (en) | Compiler global memory access optimization in code regions using most appropriate base pointer registers | |
CN110163791B (zh) | 数据计算流图的gpu处理方法及装置 | |
EP3049926B1 (en) | Parallel solution generation | |
CN110766146A (zh) | 一种人工智能处理器的学习任务编译方法及相关产品 | |
CN109902085A (zh) | 一种配置存储结构优化方法及系统 | |
CN113792875B (zh) | 一种分布式通信库的性能测试方法、装置、设备及介质 | |
CN116522844A (zh) | 电路划分方法、电路节点电压计算方法、终端及存储介质 | |
CN115686628A (zh) | 一种寄存器分配方法及装置 | |
CN115495226A (zh) | 内存管理方法、装置、设备及计算机可读存储介质 | |
US20220276642A1 (en) | Allocation device, learning device, inference device, allocation method, and non-transitory computer readable medium | |
CN113064720B (zh) | 对象分配方法、装置、服务器及存储介质 | |
KR102717840B1 (ko) | 리소스 크기 추천 방법 |
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 |