Параллель данных PyTorch использует только один графический процессор

#python #parallel-processing #pytorch #gpu

#python #параллельная обработка #pytorch #графический процессор

Вопрос:

Я пытаюсь использовать два графических процессора для обучения модели в PyTorch. Я использую, torch.nn.DataParallel но по какой-то причине nvidia-smi говорю, что использую только один графический процессор.

Код представляет собой что-то вроде:

 >>> import torch.nn as nn 
>>> model = SomeModel()
>>> model = nn.DataParallel(model)
>>> model.to('cuda')
 

Когда я запускаю программу и наблюдаю за выводом nvidia-smi , я вижу только запущенный GPU 0. Кто-нибудь знает, в чем проблема?

Комментарии:

1. Вы пробовали указывать devices_ids ?

2. Да, я пытался выполнить device_ids=[0, 1] вызов функции, но, насколько я знаю, по умолчанию используется для nn.DataParallel использования всех доступных устройств. Ни один из них не работает. 🙁

Ответ №1:

Столкнулся с той же проблемой и решил ее, поняв, что я использую ее неправильно. Возможно, это поможет кому-то сэкономить время:

Если вы обернете свою модель так, как model = nn.DataParallel(model) она обернет только вызов именно этой модели (средства вызова model(input) ). Поэтому, если ваша модель имеет линейный слой, и вы теперь используете его напрямую, как будто model.my_linear(input) он не будет обернут.

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

Самым простым тестом было бы обернуть вашу модель непосредственно перед ее вызовом и проверить, работает ли это. Если это так, ваш код переноса, вероятно, имеет одну из вышеуказанных проблем.

Ответ №2:

Вы должны использовать nn.DataParallel(model, [0,1]) , чтобы использовать GPU # 0 и GPU # 1. Последующий вызов model.to('cuda') не требуется. У вас может возникнуть соблазн использовать nn.DataParallel(model.to('cuda'), [0,1]) , но это также кажется ненужным.

Ответ №3:

Обратите внимание, что DataParallel попытается разделить ваш входной тензор по первому измерению по умолчанию. Если он не может этого сделать (например, если входные данные не являются тензором), он может автоматически вернуться к использованию одного графического процессора. Для получения более подробной информации см. https://discuss.pytorch.org/t/while-using-nn-dataparallel-only-accessing-one-gpu/19807/19