解决RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:

完整报错警告为:

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat2 in method wrapper_mm)

或者

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! (when checking argument for argument mat1 in method wrapper_mm)

这是由于代码所写的某一位置的Tensor设备指代不清楚,正常情况下是不会出现这个错误的,但是个人总结了以下容易导致该错误产生的原因:

1.当你存在多GPU并行训练时

 这时候你的model里面传入的不只是Cuda:0,还有Cuda:1, Cuda:2等等,这个时候,你的网络模型model里面的forward函数里面就及其容易报错,因为里面存在的一些定维度的Tensor,比如权重、偏差的device容易跑偏。

2.当你单GPU正常使用Cuda:0:

这时候按理来说,只要device代码指代正常,按理来说不会出现设备问题,如果出现了,就是tensor的格式没有传入cuda而是保留在cpu。碰巧我某天训练时候就出现了,思路跟上面一样,最容易出现错误的地方是网络模型中固定维度的tensor如权重和偏差等tensor,或者是forward函数里面的输出.

下面直接给出解决办法:

1.在你网络的forward函数,先调出input的device,然后在输出的后面添加一句.to(device)

这样可以保证你无论是几个GPU,他在训练的时候都是会输出到正确的设备中

2.在你报错的代码中,通过debug观察到底是哪一块的参数设备不一致,然后通过一样的办法解决:

比如我那天在训练时,报错的地方是nn.Linear函数,很奇怪因为我是单GPU,按理来说不会出现这种情况。

 具体情况通过debug后发现,我的input的设备是'cuda:0',但是我linear[64,4]的权重矩阵,也就是weight的设备是cpu(这个具体要通过debug观察哪里出问题),于是改进方法如下解决问题:

 

 

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值