TensorFlow Horovod
TensorFlow Horovod — это библиотека для распределённого обучения глубоких нейронных сетей, разработанная компанией Uber Technologies и впоследствии переданная в управление сообществу Linux Foundation. Она предоставляет высокоуровневый интерфейс для параллельного обучения моделей на нескольких графических процессорах (GPU) или узлах кластера, используя алгоритм синхронного обмена градиентами (all-reduce). Horovod интегрируется с популярными фреймворками машинного обучения, включая TensorFlow, PyTorch и Apache MXNet, и позволяет значительно ускорить обучение моделей за счёт эффективного масштабирования.
История
Библиотека Horovod была создана в 2017 году инженерами компании Uber для решения проблем, связанных с масштабированием обучения моделей на больших кластерах GPU. До появления Horovod распределённое обучение в TensorFlow требовало использования сложных и ресурсоёмких схем, таких как параметрические серверы (Parameter Server), которые создавали узкие места при передаче данных. В 2018 году Uber опубликовала исходный код Horovod под лицензией Apache 2.0, и библиотека быстро получила распространение в сообществе машинного обучения. В 2020 году проект был передан под управление Linux Foundation, что обеспечило его независимость и долгосрочную поддержку. Ключевым вкладом Horovod стало внедрение алгоритма all-reduce, основанного на технологии NVIDIA NCCL (NVIDIA Collective Communications Library), который позволяет эффективно объединять градиенты со всех узлов без единой точки отказа.
Архитектура и принцип работы
Алгоритм all-reduce
Основой Horovod является алгоритм синхронного обмена градиентами, известный как all-reduce. В отличие от традиционных подходов, где каждый узел отправляет градиенты на центральный сервер, all-reduce выполняет агрегацию градиентов непосредственно между узлами. Это достигается за счёт использования кольцевой топологии (ring all-reduce), где каждый узел передаёт данные только соседним узлам, что минимизирует задержки и нагрузку на сеть. Процесс состоит из двух этапов: scatter-reduce (распределение и суммирование) и all-gather (сборка полного результата). В результате каждый узел получает одинаковые обновлённые градиенты, что позволяет синхронно обновлять веса модели.
Интеграция с TensorFlow
Horovod предоставляет API для интеграции с TensorFlow, которое заменяет стандартные механизмы распределённого обучения. Для использования Horovod с TensorFlow необходимо:
- Инициализировать Horovod с помощью
hvd.init(). - Закрепить каждый GPU за отдельным процессом с помощью
hvd.local_rank(). - Обернуть оптимизатор TensorFlow в
hvd.DistributedOptimizer, который автоматически вычисляет и синхронизирует градиенты. - Использовать
hvd.BroadcastGlobalVariablesHookдля синхронизации начальных весов модели на всех узлах.
Пример кода на Python: ```python import tensorflow as tf import horovod.tensorflow as hvd
hvd.init() config = tf.ConfigProto() config.gpu_options.visible_device_list = str(hvd.local_rank())
model = tf.keras.models.Sequential([...]) optimizer = tf.keras.optimizers.SGD(0.01) optimizer = hvd.DistributedOptimizer(optimizer)
model.compile(optimizer=optimizer, loss='categorical_crossentropy') callbacks = [hvd.callbacks.BroadcastGlobalVariablesCallback(0)]
model.fit(x_train, y_train, callbacks=callbacks, steps_per_epoch=500 // hvd.size()) ```
Классификация и виды
По типу поддерживаемых фреймворков
Horovod поддерживает интеграцию с несколькими фреймворками машинного обучения:
- TensorFlow — полная поддержка, включая TensorFlow 1.x и 2.x, а также Keras.
- PyTorch — поддержка через модуль
horovod.torch. - Apache MXNet — поддержка через модуль
horovod.mxnet. - Spark — интеграция с Apache Spark через
horovod.spark.
По типу используемых коммуникационных библиотек
Horovod может использовать различные бэкенды для передачи данных:
- NCCL — оптимизирован для GPU от NVIDIA, обеспечивает максимальную производительность на кластерах с GPU.
- MPI — стандартный протокол для распределённых вычислений, подходит для CPU-кластеров.
- Gloo — библиотека для коллективных коммуникаций, разработанная Facebook (организация Meta признана экстремистской и запрещена в РФ), используется для CPU-кластеров.
Применение
Обучение больших моделей
Horovod широко используется для обучения моделей, которые не помещаются в память одного GPU. Например, модели с миллиардами параметров, такие как GPT-3 (разработана OpenAI) или BERT (разработана Google), требуют распределённого обучения на сотнях и тысячах GPU. Horovod позволяет эффективно масштабировать обучение, достигая линейного ускорения при увеличении числа узлов.
Исследования и промышленность
Библиотека применяется в исследовательских лабораториях и промышленных компаниях для ускорения экспериментов. Например, в Uber Horovod используется для обучения моделей прогнозирования времени поездок и оптимизации маршрутов. В области компьютерного зрения Horovod применяется для обучения моделей распознавания изображений на больших наборах данных, таких как ImageNet.
Обучение с подкреплением
В задачах обучения с подкреплением, где требуется многократное взаимодействие с симулятором, Horovod позволяет параллельно запускать несколько агентов на разных узлах, что ускоряет сбор данных и обучение.
Преимущества и недостатки
Преимущества
- Простота использования: Horovod требует минимальных изменений в коде по сравнению с другими системами распределённого обучения.
- Масштабируемость: алгоритм all-reduce обеспечивает почти линейное ускорение при увеличении числа узлов.
- Совместимость: библиотека работает с большинством современных фреймворков и аппаратных платформ.
- Отказоустойчивость: Horovod поддерживает механизмы восстановления после сбоев, такие как
hvd.elastic, позволяющий динамически добавлять или удалять узлы.
Недостатки
- Синхронность: Horovod использует синхронное обновление градиентов, что может приводить к задержкам при наличии медленных узлов (stragglers).
- Потребление памяти: при использовании all-reduce требуется дополнительная память для хранения промежуточных результатов.
- Зависимость от сети: производительность сильно зависит от пропускной способности сети и задержек между узлами.
Сравнение с альтернативами
TensorFlow Distributed Strategy
TensorFlow предоставляет встроенный механизм распределённого обучения — tf.distribute.Strategy, который включает различные стратегии, такие как MirroredStrategy, MultiWorkerMirroredStrategy и ParameterServerStrategy. Horovod отличается от них тем, что:
- использует all-reduce вместо параметрических серверов, что снижает задержки;
- поддерживает больше фреймворков, а не только TensorFlow;
- предоставляет более гибкий контроль над распределением данных.
PyTorch Distributed Data Parallel (DDP)
PyTorch DDP является стандартным инструментом для распределённого обучения в PyTorch. Horovod может быть альтернативой, если требуется единый интерфейс для нескольких фреймворков или если необходимо использовать специфические бэкенды, такие как MPI.
Интересные факты
- Название «Horovod» происходит от русского слова «хоровод», что символизирует круговую передачу данных между узлами.
- В 2019 году Horovod был использован для обучения модели BERT на 64 GPU, что позволило сократить время обучения с нескольких недель до нескольких дней.
- Библиотека поддерживает обучение на смешанной точности (mixed precision) с использованием NVIDIA Tensor Cores, что дополнительно ускоряет вычисления.
Источники
- Uber Engineering. «Horovod: fast and easy distributed deep learning in TensorFlow». — 2017.
- Документация Horovod. — Linux Foundation, 2023.
- Sergeev, A., Del Balso, M. «Meet Horovod: Uber’s Open Source Distributed Deep Learning Framework for TensorFlow». — Uber Engineering Blog, 2017.
- NVIDIA. «NCCL: NVIDIA Collective Communications Library». — 2022.
- TensorFlow Documentation. «Distributed training with TensorFlow». — 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →