运行PyTorch模型摘要时遭遇MPS设备不匹配错误求助
解决PyTorch MPS设备输入与模型设备不匹配问题
问题描述
运行PyTorch模型摘要代码时遇到错误:
slow_conv2d_forward_mps: input(device='cpu') and weight(device='mps:0') must be on the same device。已通过model = Net().to(mps)将模型移至MPS设备,但找不到切换输入设备的位置,尝试给网络模块单独添加.to(mps)处理也未解决,不确定是否需要对输入数据执行.to(mps)操作。
用户提供的代码:
import torch import torch.nn as nn import torch.nn.functional as F from torchsummary import summary class Net(nn.Module): def __init__(self): super(Net, self).__init__() # Input Block self.convblock1 = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=8, kernel_size=(3, 3),padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(4) ) self.pool11 = nn.MaxPool2d(2, 2) # CONVOLUTION BLOCK self.convblock2 = nn.Sequential( nn.Conv2d(in_channels=8, out_channels=16, kernel_size=(3, 3),padding=0,bias=False), nn.ReLU(), #nn.BatchNorm2d(16) ) # TRANSITION BLOCK self.pool22 = nn.MaxPool2d(2, 2) self.convblock3 = nn.Sequential( nn.Conv2d(in_channels=16, out_channels=10, kernel_size=(1, 1), padding=0,bias=False), #nn.BatchNorm2d(10), nn.ReLU() ) self.pool33 = nn.MaxPool2d(2, 2) # CONVOLUTION BLOCK self.convblock4 = nn.Sequential( nn.Conv2d(in_channels=10, out_channels=10, kernel_size=(3, 3), padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(10) ) self.convblock5 = nn.Sequential( nn.Conv2d(in_channels=10, out_channels=32, kernel_size=(1, 1), padding=0, bias=False), #nn.BatchNorm2d(32), nn.ReLU(), ) self.convblock6 = nn.Sequential( nn.Conv2d(in_channels=32, out_channels=10, kernel_size=(1, 1), padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(10), ) self.convblock7 = nn.Sequential( nn.Conv2d(in_channels=10, out_channels=10, kernel_size=(3, 3), padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(10) ) self.convblock8 = nn.Sequential( nn.Conv2d(in_channels=10, out_channels=32, kernel_size=(1, 1), padding=0, bias=False), #nn.BatchNorm2d(32), nn.ReLU() ) self.convblock9 = nn.Sequential( nn.Conv2d(in_channels=32, out_channels=10, kernel_size=(1, 1), padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(10), ) self.convblock10 = nn.Sequential( nn.Conv2d(in_channels=10, out_channels=14, kernel_size=(3, 3), padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(14), ) self.convblock11 = nn.Sequential( nn.Conv2d(in_channels=14, out_channels=16, kernel_size=(3, 3), padding=0, bias=False), nn.ReLU(), #nn.BatchNorm2d(16), ) # OUTPUT BLOCK self.gap = nn.Sequential( nn.AvgPool2d(kernel_size=4) ) self.convblockout = nn.Sequential( nn.Conv2d(in_channels=16, out_channels=2, kernel_size=(4, 4), padding=0, bias=False), ) def forward(self, x): x = self.convblock1(x) x = self.pool11(x) x = self.convblock2(x) x = self.pool22(x) x = self.convblock3(x) x = self.pool33(x) x = self.convblock4(x) x = self.convblock5(x) x = self.convblock6(x) x = self.convblock7(x) x = self.convblock8(x) x = self.convblock9(x) x = self.convblock10(x) x = self.convblock11(x) x = self.gap(x) x = self.convblockout(x) x = x.view(-1, 2) return F.log_softmax(x, dim=-1) mps = torch.device("mps") cpu = torch.device("cpu") model = Net().to(mps) summary(model, input_size=(3, 224, 224))
解决方案
- 问题本质:
summary函数默认会在CPU上生成输入张量,而你的模型已经移到MPS设备,导致输入和模型参数设备不匹配。 - 解决方法:手动创建MPS设备的输入张量,传给
summary的input_data参数,替换原来的input_size:
修改后的代码片段:
mps = torch.device("mps") model = Net().to(mps) # 生成匹配输入尺寸的张量并移至MPS设备 dummy_input = torch.randn(1, 3, 224, 224).to(mps) # 使用input_data传入MPS设备的输入 summary(model, input_data=dummy_input)
- 额外说明:
model = Net().to(mps)已经会把模型所有子模块的参数移到MPS,不需要单独给每个convblock加.to(mps)。
内容的提问来源于stack exchange,提问作者ikaikaalika95
相关产品推荐
相关产品推荐

