GPU PoolAllocator взрывает память процессора
Я сделал модель с тензорным потоком с относительно распространенными операциями (кроме пары tf.where
и обработки индексов), но назовите ее с очень разными различными формами ввода (многие тензоры w90 > в модели).
Все работает отлично на процессоре. Но когда вы используете графический процессор, использование ОЗУ (а не память GPU, центральный процессор) неуклонно увеличивается, чтобы заполнить 256 ГБ машины и убить себя.
Во время процесса я получаю обычные сообщения:
2017-03-17 16:42:22.366601: I tensorflow/core/common_runtime/gpu/pool_allocator.cc:247] PoolAllocator: After 18347 get requests, put_count=18345 evicted_count=1000 eviction_rate=0.0545108 and unsatisfied allocation rate=0.0763068
2017-03-17 16:42:22.366680: I tensorflow/core/common_runtime/gpu/pool_allocator.cc:259] Raising pool_size_limit_ from 4385 to 4823
Что, насколько я понимаю, является распределителем пулов для некоторой памяти DMA для GPU. Проблема в том, что она никогда не удовлетворяет скорости выселения, которую она получает, и никогда не заканчивает выделять больше места для себя.
Это нормальное поведение? Способы борьбы с этим? Прямо сейчас я не могу обучить модель более 1 часа, прежде чем закончиться память.
Примечание. Я использую версию TF для nigthly, из-за некоторых исправлений, необходимых для запуска текущей модели. Кроме того, никакие операции не добавляются во время обучения, потому что я назвал tf.get_default_graph().finalize()
EDIT: пытался работать с tcmalloc
вместо malloc
. Не помогло. Я также использовал профилировщик памяти, и он не говорит, что есть утечка памяти, а использование памяти стабилизируется на 500 Мб для tcmalloc, даже если использование памяти в top
намного выше, а программа в конечном итоге запускает OOM.
Итак, почему профилировщик tcmalloc
не согласен с использованием памяти, которую я вижу в top
?
РЕДАКТИРОВАТЬ 2: перекомпилировал TF с измененными параметрами hardcoded, чтобы заставить его работать. См. здесь