PyG训练时所有张量都在cuda上仍报设备不匹配错误如何解决
问题原因
你打印的所有输入张量设备均为cuda:0,报错触发在GCNConv内部的Linear层矩阵乘法环节,说明模型自身的可训练参数(权重、偏置)仍然存储在CPU上,未同步移动到CUDA设备,导致前向传播时CPU的模型参数和CUDA的输入张量运算触发设备不匹配。切换到CPU后输入和模型参数都在CPU,所以运行正常。
解决步骤
- 模型初始化完成后,训练启动前,显式将模型整体迁移到目标CUDA设备:
# 放在模型定义完成、训练函数调用前的位置 device = torch.device('cuda:0') self.model = self.model.to(device)
⚠️ 注意:如果你的优化器是在模型迁移到CUDA之前初始化的,必须在模型迁移完成后重新初始化优化器,否则优化器内存储的梯度、动量等状态会留在CPU,触发新的设备不匹配问题。
- 若操作后仍报错,可添加代码逐一检查模型参数的设备定位问题参数:
for param_name, param in self.model.named_parameters(): print(f"参数{param_name}设备:{param.get_device()}")
打印结果为-1就代表对应参数在CPU上,可进一步检查你是否在模型的__init__或forward方法中定义了未指定设备的临时张量,或者训练过程中动态新增了模型结构没有重新迁移到CUDA。
- 排查PyG特有缓存问题:如果你给GCNConv设置了
cached=True参数,第一次在CPU上运行前向传播时会生成缓存的归一化邻接矩阵,后续即使迁移模型到CUDA,该缓存张量也不会自动迁移,你可以将cached参数改为False,或者迁移模型后手动清空对应Conv层的缓存属性。
内容的提问来源于stack exchange,提问作者Adnan Ali
相关产品推荐
相关产品推荐

