pytorch使用DataParallel进行GPU并行训练,以及AttributeError: 'DataParallel' object has no attribute '**'错误的解决

目录

请让模型奔跑

一个bug出现了


请让模型奔跑

首先由于GPU暂时没有爆显存的担心,主要是想把程序尽快跑起来,所以参考了https://zhuanlan.zhihu.com/p/86441879的方法,在他的文章中,不仅对单机多GPU的情况进行了介绍,同时也给出了平衡显存的方法,以及多机多GPU的方法,并且介绍很简洁易懂。

在我的程序中,主要用到的是最简单的情况,步骤如下:

  • 使用单机多卡进行训练,设置程序可见的GPU编号:
    os.environ['CUDA_VISIBLE_DEVICES'] = '0,3'
    

     

  • 对模型执行以下代码:
    model = nn.DataParallel(model)  #我们自定义的模型
    model = model.cuda()

     

  • 对数据执行以下代码:
    inputs = inputs.cuda()   #我们模型的输入数据
    labels = labels.cuda()   #我们数据的标签

     

  • 上面的博文作者也提到,以上代码与pytorch官方代码具有相同的作用:
    #device为用户主机上从0号开始可用的GPU编号
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
    
    #Model为用户的网络模型
    model = Model(input_size, output_size)
    
    if torch.cuda.device_count() > 1:
      print("Let's use", torch.cuda.device_count(), "GPUs!")
      # dim = 0 [30, xxx] -> [10, ...], [10, ...], [10, ...] on 3 GPUs
      model = nn.DataParallel(model)
    
    model.to(device)
    

     

一个bug出现了

在跑程序的时候出现了一个bug提示:AttributeError: 'DataParallel' object has no attribute '**'

这次参考了:https://github.com/jytime/Mask_RCNN_Pytorch/issues/2

其中提到,因为使用torch.nn.DataParallel而造成了AttributeError: 'DataParallel' object has no attribute '**',‘**’为用户自定义的模型中的函数,此时因为使用了DataParallel函数对原本用户定义的model进行了包装,原model变为了DataParallel的一个子模块。

因此想要再次调用原model中的函数,需要将原本的model.load()函数变为model.module.load()形式。其中load()为我在model中自定义的函数,综上,在model与函数中间加入.module即可。

 

 

 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值