Налаштування Horovod для розподіленого навчання

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Налаштування Horovod для розподіленого навчання
Складний
~3-5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Налаштування Horovod для розподіленого навчання

Horovod - фреймворк для розподіленого навчання від Uber, що підтримує TensorFlow, Keras, PyTorch та MXNet. Його ключова перевага – уніфікований API для різних фреймворків та оптимізована реалізація ring-allreduce для агрегації градієнтів.

Встановлення

# Зависимости
apt install -y g++ openmpi-bin libopenmpi-dev

# Установка с поддержкой NCCL и gloo
HOROVOD_GPU_OPERATIONS=NCCL pip install horovod[tensorflow,keras,pytorch,mxnet]

# Проверка
horovodrun --check-build

Інтеграція з PyTorch

import torch
import horovod.torch as hvd

# Инициализация
hvd.init()

# Привязка к GPU по rank
torch.cuda.set_device(hvd.local_rank())

# Масштабирование learning rate пропорционально числу GPU
lr = 1e-3 * hvd.size()
optimizer = torch.optim.SGD(model.parameters(), lr=lr)

# Оборачивание оптимизатора — добавляет all-reduce градиентов
optimizer = hvd.DistributedOptimizer(
    optimizer,
    named_parameters=model.named_parameters(),
    compression=hvd.Compression.fp16  # Сжатие градиентов
)

# Broadcast начальных весов с rank 0 на все GPU
hvd.broadcast_parameters(model.state_dict(), root_rank=0)
hvd.broadcast_optimizer_state(optimizer, root_rank=0)

# Сохранение только на rank 0
if hvd.rank() == 0:
    torch.save(model.state_dict(), "model.pt")

Запуск

# Один узел, 4 GPU
horovodrun -np 4 -H localhost:4 python train.py

# Несколько узлов
horovodrun -np 16 -H server1:8,server2:8 \
  --network-interface eth0 \
  python train.py

# С MPI
mpirun -np 16 \
  -H server1:8,server2:8 \
  -bind-to none -map-by slot \
  -x NCCL_DEBUG=INFO \
  -x LD_LIBRARY_PATH \
  python train.py

Horovod Elastic Training

Elastic training дозволяє динамічно додавати та видаляти вузли під час навчання без зупинки:

import horovod.torch as hvd
from horovod.torch.elastic import run

@hvd.elastic.run
def train(state):
    # state.epoch и state.batch сохраняются между resizing
    for state.epoch in range(state.epoch, num_epochs):
        for state.batch, batch in enumerate(
            get_loader(state.epoch, state.batch), state.batch
        ):
            train_step(batch)
            state.commit()  # Checkpoint состояния

state = hvd.elastic.TorchState(
    model=model,
    optimizer=optimizer,
    epoch=0,
    batch=0
)

run(train, state)

Timeline профільувальник

Horovod включає вбудований profiler для аналізу комунікаційних накладних витрат:

HOROVOD_TIMELINE=timeline.json horovodrun -np 4 python train.py
# Открыть chrome://tracing и загрузить timeline.json

Timeline показує час each allreduce операції, що допомагає знайти bottleneck - шари з повільною синхронізацією.

Порівняння з альтернативами

Horovod історично був популярний до появи PyTorch DDP та DeepSpeed. Сьогодні для нових проектів на PyTorch краще PyTorch DDP (нативна інтеграція) або DeepSpeed (для великих моделей). Horovod залишається актуальним для:

  • існуючих кодових баз TensorFlow з розподіленим навчанням
  • Multi-framework оточення (PyTorch + TensorFlow одночасно)
  • Середовище з MPI-інфраструктурою (HPC-кластери з SLURM)

При переході з Horovod на PyTorch DDP: основна зміна - заміна hvd.DistributedOptimizer на torch.nn.parallel.DistributedDataParallel і використання torchrun замість horovodrun.