PyTorch 模型训练:RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR

Posted

技术标签:

【中文标题】PyTorch 模型训练:RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR【英文标题】:PyTorch Model Training: RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR 【发布时间】:2020-09-15 22:53:58 【问题描述】:

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

RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR

培训条件

神经网络:PyTorch 4 层 nn.LSTMnn.Linear 输出 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 小时后,因此一些有根据的猜测在这里会很有帮助!

谢谢!


更新:

注释掉 2 torch.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 CUDA 10.2 cuDNN 7604 Python 3.8 Windows 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

~\AppData\Local\Continuum\anaconda3\envs\rl\lib\site-packages\torch\nn\modules\module.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)

~\AppData\Local\Continuum\anaconda3\envs\rl\lib\site-packages\torch\nn\modules\rnn.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

~\AppData\Local\Continuum\anaconda3\envs\rl\lib\site-packages\torch\tensor.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):

~\AppData\Local\Continuum\anaconda3\envs\rl\lib\site-packages\torch\_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:

~\AppData\Local\Continuum\anaconda3\envs\rl\lib\site-packages\torch\_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 

~\AppData\Local\Continuum\anaconda3\envs\rl\lib\site-packages\torch\_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

【问题讨论】:

在我的情况下,错误是标签。模型输出 53 个值数据集从 0 开始输出标签,但交叉熵期望标签从 0 开始。因此,更改此设置解决了我的问题。 【参考方案1】:

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

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

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

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

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

【讨论】:

【参考方案2】:

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

根据我的经验,大多数时候错误来自嵌入的无效索引。

【讨论】:

我从没想过这会起作用,但实际上我得到了它。显然我有一些不稳定的 cuda 安装 这正是我大部分时间遇到的。【参考方案3】:

减少 num_workers 对我有用:D

【讨论】:

这更像是一个评论,而不是一个答案。声望超过 50 时,您可以发布 cmets。详情请见here。【参考方案4】:

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

conda install pytorch torchvision cudatoolkit=10.1

【讨论】:

您是在自己的机器上还是在 Google Colab 中完成的?

以上是关于PyTorch 模型训练:RuntimeError:cuDNN 错误:CUDNN_STATUS_INTERNAL_ERROR的主要内容,如果未能解决你的问题,请参考以下文章

无法将 PyTorch 模型导出到 ONNX

Pytorch RNN 错误:RuntimeError:输入必须有 3 个维度得到 1

训练时 Pytorch CUDA OutOfMemory 错误

《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办

运行时错误:CUDA 在训练结束时内存不足并且不保存模型;火炬

docker容器内运行pytorch多gpu报错 RuntimeError: NCCL Error 2: unhandled system error