2016-03-15 1 views
1

TL; DR: Как я могу предоставить больше данных функции Anano, не занимая больше памяти?Каков правильный способ управления памятью в Theano для тренировочных наборов, которые не могут поместиться в ОЗУ?

Проблема, с которой я сталкиваюсь, заключается в том, что обучение моему алгоритму ML на графическом процессоре с помощью Theano приводит к тому, что графический процессор в конечном итоге исчерпает память. Я немного отклонился от учебника, потому что мой набор данных слишком велик, чтобы полностью читать в памяти (это тоже проблема для видео-алгоритмов, верно?), Поэтому вместо использования схемы ввода и обновления индекса я просто передаю Theano напрямую управляйте ndarrays.

Позвольте мне привести пример того, что я имею в виду. В учебнике логистической регрессии в Теано он говорит что-то делать по линиям:

train_model = theano.function(
    inputs=[index], 
    outputs=cost, 
    updates=updates, 
    givens={ 
     x: train_set_x[index * batch_size: (index + 1) * batch_size], 
     y: train_set_y[index * batch_size: (index + 1) * batch_size] 
    } 
) 

Это требует test_set_x и test_set_y быть загружены в память, и учебник использует SharedVariable для хранения полных набора данных.

Хорошо для меня, набор данные огромных (много много гигабайта), что означает, что не все могут быть загружены в память сразу, поэтому я изменил мой, чтобы взять данные непосредственно, таким образом:

train_model = theano.function(
    inputs=[input, classes], 
    outputs=cost, 
    updates=updates 
) 

, а затем я сделать что-то, что выглядит неопределенно, как это:

for count, data in enumerate(extractor): 
    observations, labels = data 
    batch_cost = train_model(observations, labels) 
    logger.debug("Generation %d: %f cost", count, batch_cost) 

Я думаю, что я может быть в корне неправильного понимания, как правильно передать данные в GPU без какой противный питона сборки мусора нечистоты. Похоже, что это как раз занимая все больше и больше памяти в модели внутренне, потому что после тренировки это после того, как (большой) количества партий, я получаю сообщение об ошибке, как это:

Error when tring to find the memory information on the GPU: initialization error 
Error freeing device pointer 0x500c88000 (initialization error). Driver report 0 bytes free and 0 bytes total 
CudaNdarray_uninit: error freeing self->devdata. (self=0x10cbbd170, self->devata=0x500c88000) 
Exception MemoryError: 'error freeing device pointer 0x500c88000 (initialization error)' in 'garbage collection' ignored 
Fatal Python error: unexpected exception during garbage collection 

Как дать больше информации к функции Теано, не занимая больше памяти?

ответ

0

Если набор данных не соответствует памяти, идея заключается в том, чтобы взять часть его и загрузить его каждый раз, когда вам нужно.

Если данные не помещаются в памяти GPU, как показано в классическом lasagne учебнике, вы можете итерацию по части набора данных, называемые minibatches

Затем, если данные не помещаются в вашем ОЗУ, вам нужно каждый раз загружать микроавтобус. Лучший способ сделать это состоит в сделать отдельный процесс загрузки следующего minibatch (процессор работает), как вы анализируете текущую (ГП обработку)

Вы можете вдохновить себя от AlexNet:

+0

права, вопрос не «как работают миниатюры концептуально», а скорее «как работают мини-кавычки в коде с Theano». Вы не можете видеть это явно в коде, но 'для count, data in enumerate (extractor):' делает именно это. Проблема в том, что они как-то меня настроили, кажется, что каждый вызов 'train_model' выделяет больше памяти GPU. Как я могу его переработать? –

+0

проверяя, у вас есть allow_gc = False в вашем .theanorc? – bold

+0

Создаете ли вы общую переменную в своем экстракторе.Если да, не делайте этого, так как вы проходите только один мини-канал каждый раз или вызываете a_shared_varialbe.set_value(), если вы действительно этого хотите. Это далеко, я могу пойти сюда. – bold

Смежные вопросы