Подтвердить что ты не робот

Как я могу решить, "закончился из памяти gpu" в TensorFlow

Я запускал демонстрацию MNIST в TensorFlow с 2 уровнями conv и слоем с полным коннектиком, у меня появилось сообщение о том, что "закончилось использование memeory, пытаясь выделить 2.59GiB", но это показывает, что общая память равна 4.69GiB, и бесплатно память 3.22GiB, как она может остановиться с 2.59GiB? И с более крупной сетью, как я могу управлять памятью gpu? Я касаюсь только того, как наилучшим образом использовать память gpu и хочу знать, как это произошло, а не как предварительно выделить память

4b9b3361

Ответ 1

Это не об этом. прежде всего, вы можете видеть, сколько памяти он получает, когда он работает, контролируя ваш gpu. например, если у вас есть nvidia gpu u, вы можете проверить это с помощью команды watch -n 1 nvidia-smi. Но в большинстве случаев, если вы не установили максимальную долю памяти gpu, она выделяет почти всю свободную память. ваша проблема в нехватке памяти для вашего gpu. Сети cnn полностью тяжелы. Когда вы пытаетесь прокормить свою сеть, НЕ делайте это со всеми вашими данными. Сделайте эту процедуру кормления небольшими партиями.

Ответ 2

Я столкнулся с ошибками памяти при обучении небольшому CNN на GTX 970. Я несколько раз обнаружил, что сообщать TensorFlow о распределении памяти на графическом процессоре по мере необходимости (вместо начала) разрешало все мои проблемы. Это может быть выполнено с использованием следующего кода Python:

    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    sess = tf.Session(config = config)

Ранее TensorFlow предварительно выделял ~ 90% памяти GPU. Но по какой-то неизвестной причине это приведет к ошибкам памяти, когда я увеличил размер сети. Используя вышеприведенный код, у меня больше нет ошибок OOM.

Ответ 3

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

TensorFlow предоставляет два параметра конфигурации на сеансе для управления этим.

Во-первых, это параметр allow_growth, который пытается выделить только столько памяти GPU, что распределяется по времени выполнения:

config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config, ...)

Второй метод - это параметр per_process_gpu_memory_fraction, который определяет долю общего объема памяти, которую должен выделять каждый видимый графический процессор. Например, вы можете сказать, что TensorFlow выделяет 40% общей памяти каждого графического процессора:

config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = tf.Session(config=config, ...)