Обучение модели PyTorch: RuntimeError: ошибка cuDNN: CUDNN_STATUS_INTERNAL_ERROR - PullRequest
0 голосов
/ 28 мая 2020

После обучения модели PyTorch на графическом процессоре в течение нескольких часов программа выдает ошибку

RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR

Условия обучения

  • Нейронная сеть: PyTorch 4-слойная nn.LSTM с nn.Linear выводом
  • Сетевой агент Deep 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

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Ошибка RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR, как известно, трудно отладить, но на удивление часто это проблема нехватки памяти. Обычно вы получаете ошибку нехватки памяти, но в зависимости от того, где она возникает, PyTorch не может перехватить ошибку и, следовательно, не выдает значимого сообщения об ошибке.

Проблема с памятью в вашем случае вероятна, потому что вы используете while l oop, пока агент не закончит работу, что может занять достаточно много времени, чтобы у вас закончилась память, это просто вопрос времени. Это также может произойти довольно поздно, когда параметры модели в сочетании с определенными входными данными не могут быть sh вовремя.

Вы можете избежать этого сценария, ограничив количество разрешенных действий вместо того, чтобы надеяться, что актер будет готов в разумные сроки.

Вам также нужно быть осторожным, чтобы не занимать ненужную память. Распространенная ошибка - продолжать вычислять градиенты прошлых состояний в будущих итерациях. Состояние из последней итерации следует считать постоянным, поскольку текущее действие не должно влиять на прошлые действия, поэтому градиенты не требуются. Обычно это достигается путем отделения состояния от вычислительного графа для следующей итерации, например, state = state_.detach(). Возможно, вы уже делаете это, но без кода это невозможно сказать.

Точно так же, если вы храните историю состояний, вы должны отсоединить их и, что еще более важно, поместить их в ЦП, т.е. history.append(state.detach().cpu()).

0 голосов
/ 09 августа 2020

Я столкнулся с той же проблемой и решил ее, понизив cudatoolkit до версии 10.1. Так что попробуйте переустановить pytorch с cudatoolkit 10.1.

conda install pytorch torchvision cudatoolkit=10.1
...