Низкое использование графических процессоров NVIDIA с Keras и Tensorflow - PullRequest
1 голос
/ 08 октября 2019

Я использую CNN с keras-gpu и tenorflow-gpu с NVIDIA GeForce RTX 2080 Ti в Windows 10. На моем компьютере установлен процессор Intel Xeon e5-2683 v4 (2,1 ГГц). Я запускаю свой код через Jupyter (последний дистрибутив Anaconda). Вывод в командном терминале показывает, что графический процессор используется, однако выполняемый мной скрипт занимает больше времени, чем я ожидаю, чтобы обучить / протестировать данные, и когда я открываю диспетчер задач, похоже, что использование графического процессора очень низкое. Вот изображение: enter image description here

Обратите внимание, что процессор не используется, и ничто иное в диспетчере задач не предполагает, что что-то полностью используется. У меня нет подключения к Ethernet и я подключен к Wi-Fi (не думаю, что это влияет на что-либо, но я не уверен с Jupyter, поскольку он работает через веб-браузеры). Я тренируюсь на большом количестве данных (~ 128 ГБ), которые все загружены в ОЗУ (512 ГБ). Модель, которую я использую, представляет собой полностью сверточную нейронную сеть (в основном архитектура U-Net) с 566 290 обучаемыми параметрами. Вещи, которые я пробовал до сих пор: 1. Увеличение размера пакета с 20 до 10000 (увеличивает использование графического процессора с ~ 3-4% до ~ 6-7%, значительно сокращает время обучения, как и ожидалось). 2. Установите для параметра use_multiprocessing значение True и увеличив количество рабочих в model.fit (безрезультатно).

Я следовал инструкциям по установке на этом веб-сайте: https://www.pugetsystems.com/labs/hpc/The-Best-Way-to-Install-TensorFlow-with-GPU-Support-on-Windows-10-Without-Installing-CUDA-1187/#look-at-the-job-run-with-tensorboard

Обратите внимание, что эта установка специально НЕ УСТАНАВЛИВАЕТСЯ CuDNN или CUDA . В прошлом у меня были проблемы с запуском tenorflow-gpu с CUDA (хотя я не пробовал более 2 лет, так что, может быть, проще с последними версиями), поэтому я использовал этот метод установки.

Скорее всего, это причина того, что графический процессор используется не полностью (нет CuDNN / CUDA)? Это как-то связано с тем, что использование выделенной памяти GPU является узким местом? Или, может быть, что-то связано с сетевой архитектурой, которую я использую (количество параметров и т. Д.)?

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

РЕДАКТИРОВАТЬ: я заметил кое-что интересное в диспетчере задач. Эпоха с размером партии 10 000 занимает около 200 с. За последние ~ 5 с каждой эпохи использование графического процессора увеличивается до ~ 15-17% (по сравнению с ~ 6-7% за первые 195 с каждой эпохи). Не уверен, помогает ли это или указывает, что где-то, кроме графического процессора, есть узкое место.

Ответы [ 4 ]

1 голос
/ 08 октября 2019

все работает как положено;ваше выделенное использование памяти почти максимально, и ни TensorFlow, ни CUDA не могут использовать разделяемую память - см. этот ответ .

Если ваш GPU запускает OOM, единственное решениеполучить графический процессор с более выделенной памятью, уменьшить размер модели или использовать приведенный ниже сценарий, чтобы TensorFlow не назначал избыточные ресурсы графическому процессору (что он обычно делает):

## LIMIT GPU USAGE
config = tf.ConfigProto()  
config.gpu_options.allow_growth = True  # don't pre-allocate memory; allocate as-needed
config.gpu_options.per_process_gpu_memory_fraction = 0.95  # limit memory to be allocated
K.tensorflow_backend.set_session(tf.Session(config=config)) # create sess w/ above settings

Необычное увеличение использования, которое вы наблюдаете, может быть связано с тем, что ресурсы общей памяти временно доступны из-за исчерпания других доступных ресурсов, особенно с use_multiprocessing=True - но неуверенно, могут быть другие причины

0 голосов
/ 08 октября 2019

Если вы попробовали решение @ KDecker и @ OverLordGoldDragon, низкое использование графического процессора все еще сохраняется, я бы посоветовал сначала исследовать ваш конвейер данных . Следующие два рисунка взяты из официальных руководств tenorflow производительность данных , они хорошо иллюстрируют, как конвейер данных повлияет на эффективность графического процессора.

enter image description here

enter image description here

Как видите, подготовка данных параллельно с тренингом будет увеличиватьсяиспользование графического процессора. В этой ситуации процессорная обработка становится узким местом. Вам нужно найти механизм, чтобы скрыть задержку предварительной обработки, например, изменить количество процессов, размер масла и т. Д. Эффективность ЦП должна соответствовать эффективности ГП. Таким образом, графический процессор будет максимально использован.

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

0 голосов
/ 08 октября 2019

Сначала я бы запустил один из коротких «тестов» , чтобы убедиться, что Tensorflow использует графический процессор. Например, я предпочитаю @ ответ Сальвадора Дали в этом связанном вопросе

import tensorflow as tf
with tf.device('/gpu:0'):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
    c = tf.matmul(a, b)

with tf.Session() as sess:
    print (sess.run(c))

Если Tensorflow действительно использует ваш графический процессор, вы должны увидеть результат умножения матрицы. В противном случае достаточно длинная трассировка стека, указывающая, что "gpu:0" не может быть найден.


Если все это работает хорошо, я бы порекомендовал использовать утилиту Nvidia smi.exe. Он доступен как для Windows, так и для Linux, и AFAIK устанавливается с драйвером Nvidia. В системе Windows она находится по адресу

C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe

Откройте командную строку Windows и перейдите в этот каталог. Затем запустите

nvidia-smi.exe -l 3

Это покажет вам экран, который обновляется каждые три секунды.

enter image description here

Здесь мы можемувидеть различную информацию о состоянии графических процессоров и о том, что они делают. Особый интерес в этом случае представляют столбцы «Pwr: Usage / Cap» и «Volatile GPU-Util». Если ваша модель действительно использует / a графический процессор, эти столбцы должны увеличиваться «мгновенно», как только вы начнете тренировать модель.

Скорее всего, вы увидите увеличение скорости и температуры вентилятора, если у вас нет очень хорошего решения для охлаждения. В нижней части распечатки вы также должны увидеть процесс с именем, похожим на «python» или «Jupityr».


Если это не дает ответов относительно медленного времени обучения, то я бы предположил, что проблема заключается в модели и самом коде. И я думаю, что это действительно так. В частности, просмотр списка «Диспетчеры задач Windows» для «Использование памяти выделенного графического процессора» проверен на максимальный уровень.

0 голосов
/ 08 октября 2019

прочитайте следующие две страницы, у вас будет идея правильно настроить с графическим процессором https://medium.com/@kegui/how-do-i-know-i-am-running-keras-model-on-gpu-a9cdcc24f986

https://datascience.stackexchange.com/questions/41956/how-to-make-my-neural-netwok-run-on-gpu-instead-of-cpu

...