深度模型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内存知识点的主要内容,如果未能解决你的问题,请参考以下文章