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
Как дать больше информации к функции Теано, не занимая больше памяти?
права, вопрос не «как работают миниатюры концептуально», а скорее «как работают мини-кавычки в коде с Theano». Вы не можете видеть это явно в коде, но 'для count, data in enumerate (extractor):' делает именно это. Проблема в том, что они как-то меня настроили, кажется, что каждый вызов 'train_model' выделяет больше памяти GPU. Как я могу его переработать? –
проверяя, у вас есть allow_gc = False в вашем .theanorc? – bold
Создаете ли вы общую переменную в своем экстракторе.Если да, не делайте этого, так как вы проходите только один мини-канал каждый раз или вызываете a_shared_varialbe.set_value(), если вы действительно этого хотите. Это далеко, я могу пойти сюда. – bold