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

PyTorch运行时报错输入与权重张量类型不匹配 已移至GPU仍报错如何解决

问题根因
  • 你遇到的报错核心原因是BrainModel自定义结构中存在未被PyTorch自动迁移到GPU的张量,.to(device)方法只会自动迁移模型中注册为nn.Parameter的可训练参数、以及通过register_buffer注册的固定缓冲张量,不在这个范围内的张量会一直停留在CPU,参与运算时就会触发类型不匹配。常见的两种场景:
    1. __init__方法中直接将自定义张量赋值为类普通属性,没有做注册处理
    2. forward方法中创建临时张量时没有指定device参数,默认在CPU生成
  • 额外注意:你报错行之后的类型转换代码out, labels = out.type(torch.FloatTensor), labels.type(torch.FloatTensor)同样存在问题,torch.FloatTensor默认是CPU类型,会把已经在CUDA上的输出和标签重新转回CPU,后续计算损失时也会触发同类报错。
修复方案

1. 修正模型定义部分

检查BrainModel的__init__方法,对所有自定义张量做对应注册处理:

# 错误写法:普通类属性张量不会被to(device)迁移
self.custom_kernel = torch.randn(3, 3)

# 修正写法1:如果是可训练参数,封装为nn.Parameter
self.custom_kernel = nn.Parameter(torch.randn(3, 3))

# 修正写法2:如果是不需要训练的固定张量,注册为buffer
self.register_buffer('custom_kernel', torch.randn(3, 3))

2. 修正forward内部临时张量创建逻辑

所有forward方法内生成的临时张量,都指定device参数,优先用输入张量的device属性适配不同运行环境:

# 错误写法:默认在CPU生成张量
mask = torch.ones(sequences.shape[0], 128)

# 修正写法:指定和输入一致的device
mask = torch.ones(sequences.shape[0], 128, device=sequences.device)

3. 修正后续类型转换逻辑

替换固定CPU类型的转换写法,适配当前运行设备:

# 错误写法:固定转CPU张量
out, labels = out.type(torch.FloatTensor), labels.type(torch.FloatTensor)

# 修正写法:统一转到当前设备
out, labels = out.to(device), labels.to(device)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:06:04