PyTorch 模型训练:运行时错误:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR



在GPU上训练PyTorch模型几个小时后,程序失败并显示错误

运行时错误: cuDNN 错误: CUDNN_STATUS_INTERNAL_ERROR

培训条件

  • 神经网络:具有nn.Linear输出的 PyTorch 4 层nn.LSTM
  • Deep Q 网络代理(带有重放内存的香草 DQN(
  • 传递到forward()state具有形状(32, 20, 15),其中32是批大小
  • 每集 50 秒
  • 大约 583 次(8 小时(或 1,150,000 步后发生错误,其中每一步都涉及通过 LSTM 模型的正向传递。

我的代码在训练开始之前还设置了以下值

torch.manual_seed(0)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
np.random.seed(0)

我们如何解决此问题?由于这发生在培训的 8 小时后,一些有根据的猜测在这里会非常有帮助!

谢谢!


更新:

注释掉 2torch.backends.cudnn...行不起作用。CUDNN_STATUS_INTERNAL_ERROR仍然发生,但更早在第300集(585,000步(左右。

torch.manual_seed(0)
#torch.backends.cudnn.deterministic = True
#torch.backends.cudnn.benchmark = False
np.random.seed(0)

系统

  • PyTorch 1.6.0.dev20200525
  • 库达 10.2
  • cuDNN 7604
  • 蟒蛇 3.8
  • 视窗 10
  • nVidia 1080 GPU

错误回溯

RuntimeError                              Traceback (most recent call last)
<ipython-input-18-f5bbb4fdfda5> in <module>
57 
58     while not done:
---> 59         action = agent.choose_action(state)
60         state_, reward, done, info = env.step(action)
61         score += reward
<ipython-input-11-5ad4dd57b5ad> in choose_action(self, state)
58         if np.random.random() > self.epsilon:
59             state = T.tensor([state], dtype=T.float).to(self.q_eval.device)
---> 60             actions = self.q_eval.forward(state)
61             action = T.argmax(actions).item()
62         else:
<ipython-input-10-94271a92f66e> in forward(self, state)
20 
21     def forward(self, state):
---> 22         lstm, hidden = self.lstm(state)
23         actions = self.fc1(lstm[:,-1:].squeeze(1))
24         return actions
~AppDataLocalContinuumanaconda3envsrllibsite-packagestorchnnmodulesmodule.py in __call__(self, *input, **kwargs)
575             result = self._slow_forward(*input, **kwargs)
576         else:
--> 577             result = self.forward(*input, **kwargs)
578         for hook in self._forward_hooks.values():
579             hook_result = hook(self, input, result)
~AppDataLocalContinuumanaconda3envsrllibsite-packagestorchnnmodulesrnn.py in forward(self, input, hx)
571         self.check_forward_args(input, hx, batch_sizes)
572         if batch_sizes is None:
--> 573             result = _VF.lstm(input, hx, self._flat_weights, self.bias, self.num_layers,
574                               self.dropout, self.training, self.bidirectional, self.batch_first)
575         else:
RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR

更新:在我的代码上尝试try... except发生此错误的地方,除了RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR,我们还获得了错误的第二次回溯RuntimeError: CUDA error: unspecified launch failure

During handling of the above exception, another exception occurred:
RuntimeError                              Traceback (most recent call last)
<ipython-input-4-e8f15cc8cf4f> in <module>
61 
62     while not done:
---> 63         action = agent.choose_action(state)
64         state_, reward, done, info = env.step(action)
65         score += reward
<ipython-input-3-1aae79080e99> in choose_action(self, state)
58         if np.random.random() > self.epsilon:
59             state = T.tensor([state], dtype=T.float).to(self.q_eval.device)
---> 60             actions = self.q_eval.forward(state)
61             action = T.argmax(actions).item()
62         else:
<ipython-input-2-6d22bb632c4c> in forward(self, state)
25         except Exception as e:
26             print('error in forward() with state:', state.shape, 'exception:', e)
---> 27             print('state:', state)
28         actions = self.fc1(lstm[:,-1:].squeeze(1))
29         return actions
~AppDataLocalContinuumanaconda3envsrllibsite-packagestorchtensor.py in __repr__(self)
152     def __repr__(self):
153         # All strings are unicode in Python 3.
--> 154         return torch._tensor_str._str(self)
155 
156     def backward(self, gradient=None, retain_graph=None, create_graph=False):
~AppDataLocalContinuumanaconda3envsrllibsite-packagestorch_tensor_str.py in _str(self)
331                 tensor_str = _tensor_str(self.to_dense(), indent)
332             else:
--> 333                 tensor_str = _tensor_str(self, indent)
334 
335     if self.layout != torch.strided:
~AppDataLocalContinuumanaconda3envsrllibsite-packagestorch_tensor_str.py in _tensor_str(self, indent)
227     if self.dtype is torch.float16 or self.dtype is torch.bfloat16:
228         self = self.float()
--> 229     formatter = _Formatter(get_summarized_data(self) if summarize else self)
230     return _tensor_str_with_formatter(self, indent, formatter, summarize)
231 
~AppDataLocalContinuumanaconda3envsrllibsite-packagestorch_tensor_str.py in __init__(self, tensor)
99 
100         else:
--> 101             nonzero_finite_vals = torch.masked_select(tensor_view, torch.isfinite(tensor_view) & tensor_view.ne(0))
102 
103             if nonzero_finite_vals.numel() == 0:
RuntimeError: CUDA error: unspecified launch failure

众所周知,错误RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR很难调试,但令人惊讶的是,它通常是内存不足的问题。通常,您会收到内存不足错误,但根据它发生的位置,PyTorch 无法拦截该错误,因此不会提供有意义的错误消息。

在您的情况下,内存问题似乎很大,因为您在代理完成之前使用的是 while 循环,这可能需要足够长的时间以耗尽内存,这只是时间问题。一旦模型的参数与某个输入的组合无法及时完成,这也可能发生得相当晚。

您可以通过限制允许的操作数量来避免这种情况,而不是希望参与者将在合理的时间内完成。

您还需要注意的是,不要占用不必要的内存。一个常见的错误是在未来的迭代中不断计算过去状态的梯度。上次迭代的状态应被视为常量,因为当前操作不应影响过去的操作,因此不需要渐变。这通常是通过将状态从下一次迭代的计算图中分离来实现的,例如state = state_.detach().也许你已经在这样做了,但没有代码就无法分辨。

同样,如果您保留状态的历史记录,则应将它们分离,更重要的是将它们放在CPU上,即history.append(state.detach().cpu()).

任何遇到此错误以及其他与 cudnn/GPU 相关的错误的人都应该尝试更改 CPU 的模型和输入,通常 CPU 运行时具有更好的错误报告,并使您能够调试问题。

根据我的经验,大多数情况下错误来自嵌入上的无效索引。

减少num_workers对我有用:D

我遇到了同样的问题,并通过将 cudatoolkit 降级到 10.1 版来解决它。因此,请尝试使用 cudatoolkit 10.1 重新安装 pytorch。

conda install pytorch torchvision cudatoolkit=10.1

这可能并不适合所有人,因为可能还有其他因素,例如工人、已安装的 Cuda 版本等。

对我来说,系统重启将它固定在我的Windows 11机器上,该机器带有8GB内存的Nvidia Geforce RTX3070。我的机器已经开机好几天了,许多程序进出 GPU。

我认为减小批量大小,它会起作用。

对我来说,这是因为上次运行中的两个进程不知何故没有被正确杀死,并且它们占用了两个 GPU,导致相同的 cudnn 错误。

杀死这两个进程后错误消失

相关内容

  • 没有找到相关文章

最新更新