Руководство по миграции рекомендует сделать код независимым от процессора / графического процессора:
> # at beginning of the script
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
...
# then whenever you get a new Tensor or Module
# this won't copy if they are already on the desired device
input = data.to(device)
model = MyModule(...).to(device)
Я сделал это и запустил свой код на устройстве только с процессором, но моя модель потерпела крахпри подаче входного массива, как говорится, ожидал, что тензор ЦП, а не ГП.Каким-то образом моя модель автоматически преобразовывала входной массив CPU в массив GPU.Наконец, я отследил это до этой команды в своем коде:
model = torch.nn.DataParallel(model).to(device)
Даже если я преобразовал модель в 'CPU', nn.DataParallel переопределяет это.Лучшее решение, которое я придумал, было условным:
if device.type=='cpu':
model = model.to(device)
else:
model = torch.nn.DataParallel(model).to(device)
Это не кажется элегантным.Есть ли лучший способ?