Недостаточно памяти при создании общей переменной Theano с параметром заимствования=True

Я пытаюсь выделить действительно большой набор данных (~ 28 ГБ ОЗУ в ndarray) в общие переменные theano, используя заимствование = True, чтобы избежать репликации памяти. Для этого я использую следующую функцию:

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 настроен для работы на графическом процессоре (GTX 970).


person gaspercat    schedule 15.04.2015    source источник


Ответы (1)


Вместо использования theano.shared можно использовать 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)
        )
    )
person gaspercat    schedule 15.04.2015