Вопрос или проблема
Я наконец-то получил компьютер с двумя графическими процессорами и протестировал 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 |
+-----------------------------------------------------------------------------+
Я вижу то же самое, здесь я включил только первые два графических процессора.
Если я принудительно использую только один графический процессор, использование памяти падает, но время на эпоху остается неизменным.
Ответ или решение
Использование 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 может потребовать экспериментов, но, с учетом вышеприведенных рекомендаций, вы обязательно найдете путь к более эффективному использованию вашего оборудования.