PyTorch CUDA报错:张量设备不统一(CPU与CUDA:0)求助
PyTorch CUDA设备不匹配问题排查与修复
核心问题及修复方案
1. 单独调用未部署到CUDA的模型组件
你在train_step和validation_step中直接调用feature_extractor和proj_head这两个独立变量,但这两个组件仅被包装进network并移至CUDA,自身并未部署到GPU。单独的feature_extractor和proj_head仍停留在CPU上,导致输出张量在CPU,与CUDA上的损失函数计算时触发设备不匹配错误。
修复代码:
直接使用组合好的network完成前向传播,替代分开调用:
# train_step中替换原有前向传播代码 z1 = network(aug1) z2 = network(aug2) # validation_step中同理替换 z1 = network(aug1) z2 = network(aug2)
删除原有features1 = feature_extractor(aug1)、z1 = proj_head(features1)等拆分调用的代码。
2. SupervisedModel未移至CUDA
初始化SupervisedModel后未执行model.to(device),模型参数停留在CPU,而输入的emb是CUDA张量,前向传播时设备不匹配。
修复代码:
每次初始化SupervisedModel后立即部署到目标设备:
model = SupervisedModel() model.to(device) # 添加该行代码
3. 冗余的设备转换操作
测试代码中labels.cuda().numpy()是冗余操作,labels已通过labels.to(device)移至CUDA,直接转回CPU即可:
test_labels = np.concatenate( (test_labels, labels.cpu().numpy()), axis=0) test_predictions = np.concatenate( (test_predictions, predicted.cpu().numpy()), axis=0)
4. 加载模型时指定设备(优化建议)
使用torch.load加载权重时,直接指定map_location=device,避免后续手动迁移:
network.load_state_dict(torch.load(weight_files[-1].as_posix(), map_location=device)) model.load_state_dict(torch.load(weight_files_1[-1].as_posix(), map_location=device))
内容的提问来源于stack exchange,提问作者sersem1
相关产品推荐
相关产品推荐

