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

PyTorch CPU训练时输入与权重设备类型不匹配问题排查

问题原因与解决方案

核心原因

错误本质是输入张量在CPU(torch.FloatTensor),但模型权重却在GPU(torch.cuda.FloatTensor),二者设备不匹配导致运算失败。你虽然调用了model = myCNN().to(device),但实际存在未覆盖的权重设备问题。

针对性解决方法

1. 排查模型初始化/权重加载环节

  • 如果myCNN的__init__方法中,有手动给层参数调用.cuda()的代码,直接删除这类操作,让参数默认在CPU初始化。
  • 如果加载了预训练权重,必须指定加载到CPU设备:
    state_dict = torch.load("pretrained_weights.pth", map_location=device)
    model.load_state_dict(state_dict)
    
    跳过这一步的话,预训练权重会默认加载到GPU,后续的.to(device)可能无法完全覆盖所有参数。

2. 确保model.to(device)执行时机正确

如果在调用model.to(device)之后,又动态添加了新的网络层,新层的参数会默认留在CPU,此时需要重新把整个模型转移到目标设备:

# 修改模型结构后,重新执行设备转移
model = model.to(device)

3. 强制CPU运行的终极方案

如果上述方法都无效,直接在代码最开头添加以下代码,彻底让PyTorch忽略GPU:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"  # 屏蔽所有GPU设备

import torch
device = torch.device("cpu")

或者用另一种方式强制禁用CUDA:

import torch
torch.cuda.is_available = lambda: False
device = torch.device("cpu")

4. 验证设备匹配情况

在训练循环中添加打印语句,快速定位问题:

# 训练循环内添加
print(f"Inputs device: {inputs.device}")
print(f"Model first layer weight device: {next(model.parameters()).device}")

如果输出显示模型权重仍在GPU,说明model.to(device)未生效,回到前两步排查。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:05:18