HorovodRunner. Распределенное глубокое обучение с Horovod

Узнайте, как выполнять распределенное обучение моделей машинного обучения с помощью HorovodRunner для запуска заданий обучения Horovod в качестве заданий Spark в Azure Databricks.

Что такое HorovodRunner?

HorovodRunner — это общий API для выполнения распределенных рабочих нагрузок глубокого обучения в Azure Databricks с помощью платформы Horovod. Путем интеграции Horovod с режимом барьера Spark Azure Databricks может обеспечить повышенную стабильность для длительно выполняемых заданий глубокого обучения в Spark. HorovodRunner принимает метод Python, которые содержит код глубокого обучения с перехватчиками Horovod. HorovodRunner определяет метод в драйвере и распространяет его среди рабочих ролей Spark. Задание Horovod MPI внедряется как задание Spark с использованием режима барьера. Первый исполнитель собирает IP-адреса всех исполнителей задач с помощью BarrierTaskContext и запускает задание Horovod с помощью mpirun. Каждый процесс Python MPI загружает пользовательскую программу, десериализует ее и выполняет.

HorovodRunner

Distributed training with HorovodRunner (Распределенное обучение с использованием HorovodRunner)

HorovodRunner позволяет запускать задания обучения Horovod как задания Spark. API HorovodRunner поддерживает методы, отображаемые в таблице. Дополнительные сведения см. в документации по API HorovodRunner.

Метод и сигнатура Description
init(self, np) Создайте экземпляр HorovodRunner.
run(self, main, **kwargs) Запустите задание обучения Horovod, которое вызывает main(**kwargs). Основные аргументы функции и ключевого слова сериализуются с помощью cloudpickle и распределяются между рабочими ролями кластера.

Общий подход к разработке программы распределенного обучения с помощью HorovodRunner:

  1. Создайте экземпляр HorovodRunner, инициализируемый с количеством узлов.
  2. Определите метод обучения Horovod в соответствии с методами, описанными в разделе Использование Horovod, и убедитесь, что в метод добавлены все операторы импорта.
  3. Передайте метод обучения в экземпляр HorovodRunner.

Например:

hr = HorovodRunner(np=2)

def train():
  import tensorflow as tf
  hvd.init()

hr.run(train)

Чтобы запустить HorovodRunner для драйвера только с подпроцессами n, используйте hr = HorovodRunner(np=-n). Например, если в узле драйвера есть 4 GPU, можно выбрать n со значением не более 4. Дополнительные сведения о параметре np см. в Документации по API HorovodRunner. Дополнительные сведения о том, как закрепить один GPU для каждого подпроцесса, см. в разделе Руководство по использованию Horovod.

Часто возникает ошибка, при которой не удается найти или выбрать объекты TensorFlow. Это происходит, когда инструкции импорта библиотеки не распространяются на другие исполнители. Чтобы избежать этой проблемы, включите все инструкции импорта (например, import tensorflow as tf) как в методе обучения Horovod, так и внутри всех остальных определяемых пользователем функций, вызванных в методе обучения Horovod.

Запись обучения Horovod с помощью Horovod Timeline

Horovod может записывать временную шкалу своей активности, которая называется временной шкалой Horovod.

Внимание

Временная шкала Horovod оказывает значительное влияние на производительность. Пропускная способность Inception3 может снизиться примерно на 40% при включенной временной шкале Horovod. Чтобы ускорить выполнение заданий HorovodRunner, не используйте временную шкалу Horovod.

Нельзя просмотреть временную шкалу Horovod во время обучения.

Чтобы записать временную шкалу Horovod, задайте для переменной среды HOROVOD_TIMELINE расположение, в котором нужно сохранить файл временной шкалы. Databricks рекомендует использовать расположение в общем хранилище, чтобы файл временной шкалы можно было легко извлечь. Например, можно использовать API локальных файлов DBFS, как показано ниже.

timeline_dir = "/dbfs/ml/horovod-timeline/%s" % uuid.uuid4()
os.makedirs(timeline_dir)
os.environ['HOROVOD_TIMELINE'] = timeline_dir + "/horovod_timeline.json"
hr = HorovodRunner(np=4)
hr.run(run_training_horovod, params=params)

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

Записная книжка с примерами временной шкалы Horovod

Получить записную книжку

Чтобы скачать файл временная шкала, используйте интерфейс командной строки Databricks или FileStore, а затем используйте средство браузера chrome://tracing Chrome для просмотра. Например:

Horovod timeline

Development workflow (Рабочий процесс разработки)

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

  1. Подготовка кода для одного узла: подготовьте и протестируйте код одного узла с помощью TensorFlow, Keras или PyTorch.
  2. Миграция в Horovod: Следуйте инструкциям из потребления Horovod, чтобы перенести код с Horovod и протестировать его на драйвере:
    1. Добавьте hvd.init(), чтобы инициализировать Horovod.
    2. Закрепите серверный GPU, который будет использоваться этим процессом, с помощью config.gpu_options.visible_device_list. При стандартной настройке одного GPU для каждого процесса для него можно настроить использование локального назначения приоритета. В этом случае первому процессу на сервере будет выделен первый GPU, второму процессу будет выделен второй графический процессор и т. д.
    3. Включите сегмент набора данных. Этот оператор набора данных очень удобен при запуске программы распределенного обучения, так как он позволяет каждому рабочему процессу считывать уникальное подмножество.
    4. Масштабирование скорости обучения по числу рабочих ролей. Эффективный размер пакета в синхронном распределенном обучении масштабируется по количеству рабочих ролей. Увеличение скорости обучения компенсирует увеличение размера пакета.
    5. Создайте программу-оболочку для оптимизатора в hvd.DistributedOptimizer. Распределенный оптимизатор делегирует вычисление градиента исходному оптимизатору, усредняет значения градиентов, используя allreduce или allgather, а затем применяет усредненные градиенты.
    6. Добавьте hvd.BroadcastGlobalVariablesHook(0), чтобы транслировать начальные состояния переменных от назначения приоритета 0 ко всем остальным процессам. Необходимо обеспечить последовательную инициализацию всех рабочих ролей при запуске обучения со случайными весовыми коэффициентами или восстановлении из контрольной точки. Кроме того, если вы не используете MonitoredTrainingSession, можно выполнить операцию hvd.broadcast_global_variables после инициализации глобальных переменных.
    7. Измените код, чтобы сохранить контрольные точки только в рабочей роли 0, чтобы другие рабочие роли не повреждали их.
  3. Миграция в HorovodRunner: HorovodRunner запускает задание обучения Horovod, вызывая функцию Python. Основную процедуру обучения необходимо перенести в одну функцию Python. После этого можно протестировать HorovodRunner в локальном и распределенном режиме.

Update the deep learning libraries (Обновление библиотек глубокого обучения)

Примечание.

Эта статья содержит упоминания термина slave (ведомый),который больше не используется в Azure Databricks. Когда этот термин будет удален из программного обеспечения, мы удалим его из статьи.

При обновлении или понижении версии TensorFlow, Keras или PyTorch необходимо переустановить Horovod, чтобы скомпилировать их во вновь установленной библиотеке. Например, чтобы обновить TensorFlow, Databricks рекомендует использовать сценарий init из раздела Инструкции по установке TensorFlow и добавить в конец этого кода следующий объект TensorFlow, относящийся к Horovod. См. раздел инструкции по установке хоровод, где приведены инструкции по работе с различными комбинациями, такими как обновление или понижение версии PyTorch и других библиотек.

add-apt-repository -y ppa:ubuntu-toolchain-r/test
apt update
# Using the same compiler that TensorFlow was built to compile Horovod
apt install g++-7 -y
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7

HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_CUDA_HOME=/usr/local/cuda pip install horovod==0.18.1 --force-reinstall --no-deps --no-cache-dir

Примеры. Миграция на распределенное глубокое обучение с помощью HorovodRunner

В следующих примерах, основанных на наборе данных MNIST, показано, как с помощью HorovodRunner перенести программу глубокого обучения с одним узлом в программу распределенного глубокого обучения.

Ограничения

  • При работе с файлами рабочей области HorovodRunner не будет работать, если np задано значение больше 1, а записная книжка импортируется из других относительных файлов. Вместо HorovodRunner рекомендуется использовать horovod.spark.