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的项就是问题来源。
解决方案
对应两种场景的解决方法:
- 把所有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__里,注册为子模块 ...
- 如果需要在forward中动态生成张量,必须指定device和输入张量保持一致:
# 错误写法,张量默认在CPU temp = torch.zeros(x.shape) # 正确写法,和输入张量设备一致 temp = torch.zeros(x.shape, device=x.device)
内容的提问来源于stack exchange,提问作者Rlvf40 Wfg35
相关产品推荐
相关产品推荐

