You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:54:01