How to prevent tensorflow from allocating the totality of a GPU memory?
Как запретить tensorflow выделять всю память графического процессора?
Я работаю в среде, в которой вычислительные ресурсы являются общими, т. Е. У нас есть несколько серверных машин, оснащенных несколькими графическими процессорами Nvidia Titan X каждая.
Для моделей малого и среднего размера 12 ГБ Titan X обычно достаточно для одновременного обучения 2-3 человек на одном графическом процессоре. Если модели достаточно малы, чтобы одна модель не использовала в полной мере все вычислительные блоки графического процессора, это может фактически привести к ускорению по сравнению с выполнением одного процесса обучения за другим. Даже в случаях, когда параллельный доступ к графическому процессору действительно замедляет время индивидуального обучения, все равно приятно иметь гибкость, заключающуюся в одновременном обучении нескольких пользователей на графическом процессоре.
Проблема с TensorFlow заключается в том, что по умолчанию он выделяет весь объем доступной памяти графического процессора при запуске. Даже для небольшой двухслойной нейронной сети я вижу, что все 12 ГБ памяти графического процессора израсходованы.
Есть ли способ заставить TensorFlow выделять только, скажем, 4 ГБ памяти графического процессора, если известно, что этого достаточно для данной модели?
Переведено автоматически
Ответ 1
Вы можете установить долю памяти графического процессора, которая будет выделяться при создании tf.Session путем передачи tf.GPUOptions как части необязательного config аргумента:
# Assume that you have 12GB of GPU memory and want to allocate ~4GB: gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
per_process_gpu_memory_fraction действует как жесткая верхняя граница объема памяти графического процессора, который будет использоваться процессом на каждом графическом процессоре на одной машине. В настоящее время эта доля применяется равномерно ко всем графическим процессорам на одной машине; нет способа установить это для каждого графического процессора.
import tensorflow as tf gpus = tf.config.experimental.list_physical_devices('GPU') for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True)
В документах также перечислены еще несколько методов:
Установите переменную окружения TF_FORCE_GPU_ALLOW_GROWTH в true.
Используйте tf.config.experimental.set_virtual_device_configuration для установки жесткого ограничения на виртуальное устройство с графическим процессором.
Ответ 4
Вот выдержка из книги Deep Learning with TensorFlow
В некоторых случаях желательно, чтобы процесс выделял только подмножество доступной памяти или увеличивал использование памяти только по мере необходимости процесса. TensorFlow предоставляет два варианта конфигурации сеанса для управления этим. Первый - это allow_growth вариант, который пытается выделить только столько памяти графического процессора на основе распределения во время выполнения, вначале выделяется очень мало памяти, и по мере запуска сеансов и увеличения объема памяти графического процессора мы расширяем область памяти графического процессора, необходимую процессу TensorFlow.
Второй метод - это per_process_gpu_memory_fraction option, который определяет долю от общего объема памяти, которая должна быть выделена each видимому графическому процессору. Примечание: освобождение памяти не требуется, это может даже ухудшить фрагментацию памяти, когда это будет сделано.
2) Выделить фиксированную память:
Выделять только 40% от общей памяти каждого графического процессора с помощью:
Примечание: Это полезно только в том случае, если вы действительно хотите привязать объем памяти графического процессора, доступный процессу TensorFlow.