moDNN: Memory Optimal DNN Traini

2020-04-15  本文已影响0人  CPinging
image.png

一、前言

这篇文章是2018年DATE上的一篇关于DNN中优化内存的论文,前面也总结了许多相关文章,这些问题的背景出发点均是由于随着模型越来越大,系统GPU内存不足以装下如此大规模的模型,从而使得训练失败。

如何能让GPU装下模型并不太影响训练的效率成为这些工作的研究重点。

本文基于数据释放、预取,动态卷积函数选择、动态Batch大小选择等方向来优化系统。与之前的一些方案相比(如vDNN),本文说其方案更为智能、并且考虑了batch大小。此外,本文没有运用重计算的思想,文章给的原因是因为这样会带来额外的开销(This approach incurs high performance degra- dation. )。那我们就来看看这篇文章的主要思想是什么。

二、基本概念交代

在分析这些方案前,先交代一些基本背景:

image.png image.png

爆炸增长。

所以文章声称:

-1 引入自动调整Batch size的方案以便最优化内存使用;

三、核心思想

image.png

文章介绍到,如果把一个大batch分成许多小的,那么有个很严重的问题就是准确度,不过可以把小batch的梯度整合起来进行操作,从而不影响精度(the gradients are accumulated from all the sub-batches)。

第一个公式首先定义了对于某个Task,在sub-batch size下的最小内存占用。

image.png

输入Tensor+输出Tensor+卷积函数工作空间。

之后又定义出了最小的使用内存量:

image.png

于是:Sw(weights权重的内存量)+batch size为1时的Tensor输入输出大小。

之后是定义如何选择最合适的Batch size。

首先需要profile工作来对不同种类的卷积函数所需空间以及性能进行收集。然后迭代计算batch size,直到下列等式满足:

image.png

这个函数似乎写的不太清楚,没有体现迭代的过程,不过我理解的来说,max是为了取出我所有操作(这里t是值的操作)中最消耗内存的那个。M-Sw是指我内存总量-weights所需内存量。然后对后面的数进行除法操作意思是:当前内存能装下几倍的当前的batch消耗的空间。

由于Mmin与b不是完全的y=bx关系(即如果我b增加2倍,那么Mmin应该会增加的小于等于两倍)

所以导致这个公式在迭代过程中前后的两个b并不一致。逐步逼近直到左右两个b一致。

image.png

其中包括几个要点需要我们注意:1 将数据转移与计算最大化并行;2 减少额外释放操作需要的时间;3 更明智的预取数据;4 选择最合适的卷积函数;

该流程包括三个主要步骤:(1)对t操作涉及的输入与输出数据做准备;(2)选择合适的卷积函数;(3)选择预取的位置与数据;

如果分配失败,则需要释放掉部分数据(4~5行),如果找不到可以释放的数据,则需要进行defragmentation操作,把所有数据都reload一遍(此时就肯定能装下,因为之前的batch操作保证了内存可以装下最大task中的所有数据)。

并且我们需要记录一下这个额外操作的时间。

如果至少有一个tensor可以分配,那么去判断是否需要在当前t阶段执行转移(判断会不会造成延迟,不过这里没说清楚,我感觉造成延迟同样可以转移,),如果可以进行,那么就给其分配内存,如果内存分配失败(我也没懂这里为什么又会失败)

干脆这一段伪代码我们理解的时候就全部理解成功的情况,最优情况。不然里面细节不能多想,这代码也解释不清楚。

最后更新时间T。

文中提到,它的方案中一个数据的转移可以与多个计算阶段并行,而不用像vDNN那样,必须要当前计算和当前数据转移必须都完成:

image.png image.png

使用了链表来记录了当前内存中的空闲区域,有针对性的去选择空间把合适的数据放进来。不过有两种数据不能释放:1 下一个task中要用的;2 进来之后还没有用过的;

如果确实没有空间,那么就进行offload all data and then reload the required data for the next task (i.e., defragmentation)。

引入公式来判断当前时间是否合适:

image.png

即在t完成后再取s所需数据是否来得及

image.png

例如:这个图中其实就会引入delay,如果EST(s)正好是s-1结束,那么这个公式就不满足了。

对于算法alg的受益时间:

image.png

为:最慢基础算法执行时间-alg算法执行时间-为了运行快算法而需求腾空内存额外花费的时间-下一个阶段S的延迟时间

所以这个时间可以简单理解为:用快算法带来的受益-用快算法造成的损失。

这个值越大,就越好。

整体来说,这篇文章篇幅太短,所以很多东西写的很不清楚,理解有点小难。不过里面给的一些思想还是很好的,比如可以调整batch size来减少内存使用;其他方面有一点老套,估计在18年有可能算比较好的方案

上一篇下一篇

猜你喜欢

热点阅读