RuntimeError: module must have its parameters and buffers on device cuda:0 (device_ids[0]) but found

笔者正在进行PyTorch框架下的多卡并行计算初探,目前常用的方式有:
model = torch.nn.DataParallel(model, device_ids = [0,1,2,3])
该方法主要用于一机多卡。
model = torch.nn.parallel.DistributedDataParallel(model,
device_ids=[arg.local_rank],
output_device=arg.local_rank)
该方法主要用于分布式计算,多机多卡。

这里主要给大家分享一机多卡的方法,torch.nn.DataParallel()介绍的版本较多,这里笔者分享一个亲测运行版本。

  1. 首先设置必要的参数,
 USE_CUDA = torch.cuda.is_available()
 device = torch.device("cuda:0" if USE_CUDA else "cpu")
  1. 获取网络模型,这里可以是自定义的网络模型,也可以加载预训练好的网络模型。
model = torchvision.models.vgg19_bn(pretrained = True)
  1. 获取到网络模型后,使用并行方法,并将网络模型和参数移到GPU上。注意,若需要修改网络模块,一定要在model后面加上.module,否则会报错。
    model = torch.nn.DataParallel(model, device_ids=[0,1,2,3])
    model.to(device)
    #model.module.avgpool = nn.AdaptiveAvgPool2d(7)

这里需要说明的是,device定义中的cuda:0可以不变,无论你多卡的GPU如何选取。device_ids=[0,1,2,3]也相对固定,如果有两张卡就定义device_ids=[0,1],如果有八张卡就定义device_ids=[0,1,2,3,4,5,6,7]。在多卡并行时,会有一个相对的主卡,就是cuda:0所指向的GPU。介绍到主卡就得引入os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1,2,3”,在这里主卡是0卡。如果定义为cuda:1,os.environ[“CUDA_VISIBLE_DEVICES”] = “1,2,3”,这里主卡是2卡。
**提示:**需要注意的是device_ids中包含的卡数要和os.environ[“CUDA_VISIBLE_DEVICES”]中包含的卡数相等。这里的卡数是指数量,无需具体卡号一一对应,此外,batch_size的数量需要大于GPU的数量。

OK,最核心的部分给大家介绍完了,剩下的工作就是将之前单卡运行时的所有.cuda()替换为.to(device)即可。

这里,小小的总结下需要使用.cuda或者.to(device)的地方。

  1. model(如:model.to(device))
  2. input(通常需要使用Variable包装,如:input = Variable(input).to(device))
  3. target(通常需要使用Variable包装,如:target = Variable(torch.from_numpy(np.array(target)).long()).to(device)
  4. nn.CrossEntropyLoss()(如:criterion = nn.CrossEntropyLoss().to(device))

参考:https://blog.csdn.net/m0_37201243/article/details/89599686
以上内容为初探分享,望各位大牛批评指正 !
(debug就像过日子,要有耐心哈哈哈哈哈)

发布了25 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_30680871/article/details/90761272