我正在使用 pytorch geometric 来训练图神经网络。导致这个问题的问题是以下错误:
RuntimeError:预期所有张量都在同一设备上,但发现 至少有两个设备,cpu 和 cuda:0! (检查参数时 方法 wrapper_addmm 中的参数 mat1)
所以,我正在尝试检查张量加载到哪个设备上,当我运行
data.x.get_device()
和data.edge_index.get_device()
时,我得到每个设备的-1
。 -1 是什么意思?
一般来说,我对何时需要将数据传输到设备(无论是 cpu 还是 gpu)感到有点困惑,但我假设对于每个纪元,我只是在我的张量上使用 .to(device) 来添加到适当的设备。
附加上下文:
我正在运行 ubuntu 20,在安装 cuda 之前我没有看到这个问题(即,我能够在 cpu 上训练/测试模型,但只有在安装 cuda 和更新 nvidia 驱动程序后才会出现这个问题)。 我在我的系统上安装了
cuda 11.7
,带有兼容 cuda 12 的 nvidia 驱动程序(例如,cuda 12 以 nvidia-smi
列出),torch.version.cuda
的输出是 11.7
。不管怎样,我现在只是想使用 cpu,但一旦这个设备问题得到解决,我就会使用 gpu。
-1 表示不在任何 GPU 设备上。
.to()
data.x = data.x.to(device)
data.edge_index = data.edge_index.to(device)
-1 表示张量在 CPU 上。当你做
.to(device)
时,你的device
变量初始化为什么?如果您只想使用 CPU,我建议将设备初始化为 device = torch.device("cpu")
并使用 CUDA_VISIBLE_DEVICES='' python your_code.py ...
运行您的 python 代码
通常,如果您将张量传递给模型,PyTorch 期望您的张量与您的模型位于同一设备上。如果您将多个张量传递给一个方法,例如您的损失函数 ``nn.CrossEntropy()```,PyTorch 期望您的两个张量(预测和标签)位于同一设备上。