Tensorflow MirroredStrategy() кажется, работает только на одном GPU?

Вопрос или проблема

Я наконец-то получил компьютер с двумя графическими процессорами и протестировал https://pytorch.org/tutorials/beginner/blitz/data_parallel_tutorial.html и https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10_estimator и подтвердил, что оба графических процессора используются (потребление увеличивается до 160-180 ватт на обоих, память почти на пределе на обоих, а использование графического процессора увеличивается до примерно 45% на обоих одновременно).

Поэтому я решил попробовать MirroredStrategy() от TensorFlow на существующей нейронной сети, которую я ранее обучал с одним графическим процессором.

Что я не понимаю, так это то, что потребление энергии увеличивается на обоих графических процессорах, а память почти заполнена на обоих, но только один графический процессор выглядит так, как будто используется на 98%, а другой просто отдыхает на 3%. Я что-то не так делаю в своем коде? Или это работает как задумано?

strategy = tensorflow.distribute.MirroredStrategy()
with strategy.scope():
    model = tensorflow.keras.models.Sequential([
        tensorflow.keras.layers.Dense(units=427, kernel_initializer="uniform", activation='relu', input_dim=853),
        tensorflow.keras.layers.Dense(units=427, kernel_initializer="uniform",activation='relu'),
        tensorflow.keras.layers.Dense(units=1, kernel_initializer="uniform", activation='sigmoid')])
    model.compile(optimizer="adam", loss="binary_crossentropy", metrics=['accuracy'])
    model.fit(X_train, y_train, batch_size=1000, epochs=100)

nvidia-smi:

Пт Ноя 22 09:26:21 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 435.21       Версия драйвера: 435.21       Версия CUDA: 10.1     |
|-------------------------------+----------------------+----------------------+
| Название GPU       Persistence-M| Bus-Id        Disp.A | Нестабильная некорр. ECC |
| Вентилятор  Темп  Производительность  Потребление:Использование/Макс.| Использование памяти | Использование GPU  Вычисл. М. |
|===============================+======================+======================|
|   0  TITAN Xp COLLEC...  Выкл.  | 00000000:0A:00.0 Выкл. |                  N/A |
| 24%   47C    P2    81W / 250W |  11733MiB / 12196MiB |     98%      По умолчанию |
+-------------------------------+----------------------+----------------------+
|   1  TITAN Xp COLLEC...  Выкл.  | 00000000:41:00.0  Вкл. |                  N/A |
| 28%   51C    P2    64W / 250W |  11736MiB / 12187MiB |      3%      По умолчанию |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Процессы:                                                       Память GPU |
|  GPU       PID   Тип   Имя процесса                             Использование      |
|=============================================================================|
|    0      2506      C   python3                                    11721MiB |
|    1      1312      G   /usr/lib/xorg/Xorg                            18MiB |
|    1      1353      G   /usr/bin/gnome-shell                          51MiB |
|    1      1620      G   /usr/lib/xorg/Xorg                           108MiB |
|    1      1751      G   /usr/bin/gnome-shell                          72MiB |
|    1      2506      C   python3                                    11473MiB |
+-----------------------------------------------------------------------------+

Я вижу то же самое, здесь я включил только первые два графических процессора. nvidia-smi

Если я принудительно использую только один графический процессор, использование памяти падает, но время на эпоху остается неизменным.

описание изображения здесь

Ответ или решение

Использование TensorFlow MirroredStrategy для работы с несколькими GPU: Важные аспекты

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

1. Что такое MirroredStrategy?

MirroredStrategy — это стратегия распределённого обучения в TensorFlow, которая позволяет пользователю эффективно использовать несколько GPU для тренировки модели. Эта стратегия автоматически дублирует ваши модели на каждом доступном GPU, что должно увеличивать скорость обучения за счёт параллельной обработки.

2. Анализ вашей ситуации

Вы упомянули, что при использовании MirroredStrategy, один из GPU загружен на 98%, в то время как другой — на 3%. Это, в первую очередь, может быть связано с тем, как вы организовали тренировку и загрузку данных.

a. Размер батча

Вы используете весьма большой размер батча (1000), что может привести к тому, что данные не будут равномерно распределены между всеми доступными GPU. Если каждый GPU обрабатывает эти данные, то, возможно, один из них получает гораздо больше данных. Попробуйте уменьшить размер батча или использовать более сложные функции шардирования данных, чтобы убедиться, что данные равномерно распределяются.

b. Архитектура модели

Ваше использование Sequential может также сыграть негативную роль. Хотя Sequential поддерживает простые модели, вы можете рассмотреть возможность использования функционального API TensorFlow, который лучше подходит для более сложных архитектур и может привести к более равномерному распределению нагрузки.

c. Оптимизация и конфигурация

Обратите внимание на настройки вашего окружения. Проверьте, правильные ли версии CUDA и cuDNN используются, а также нужна ли дополнительная настройка для вашего конкретного оборудования. Лучше всего использовать последние версии библиотек, которые имеют исправления производительности и оптимизации.

3. Проверка конфигурации

Проверьте, правильно ли вы настраиваете вашу среду TensorFlow. Убедитесь, что TensorFlow видит оба ваших GPU:

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

Это поможет убедиться, что ваше окружение настроено корректно и ваши GPU видны.

4. Мониторинг

Важно постоянно мониторить загрузку ваших GPU, используя nvidia-smi. Если вы видите, что один GPU начинает оставаться без работы, это может указывать на то, что данные не равномерно распределяются.

5. Рекомендации по отладке

  • Уменьшите размер батча и посмотрите на распределение нагрузки.
  • Попробуйте использовать tf.data.Dataset для более эффективного управления загрузкой данных.
  • Если используете tf.keras.Model.fit, посмотрите на параметр validation_data и убедитесь, что он корректно настроен для мульти-GPU.
  • Попробуйте запустить обучение на других моделях, чтобы исключить возможность того, что проблема связана с конкретной архитектурой вашей модели.

Заключение

Если MirroredStrategy не распределяет нагрузку между вашими GPU так, как вы ожидаете, нет недоразумений — проблема может быть связана с вашим кодом или конфигурацией окружения. Проведите дополнительные тесты, проверьте загрузку данных, архитектуру модели и настройки окружения. Достижение оптимальной производительности при использовании нескольких GPU может потребовать экспериментов, но, с учетом вышеприведенных рекомендаций, вы обязательно найдете путь к более эффективному использованию вашего оборудования.

Оцените материал
Добавить комментарий

Капча загружается...