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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:43:15