Заменить
model = torch.nn.DataParallel(model,device_ids = [0])
на
model = torch.nn.DataParallel(model(), device_ids=[0])
(обратите внимание на ()
после модели внутри DataParallel
). Разница проста: модуль models
содержит классы / функции, которые создают модели, а не экземпляры моделей. Если вы проследите за импортом, вы обнаружите, что models.__dict__['resnet18']
разрешает эту функцию. Поскольку DataParallel
переносит экземпляр, а не сам класс, он несовместим. ()
вызывает эту функцию построения модели / конструктор класса для создания экземпляра этой модели.
Гораздо более простым примером этого будет следующий
class MyNet(nn.Model):
def __init__(self):
self.linear = nn.Linear(4, 4)
def forward(self, x):
return self.linear(x)
model = nn.DataParallel(MyNet) # this is what you're doing
model = nn.DataParallel(MyNet()) # this is what you should be doing
Ваше сообщение об ошибке жалуется на то, что function
(поскольку model
без ()
имеет тип function
) не имеет атрибута cuda
, который является методом nn.Model
экземпляров .