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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:02:32