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

#python #tensorflow #keras #deep-learning

#python #тензорный поток #keras #глубокое обучение

Вопрос:

У меня есть компьютер со следующими характеристиками:

  • Процессор: AMD Ryzen Threadripper 2990wx (32 ядра)
  • Оперативная память: 32 ГБ
  • Видеокарты: (GPU: 1) GTX1080 Ti (11 ГБ), (GPU: 0) GTX1070 (8 ГБ)
  • SSD: 2 ТБ Samsung Evo 890

Мой вопрос в том, что когда я запускаю свою обучающую программу с использованием Keras примерно на 60 тыс. изображений (GPU: 1), программа загружает изображения, а матрица данных составляет 12922,20 МБ

скриншот программы

После этого программа ничего не делает в течение минуты и автоматически завершается. Тот же код, похоже, обучается на GPU: 1 и отлично работает с 10 тыс. изображений.

  1. Может ли это быть связано с тем, что мой GPU: 1 может хранить только 11 ГБ, а размер данных составляет около 12 ГБ?
  2. Решит ли мою проблему распараллеливание GPU: 1 и GPU: 0? Если да, будет ли это 16 ГБ видеопамяти (8 8) или 19 ГБ (11 8)?
  3. Я делаю что-то не так? Сообщение, на которое я ссылаюсь: https://www.pyimagesearch.com/2018/09/10/keras-tutorial-how-to-get-started-with-keras-deep-learning-and-python с некоторыми незначительными изменениями.

Я пытался искать в Интернете и на SO, но я не смог найти / понять много информации о том, как распределяется / масштабируется память GPU при использовании Multi-GPU с Keras.

Любая помощь будет оценена!

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

1. Изображения, вероятно, загружаются не в видеопамять, а в вашу оперативную память. Вы проверяли использование оперативной памяти вашего ПК?

Ответ №1:

Я бы сначала рекомендовал вам проверить использование памяти при обучении на одном графическом процессоре; Я подозреваю, что ваш набор данных загружается не в память графического процессора, а в ОЗУ.

Вы можете попытаться установить:

1.

   import os
  #Enable system to see only one of the video cards
  os.environ["CUDA_VISIBLE_DEVICES"] = "0"/"1" 
  

Проверьте, чтобы увидеть точное отображение (что tensorflow видит ваш графический процессор):

 tf.config.list_physical_devices('GPU') 
  
  1. Теперь точно проверьте, сколько видеопамяти используется в этом случае:

Затем в терминале вы можете nvidia-smi проверить, сколько памяти GPU было выделено; в то же время, используя watch -n K nvidia-smi

  1. При использовании нескольких графических процессоров убедитесь, что вы используете tf.distribute.MirroredStrategy() и объявляете свою логику создания модели подгонки, как показано ниже:

      strategy = tf.distribute.MirroredStrategy()
     print('Number of devices: {}'.format(strategy.num_replicas_in_sync))
    
     # Open a strategy scope.
     with strategy.scope():
       # Everything that creates variables should be under the strategy scope.
       # In general this is only model construction amp; `compile()`.
       model = Model(...)
       model.compile(...)
      

Вне области стратегии

 model.fit(train_dataset, validation_data=val_dataset, ...)

model.evaluate(test_dataset)
  

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

1. Спасибо за ответ, у меня он работает и отлично тренируется на одном графическом процессоре, но с 10 тыс. образцов (3x классов)

2. Кроме того, несмотря на то, что используется видеопамять, даже если я обучаю небольшой набор данных, он по-прежнему использует всю оперативную память

3. Да, это хорошо, по крайней мере, он тренируется на GPU. И он терпит неудачу только при попытке использовать несколько графических процессоров? Вы использовали MirroredStrategy() для мульти-gpu или Keras multi_gpu_model?

4. Спасибо за ваш ответ. Нет, я еще не пробовал работать с мульти-графическим процессором. Я хотел быть уверенным в том, как будет работать распределение, прежде чем погрузиться в это. В настоящее время я смог обучить гораздо больший набор данных, увеличив объем памяти подкачки на 64 ГБ, поэтому я думаю, что в настоящее время это решило мою проблему, но я бы очень хотел начать с обучения с несколькими графическими процессорами и поиграю с MirroredStrategy() и посмотрю, как ведет себя машина: D

5. Что-то здесь не так; вам не нужно увеличивать объем памяти подкачки, чтобы иметь возможность тренироваться. Если это происходит, то это означает, что графический процессор используется неправильно, хотя на уровне выделения Tensorflow может это видеть.