Ошибка OOM при обучении API обнаружения объектов TensorFlow с использованием inception-resnet и NASnet (особенно) в качестве основы

Пожалуйста, помогите мне найти решение моих проблем. Для меня важно сначала заявить, что я успешно создал свой собственный набор данных и успешно обучил этот набор данных с помощью resnet101 на своем компьютере (16 ГБ ОЗУ и 4 ГБ NVIDIA 980).

Проблема возникла, когда я попытался переключить магистраль с помощью inception-resnet и nasnet. Я получил следующую ошибку

"ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape ..."

И я подумал, что у меня недостаточно ресурсов на моем компьютере, поэтому я создал инстанс на AWS EC2 с 60 ГБ ОЗУ и 12 ГБ NVIDIA Tesla K80 (мое рабочее место предоставляет только эту услугу) и обучил там сеть.

Обучение начальному реснету сработало хорошо, однако это не относится к наснету. Даже со 100 ГБ памяти я все равно получаю ошибку OOM

Я нашел одно решение на веб-странице github с моделями tensorflow по адресу issue #1817, и я последовал за инструкции, добавив следующую строку кода в файл конфигурации nasnet

train_config: {
  batch_size: 1
  batch_queue_capacity: 50
  num_batch_queue_threads: 8
  prefetch_queue_capacity: 10
...

и код какое-то время работал хорошо (следующий скриншот вверху). Тем не менее, я все еще получаю ошибку OOM после выполнения около 6000 шагов.

INFO:tensorflow:global step 6348: loss = 2.0393 (3.988 sec/step)
INFO:tensorflow:Saving checkpoint to path /home/ubuntu/crack-detection/structure-crack/models/faster_rcnn_nas_coco_2017_11_08/train/model.ckpt
INFO:tensorflow:global step 6349: loss = 0.9803 (3.980 sec/step)
2018-01-25 05:51:25.959402: W tensorflow/core/common_runtime/bfc_allocator.cc:273] Allocator (GPU_0_bfc) ran out of memory trying to allocate 79.73MiB.  Current allocation summary follows.
...

ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[64,17,17,4032]
     [[Node: MaxPool2D/MaxPool = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 1, 1, 1], padding="VALID", strides=[1, 1, 1, 1], 
...

Есть ли что-нибудь еще, что я мог бы сделать, чтобы это работало гладко без ошибок OOM? Спасибо за вашу помощь


РЕДАКТИРОВАТЬ №1: теперь ошибки появляются чаще, они появятся после 1000-1500 шагов.

РЕДАКТИРОВАНИЕ №2: на основе ошибки №2668 и issue #3014, есть еще одна вещь, которую мы можем сделать, чтобы запустить код без ошибки OOM, добавив second_stage_batch_size: 25 (по умолчанию 50) в разделе модели файла конфигурации. Итак, файл должен выглядеть следующим образом

model{
  faster_rcnn {
    ...
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
    second_stage_batch_size: 25
  }
}

Надеюсь, это может помочь.


person RoGuKa    schedule 25.01.2018    source источник


Ответы (1)


Я хотел бы отметить, что память, которой у вас не хватает, — это память графического процессора, поэтому я боюсь, что эти 100 ГБ полезны только для обработки данных вне учебных целей. Кроме того, без кода очень сложно понять, откуда берется ошибка.

При этом, если вы можете инициализировать архитектуру нейронной сети с помощью весов, обучить 6000 итераций и внезапно исчерпать память графического процессора, то я предполагаю, что вы либо каким-то образом сохраняете значения в памяти графического процессора, либо, если у вас есть входные данные переменной длины, вы могли бы передавать последовательность в этой итерации, которая требует слишком большого объема памяти.

person Diego Aguado    schedule 25.01.2018
comment
Привет @Diego, спасибо за ответ. Означает ли это, что мне нужно увеличить память графического процессора для плавного обучения NASnet? - person RoGuKa; 25.01.2018
comment
Это был бы простой, грубый и дорогой способ сделать это. Как я уже сказал... странно, что он обучается и внезапно заканчивается память. Есть приемы, которые вы можете попробовать реализовать, чтобы уменьшить использование памяти, например, урезать веса NASnet, см. этот ресурс: tensorflow.org/performance/quantization. Я бы посоветовал сначала попытаться найти обходные пути в процедуре обучения. - person Diego Aguado; 25.01.2018
comment
Да, я согласен с вами. Однако я не знаю, что еще я мог бы сделать для плавного обучения nasnet (возможно, мне придется взглянуть на метод квантования, который вы упомянули). Проблема № 1817, которую я разместил в сообщении, создала у меня впечатление, что ошибки OOM исходят из ОЗУ, а не из памяти графического процессора. - person RoGuKa; 25.01.2018
comment
Я очень сомневаюсь, что это проблема с оперативной памятью, но на всякий случай узнайте размер магистральных весов. Это должно дать вам представление о том, с чего начать отладку. - person Diego Aguado; 25.01.2018
comment
посмотрите здесь, как подсчитать общее количество параметров в вашей архитектуре: quora.com/. Затем рассмотрите правильный размер: float32 или float64, чтобы оценить его размер. - person Diego Aguado; 25.01.2018