在对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)
这就是解决的两个步骤,步骤一来验证,步骤二来调整,我对这个问题困扰了好一会,希望这个方法可以帮到你。
参考博客: