Получение ошибки «Ресурс исчерпан: ООМ при выделении тензора с формой [1800,1024,28,28] и типом float на /job:localhost/…»

tensorflow #out-of-memory #tensorflow2.0 #object-detection #object-detection-api

#tensorflow #не хватает памяти #tensorflow2.0 #обнаружение объекта #object-detection-api

Вопрос:

Я получаю ошибку исчерпания ресурса при инициализации обучения для моей модели графического процессора Object detection Tensorflow 2.5. Я использую 18 обучающих изображений и 3 тестовых изображения. Предварительно обученная модель, которую я использую, — это более быстрая модель R-CNN ResNet101 V1 640×640 из Tensorflow zoo 2.2. Я использую Nvidia RTX 2070 с 8 ГБ выделенной памяти для обучения моей модели.

Меня смущает то, почему процесс обучения занимает так много памяти у моего графического процессора, когда обучающий набор настолько мал. Это сводная информация о памяти графического процессора, которую я получаю с ошибкой:

 Limit:                      6269894656
InUse:                      6103403264
MaxInUse:                   6154866944
NumAllocs:                        4276
MaxAllocSize:               5786902272
Reserved:                            0
PeakReserved:                        0
LargestFreeBlock:                    0
 

Я также уменьшил размер пакета обучающих данных до 6, а тестовых данных — до 1.

Ответ №1:

Я использую приведенный ниже код во всех ноутбуках, где я работаю на gpu, чтобы предотвратить ошибки такого типа:

     import tensorflow as tf

    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
      try:
        # Currently, memory growth needs to be the same across GPUs
        for gpu in gpus:
          tf.config.experimental.set_memory_growth(gpu, True)
        logical_gpus = tf.config.list_logical_devices('GPU')
        print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
      except RuntimeError as e:
        # Memory growth must be set before GPUs have been initialized
        print(e)
 

По умолчанию TensorFlow отображает почти всю память графического процессора всех графических процессоров (с учетом CUDA_VISIBLE_DEVICES), видимую процессу.

Дополнительная информация об использовании gpu с tensorflow здесь

Возможно, это решит ошибку

Надеюсь, я вам помог

Комментарии:

1. Я совсем новичок в tensorflow и python в целом. Куда бы я поместил этот код? Заранее спасибо.

2. сразу после импорта пакета. Например: import tensorflow as tf

Ответ №2:

На максимальное использование памяти во время обучения влияют несколько факторов, и уменьшение размера пакета обычно связано с ограничениями памяти. Рекомендация Александра Леобонса Соуза также может помочь, предоставляя Tensorflow большую гибкость при выделении памяти, но если вы продолжаете видеть ошибки ООМ, я бы рекомендовал еще больше уменьшить размер пакета. В качестве альтернативы вы можете попробовать ограничить обучаемые переменные в модели, что также приведет к снижению использования памяти во время обучения.

Вы упомянули: «Меня смущает то, почему процесс обучения занимает так много памяти у моего графического процессора, когда обучающий набор настолько мал». Что-то, что следует иметь в виду, это то, что во время обучения ваши обучающие данные будут использоваться при прямом проходе через модель, а затем вывычислит градиенты для каждой обучаемой переменной в обратном проходе. Даже если ваши обучающие данные невелики, промежуточные вычисления (включая градиенты) требуют памяти. Эти вычисления линейно масштабируются в зависимости от размера вашего пакета и размера модели. За счет уменьшения размера пакета или уменьшения количества обучаемых переменных для обучения потребуется меньше памяти.

Еще одно предложение, если размер вашего входного тензора изменяется в ваших обучающих данных (т. Е. Если Количество основных ограничивающих прямоугольников истинности меняется с 1 на 2, и вы не заполняете входной тензор), это может привести к повторному отслеживанию графика вычислений во время обучения, и вы увидите предупреждения. Я не уверен, какое влияние на память в этом случае, но подозреваю, что для каждого повторного отслеживания эффективно требуется дублирующая модель в памяти. Если это так, вы можете попробовать использовать @tf.function(experimental_relax_shapes=True) .

Комментарии:

1. Спасибо за помощь! Еще большее уменьшение размера пакета помогло начать процесс обучения.