Налаштування 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.







