CN116302461A - 深度学习内存分配优化方法和系统 - Google Patents
深度学习内存分配优化方法和系统 Download PDFInfo
- Publication number
- CN116302461A CN116302461A CN202210940377.XA CN202210940377A CN116302461A CN 116302461 A CN116302461 A CN 116302461A CN 202210940377 A CN202210940377 A CN 202210940377A CN 116302461 A CN116302461 A CN 116302461A
- Authority
- CN
- China
- Prior art keywords
- memory
- tensor
- virtual
- memory allocation
- allocation
- 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.)
- Pending
Links
- 230000015654 memory Effects 0.000 title claims abstract description 633
- 238000013135 deep learning Methods 0.000 title claims abstract description 88
- 238000000034 method Methods 0.000 title claims abstract description 56
- 238000005457 optimization Methods 0.000 title claims abstract description 50
- 238000004364 calculation method Methods 0.000 claims abstract description 27
- 238000009826 distribution Methods 0.000 claims description 31
- 238000003860 storage Methods 0.000 claims description 21
- 238000012549 training Methods 0.000 abstract description 32
- 230000008569 process Effects 0.000 description 14
- 238000005192 partition Methods 0.000 description 13
- 238000007726 management method Methods 0.000 description 11
- 238000004088 simulation Methods 0.000 description 11
- 238000010586 diagram Methods 0.000 description 10
- 230000003068 static effect Effects 0.000 description 7
- 230000002085 persistent effect Effects 0.000 description 6
- 238000004422 calculation algorithm Methods 0.000 description 5
- 239000012634 fragment Substances 0.000 description 5
- 230000007246 mechanism Effects 0.000 description 5
- 230000006978 adaptation Effects 0.000 description 4
- 238000004590 computer program Methods 0.000 description 4
- 238000013528 artificial neural network Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000006870 function Effects 0.000 description 3
- 239000010410 layer Substances 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000011218 segmentation Effects 0.000 description 3
- 238000000926 separation method Methods 0.000 description 3
- 239000013598 vector Substances 0.000 description 3
- 230000003044 adaptive effect Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000013467 fragmentation Methods 0.000 description 2
- 238000006062 fragmentation reaction Methods 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 238000012804 iterative process Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 238000011160 research Methods 0.000 description 2
- 238000004458 analytical method Methods 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000006731 degradation reaction Methods 0.000 description 1
- 239000002355 dual-layer Substances 0.000 description 1
- 238000003384 imaging method Methods 0.000 description 1
- 230000001788 irregular Effects 0.000 description 1
- 239000011159 matrix material Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
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
- 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/5022—Mechanisms to release resources
-
- 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
-
- 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)
- Artificial Intelligence (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
公开了一种深度学习内存分配优化方法和系统。所述方法包括:记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息;根据获取的张量大小和生命期信息进行内存分配规划以生成内存分配计划;以及根据所述内存分配计划,进行后续轮次的张量内存分配。本发明利用深度学习训练任务每轮迭代运行数据不同,但执行计算图相同而使得多轮迭代之间的内存分配存在天然相似性的特点,采集前几轮迭代的张量大小和生命期信息,生成可用于后续迭代的内存分配计划,由此提升后续轮次迭代的内存复用,减少内存分配开销以及内存占用。
Description
技术领域
本公开涉及深度学习领域,尤其涉及一种深度学习内存分配优化方法和系统。
背景技术
目前在深度学习的譬如搜索、推荐、广告等的诸多场景中需要使用稀疏模型,而稀疏模型的张量形状(tensor shape)是未知的,导致难以进行内存静态分配。另外,存在一些多分支模型,模型的多分支结构会使得内存分配顺序不确定。在分布式场景中,参数服务器为多个工作器(worker)服务更新模型参数,存在多个计算图执行的场景,这也使得运行时收集信息进行内存分配的方法存在不准确的问题。
由此,需要一种改进的针对深度学习的内存分配优化方案。
发明内容
本公开要解决的一个技术问题是提供一种深度学习内存分配优化方法和系统,通过利用深度学习训练任务每轮迭代运行数据不同,但执行图相同而使得多轮迭代之间的内存分配存在天然相似性的特点,采集前几轮迭代的张量大小和生命期信息,并生成可用于后续迭代的内存分配计划,由此提升后续轮次迭代的内存复用,减少内存分配开销。
根据本公开的第一个方面,提供了一种深度学习内存分配优化方法,包括:记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息;根据获取的张量大小和生命期信息进行内存分配规划以生成内存分配计划;以及根据所述内存分配计划,进行后续轮次的张量内存分配。
可选地,根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划包括:根据获取的张量信息设置内存分配规划时的虚拟张量并根据所述虚拟张量对应的张量大小按预定间隔进行分桶;以及以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配。
可选地,以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配包括:查找无生命期冲突的更大分桶的虚拟内存块进行当前分桶内的当前虚拟张量的虚拟分配;若未找到所述更大分桶虚拟内存块,将当前虚拟张量向无生命期冲突的当前分桶的虚拟内存块进行虚拟分配;以及若未找到所述虚拟内存块,为所述当前虚拟张量分配一个新的当前分桶的虚拟内存块。
可选地,所述方法还包括:基于收集的虚拟张量对应张量的内存申请时间,根据所述内存分配计划进行模拟内存分配;以及在需要为当前分桶中的虚拟张量分配新的虚拟内存块时,重新进行所述内存分配规划以获取更新的内存分配计划。如上过程优选是一个迭代过程,由此可以重复以上过程直到内存分配计划能够满足多次迭代的内存分配请求或者达到指定迭代阈值。
可选地,根据所述内存分配计划,进行后续轮次的张量内存分配包括:根据所述内存分配计划进行与分桶对应的内存块申请;根据张量大小为张量分配对应分桶内的空闲内存块;在未找到所述空闲内存块时,根据所述内存分配计划分配更大分桶中的空闲内存块。
可选地,所述方法还包括:在后续轮次的张量内存分配中,在未找到所述内存块时,向备用内存池申请新的内存块。
可选地,针对同一深度学习计算任务中包括的多个计算图,执行各自的内存分配规划以获取各自的内存分配计划。
可选地,根据所述内存分配计划,进行后续轮次的张量内存分配包括:根据所述多个计算图各自对应的内存分配计划,在全局共享内存池中进行各个计算图与分桶对应的内存块申请。
根据本公开的第二个方面,提供了一种深度学习内存分配优化系统,包括:内存统计模块,用于记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息;分配规划模块,用于根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划;以及在线分配模块,用于根据所述内存分配计划,进行后续轮次的张量内存分配。
根据本公开的第三个方面,提供了一种计算设备,包括:处理器;以及存储器,其上存储有可执行代码,当可执行代码被处理器执行时,使处理器执行如上述第一方面所述的方法。
根据本公开的第四个方面,提供了一种非暂时性机器可读存储介质,其上存储有可执行代码,当可执行代码被电子设备的处理器执行时,使处理器执行如上述第一方面所述的方法。
由此,本发明的内存分配器通过创新性的内存管理机制、启发式内存规划算法,启发式内存块分桶策略、张量复用,基于图优化的内存分配等机制,通过系统架构和软件算法两个方面的创新,结合深度学习任务的特点,创造了可预测的计算图感知的深度学习框架自适应的内存分配器,它减少深度学习计算任务的内存资源占用以及分配内存的代价,从而提升深度学习系统的效率,提高了深度学习任务的计算性能。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了输入特征图作为张量的一个例子。
图2示出了运行时不同的并行内存分配场景。
图3示出了根据本发明一个实施例的一种深度学习内存分配优化方法的示意性流程图。
图4示出了本发明的分桶及虚拟内存分配策略的一个例子。
图5示出了模拟分配阶段根据计算进行虚拟内存分配的例子。
图6示出了根据本发明一个实施例的深度学习内存分配优化系统的组成示意图。
图7示出了本发明的深度学习内存分配优化系统的具体操作例。
图8示出了包括多个图分配器的深度学习内存分配优化系统的具体操作例。
图9示出了根据本发明一实施例可用于实现上述深度学习内存分配优化方法的计算设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
深度学习框架通过高级编程接口为神经网络的设计、训练和验证提供了构建模块。深度学习框架为神经网络具体算法的实现提供了途径。深度学习框架的性能和功能直接影响到模型训练和推理任务的速度以及可用性。目前深度学习已经在各个领域都得到广泛应用,包括在图像、语音、广告、搜索、推荐、自然语言处理等场景,业界也在持续探索各种方法来优化深度学习框架的性能。
内存和显存的优化是深度学习框架优化的重要组成部分,其是制约性能以及框架可用性关键因素:业界的研究主要集中在GPU显存的优化上,并且考虑的主要是静态模型。在稀疏模型的场景下,模型几乎都具有动态性。之前的研究忽视了多计算图并行以及多分支网络结构带来的动态性问题,同时对内存和显存碎片可能带来更高的内存和显存占用等问题缺少研究。现有场景下的深度学习框架的内存管理严重制约了整个深度学习框架的性能。由于深度学习框架的内存分配器仅用于进行张量的分配,因此针对深度学习任务的内存分配优化,就主要在于针对张量进行内存分配的优化。为了方便对本发明原理的理解,如下将首先介绍张量的概念。
在利用常见的深度学习框架例如TensorFlow和Pytorch进行深度学习任务训练时,首先需要通过编程构建一个计算图,然后将数据作为输入,通过计算图规定的计算操作进行计算,最后得到计算结果。由此能够摆脱编程语言的限制,帮助前后端解耦并能呈现更为直观的图像化效果。计算图模型由节点和边组成,节点表示操作符(Op),或者称之为算子,边表示计算间的依赖。在基于深度框架的深度学习任务计算(包括训练和预测)中,特征值沿着计算图节点中操作逐一流动。在此,特征值通常是多维矩阵,并且可被称为张量(tensor)。这也是深度框架TensorFlow名称的由来。
张量具有形状。形状(shape)指代张量的每个轴的长度(元素数量)。秩(rank)指代张量的轴数。标量的秩为0,向量的秩为1,矩阵的秩为2。轴或维度可以用于指代张量的一个特定维度。大小或尺寸(size)可以指代张量的总项数,即乘积形状向量。通常用索引来指代轴。轴通常按照从全局到局部的顺序进行排序:首先是批次,随后是空间维度,最后是每个位置的特征。由此使得在内存中特征向量可以位于连续的区域。
图1示出了输入特征图作为张量的一个例子。图示的张量是一个4秩张量,形状表示为[2,4,5,3],大小(尺寸)为60,即,含有60个元素。具体地,该张量可以包括批次(Batch)、宽度(Width)、高度(Height)、和特征(Feature)这四个维度。例如,当以4x5像素的RGB图像作为训练图像,并且每次训练两幅图像作为一个批次(通常对应于一个mini-batch,即,小批次)时,就可以得到如图1所示的输入张量。此时,图中每一个立方体可以表示某一幅训练图像的某一个像素点的R或G或B的取值。
应该理解的是,图1是为了示出方便给出了一个数据量较小的例子,在真实的训练常见中,每一幅训练图像可以具有更高的像素,例如40x60,每一个小批次可以训练更多的图像,例如512幅图像,并且用于训练的图像也可以不是RGB图像。另外,虽然图中为了方便理解将张量示出为四维张量在三维空间的表示,但上述表示通常不是用来描述空间的。
张量会在实现为有向无环图的计算图中单向流动,并且会因为节点算子的操作而更改形状。例如,由不同的卷积核进行卷积,用不同的填充策略进行填充,被重构以符合API调用需求等。
目前在深度学习的譬如搜索,推荐,广告等的诸多场景中需要使用稀疏模型,而稀疏模型的张量形状是未知的,导致难以进行内存静态分配。另外,存在一些多分支模型,模型的多分支结构会使得内存分配顺序不确定。在分布式场景中,参数服务器为多个工作器(worker)服务更新模型参数,存在多个计算图执行的场景,这也使得运行时收集信息进行内存分配的方法存在不准确的问题。
内存分配器对于提升模型训练和推理的性能,减少内存和显存占用有着重要意义。传统深度学习计算框架采用通用的内存管理系统其底层使用的是malloc库。这些库适合服务器类应用,提高其内存复用,减少内存分配从而提升性能。然而在深度学习场景下,每轮训练都有频繁的内存申请和释放,并且随着大模型的普及,模型中的张量越来越大,这导致每次分配和释放的内存块很大,传统的malloc库对于大内存块的分配和释放是不友好的,因为其对于大的内存不做缓存,按照需要及时分配和释放,在这样频繁申请释放的场景下由分配导致的缺页中断开销不可忽视。如果对其改造,对于大内存块也进行缓存,由于这种缓存完全是基于分配来进行的,并不能感知上层任务运行的规律,这可能导致大内存在较长时间内不被复用,从而造成内存浪费。
换句话说,现有内存分配器存在一些问题。在CPU端,一方面现有分配器(例如,jemalloc)对于深度学习应用的大内存分配会带来严重的缺页中断问题;另一方面,现有深度学习框架会周期性地将匿名计算任务发送给线程池执行,这使得同一线程在训练的不同周期执行的任务不同,导致基于线程的内存分配策略产生了较多的内存占用。在GPU端,现有深度学习框架的显存管理十分粗放,并且存在两个主要问题:一是因无法感知上层应用的分配请求特点而导致显存碎片过多;二是多分支模型结构下算子的不同执行顺序会带来不同的显存使用。
多分支结构广泛存在于推荐模型中。TensorFlow等深度学习框架使用多个线程来运行这样的多个分支,从而实现内存分配的并行性。为了方便理解,图2示出了运行时不同的并行内存分配场景。左图(a)中的节点表示算子所需的张量分配。右图(b)中线程上的每个矩形框代表一个张量分配,其中高度和宽度分别代表张量的大小和生命期。
由于并行内存分配导致内存分配顺序的不确定性,静态分析只能决定当前分支线程中每个分配的内存重用,如右图(b)所示的张量C和D的内存重用,而不能决定跨线程的内存分配的内存重用,例如不同的分支线程中例如B和G的重用。但是,结合图示的实际运行情况,可以看到在右图(b)上部的第一个并行分配的情况下,F和C因为生命周期冲突而不能重用同一个内存块,而在右图(b)下部所示的第二种情况,则可重复使用。而在这两种情况下,B和G都可以重用相同的内存块。由上可知,现有的内存分配方案存在巨大的改进空间。
有鉴于此,本发明提出一种针对深度学习任务特点的自适应内存管理优化方案,具备如下特点:
1)深度学习训练任务每轮迭代运行数据是不同的,但是执行的图是相同的,这导致多轮迭代之间存在一定的相似性。本发明的内存分配方案利用此特点,在多轮迭代之间进行内存和显存的复用,这样减少内存分配开销。
2)基于上述特点,生存期不同、大小不同张量可以复用同一个的内存块,极大的降低实际内存的用量。
3)优选地,本内存分配方案支持动态和静态模型的内存分配,并且能够做到高效复用分配器内存池中的内存,保证即使是在动态模型场景下也能极大减少内存分配,提高性能。
4)更为优选地,基于本方案实现的内存分配器可以是基于图的内存分配器,支持多图并行执行场景下内存分配和复用,提高执行性能。并且不同的图之间可以共享大块内存,从而减少实际内存使用量。
应该理解的是,本发明中使用的“内存”指代用于暂放处理器运算数据的存储器。因此在使用例如GPU等异构处理器进行深度学习任务的计算时,“内存分配”可以是针对GPU进行的“显存分配”。
图3示出了根据本发明一个实施例的一种深度学习内存分配优化方法的示意性流程图。
在步骤S310,记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息。
如前所述,深度学习训练任务每轮迭代运行数据是不同的,但是执行的图是相同的,这导致多轮迭代之间存在一定的相似性。因此,可以记录深度学习任务训练中前一轮或是前几轮的实际内存分配情况(此时内存分配可由深度学习框架自带内存分配器完成),并由此进行分配策略的优化并将优化策略用于后续轮次的内存分配。因此,当前轮次计算可以时深度学习训练任务的前一个或前几个小批次所对应的轮次。在深度学习场景中,在对训练集执行梯度下降算法时,将整个数据集分为若干的小的训练集,每一次对一个小的子集进行训练,此小子集称之为小批次(mini-batch)。
如上的步骤S310可由本发明对应内存分配优化系统所对应的内存统计模块(Collector)执行。内存统计模块可以收集指定的一段训练轮次区间(例如,step(步骤)1000到step 2000)内K个mini-batch(小批次)中对于张量的申请和释放请求,进行记录并统计,统计信息包括张量的大小和其申请时间和释放时间。具体地,存统计模块判断当前轮次是否需要进行统计,若需要进行统计,则开始记录准备。统计直到指定的结束轮次。在内存进行分配时记录内存地址以及时间戳,在回收此内存时再次记录时间戳,这样就获得了张量所分配内存的生命期和内存地址,即获得了张量本次分配的大小和生命期,为了表述方便,也称为“张量大小”和“张量生命期”。另外,应该理解的是,在此统计张量可以是当前轮次计算时涉及的所有张量,或者起码是所需分配的内存空间大于预定尺寸的张量,例如,当前轮次计算中,所有分配内存大于32KB的张量,
随后,在步骤S320,可以根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划。该步骤可由发明对应内存分配优化系统所对应的分配规划模块(Planner)执行。分配规划模块可以根据获取的张量设置作为内存分配规划时的虚拟张量并根据所述虚拟张量对应的张量大小按预定间隔进行分桶(bin),并以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配。
在获取了内存分配计划后,则可以在步骤S330,根据所述内存分配计划,进行后续轮次的张量内存分配。该步骤可由发明对应内存分配优化系统所对应的在线分配模块(OnlineAllocator)执行。
由此,本发明通过张量信息的收集,将在线内存分配效果转换为可知的离线内存分配过程。首先,由内存统计模块从深度学习训练任务最初的几个小批次(例如,前K个)收集数据,尤其是关于内存分配模式的数据,并将其用作后续小批次训练的内存分配指导。在这K个小批次之后,分配规划模块可以利用收集到的统计信息来为接下来的小批次生成合适的内存分配计划。并且随后,可以利用该内存分配计划对在线分配模块进行初始化,并由该在线分配模块对后续的小批次内存分配进行管理。在一个实施例中,在线分配模块可以根据分配的尺寸使用小内存池和大内存池来管理分配的内存(例如,小内存池和大内存池可以采用不同的策略来分别管理32KB以下的小张量和32KB以上的大张量)。在某些大内存分配无法由该大内存池管理时,还可以向备用内存池申请新的内存(例如,利用最佳适应分配模块(BestFitAllocator))。
在内存分配计划被制定之后,在线分配模块和最佳适应分配模块仅在需要新内存时才会调用malloc库(深度学习框架自带的内存管理库)并且这些被申请的内存空间不再返回给malloc库,而是由在线分配模块和最佳适应分配模块自行管理。最初的几个小批次(例如,前K个)的内存分配可由系统的malloc库管理,后续小批次的训练则由基于优化策略初始化的在线分配模块管理。由于深度学习任务的训练往往需要耗费几小时甚至几天的时间,由此由调用malloc库用于前K个小批次训练所导致的性能劣化对任务的整体训练性能影响很小。
由于模型训练阶段内存使用在每次迭代中的规律性,本发明通过收集运行时统计数据将在线内存分配问题转换程离线内存分配问题。然而,如何应对由于张量形状的不确定性和并行执行引起的动态波动仍然是一个未解决的挑战。由于内存使用波动问题难以适应规定大小的内存分配,因此本发明的优化策略可以是一种基于“分桶匹配”的内存分配方案,该方案基于张量的内存使用尺寸对内存块进行动态分配。为了实现这一目标,可以首先根据尺寸将内存块进行分桶分组。对于新进的内存分配请求,可以首先在对应分桶内查找空闲内存块,而在空闲内存块不足时,去更大分桶内查找空闲内存块(基于优化策略规定的顺序)直到请求被满足为止。由此,能够有效应对动态请求尺寸的变化。此外,还可以利用最佳适应分配模块来管理无法匹配内存分配计划的内存分配请求。
如前所述,根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划包括:统计获取的张量作为内存分配规划时的虚拟张量并根据所述虚拟张量对应的张量大小按预定间隔行分桶分组;以及以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配。在此,张量和内存块被称为“虚拟”的原因是此时进行的是内存分配规划,即,离线内存分配,而非实际的内存分配。具体地,以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配包括:查找可用的更大分桶的虚拟内存块进行当前分桶内的当前虚拟张量的虚拟分配;若未找到所述可用的更大分桶的虚拟内存块,将向无生命期冲突的当前分桶的虚拟内存块内进行虚拟分配;以及若未找到所述虚拟内存块,为所述当前虚拟张量分配一个新的当前分桶的虚拟内存块。
图4示出了本发明的分桶及虚拟内存分配策略的一个例子。周知的是,“分桶(bin)”是一种分组方法,可以将一个特征(通常是连续特征)根据所处区间,分组到区间对应的分桶中。本发明为减少管理的复杂度,对内存分配实行按分桶分组。例如,在本发明中,对于大于32KB的内存块,使用4KB的间隔进行分桶(Bin)分组,比如32KB到36KB为一个分桶、64KB到68KB为一个分桶等。
在图4上部,示出了内存统计模块(Collector)在对例如一个小批次的内存分配信息进行插桩收集(profiling)后生成的虚拟张量。虚拟张量由Collector将统计得到的张量按大小插入分桶而得到。具体如图4上部所示,当一个小批次迭代中涉大小为83KB、83KB、41KB、44KB、42KB、33KB和35KB的7个张量时,内存统计模块可以生成相应大小的七个虚拟张量A-G,并且根据它们各自对应的张量大小来进行分桶。其中,张量A和B被分到区间为(80KB,84KB]的同一个分桶中,张量C、D和E被分到区间为(40KB,44KB]的同一个分桶中,张量F和G被分到区间为(32KB,36KB]的同一个分桶中。如图4上部所示,内存统计模块在创建虚拟张量时,还会表明该张量的生命期,如图中所示的起始时间和结束时间。另外,为减少小内存块按分桶划分带来的内部碎片,对于小于32KB的内存块,分桶(Bin)的内存块大小间隔会更小。参考现代分配器对于小内存的管理,一般使用67个无大小的分桶间隔进行小内存块的分组,比如0~8byte为1个分桶,8~16byte为1个分桶等。对这些小于32KB的小张量,由于所占内存空间较小,内存复用带来的内存空间减少不明显,同时复用会引入设计的复杂性和性能开销,所以可以不进行跨桶的内存复用,由此可以不执行如图4下部所示的优化策略和后续的模拟策略,并在随后结合图7的描述中,可以在后续由在线分配模块控制内存分配的实际迭代中,从小内存池进行内存分配。
对于那些所需内存空间大于32KB的虚拟张量(VirtualTensor),可以根据张量大小进行遍历来完成虚拟内存块分配。对每个虚拟张量vt,在虚拟内存块列表中进行寻找,如果某个虚拟内存块m中之前已经被分配到该块的虚拟张量j均与该虚拟张量vt没有生命期冲突(对于两个虚拟张量vt1和vt2,它们之间的生命期冲突定义为vt1和vt2的分配时间和释放时间没有重合),则将该虚拟张量vt加入虚拟内存块m的已分配虚拟张量列表,进行下一个虚拟张量的分配。如果没有找到虚拟内存块,就分配一个新的虚拟内存块m_new,并将该虚拟张量vt加入虚拟内存块m_new的已分配虚拟张量列表。
在图4下部,示出了由分配计划模块(Planner),尤其是由分配计划模块(Planner)中包含的生成子模块(Generator)基于如上得到的虚拟张量来进行的虚拟内存分配。生成子模块启发性地规划内存分配策略,具体如图4下部所示,由于七个虚拟张量A-G中,按大小排序为ABDECGF,因此也以此顺序进行虚拟内存的分配。首先,由于虚拟张量A最先被分配,因此尚不存在可以复用的已分配内存块,因此为虚拟张量A分配分桶(80KB,84KB]的一个新的虚拟内存块,即,虚拟内存块1。随后,由于虚拟张量B的生命期与虚拟张量A的生命期有冲突,因此无法复用该虚拟内存块1,因此为虚拟张量B分配分桶(80KB,84KB]的一个新的虚拟内存块,即,虚拟内存块2。在一个实施例中,为同一个分桶分配的虚拟内存块具有与被分配虚拟张量相同的大小,此时分桶(80KB,84KB]的虚拟内存块1和2的大小为83KB和83KB。在一个优选实施例中,为同一个分桶分配的虚拟内存块具有相同的大小,都与该分桶的上限对齐,例如,分桶(80KB,84KB]的虚拟内存块1和2的大小都是如图所示的84KB。在同一分桶的虚拟内存块大小相同并与该分桶的上限对齐的情况下,虚拟张量的分配顺序只需是从大分桶到小分桶进行分配,而无法严格按照每个虚拟张量的大小进行分配,例如,此时也可以以ABCDEFG的顺序分配。
在完成对虚拟张量A和B的分配后,随后进行对属于分桶(40KB,44KB]的虚拟张量C、D和E的虚拟内存分配。在对虚拟内存C进行分配时,首先查找可用的更大分桶的虚拟内存块。在此,“可用的更大分桶的虚拟内存块”可以是该更大分桶的虚拟内存块内的已分配张量与该待分配张量无生命期冲突;也可以是虽然该更大分桶虚拟内存块内的已分配张量与该待分配张量有生命期冲突,待由于该更大分桶虚拟内存块在冲突时间内还存在足以容纳该待分配张量的空间,则仍然可以对该待分配张量“可用”(例如,如下张量F的分配)。由于分桶(80KB,84KB]的虚拟内存块1在时段t0-t4空闲,因此生命期为t0-t3的虚拟张量C被分配给分桶(80KB,84KB]的虚拟内存块1。类似地,由于分桶(80KB,84KB]的虚拟内存块2在时段t0-t5空闲,因此生命期为t0-t5的虚拟张量D被分配给分桶(80KB,84KB]的虚拟内存块2。而在进行虚拟张量E的分配时,由于分桶(80KB,84KB]的虚拟内存块1和2已对该虚拟张量E不可用,因此为该虚拟张量E分配所属分桶(40KB,44KB]的一个虚拟内存块1,例如如图所示的大小为44KB的虚拟内存块1。
在完成对虚拟张量C、D和E的分配后,随后进行对属于分桶(32KB,36KB]的虚拟张量F和G的虚拟内存分配。在对虚拟张量F进行分配时,同样首先查找可用的更大分桶虚拟内存块。虽然生命期为t0-t3的虚拟张量C被分配给分桶(80KB,84KB]的虚拟内存块1,在由于分配了虚拟张量C之后,分桶(80KB,84KB]的虚拟内存块1在t0-t3时间段内仍然有40KB的内存空闲,因此可以将生命期为t0-t1且大小为33KB的虚拟张量F分配分桶(80KB,84KB]的虚拟内存块1。而对于虚拟张量G,由于在其生命期t3-t6内,每个已有虚拟内存块都不可用,因此为该虚拟张量G分配所属分桶(33KB,36KB]的一个虚拟内存块1,例如如图所示的大小为36KB的虚拟内存块1。
如上的分配过程可以是由分配规划模块中的生成子模块(Generator)进行的。该生成子模块用于生成内存分配计划。但由于该内存分配计划是基于张量大小进行虚拟内存块分配,而在实际操作中则是按照时间先后进行内存分配,因此需要在实际实施优化策略前进行模拟,并在需要时更新由生成子模块生成的内存分配计划。此时,分配规划模块中还应该包括模拟子模块(Simulator)。相应地,本发明的深度学习内存分配优化方法还可以包括:基于收集的虚拟张量对应张量的内存申请时间,根据所述内存分配计划进行模拟内存分配;以及在需要为当前分桶中的虚拟张量分配新的虚拟内存块时,重新进行所述内存分配规划以获取更新的内存分配计划。如上过程优选是一个迭代过程,由此可以重复以上过程直到内存分配计划能够满足多次迭代的内存分配请求或者达到指定迭代阈值。
模拟子模块对运行时收集的虚拟张量信息,按照生成子模块初步生成的内存分配计划,进行模拟内存分配。具体地,模拟子模块不对分桶进行排序,按照虚拟张量的时间分配顺序,先从对应的分桶中寻找没有生命期冲突的虚拟内存块进行分配。如果对于分桶内没有找到可用的虚拟内存块,则再到优化策略阶段记录的复用分桶中寻找虚拟复用块。倘若仍然没有虚拟内存块可用,则为当前分桶生成一个新的虚拟内存块。图5示出了模拟分配阶段根据计算进行虚拟内存分配的例子。具体地,图5示出了由分配计划模块(Planner),尤其是由分配计划模块(Planner)中包含的模拟子模块(Simulator)基于如上得到的分配计划阶段得到的虚拟内存块,验证其基于时间前后的可行性。
此时,生成子模块已经生成了例如图4下部所示的(初步的)优化策略,并且虚拟张量A-G预先分配了对应分桶(80KB,84KB]的两个虚拟内存块,对应分桶(40KB,44KB]的一个虚拟内存块以及对应分桶(32KB,36KB]的一个虚拟内存块。在时刻t0,需要为虚拟张量C、D和F进行内存分配。根据模拟子模块的内存分配原则,首先从对应的分桶中寻找没有生命期冲突的虚拟内存块进行分配。因此虚拟张量C被分配到对应分桶(40KB,44KB]的虚拟内存块1内,虚拟张量F则被分配到对应分桶(32KB,36KB]的虚拟内存块1内。由于分桶(40KB,44KB]仅包括一个虚拟内存块,因此虚拟张量D需要到优化策略阶段记录的复用分桶中寻找虚拟复用块,并由此被分配到分桶(80KB,84KB]的虚拟内存块2内。在时刻t3,需要为虚拟张量E和G进行内存分配。根据模拟子模块的内存分配原则,首先从对应的分桶中寻找没有生命期冲突的虚拟内存块进行分配。因此虚拟张量E被分配到对应分桶(40KB,44KB]的虚拟内存块1内,虚拟张量G则被分配到对应分桶(32KB,36KB]的虚拟内存块1内。在时刻t4,为虚拟张量A进行内存分配,由于分桶(80KB,84KB]的虚拟内存块1完全空闲,将虚拟张量A分配到分桶(80KB,84KB]的虚拟内存块1内。最后在时刻t5,为虚拟张量B进行内存分配,由于虚拟张量D对分桶(80KB,84KB]的虚拟内存块2的占用已在t5结束,因此可以将虚拟张量B分配到分桶(80KB,84KB]的虚拟内存块2内。
虽然图5模拟的虚拟张量内存分配与图4下部的虚拟张量内存分配不同,但基于Generator的计划而预先分配的虚拟内存块能够满足虚拟张量的按时间的内存分配需求。即,图4下部所示的由生成子模块初步生成的内存分配计划经由模拟子模块的模拟,并如图5所示是可行的。
在实际操作中,可以首先运行生成子模块,待优化策略稳定,再运行模拟子模块。具体地,可以在最初的每个小批次运行结束后就收集到了当前轮次的所有内存分配信息,并运行生成子模块。生成子模块中任一个分桶中都没有新的虚拟内存块生成,则当前认为当前是一个稳定的轮次,在连续K个稳定轮次后或者达到最大设定的轮次后计划生成子模块阶段的运行结束,并进入模拟子模块运行阶段。模拟子模块运行阶段同样以没有新的内存块生成以及最大统计轮次为结束条件。由此,可以生成完整的内存分配计划,用于在线分配模块的使用。
在线分配模块是实际运行时给计算图算子分配内存使用的。在一个实施例中,可以仅对预定阈值大小以上的张量执行基于如上所述的内存分配计划的内存分配。该预定阈值大小可以是如上所述的32KB。如果需要进行内存分配的张量小于32KB,可以直接使用系统库譬如jemalloc进行分配;或是如上所述使用基于更小间隔分桶得出的小张量内存分配计划,该计划也可以为小张量预先分配与分桶对应的内存块,但由于张量尺寸小,因此小张量分配计划可以不涉及一个迭代轮次中跨桶内存块的复用。而如果需要进行内存分配的张量大于32KB,则可基于如上所述的内存分配计划进行分配。为此,根据所述内存分配计划,进行后续轮次的张量内存分配包括:根据所述内存分配计划进行与分桶对应的内存块申请;根据张量大小为张量分配对应分桶内的空闲内存块;若找到,则分配一个内存块给当前张量;在未找到所述空闲内存块时,根据所述内存分配计划分配更大分桶中的复用内存块。
如下将具体讨论如何在内存分配计划的指导下在运行时执行实际的内存分配。应该注意到,在运行时,分配请求没有生命周期信息(即,在分配请求时并不知道对应张量的释放时间)。由于将内存块按大小分桶,因此每个分桶中的各个内存块彼此等价。在线分配模块首先根据内存分配计划进行初始化,指定虚拟内存块大小、虚拟内存块个数以及每个分桶对应的复用分桶列表。因此,在线分配模块将确定分桶并将实际内存块分配给每个分桶。这些内存块被组织在一个堆栈中,作为分桶的空闲块列表。
在运行时,当一个内存分配请求到达时,在线分配模块首先根据请求大小找到对应分桶。如果该分桶的空闲列表不为空(即,存在空闲内存块),则从堆栈中弹出一个内存块返回给该请求。如果空闲列表为空(即,无内存块空闲),则根据内存分配计划中的复用分桶列表查找空闲块。如果搜索失败,则需要求助于最佳适应分配模块。
当在复用分桶中搜索空闲块时,内存块将由最适合的方法管理。首先,从空闲块列表中找到最小且最合适的空闲块,然后将该块划分为一个已使用块和一个空闲块。已使用块返回给请求使用,空闲块被添加到空闲列表中。显然,复用分桶是比当前请求大小对应分桶更大的分桶。
在内存分配的过程中,需要保存内存块的一些元数据(metadata)信息,包括这个内存块属于那个分桶以及内存块切分的前后块等。为此,需要建立内存块到元数据信息的映射。在一个实施例中,为了避免锁的开销,使用二级radix tree(基数树)进行存储。在释放内存时,从二级radix tree中获得对应的分桶,如果是被切分的内存块,进行前后空闲块(如果存在)的合并,并加入对应分桶的空闲块列表;如果不是切分块,就直接压入空闲块的栈中。
由于运行时的动态和不规则内存分配,在计划的内存分配策略和实际的内存分配中会存在某些不一致。如果在线分配模块未找到复用内存块,则意味着内存分配计划预先请求的内存块无法满足实际操作时的内存分配需求,此时可以向备用内存池申请新的内存块。具体地,这些失配的内存分配可由最佳适应分配模块进行管理,最佳适应分配模块可以向系统malloc库申请备用内存池。在一个具体实现中,最佳适应分配模块使用最佳适应策略进行内存分配。最佳适应策略需要预先确定的内存块大小,然后在此内存块上拆分以进行内存分配。每次内存用完都需要一个新的内存块,这会导致更多的内存碎片,因为新的内存块和之前的内存块不连续,这些内存块不能合并。因此,最佳适应分配模块可以统计预定数量(例如,128个)内存分配请求的最大内存使用量,并以此大小作为最佳适应策略的初始内存块大小。对于后续还是不满足的内存分配,依次以64、32、16、8的次数确定初始内存池大小,最后统一使用每8个不满足的内存分配进行确定。对于最佳适应分配模块的内存分配,依次遍历每个内存池进行内存分配。
图6示出了根据本发明一个实施例的深度学习内存分配优化系统的组成示意图。该系统可以并入现有的深度学习框架,作为内存分配器的一部分。如图所示,该系统600可以包括内存统计模块610、分配规划模块620和在线分配模块630。内存统计模块610用于记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息。分配规划模块620用于根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划。在线分配模块630用于根据所述内存分配计划,进行后续轮次的张量内存分配。进一步地,该系统600还可以包括最佳适应分配模块,用于处理实际运行中计划之外的新内存分配。
为了进一步加深对本发明的理解,如下将结合图7描述本发明优化系统的示例性操作过程。图7示出了本发明的深度学习内存分配优化系统的具体操作例。此时的深度学习内存分配优化系统700可以包括内存统计模块710、分配规划模块720、在线分配模块730和最佳适应分配模块740。如图所示,在进行深度学习训练的过程中,会接收到针对张量的内存分配或释放请求。此时,如果需要进行在线分配模块的初始化,则意味着需要首先采集实际的内存分配信息并据此制定内存分配计划。因此,在需要进行初始化时,内存统计模块(Collector)710收集前K个小批次中每一个批次的内存分配和释放信息,并将其提供给分配规划模块(Planner)720。分配规划模块(Planner)720可以包括生成子模块(Generator)和模拟子模块(Simulator)两个子模块,分别用于基于分桶和张量大小的内存分配计划的生成以及基于张量分配时间的计划模拟执行。当由此获取的内存分配计划在预定轮次中保持稳定或达到最大次数时,就得到了自适应生成的内存分配计划。该内存分配计划随后交由在线分配模块(OnlineAllocator)730,用于后者的初始化。在线分配模块用于深度学习任务后续轮次执行时进行实际内存分配。如前所述,可以为小于预定阈值(例如,32KB)的张量分配小内存池,为大于预定阈值(例如,32KB)的张量预先分配大内存池。在不同的实施例中,用于在线分配模块初始化的内存分配计划可以包括针对小张量的分配计划,也可以不包括针对小张量的分配计划。在内存分配计划包括针对小张量的分配计划时,可以在在线分配模块初始化时就进行小内存池的分配(小张量不进行内存复用);而如果内存分配计划不包括针对小张量的分配计划,则完全可以交由系统malloc库来进行针对小张量的内存分配。无论在哪个实施例中,都需要基于内存分配计划进行针对大张量的内存预先分配。可以基于内存分配计划,申请对应于各个分桶的计划数量的内存块,并且优选地,对应于同一个分桶的预先分配的内存块具有相同的大小,都等于分桶对应张量大小区间的上限。这些分配的内存块构成了大内存池。在后续迭代中,如果内存分配完全按计划实施,则仅需从大内存池和小内存池中申请内存和回收内存。而当大小内存池无法满足内存需求时,则说明优化策略与实际内存分配存在不匹配,此时需要最佳适应分配模块(BestFitAllocator)740进行额外的内存申请。应该理解的是,大小内存池和最佳适应分配模块740管理的备用内存池最初都需要系统malloc库来进行内存分配,并且内存统计模块710在进行最初的分配和释放统计时,也是针对系统malloc库进行的内存分配和释放进行的统计。
本发明如上提及的当前轮次和后续轮次,其计算针对深度学习任务的计算图。在某些实施例中,一个深度学习任务包括一个计算图。此时,可以为该计算图进行内存分配规划,以及基于规划的后续轮次迭代。而为了提升深度学习任务的整体计算效率,针对同一深度学习计算任务中可以包括多个计算图。多个计算图可以包括并行或是串行的计算图,由此提升深度学习任务的整体计算效率。当存在针对同一任务的多个计算图时,可以为每个计算图执行各自的内存分配规划以获取各自的内存分配计划。为了降低不同计算图的内存分配之间的干扰并且更好地适应每个计算图的属性,还可以涉及基于图的分配模块,以收集每个计算图的内存使用模式并独立的分配内存。为此,根据所述内存分配计划,进行后续轮次的张量内存分配可以包括:根据所述多个计算图各自对应的内存分配计划,在全局共享内存池中进行各个计算图与分桶对应的内存块申请。
图8示出了包括多个图分配器的深度学习内存分配优化系统的具体操作例。如图所示,深度学习内存分配优化系统800可以包括多个内部组成相同的图分配器(GraphAllocator 1-N)810。每个图分配器810都用于对组成深度学习任务的多个计算图中的一个计算图进行计算,并且都包括各自内部的内存统计模块811、分配规划模块812和在线分配模块813。虽然图中示出了图分配器1和N中针对不同的计算图进行计算,但在实际操作中,也存在针对相同的计算图采用不同的线程进行并行计算的情况,此时,也需要为并行计算的每个相同的计算图分配不同的线程(单机计算)甚至不同的计算节点(分布式计算),因此仍然需要为这些计算图各自分配图分配器以进行各自的内存分配优化。在优选的实现中,如图所示,由在线分配模块813管理的小内存池可以在初始化时直接由系统malloc库进行分配,并且保留在各自的图分配器内,即,小内存池不是全局内存池。而同样由在线分配模块813管理的大内存池则可以位于全局共享内存池820中。在每个计算图开始时,可以从该全局共享内存池820中获取对应的内存块,而在该计算图结束时,全局共享内存池820可以将该内存块回收。同样地,全局共享内存池820本身也需要在由系统malloc库进行内存分配。另外,各个图分配器1-N也基于同一个全局的最佳适应分配模块(BestFitAllocator)830来进行计划不匹配时的内存申请和释放处理。由此,通过全局共享的内存来实现大内存池和备用内存池,提升计算图之间张量调用和内存复用的便利性。另外,应该理解虽然为了图示清楚,在图8中没有使用虚线框框出系统800的范围,但该系统800不包括图中的系统malloc库,而是包括多个图分配器810、全局共享内存池820和最佳适应分配模块830。
图9示出了根据本发明一实施例可用于实现上述深度学习内存分配优化方法的计算设备的结构示意图。
参见图9,计算设备900包括存储器910和处理器920。
处理器920可以是一个多核的处理器,也可以包含多个处理器。在一些实施例中,处理器920可以包含一个通用的主处理器以及一个或多个特殊的协处理器,例如图形处理器(GPU)、数字信号处理器(DSP)等等。在一些实施例中,处理器920可以使用定制的电路实现,例如特定用途集成电路(ASIC,Application Specific Integrated Circuit)或者现场可编程逻辑门阵列(FPGA,Field Programmable Gate Arrays)。
存储器910可以包括各种类型的存储单元,例如系统内存、只读存储器(ROM),和永久存储装置。其中,ROM可以存储处理器920或者计算机的其他模块需要的静态数据或者指令。永久存储装置可以是可读写的存储装置。永久存储装置可以是即使计算机断电后也不会失去存储的指令和数据的非易失性存储设备。在一些实施方式中,永久性存储装置采用大容量存储装置(例如磁或光盘、闪存)作为永久存储装置。另外一些实施方式中,永久性存储装置可以是可移除的存储设备(例如软盘、光驱)。系统内存可以是可读写存储设备或者易失性可读写存储设备,例如动态随机访问内存。系统内存可以存储一些或者所有处理器在运行时需要的指令和数据。此外,存储器910可以包括任意计算机可读存储媒介的组合,包括各种类型的半导体存储芯片(DRAM,SRAM,SDRAM,闪存,可编程只读存储器),磁盘和/或光盘也可以采用。在一些实施方式中,存储器910可以包括可读和/或写的可移除的存储设备,例如激光唱片(CD)、只读数字多功能光盘(例如DVD-ROM,双层DVD-ROM)、只读蓝光光盘、超密度光盘、闪存卡(例如SD卡、min SD卡、Micro-SD卡等等)、磁性软盘等等。计算机可读存储媒介不包含载波和通过无线或有线传输的瞬间电子信号。
存储器910上存储有可执行代码,当可执行代码被处理器920处理时,可以使处理器920执行上文述及的深度学习内存分配优化方法。
上文中已经参考附图详细描述了根据本发明的深度学习内存分配优化方法和系统。本发明的如上优化方案尤其适用于涉及多批次多轮迭代的深度学习训练任务。而在深度学习推理任务中,也可以在使用相同硬件相同神经网络对输入数据进行持续推理时,在数据起始输入时制定内存分配计划,并在针对后续数据的推理计算时基于该内存分配计划进行内存分配。
目前业界主要关注GPU显存的优化,包括对显存的精细管理、显存的换入/换出技术等方法,但是这些优化忽视了多计算图并行以及多分支网络结构带来的动态性问题,导致了运行时统计不准确的性,同时也忽视了内存和显存碎片可能带来更高的内存和显存使用以及模型结构带来的内存和显存影响。本发明针对动态模型在CPU/GPU集群时面临的内存(包括显存)紧张、碎片,缺页中断严重的问题,提出了深度学习自适应内存分配器,通过多阶段分配规划内存,复用块切分,radix tree信息索引以及基于子图的优化等创新技术实现,大大降低了内存和显存使用量,减少了缺页中断以及内存和显存碎片,显著的提高了端到端的训练性能并且节省了内存和显存的使用量。该方法对于训练搜索、推荐、广告的稀疏模型能够显著带来优化效果。
本发明的内存分配器通过创新性的内存管理机制,包括通过Collector,Planner,OnlineAllocator以及BestFitAllocator等模块,对于动态和静态任务都能计算出优化的内存分配计划。这使得任务执行过程中张量可以得到最大程度的复用,减少整体内存使用量。同时也能保证高效的内存分配效率,保证绝大部分的内存都是直接从缓存的内存块中直接分配,而无需经过真正的系统内存分配过程,提高了整体的分配效率。同时对于多子图同时执行的场景,进行进一步的基于图的优化,保证不同的子图之间互不干扰,大大的提高了任务执行性能。由此,通过系统架构和软件算法两个方面的创新,结合深度学习任务的特点,创造了可预测的计算图感知的深度学习框架自适应内存分配器,减少深度学习计算任务的内存资源开销以及分配内存的代价,提高了深度学习任务的性能。
具体地,Planner模块采用两阶段计算模式,Planner模块首先会使用Generator生成内存分配策略,称为计划分配阶段,然后使用Simulator对Generator生成的内存分配策略进行模拟分配,称为模拟分配阶段。Generator模块对内存分配进行了复用计划的生成,但因为Generator模块对分桶进行了排序,这可能会计划和实际分配不匹配的情况,比如较大分桶中的虚拟张量比较小分桶中的虚拟张量先分配,实际运行中可能是较大分桶中的虚拟张量后分配。为了解决这个问题,引入了Simulator。Simulator对运行时收集的虚拟张量信息,按照计划分配阶段的内存分配策略,进行模拟内存分配。生成最终的内存分配规划。在稀疏动态模型场景下,通过Generator和Simulator的配合能够计算出更加精确的内存缓存计划。
在图执行过程中,存在大小不一的张量,本发明的分配器需要同时做到最大内存复用,同时也需要尽可能用更少的内存,所以使用了复用块切分方法。在小虚拟张量复用大虚拟内存块的过程中,由于大虚拟内存块比小虚拟张量大,会有空闲空间不被使用,这块空闲空间可以被切分来让其他小虚拟张量使用。这一过程可以使用最佳适应方法进行处理。
在内存分配的过程中,需要保存内存块的一些元数据,包括这个块属于那个分桶以及内存块切分的前后块等。为此,需要建立内存块到元数据的映射。为了避免锁的开销,优选使用二级radix tree进行存储。在内存释放时,从二级radix tree中获得对应的分桶,如果是切分块,进行前后空闲块(如果存在)的合并,并加入对应分桶的空闲块列表;如果不是切分块,就直接压入空闲块的栈中。
而在多图执行场景下,不同的子图之间相互独立,互不影响。如果这些图使用统一的内存分配器,难以实现高效的内存复用,同时也容易出现内存浪费。本发明的内存分配器关注到这一特点,实现了GraphAllocator,这样能保证子图之间相互不影响,这减少了内存分配时的开销,提升了整体的性能。同时为了更进一步减少内存使用,在不同的子图之间增加了一层全局共享内存池,用于每张子图执行过程中张量未分配到缓存的内存块时候使用的,这种情况一般出现频率比较低,所以不同的子图之间是可以共享一套内存池的,既不影响性能,也节省了内存使用。
从整体方案设计上来看,本发明的内存分配器通过创新性的内存管理机制、启发式内存规划算法,启发式内存块分桶策略、张量复用,基于图优化的内存分配等机制,通过系统架构和软件算法两个方面的创新,结合深度学习任务的特点,创造了可预测的计算图感知的深度学习框架自适应内存分配器,它减少深度学习计算任务的内存资源开销以及分配内存的代价,从而提升深度学习系统的效率,提高了深度学习任务的计算性能。
此外,根据本发明的方法还可以实现为一种计算机程序或计算机程序产品,该计算机程序或计算机程序产品包括用于执行本发明的上述方法中限定的上述各步骤的计算机程序代码指令。
或者,本发明还可以实施为一种非暂时性机器可读存储介质(或计算机可读存储介质、或机器可读存储介质),其上存储有可执行代码(或计算机程序、或计算机指令代码),当所述可执行代码(或计算机程序、或计算机指令代码)被电子设备(或计算设备、服务器等)的处理器执行时,使所述处理器执行根据本发明的上述方法的各个步骤。
本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。
附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (11)
1.一种深度学习内存分配优化方法,包括:
记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息;
根据获取的张量大小和生命期信息进行内存分配规划以生成内存分配计划;以及
根据所述内存分配计划,进行后续轮次的张量内存分配。
2.如权利要求1所述的方法,其中,根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划包括:
根据获取的张量信息设置内存分配规划的虚拟张量并根据所述虚拟张量对应的张量大小按预定间隔进行分桶(bin);以及
以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配。
3.如权利要求2所述的方法,其中,以从大到小的分桶顺序为虚拟张量进行虚拟内存的分配包括:
查找无生命期冲突的更大分桶的虚拟内存块进行当前虚拟张量的虚拟分配;
若未找到所述更大分桶虚拟内存块,在当前分桶的虚拟内存块中寻找无生命期冲突的虚拟内存块进行虚拟分配;以及
若未找到所述当前分桶的虚拟内存块,为所述当前虚拟张量分配一个新的当前分桶的虚拟内存块。
4.如权利要求1所述的方法,还包括:
基于收集的虚拟张量对应张量的内存申请时间,根据所述内存分配计划进行模拟内存分配;以及
在需要为当前分桶中的虚拟张量分配新的虚拟内存块时,重新进行所述内存分配规划以获取更新的内存分配计划。
5.如权利要求1所述的方法,其中,根据所述内存分配计划,进行后续轮次的张量内存分配包括:
根据所述内存分配计划进行与分桶对应的内存块申请;
根据张量大小为张量分配对应分桶内的空闲内存块;
在未找到所述空闲内存块时,根据所述内存分配计划分配更大分桶中的空闲内存块。
6.如权利要求5所述的方法,还包括:
在后续轮次的张量内存分配中,在未找到所述复用内存块时,向备用内存池申请新的内存块。
7.如权利要求1所述的方法,其中,针对同一深度学习计算任务中包括的多个计算图,执行各自的内存分配规划以获取各自的内存分配计划。
8.如权利要求7所述的方法,其中,根据所述内存分配计划,进行后续轮次的张量内存分配包括:
根据所述多个计算图各自对应的内存分配计划,在全局共享内存池中进行各个计算图与分桶对应的内存块申请。
9.一种深度学习内存分配优化系统,包括:
内存统计模块,用于记录当前轮次计算中所涉及张量的内存分配大小以及内存申请和释放时间,以获取张量大小和生命期信息;
分配规划模块,用于根据获取的张量大小和生命期信息进行内存分配规划以获取内存分配计划;以及
在线分配模块,用于根据所述内存分配计划,进行后续轮次的张量内存分配。
10.一种计算设备,包括:
处理器;以及
存储器,其上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如权利要求1至8中任一项所述的方法。
11.一种非暂时性机器可读存储介质,其上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如权利要求1至8中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210940377.XA CN116302461A (zh) | 2022-08-05 | 2022-08-05 | 深度学习内存分配优化方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210940377.XA CN116302461A (zh) | 2022-08-05 | 2022-08-05 | 深度学习内存分配优化方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116302461A true CN116302461A (zh) | 2023-06-23 |
Family
ID=86817299
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210940377.XA Pending CN116302461A (zh) | 2022-08-05 | 2022-08-05 | 深度学习内存分配优化方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116302461A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116610456A (zh) * | 2023-07-19 | 2023-08-18 | 首都师范大学 | 一种基于急切内存重用算法的内存优化方法 |
CN117032954A (zh) * | 2023-07-17 | 2023-11-10 | 北京泛睿科技合伙企业(有限合伙) | 针对终端训练模型的内存优化方法、系统、设备及介质 |
CN117093509A (zh) * | 2023-10-18 | 2023-11-21 | 上海为旌科技有限公司 | 一种基于贪婪算法的片上内存地址分配方法和系统 |
CN117632379A (zh) * | 2024-01-25 | 2024-03-01 | 大连高德瑞信科技有限公司 | 一种java内存堆栈数据分析方法及系统 |
-
2022
- 2022-08-05 CN CN202210940377.XA patent/CN116302461A/zh active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117032954A (zh) * | 2023-07-17 | 2023-11-10 | 北京泛睿科技合伙企业(有限合伙) | 针对终端训练模型的内存优化方法、系统、设备及介质 |
CN117032954B (zh) * | 2023-07-17 | 2024-04-26 | 北京泛睿科技合伙企业(有限合伙) | 针对终端训练模型的内存优化方法、系统、设备及介质 |
CN116610456A (zh) * | 2023-07-19 | 2023-08-18 | 首都师范大学 | 一种基于急切内存重用算法的内存优化方法 |
CN116610456B (zh) * | 2023-07-19 | 2023-09-26 | 首都师范大学 | 一种基于急切内存重用算法的内存优化方法 |
CN117093509A (zh) * | 2023-10-18 | 2023-11-21 | 上海为旌科技有限公司 | 一种基于贪婪算法的片上内存地址分配方法和系统 |
CN117093509B (zh) * | 2023-10-18 | 2024-01-26 | 上海为旌科技有限公司 | 一种基于贪婪算法的片上内存地址分配方法和系统 |
CN117632379A (zh) * | 2024-01-25 | 2024-03-01 | 大连高德瑞信科技有限公司 | 一种java内存堆栈数据分析方法及系统 |
CN117632379B (zh) * | 2024-01-25 | 2024-03-26 | 大连高德瑞信科技有限公司 | 一种java内存堆栈数据分析方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN116302461A (zh) | 深度学习内存分配优化方法和系统 | |
KR102198680B1 (ko) | 확장 가능한 멀티-스테이지 데이터 처리 시스템들에서의 효율적인 데이터 캐싱 관리 | |
US8402469B2 (en) | Allocating resources for parallel execution of query plans | |
JP6376865B2 (ja) | 並列ツリー・ベースの予測のための、コンピュータにより実行される方法、ストレージ媒体、およびコンピュータ・システム | |
CN105468439B (zh) | 在cpu-gpu异构框架下遍历固定半径内邻居的自适应并行方法 | |
CN105700948A (zh) | 一种用于在集群中调度计算任务的方法与设备 | |
CN111737168B (zh) | 一种缓存系统、缓存处理方法、装置、设备及介质 | |
CN111538586A (zh) | 集群gpu资源管理调度系统、方法以及计算机可读存储介质 | |
US20100031267A1 (en) | Distribution Data Structures for Locality-Guided Work Stealing | |
CN105159610A (zh) | 大规模数据处理系统及方法 | |
US20130268941A1 (en) | Determining an allocation of resources to assign to jobs of a program | |
US20190129845A1 (en) | Managing objects stored in memory | |
CN112559165A (zh) | 内存管理方法、装置、电子设备及计算机可读存储介质 | |
CN104270412A (zh) | 一种基于Hadoop分布式文件系统的三级缓存方法 | |
Li et al. | Supporting efficient execution of continuous space agent‐based simulation on GPU | |
CN112015765A (zh) | 基于缓存价值的Spark缓存淘汰方法及系统 | |
CN116450053A (zh) | 数据存储方法、装置、系统、电子设备和存储介质 | |
CN116893904A (zh) | 神经网络模型的内存管理方法、装置、设备、介质及产品 | |
CN109033365A (zh) | 一种数据处理方法及相关设备 | |
CN108108242B (zh) | 基于大数据的存储层智能分发控制方法 | |
US11429299B2 (en) | System and method for managing conversion of low-locality data into high-locality data | |
Zhang et al. | Optimizing data allocation for loops on embedded systems with scratch-pad memory | |
CN116048759A (zh) | 数据流的数据处理方法、装置、计算机和存储介质 | |
KR20230058621A (ko) | 메모리-한도 스케줄링 | |
Legrand et al. | Monarc simulation framework |
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 |