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

PyTorch GPU运行报错addmm期望张量在GPU却存在CPU张量问题排查

问题根源

你遇到的报错核心原因是Linear_f模块的可学习参数(即nn.Linear层的权重和偏置)停留在CPU上,和输入的GPU张量运算时设备不匹配,常见触发场景有以下两种:

  • 场景1:你在Generator类的forward方法中动态初始化了Linear_f实例,而没有在__init__方法中将Linear_f注册为Generator的子模块。
    PyTorch调用model.cuda()时,只会迁移已经注册的子模块参数、模型自身的Parameter/Buffer到GPU。如果是forward运行时才创建的Linear_f,它的参数默认在CPU,不会被自动迁移,运算时就会触发设备不匹配报错。
  • 场景2:你在Linear_f的forward方法中手动创建了新的CPU张量参与运算,比如使用torch.zeros()/torch.randn()等接口时没有指定device=x.device,新生成的张量默认在CPU,和GPU的输入/参数运算时触发报错。

排查验证方法

你可以在Linear_f的forward方法中加入如下打印,快速定位异常设备的张量:

def forward(self, x):
    print("输入x设备:", x.device)
    print("Linear层权重设备:", self.linear[0].weight.device)
    print("Linear层偏置设备:", self.linear[0].bias.device)
    y = self.linear(x)
    return y

运行后设备为cpu的项就是问题来源。

解决方案

对应两种场景的解决方法:

  1. 把所有Linear_f的实例初始化逻辑移到Generator的__init__方法中,并赋值给self的成员变量,确保被注册为子模块,调用gen.cuda()时参数会自动迁移到GPU。
    错误示例:
# 不要在forward里创建模块实例
def forward(self, x, label):
    linear_f = Linear_f(10, 20)
    ...

正确示例:

def __init__(self, img_channels, num_classes):
    super().__init__()
    self.linear_f = Linear_f(num_classes, 20) # 初始化放在__init__里,注册为子模块
    ...
  1. 如果需要在forward中动态生成张量,必须指定device和输入张量保持一致:
# 错误写法,张量默认在CPU
temp = torch.zeros(x.shape)
# 正确写法,和输入张量设备一致
temp = torch.zeros(x.shape, device=x.device)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:24:05