M1 Mac上的PyTorch:运行时错误:尚未在MPS设备上分配占位符存储

agyaoht7  于 2023-03-02  发布在  Mac
关注(0)|答案(1)|浏览(1542)

我正在我的M1 Mac上用PyTorch 1.13.0训练一个模型(我也在夜间构建torch-1.14.0.dev20221207上尝试过,但没有效果),我想使用MPS硬件加速。我的项目中有以下相关代码将模型和输入Tensor发送到MPS:

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu") # This always results in MPS

model.to(device)

...在我的数据集子类中:

class MyDataset(Dataset):
    def __init__(self, df, window_size):
        self.df = df
        self.window_size = window_size
        self.data = []
        self.labels = []
        for i in range(len(df) - window_size):
            x = torch.tensor(df.iloc[i:i+window_size].values, dtype=torch.float, device=device)
            y = torch.tensor(df.iloc[i+window_size].values, dtype=torch.float, device=device)
            self.data.append(x)
            self.labels.append(y)
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        return self.data[idx], self.labels[idx]

在我的第一个训练步骤中,这导致了以下回溯:

Traceback (most recent call last):
  File "lstm_model.py", line 263, in <module>
    train_losses, val_losses = train_model(model, criterion, optimizer, train_loader, val_loader, epochs=100)
  File "lstm_model.py", line 212, in train_model
    train_loss += train_step(model, criterion, optimizer, x, y)
  File "lstm_model.py", line 191, in train_step
    y_pred = model(x)
  File "miniconda3/envs/pytenv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1190, in _call_impl
    return forward_call(*input, **kwargs)
  File "lstm_model.py", line 182, in forward
    out, _ = self.lstm(x, (h0, c0))
  File "miniconda3/envs/pytenv/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1190, in _call_impl
    return forward_call(*input, **kwargs)
  File "miniconda3/envs/pytenv/lib/python3.10/site-packages/torch/nn/modules/rnn.py", line 774, in forward
    result = _VF.lstm(input, hx, self._flat_weights, self.bias, self.num_layers,
RuntimeError: Placeholder storage has not been allocated on MPS device!

我试过在没有指定设备的情况下在Dataset子类中创建Tensor,然后在它们上调用.to(device)

x = torch.tensor(df.iloc[i:i+window_size].values, dtype=torch.float)
x = x.to(device)
y = torch.tensor(df.iloc[i+window_size].values, dtype=torch.float)
y = y.to(device)

我还尝试过在没有在Dataset子类中指定设备的情况下创建Tensor,并在模型的forward方法和train_step函数中将Tensor发送到device
如何解决我的错误?

vsnjm48y

vsnjm48y1#

尝试更改此代码 device = torch.device(“mps”iftorch.backends.mps.is_available()else“cpu”)#这始终会导致MPS 更改为device = torch.device(“mps”)

相关问题