LSTNet迁移GPU后仍报RuntimeError:输入与参数设备不一致
解决PyTorch模型GPU运行时设备不匹配错误
问题描述
克隆了一个实现LSTNet深度学习模型的GitHub仓库,修改代码将模型和数据迁移至GPU运行,核心代码如下:
train_dataset = MarketDataset(train_data, history_len=history_len) train_data_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) model = LSTNet() model.to("cuda") criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=weight_decay) train_loss_list = [] for epoch in tqdm(range(epochs)): epoch_loss_train = 0 for i, batch in tqdm(enumerate(train_data_loader, start=1), leave=False, desc="Train", total=len(train_data_loader)): X, Y = batch X = X.to("cuda") Y = Y.to("cuda") optimizer.zero_grad() Y_pred = model(X) loss = criterion(Y_pred, Y) loss.backward() optimizer.step() with open(root_dir / 'Log/Running-Loss.txt', 'a+') as file: file.write(f'{loss.item()}\n') epoch_loss_train += loss.item() epoch_loss_train = epoch_loss_train / len(train_data_loader) train_loss_list.append(epoch_loss_train) with open(root_dir / 'Log/Epoch-Loss.txt', 'a+') as file: file.write(f'{epoch_loss_train}\n')
运行时出现报错:
RuntimeError: Input and parameter tensors are not at the same device, found input tensor at cuda:0 and parameter tensor at cpu
已确认输入X、标签Y和模型均已部署在CUDA上,但仍出现设备不匹配错误。
可能原因及解决方案
1. 模型移动到GPU时未正确赋值
虽然PyTorch中nn.Module.to()是in-place操作,但部分场景下(如自定义模型继承逻辑特殊)需要显式赋值,确保模型实例指向GPU上的版本:
# 替换原model.to("cuda") model = model.to("cuda")
2. 模型内部存在未迁移到GPU的张量
检查LSTNet类的forward方法,若存在运行时创建的新张量(如torch.tensor()、torch.randn()等)且未指定设备,会默认留在CPU,导致运算时设备不匹配。
例如,若有如下代码:
def forward(self, x): weights = torch.tensor([0.1, 0.2, 0.3]) # ...其他运算
需修改为:
def forward(self, x): weights = torch.tensor([0.1, 0.2, 0.3], device=x.device) # 或者在模型初始化时记录device,使用self.device # weights = torch.tensor([0.1, 0.2, 0.3], device=self.device) # ...其他运算
3. 模型子模块未被正确注册
若模型内部用普通列表存储子模块(而非nn.ModuleList),model.to()无法自动遍历移动所有子模块的参数,导致部分参数留在CPU。
检查LSTNet的__init__方法,确保子模块使用nn.ModuleList或nn.Sequential注册:
# 错误示例: self.layers = [nn.Linear(10, 20), nn.ReLU()] # 正确示例: self.layers = nn.ModuleList([nn.Linear(10, 20), nn.ReLU()])
4. 验证模型参数的设备
添加代码确认模型参数是否真的在GPU上:
model = LSTNet() model = model.to("cuda") # 打印第一个参数的设备 print(next(model.parameters()).device)
若输出为cpu,则说明模型参数未成功迁移,需排查模型定义中的参数注册逻辑。
内容的提问来源于stack exchange,提问作者Amri Rasyidi
相关产品推荐
相关产品推荐

