深度模型GPU内存知识点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度模型GPU内存知识点相关的知识,希望对你有一定的参考价值。

参考技术A 如果想要在单块GPU上训练一个大于VGG-16的模型,也许有几个解决内存限制问题的选择。

什么占用内存?

可以根据功能性把GPU内存中的数据分为4个部分:

特征映射是正向过程中生成的中间结果,梯度映射是反向过程中生成的中间结果。工作区是cuDNN函数临时变量/矩阵的一个缓冲区。

一般而言,网络层数多,分配给特征映射的内存比例就越高,对于像VGG-16这样更大的模型来说,这一比例超过50%。

只有有参数的层,才会有显存占用,这部分的显存占用和输入无关,模型加载完之后就会占用

有参数的层主要包括:

无参数的层

模型的参数数目(不考虑偏置项b):

参数占用显存 = 参数数目*n

举例来说,optimizer为SGD:

显而易见,除了保存W之外,还要保存对应的梯度,因此显存占用等于参数占用的显存*2

如果是带Momentum-SGD,这个时候还要保存动量,显存*3

如果是Adam优化器,动量占用的显存更多,显存*4

总结以上,模型中与输入无关的显存占用包括:

这部分的显存主要看输出的feature map的形状。

比如卷积的输入输出满足一下关系:

根据以上可以计算每一层输出的Tensor的形状,然后就能计算相应的显存占用。

模型输出的显存占用,总结如下:

深度学习中神经网络的显存占用,有以下公式:

在深度学习中,一般占用显存最多的是卷基层的输出,模型参数占用的显存相对较少,而且不太好优化。

节省显存一般有如下方法:

左边是每一层的参数数目,右边是消耗的计算量。

可以看出:

MobileNet,利用DepthWise Convolution的技术,将神经网络运行速度提升很多,把一个卷积操作拆分成两个相对简单的操作的组合。左边是原始卷积操作,右边是两个特殊而又简单的卷积操作的组合(上面类似于池化的操作,但是有权重,下面类似于全连接操作)。

与 GPU 共享 RAM

【中文标题】与 GPU 共享 RAM【英文标题】:Sharing RAM with GPU 【发布时间】:2017-08-11 04:18:33 【问题描述】:

我有一个深度学习模型,它处于分配内存错误(权重矩阵)的边缘。我将模型的复杂性调整到可以很好地用于我的预测的水平(但它可能会更好)并且它可以很好地与我的 RAM 内存一起使用,但是当我切换 theano 以使用 gpu 进行更快的训练时(具有 2GB gddr5 vram 的 GPU) ,它会引发分配错误。

我搜索了很多关于如何 并且许多人表示这是不可能(没有参考或解释),即使可以,它也会很慢。而且论坛上总是有一两个人说可以做到(我在谷歌搜索上检查了整个页面 1),但又是一个非常不可靠的信息,没有任何支持。

我理解他们的缓慢论点,但在深度学习中使用 GPU + RAM 是否比使用 CPU + RAM 进行矩阵繁重计算要慢?从来没有人提到过。因为我读过的所有论点(比如购买新卡、设置较低的设置)都是关于游戏的,这对我来说是有意义的,因为你追求更好的即时性能而不是整体速度。

我的盲目猜测是,将 GPU 连接到 RAM 的总线只是系统中最窄的管道(比 RAM 慢),因此使用 CPU + RAM(具有非常快的总线)而不是更快的 GPU( + 内存)。否则,它没有多大意义。

【问题讨论】:

我投票结束这个问题,因为内存共享不是一个编程问题。它是关于硬件、架构,也许还有操作系统及其驱动程序。 【参考方案1】:

既然你用 CUDA 标记了你的问题,我可以给你以下答案。

使用Managed memory,您可以从可能位于也可能不在CPU 内存上的内核引用内存。这样,GPU 内存就像缓存一样工作,并且您不受实际 GPU 内存大小的限制。

由于这是一种软件技术,我会说这是 SO 的主题。

【讨论】:

假设 OP 想要重写 theano 等以使用托管内存,在这种情况下,这可能是主题。但是,这不是我对这样一个问题的猜测。你所指的只能对 Pascal GPU 有意义。对于当前的其他 GPU 系列,托管内存不允许您分配 GPU 可访问的内存大小,该大小大于 GPU 上的物理内存。

以上是关于深度模型GPU内存知识点的主要内容,如果未能解决你的问题,请参考以下文章

深度学习基础——硬件知识总结

如何估计深度学习需要多少 GPU 内存?

知识蒸馏轻量化模型架构剪枝…几种深度学习模型压缩方法

从底层原理深度剖析volatile关键字

深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天

TensorFlow入门实战|第1周:实现mnist手写数字识别