gpt4 book ai didi

python - PyTorch 模型训练 : RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR

转载 作者:行者123 更新时间:2023-12-03 15:54:40 27 4
gpt4 key购买 nike

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

RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR



培训条件
  • 神经网络:PyTorch 4 层 nn.LSTMnn.Linear输出
  • 深度 Q 网络代理(具有重放内存的 Vanilla DQN)
  • state传入forward()有形状(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

    最佳答案

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

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

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

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

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

    关于python - PyTorch 模型训练 : RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62067849/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com