Pytorch 训练问题:indices should be either on cpu or on the same device as the indexed tensor

        在对pytroch的训练过程中,出现了如标题所示的问题,这个问题用简单的话来解释就是:部分在GPU上运行,部分在CPU上运行

问题代码

Y = T[cos_sim.topk(1 + K)[1][:, 1:]]

         在这段代码中的运行中就发生了部分在GPU上运行,部分在CPU上运行的情况,我查阅了很多的相关博客,最终总结出下面通用的方法(在本博客最后将列出参考博客)。

方法步骤

一、检查代码中那些部分的数据用CPU在处理,哪些部分的数据用GPU来处理

        使用下列代码可以检查,以我的问题代码举例:

print(f"T device: {T.device}")
print(f"cos_sim device: {cos_sim.device}")

        这样就会输出我在问题代码中每个部分数据的存放或是计算位置,通过控制台的反馈即可看出来,问题代码的反馈如下:

T device: cpu
cos_sim device: cuda:0

        我们可以看到T是在cpu,cos_sim在cuda中,与报错的结果相吻合。

二、调整代码,使其都为相同位置

        找到两者的不同后,我将使用cuda的数据转换为cpu,达到两者都在相同位置运行的结果,下面是问题代码的解决方式。

change_cpu = cos_sim.topk(1 + K)[1][:, 1:].cpu()
Y = T[change_cpu]

        那么在其他情况下也可以将cpu运行的数据放置到cuda中,使用.to(device)也是可以的。

        我在其他博客中看到一个非常好的方式,两种都结合起来了。

## x转变为j的device
x = x.to(j.device)

        

        这就是解决的两个步骤,步骤一来验证,步骤二来调整,我对这个问题困扰了好一会,希望这个方法可以帮到你。

参考博客:

RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)_一颗小树x的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值