当前位置:   article > 正文

解决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 le

完整报错警告为:

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观察哪里出问题),于是改进方法如下解决问题:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/546603
推荐阅读
相关标签
  

闽ICP备14008679号