Как исправить эту странную ошибку: «Ошибка RuntimeEr: CUDA: недостаточно памяти» - PullRequest
0 голосов
/ 26 января 2019

Я запустил код для сети с глубоким обучением, сначала я обучил сеть, и она работает хорошо, но эта ошибка возникает при запуске в сеть проверки.

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

Мой код:

for epoch in range(10,15): # epoch: 10~15
    if(options["training"]["train"]):
        trainer.epoch(model, epoch)

    if(options["validation"]["validate"]):
    #if(epoch == 14):
        validator.epoch(model)

enter image description here enter image description here

Мне кажется, что в коде проверки могут быть некоторые ошибки. Но я не могу найти это.

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Возможно, по ряду причин я попытаюсь сообщить в следующем списке:

  1. Параметры модулей : проверьте количество измерений для ваших модулей.Для линейных слоев, которые преобразуют большой входной тензор (например, размер 1000) в другой большой выходной тензор (например, размер 1000), потребуется матрица, размер которой (1000, 1000).
  2. Максимальное количество шагов RNN-декодера : если вы используете RNN-декодер в своей архитектуре, избегайте зацикливания большого количества шагов.Обычно вы фиксируете определенное количество шагов декодирования, которое подходит для вашего набора данных.
  3. Использование тензоров : минимизируйте количество создаваемых тензоров.Сборщик мусора не освободит их, пока они не выйдут из области видимости.
  4. Размер пакета : постепенно увеличивайте размер пакета, пока не выйдет из памяти.Это обычная уловка, которую реализует даже известная библиотека (см. Описание biggest_batch_first для BucketIterator в AllenNLP.

Кроме того, я бы порекомендовал вам взглянуть наофициальная документация PyTorch: https://pytorch.org/docs/stable/notes/faq.html

0 голосов
/ 29 января 2019

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

with torch.no_grad():
    ...
    net=Net()
    pred_for_validation=net(input)
    ...

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

2 .. Если вы используете оператор + = в своем коде,
он может непрерывно накапливать градиент в вашем градиентном графике.
В этом случае вам нужно использовать float (), как на следующем сайте
https://pytorch.org/docs/stable/notes/faq.html#my-model-reports-cuda-runtime-error-2-out-of-memory

Даже если docs ведет с помощью float (), для меня item () также работает как

entire_loss=0.0
for i in range(100):
    one_loss=loss_function(prediction,label)
    entire_loss+=one_loss.item()

3 .. Если вы используете для цикла в обучающем коде,
данные могут быть сохранены, пока не закончится весь цикл.
Таким образом, в этом случае вы можете явно удалить переменные после выполнения optimizer.step ()

for one_epoch in range(100):
    ...
    optimizer.step()
    del intermediate_variable1,intermediate_variable2,...
0 голосов
/ 26 января 2019

Ошибка, которую вы указали, показана, потому что у вас не хватает памяти на вашем GPU. Чтобы решить эту проблему, нужно уменьшить размер пакета, пока ваш код не будет работать без этой ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...