如何在Theano中计算GPU内存使用情况?

我在尝试不同的Theano模型,并使用一个不断增加序列长度的课程。我如何提前预测,对于给定的序列长度和模型,应该设置多大的批次大小来填满GPU的内存?

更糟糕的是,如果我无意中使用了过多的内存,我会得到一个MemoryError,并且GPU上的内存不会被释放,这需要我重新启动进程来释放内存,并且在尝试新的批次大小之前失去我的网络。因为这个错误是无法恢复的,所以很难只是增加批次大小直到出现异常然后再减小。


回答:

假设你知道要存储在GPU上的元素数量,你可以轻松计算出存储这些元素所需的内存量。

一个简单的例子:

import numpy as npimport theano.tensor as TT.config.floatX = 'float32'dataPoints = np.random.random((5000, 256 * 256)).astype(T.config.floatX)#float32数据类型需要4个字节sizeinGBs = 5000 * 256 * 256 * 4 / 1024. / 1024 / 1024 + (一些小的额外开销常数)print "数据将需要 %2f GB的可用内存" % sizeInGB

假设额外开销常数为0,将会打印:

>>> 数据将需要 1.22 GB的可用内存

如果你使用的是NVIDIA显卡,并且在你的机器上安装了CUDA,那么你可以使用以下代码行轻松获取GPU上的总可用内存量:

import theano.sandbox.cuda.basic_ops as sbcudaimport numpy as npimport theano.tensor as TT.config.floatX = 'float32'GPUFreeMemoryInBytes = sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0]freeGPUMemInGBs = GPUFreeMemoryInBytes/1024./1024/1024print "你的GPU有 %s GB的可用内存" % str(freeGPUMemInGBs)#下面要执行一个操作testData = shared(np.random.random((5000, 256 * 256)).astype(T.config.floatX), borrow = True)print "上面的任务使用了 %s GB的GPU内存。可用内存为 %s GB" % (str(freeGPUMemInGBs - GPUFreeMemoryInBytes/1024./1024/1024), str(GPUFreeMemoryInBytes/1024./1024/1024))

然后输出格式如下(以我的机器为例):

>>> 你的GPU有 11.2557678223 GB的可用内存>>> 上面的任务使用了 1.22077941895 GB的GPU内存。可用内存为 10.0349884033 GB

通过监控可用内存量和计算你的模型/数据的大小,你可以更好地使用GPU内存。然而,请注意内存碎片化问题,因为它可能会意外地导致MemoryError

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注