Небезопасно ли запускать несколько процессов тензорного потока на одном графическом процессоре?

У меня есть только один графический процессор (Titan X Pascal, 12 ГБ видеопамяти), и я хотел бы параллельно обучать несколько моделей на одном и том же графическом процессоре.

Я попытался инкапсулировать свою модель в одну программу Python (называемую model.py) и включил код в model.py, чтобы ограничить использование VRAM (на основе этот пример). Я смог запустить до 3 экземпляров model.py одновременно на моем графическом процессоре (каждый экземпляр занимал чуть менее 33% моей видеопамяти). Таинственным образом, когда я попробовал с 4 моделями, я получил сообщение об ошибке:

2017-09-10 13:27:43.714908: E tensorflow/stream_executor/cuda/cuda_dnn.cc:371] coul d not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR 2017-09-10 13:27:43.714973: E tensorflow/stream_executor/cuda/cuda_dnn.cc:338] coul d not destroy cudnn handle: CUDNN_STATUS_BAD_PARAM 2017-09-10 13:27:43.714988: F tensorflow/core/kernels/conv_ops.cc:672] Check failed : stream->parent()->GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogradNon fusedAlgo<T>(), &algorithms) Aborted (core dumped)

Позже я заметил на tensorflow Github, что люди, похоже, считают небезопасным иметь больше чем один процесс тензорного потока, работающий на GPU. Так ли это и есть ли объяснение тому, почему это так? Почему мне удалось запустить 3 процесса тензорного потока на одном графическом процессоре, а не 4?


person Adamo    schedule 10.09.2017    source источник
comment
Это не тот случай, для которого оптимизирован TensorFlow. IE, все тестирование и использование в Google выполняются с использованием только одного процесса TensorFlow для каждого графического процессора. Это делает вероятным наличие ошибок в этом сценарии. Даже если вы заставите его работать, я ожидаю, что это повлечет за собой значительное снижение затрат, т. Е. Параллельное выполнение двух процессов TF на одном графическом процессоре будет значительно медленнее, чем их последовательное выполнение.   -  person Yaroslav Bulatov    schedule 10.09.2017
comment
Как ни странно, это не так (по крайней мере, в экспериментах, которые я проводил). Например, в случае 3 процессов каждый процесс занимал примерно на 11% больше времени, чем в случае с одним процессом с одинаковым использованием VRAM.   -  person Adamo    schedule 10.09.2017
comment
Понятно, подозреваю, что GPU в такой ситуации не является узким местом (т.е. загрузка GPU низкая)   -  person Yaroslav Bulatov    schedule 10.09.2017
comment
Почему мне удалось запустить 3 процесса тензорного потока на одном графическом процессоре, а не 4? вы сами говорили, что каждый инстанс занимает чуть меньше 33% памяти GPU; кажется, что у вас просто заканчивается видеопамять с 4 процессами (я сам видел подобные ошибки из-за нехватки памяти).   -  person jdehesa    schedule 11.09.2017
comment
На самом деле, TF будет нормально работать в нескольких экземплярах на одном устройстве (конечно, если ресурсы доступны). Единственное, о чем вы, возможно, захотите позаботиться, это установить gpu_options.allow_growth=True, чтобы предотвратить выделение TF большая часть оперативной памяти вашего графического процессора по умолчанию при создании сеанса   -  person GPhilo    schedule 11.09.2017
comment
@jdehesa Я настроил использование памяти так, чтобы оно было чуть меньше 25% (на процесс), когда я пробовал с 4. Я не думаю, что это ошибка памяти, я получил их раньше, и они прямо заявляют, что память не может быть выделено. Извините за путаницу в моем исходном сообщении, я надеюсь, что это прояснит ситуацию.   -  person Adamo    schedule 11.09.2017
comment
@GPhilo Я не обязательно хочу разрешать увеличение памяти, так как в некоторых случаях это может замедлить работу процессов. Я бы предпочел выделять память в заранее определенных блоках при запуске своих процессов. У вас есть цитата/ссылка, которая объясняет, что безопасно запускать несколько процессов tensorflow на одном и том же графическом процессоре? Я не могу найти никакой официальной информации, указывающей на то или иное.   -  person Adamo    schedule 11.09.2017
comment
@Adamo Вы проверяли, не занимают ли другие вещи память GPU? Например, Xorg? Предполагая, что вы используете nvidia, вы можете использовать nvidia-smi для проверки. Если они есть, ваше распределение памяти может быть слишком агрессивным.   -  person Joshua Chia    schedule 30.11.2018
comment
Я проверил, больше ничего не использует память GPU.   -  person Adamo    schedule 25.05.2020


Ответы (2)


Вкратце: да, безопасно запускать несколько процессов на одном графическом процессоре (по состоянию на май 2017 года). Раньше это было небезопасно.

Ссылка на исходный код tensorflow, подтверждающий это

person Adamo    schedule 16.10.2017
comment
На самом деле это не совсем безопасно. Смотри мой ответ - person FindOutIslamNow; 28.08.2018

Ответить

В зависимости от размера видеопамяти, это будет разрешено или нет.

В моем случае общая видеопамять составляет 2 ГБ, а один экземпляр резервирует около 1,4 ГБ. Когда я пытался запустить другой код tensorflow, когда я уже запускал обучение распознаванию речи .

2018-08-28 08:52:51.279676: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1405] Found device 0 with properties:
name: GeForce 940MX major: 5 minor: 0 memoryClockRate(GHz): 1.2415
pciBusID: 0000:01:00.0
totalMemory: 2.00GiB freeMemory: 1.65GiB
2018-08-28 08:52:51.294948: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1484] Adding visible gpu devices: 0
2018-08-28 08:52:55.643813: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-08-28 08:52:55.647912: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:971]      0
2018-08-28 08:52:55.651054: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:984] 0:   N
2018-08-28 08:52:55.656853: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1097] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1409 MB memory) -> physical GPU (device: 0, name: GeForce 940MX, pci bus id: 0000:01:00.0, compute
capability: 5.0)

Я получил следующую ошибку в распознавании речи, которая полностью прервала работу скрипта: (я думаю, согласно этому связано с нехваткой видеопамяти)

2018-08-28 08:53:05.154711: E T:\src\github\tensorflow\tensorflow\stream_executor\cuda\cuda_driver.cc:1108] could not synchronize on CUDA context: CUDA_ERROR_LAUNCH_FAILED ::
Traceback (most recent call last):
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1278, in _do_call
    return fn(*args)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1263, in _run_fn
    options, feed_dict, fetch_list, target_list, run_metadata)
  File "C:\Python35\lib\site-packages\tensorflow\python\client\session.py", line 1350, in _call_tf_sessionrun
    run_metadata)
tensorflow.python.framework.errors_impl.InternalError: GPU sync failed
person FindOutIslamNow    schedule 28.08.2018
comment
Ваша программа потерпела неудачу просто потому, что ей не хватило памяти графического процессора? Если да, то это не то, о чем исходный вопрос. В контексте исходного вопроса программы уже могут работать с ограниченной памятью графического процессора по отдельности, а общая сумма выделения составляет менее 100%. - person Joshua Chia; 30.11.2018