使用borrow = True创建Theano共享变量时内存不足

时间:2015-04-15 11:59:10

标签: python-2.7 memory-management bigdata theano

我正在尝试使用borrow = True分配一个非常大的数据集(在ndarray中大约28GB的RAM),以避免复制内存。为此,我使用以下功能:

def load_dataset(path):
    # Load dataset from memory
    data_f = np.load(path+'train_f.npy')
    data_t = np.load(path+'train_t.npy')

    # Split into training and validation
    return (
        (
            theano.shared(data_f[:-1000, :], borrow=True),
            theano.shared(data_t[:-1000, :], borrow=True)
        ), (
            theano.shared(data_f[-1000:, :], borrow=True),
            theano.shared(data_t[-1000:, :], borrow=True)
        )
    )

为了避免数据转换,在将阵列保存到磁盘之前,我已经将它们定义为正确的格式(之后填充它们并将它们转储到带有np.save()的磁盘中):

data_f = np.ndarray((len(rows), 250*250*3), dtype=theano.config.floatX)
data_t = np.ndarray((len(rows), 1), dtype=theano.config.floatX)

但是,似乎theano轮胎要复制内存,但却抛弃了以下错误:

错误分配25594500000字节的设备内存(内存不足)。驱动程序报告3775729664字节空闲,总计4294639616字节。

Theano配置为在GPU上运行(GTX 970)。

1 个答案:

答案 0 :(得分:10)

可以使用theano.shared强制将数据分配到CPU内存中,而不是使用theano.tensor._shared。固定代码最终如下:

def load_dataset(path):
    # Load dataset from memory
    data_f = np.load(path+'train_f.npy')
    data_t = np.load(path+'train_t.npy')

    # Split into training and validation
    return (
        (
            theano.tensor._shared(data_f[:-1000, :], borrow=True),
            theano.tensor._shared(data_t[:-1000, :], borrow=True)
        ), (
            theano.tensor._shared(data_f[-1000:, :], borrow=True),
            theano.tensor._shared(data_t[-1000:, :], borrow=True)
        )
    )