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

PyTorch-GPU运行时报错张量设备不统一,遗漏了哪些迁移到GPU的步骤

问题修复方案

报错原因

报错是因为计算损失时,模型输出在cuda设备上,而你没有将训练用的target标签和输入data移动到GPU,仍留在CPU上,导致设备不匹配。

遗漏操作修复步骤

  • 首先清理冗余的.cuda()调用,你现在给每个层、每个中间张量都加.cuda()的写法极易出错,且不利于CPU/GPU兼容,模型类修改为:
class NeuralNet(nn.Module):
    def __init__(self, gpu = True):
        super(NeuralNet, self ).__init__()
        self.fc1 = nn.Linear(28 * 28, 16)
        self.fc2 = nn.Linear(16, 10)
    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x
  • 损失函数不需要额外加.cuda(),删除这部分的冗余调用。
  • 训练循环中新增张量移动逻辑,这是你之前漏掉的核心步骤:
for data, target in load_data.train_loader:
    # 新增两行,将输入和标签移动到对应设备
    data = data.to(device)
    target = target.to(device)
    optimizer.zero_grad()
    output = model(data)
    loss = criterion(output, target)
    # 后续逻辑保持不变

无需处处添加.cuda()的实现方法

你已经定义了通用设备变量device = torch.device('cuda' if torch.cuda.is_available() else 'cpu'),按以下规范写即可避免到处加.cuda():

  1. 常规兼容写法:所有需要在GPU计算的对象统一调用.to(device)即可,仅需三类操作:
    • 模型实例化后调用model = model.to(device)
    • 训练/验证时,将dataloader取出的data和target调用.to(device)
    • 自己创建的张量(如自定义参数、掩码等)创建时指定device=device参数
  2. 全局默认设备写法(PyTorch 2.0+支持):
    在代码开头加一行torch.set_default_device(device),之后所有新创建的张量、模型参数默认都会生成在指定设备上,不需要额外调用.to(device)。如果搭配DataLoader使用,给DataLoader新增参数generator=torch.Generator(device=device),即可让加载的数据直接生成在GPU上,不需要手动移动。

内容的提问来源于stack exchange,提问作者user10169965

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:45:03