Использование нескольких графических процессоров вне обучения в PyTorch - PullRequest
0 голосов
/ 11 апреля 2019

Я рассчитываю накопленное расстояние между каждой парой ядра в слое nn.Conv2d. Однако для больших слоев не хватает памяти, используя Titan X с 12 ГБ памяти. Я хотел бы знать, возможно ли разделить такие вычисления на два графических процессора. Код следует:

def ac_distance(layer):
    total = 0
    for p in layer.weight:
      for q in layer.weight:
         total += distance(p,q)
    return total

Где layer является экземпляром nn.Conv2d, а расстояние возвращает сумму разностей между p и q. Однако я не могу отсоединить график, потому что он мне понадобится позже. Я попытался обернуть мою модель вокруг nn.DataParallel, но все вычисления в ac_distance выполняются с использованием только 1 GPU, однако он тренируется с использованием обоих.

1 Ответ

0 голосов
/ 11 апреля 2019

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

  1. Параллелизм данных - разделите большой пакет на две части и выполните один и тот же набор операций, но по отдельности на двух разных графических процессорах соответственно
  2. Параллелизм модели - разделить вычисления и запустить их на разных графических процессорах

Как вы уже задали в этом вопросе, вы хотели бы разбить расчет, который относится ко второй категории. Не существует готовых способов достижения параллелизма модели. PyTorch предоставляет примитивы для параллельной обработки с использованием пакета torch.distributed. В этом учебном пособии подробно рассматриваются детали пакета, и вы можете выработать подход для достижения необходимого параллелизма модели.

Однако, параллелизм модели может быть очень сложным для достижения. Общий способ заключается в параллелизме данных с torch.nn.DataParallel или torch.nn.DistributedDataParallel. В обоих методах вы будете запускать одну и ту же модель на двух разных графических процессорах, однако один огромный пакет будет разделен на две меньшие порции. Градиенты будут накапливаться на одном графическом процессоре, и происходит оптимизация. Оптимизация происходит на одном графическом процессоре Dataparallel и параллельно на всех графических процессорах DistributedDataParallel с помощью многопроцессорной обработки.

В вашем случае, если вы используете DataParallel, вычисления все равно будут выполняться на двух разных графических процессорах. Если вы заметили дисбаланс в использовании GPU, это может быть связано с тем, как был разработан DataParallel. Вы можете попробовать использовать DistributedDataParallel, который является самым быстрым способом тренировки на нескольких графических процессорах в соответствии с docs .

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

  • делать накопление градиента для больших партий
  • Использовать DataParallel
  • Если этого недостаточно, используйте DistributedDataParallel
...