GMAN图神经网络CUDA适配报错:张量设备不匹配问题求助
解决GMAN CUDA适配的设备不匹配问题
核心问题定位
报错Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!的直接原因是:模型输出的预测张量valPred位于cuda:0设备,但验证集的真实标签张量valY仍留在CPU上,两者无法在不同设备上计算指标。
具体修复步骤
1. 迁移验证集真实标签到GPU
找到train.py中获取验证集真实标签valY的代码位置,在调用metric函数前,将valY同步到valPred所在的设备:
# 在train.py调用metric的代码段修改 valPred = model(...) # 模型输出已在GPU valY = valY.to(valPred.device) # 将真实标签同步到相同设备 metrics = metric(valPred, valY)
如果验证集是通过DataLoader加载的,也可以在数据加载的__getitem__方法中,直接将标签张量移到指定GPU设备。
2. 检查metric函数内的张量创建逻辑
打开计算指标的metric函数,若函数内有新建张量(比如全零掩码、权重张量)的操作,需指定设备为输入张量的设备,避免默认创建在CPU上:
def metric(pred, true): # 示例:将新建的掩码张量指定到pred的设备 mask = torch.ones_like(true).to(pred.device) # 后续指标计算逻辑 ...
3. 全局确认设备一致性
- 确保模型已正确迁移到GPU:
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") model = model.to(device)
- 检查训练集数据是否也完成了设备迁移,避免只处理训练集而遗漏验证集的情况。
额外排查点
若修改后仍报错,检查是否存在其他未迁移到GPU的张量(比如损失函数的权重、额外输入特征),这类隐藏的CPU张量也会引发设备不匹配问题。
内容的提问来源于stack exchange,提问作者user25485064
相关产品推荐
相关产品推荐

