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

6
我正在尝试不同的Theano模型,并使用逐步增加的序列长度。如何提前预测任何给定序列长度和模型所需的批处理大小,以填充GPU的内存?
更糟糕的是,如果我意外使用了太多内存,就会出现MemoryError,GPU上的内存不会被释放,需要重新启动进程以释放内存,然后失去网络,再尝试新的批处理大小。由于这个错误无法恢复,难以仅通过增加批处理大小直到异常,然后再回退。
2个回答

7
假设您知道要在GPU上存储的元素数量,您可以轻松计算存储这些元素所需的内存量。
一个简单的例子:
import numpy as np
import theano.tensor as T
T.config.floatX = 'float32'
dataPoints = np.random.random((5000, 256 * 256)).astype(T.config.floatX)
#float32 data type requires 4 bytes
sizeinGBs = 5000 * 256 * 256 * 4 / 1024. / 1024 / 1024 + (some small over-head constant)
print "Data will need %2f GBs of free memory" % sizeInGB

假设开销常量为0,则会输出:
>>> Data will need 1.22 GBs of free memory

如果你正在使用NVIDIA图形卡,并在计算机上安装了CUDA,那么你可以轻松地使用以下代码获取GPU上的总空闲内存量:

import theano.sandbox.cuda.basic_ops as sbcuda
import numpy as np
import theano.tensor as T
T.config.floatX = 'float32'
GPUFreeMemoryInBytes = sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0]
freeGPUMemInGBs = GPUFreeMemoryInBytes/1024./1024/1024
print "Your GPU has %s GBs of free memory" % str(freeGPUMemInGBs)
#An operation is to be executed below
testData = shared(np.random.random((5000, 256 * 256)).astype(T.config.floatX), borrow = True)
print "The tasks above used %s GBs of your GPU memory. The available memory is %s GBs" % (str(freeGPUMemInGBs - GPUFreeMemoryInBytes/1024./1024/1024), str(GPUFreeMemoryInBytes/1024./1024/1024))

然后输出的格式如下(适用于我的计算机):

>>> Your GPU has 11.2557678223 GBs of free memory
>>> The tasks above used 1.22077941895 GBs of your GPU memory. The available memory is 10.0349884033 GBs

通过监控空闲内存并计算您的模型/数据的大小,您可以更好地使用GPU内存。但是,请注意内存碎片化问题,因为它可能会意外导致MemoryError


听起来最可靠的方法是合并你和威尔的建议。在运行新模型之前,我将测量各种长度序列的内存使用情况,并使用它来预测其他序列长度将使用多少内存,并确定最佳批处理大小。谢谢。 - Zach Dwiel

2
似乎Theano没有内置方法来估计模型的内存大小。最好的方法是创建一个已知大小的小型模型子集,并使用Theano手册中描述的这里的内存估计技术。
我们还需要考虑对象在GPU内部的表示方式(例如,我们是否使用float32或float64,并且每个对象在GPU内部占用多少字节)。
一旦您可以估计小型模型的大小,就可以将这些估计投影到具有合理精度的更大模型的大小。您应该能够编写自己的内存估计函数,该函数可以将许多特征和观测值、张量或图节点作为参数,并返回内存使用量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接