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

已将模型和数据移至CUDA仍出现PyTorch张量类型不匹配报错如何解决?

报错原因

该报错的核心逻辑是PyTorch要求参与运算的输入张量和模型权重必须存储在同一设备上,当前你输入到模型的张量已经加载到CUDA设备,但模型的权重参数仍留在CPU设备,因此触发了类型不匹配错误。即便你认为已经完成了全量设备迁移,通常是以下几种疏漏导致的:

  • 模型迁移操作未实际生效:迁移代码被分支逻辑跳过,或是你在完成模型迁移后,又加载了默认存储在CPU的预训练权重到模型中,覆盖了已经迁移的权重
  • 模型存在未注册的自定义张量:你手动在模型内定义的固定张量、可训练张量没有注册为模型的Parameter或Buffer,调用model.to('cuda')时只会自动迁移注册过的参数,这部分自定义张量不会同步到CUDA
  • 子模块定义时机错误:你在执行完model.to('cuda')之后,才动态定义、添加了新的子模块到模型中,这部分后添加的子模块默认会落在CPU设备
  • 数据并行操作顺序错误:使用torch.nn.DataParallel时,错误地先包裹模型再执行设备迁移,导致部分权重没有同步到CUDA
解决方法

第一步:先确认设备归属

执行以下代码,明确是模型还是输入的设备不符合预期:

# 打印输入张量所在设备
print("输入设备:", input_tensor.device)
# 打印模型第一个参数的所在设备
print("模型权重设备:", next(model.parameters()).device)

第二步:对应场景修复

  • 规范迁移和权重加载的操作顺序,迁移完成后再加载权重,加载时可直接指定map_location避免CPU中转:
# 初始化模型后先完成CUDA迁移
model = MyModel().to('cuda')
# 加载预训练权重时直接映射到CUDA设备
ckpt = torch.load("pretrained_checkpoint.pth", map_location="cuda")
model.load_state_dict(ckpt)
  • 模型内部所有自定义张量都注册为Parameter或Buffer,确保迁移时自动同步到对应设备:
# 可训练的自定义权重注册为Parameter
self.custom_conv_kernel = torch.nn.Parameter(torch.randn(64, 3, 3))
# 不需要训练的固定张量注册为Buffer
self.register_buffer("dataset_mean_std", torch.tensor([0.485, 0.229]))
  • 所有子模块都放在模型的__init__方法中完成定义,避免在前向传播阶段动态创建子模块;如果必须动态创建,创建后立刻调用.to('cuda')迁移到对应设备
  • 数据并行场景严格遵守「先迁移模型,再包裹并行」的操作顺序:
model = model.to('cuda')
model = torch.nn.DataParallel(model)

对应报错详情截图:
报错详情截图

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

相关产品推荐
方舟 Agent Plan

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

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