Совместное использование памяти GPU между процессами на одном GPU с помощью Pytorch - PullRequest
2 голосов
/ 05 февраля 2020

Я пытаюсь реализовать эффективный способ сделать параллельный вывод в Pytorch.

Сейчас я запускаю 2 процесса на моем GPU (у меня только 1 GPU, оба процесса на одном устройстве) , Каждый процесс загружает мою модель Pytorch и делает шаг вывода.

Моя проблема в том, что моя модель занимает достаточно места в памяти. У меня 12 Гб памяти на GPU, и модель занимает ~ 3 Гб памяти (без данных). Это означает, что мои два процесса занимают 6 ГБ памяти только для модели.


Теперь мне было интересно, можно ли загрузить модель только один раз и использовать эту модель для вывода на двух разных процессах. То, что я хочу, - это то, что только 3 ГБ памяти потребляется моделью, но все еще имеет 2 процесса.


Я получил этот ответ с упоминанием IP C, но насколько Я понял, что это означает, что процесс # 2 будет копировать модель из процесса # 1, поэтому я все равно получу 6 ГБ, выделенных для модели.

Я также проверил документацию по Pytorch относительно DataParallel и DistributedDataParallel, но это кажется невозможным.

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


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

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Сам графический процессор имеет много потоков. При выполнении операции с массивом / тензором он использует каждый поток в одной или нескольких ячейках массива. Вот почему кажется, что операционная система, которая может полностью использовать GPU, должна эффективно масштабироваться без нескольких процессов - одно ядро ​​GPU уже массово распараллелено.

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

Насколько я понимаю, ядра, запущенные в потоке CUDA по умолчанию, выполняются последовательно. Если вы хотите, чтобы они работали параллельно, я думаю, вам понадобится несколько потоков. Глядя в код PyTorch, я вижу код типа getCurrentCUDAStream() в ядрах, что заставляет меня думать, что GPU будет по-прежнему запускать любой код PyTorch из всех процессов последовательно.

Это обсуждение NVIDIA предполагает, что это правильно:

https://devtalk.nvidia.com/default/topic/1028054/how-to-launch-cuda-kernel-in-different-processes/

Более новые графические процессоры могут запускать несколько ядер параллельно (используя MPI?), Но, похоже, это просто реализовано с временным разделением в любом случае , поэтому я не уверен, что нам следует ожидать более высокую общую пропускную способность:

Как мне использовать Nvidia Multi-Process Service (MPS) для запуска нескольких приложений не-MPI CUDA?

Если вам нужно разделить память из одной модели по двум параллельным вызовам логического вывода, можете ли вы просто использовать несколько потоков вместо процессов и ссылаться на одну и ту же модель из обоих потоков?

Чтобы фактически получить графический процессор для параллельного запуска нескольких ядер вы можете использовать nn.Parallel в PyTorch. Смотрите обсуждение здесь: https://discuss.pytorch.org/t/how-can-l-run-two-blocks-in-parallel/61618/3

1 голос
/ 06 февраля 2020

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

Загрузка данных отделена от Модель запуска процесса, это можно сделать вручную. Насколько я знаю, tensorflow имеет некоторые собственные поддержки для оптимальной параллельной предварительной загрузки данных , вы можете посмотреть на это для примера.

Вывод модели автоматически выполняется параллельно на GPU. Вы можете максимизировать этот параллелизм, используя более крупные пакеты.

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

...