🤖 AI/ML

Horovod

Horovod

분산 딥러닝 프레임워크. Uber 개발, 멀티 GPU 학습.

📖 상세 설명

Horovod는 Uber에서 개발한 오픈소스 분산 딥러닝 프레임워크입니다. TensorFlow, PyTorch, MXNet, Keras 등 여러 딥러닝 프레임워크와 호환되며, 멀티 GPU 및 멀티 노드 학습을 쉽게 구현할 수 있게 해줍니다.

이름은 러시아 전통 원형 춤 "호로보드(Khorovod)"에서 유래했는데, 모든 참여자가 동등하게 협력하는 모습이 분산 학습의 철학과 맞아떨어집니다. 2017년 처음 공개되어 현재 LF AI & Data Foundation에서 관리하고 있습니다.

Horovod의 핵심은 Ring-AllReduce 알고리즘입니다. 기존 Parameter Server 방식 대비 네트워크 병목이 적고, GPU 수에 따라 거의 선형으로 확장됩니다. 256개 GPU에서 90% 이상의 확장 효율을 달성할 수 있습니다.

실무에서 Horovod는 기존 단일 GPU 학습 코드에 몇 줄만 추가하면 분산 학습으로 전환할 수 있다는 장점이 있습니다. horovodrun 명령어로 쉽게 실행하고, NCCL 백엔드로 NVIDIA GPU 간 고속 통신을 지원합니다.

💻 코드 예제

import torch
import horovod.torch as hvd

# Horovod를 사용한 PyTorch 분산 학습
def train_distributed():
    # 1. Horovod 초기화
    hvd.init()

    # 2. GPU 할당 (각 프로세스에 하나씩)
    torch.cuda.set_device(hvd.local_rank())

    # 3. 모델 생성 및 GPU 이동
    model = YourModel().cuda()

    # 4. Optimizer 생성 및 Horovod로 래핑
    optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
    optimizer = hvd.DistributedOptimizer(
        optimizer,
        named_parameters=model.named_parameters()
    )

    # 5. 초기 상태 브로드캐스트 (모든 워커 동기화)
    hvd.broadcast_parameters(model.state_dict(), root_rank=0)
    hvd.broadcast_optimizer_state(optimizer, root_rank=0)

    # 6. 학습 루프
    for epoch in range(10):
        for batch in train_loader:
            optimizer.zero_grad()
            loss = model(batch)
            loss.backward()
            optimizer.step()

        # rank 0에서만 로그 출력
        if hvd.rank() == 0:
            print(f"Epoch {epoch}, Loss: {loss.item():.4f}")

# 실행: horovodrun -np 4 -H localhost:4 python train.py
# (-np: 프로세스 수, -H: 호스트 설정)

🗣️ 실무에서 이렇게 말하세요

ML 인프라 회의에서

"단일 GPU로 3일 걸리는 학습을 Horovod로 8 GPU 분산하면 반나절로 줄일 수 있어요. 코드 수정도 10줄 정도면 되고, horovodrun으로 바로 실행 가능합니다."

기술 면접에서

"Horovod의 Ring-AllReduce가 Parameter Server보다 효율적인 이유는 통신 병목이 없기 때문입니다. PS는 중앙 서버가 병목이 되지만, Ring에서는 각 노드가 이웃에게만 전송해서 총 통신량이 GPU 수와 무관합니다."

성능 최적화 논의에서

"Horovod 학습에서 GPU 활용률이 낮다면 데이터 로딩 병목일 가능성이 높아요. DataLoader의 num_workers를 늘리고, prefetch_factor를 조정해보세요. NCCL 통신 자체는 매우 빠릅니다."

⚠️ 흔한 실수 & 주의사항

1
배치 크기 조정 필요

분산 학습 시 effective batch size는 GPU 수만큼 커집니다. Learning rate도 그에 맞게 조정하거나 learning rate warmup을 적용하세요.

2
환경 설정 복잡성

멀티 노드 환경에서는 SSH 키, 네트워크 설정, NCCL 환경 변수 등 초기 설정이 까다롭습니다. Docker나 Kubernetes로 환경을 표준화하세요.

3
최신 대안 고려

PyTorch DDP나 DeepSpeed가 더 활발히 개발되고 있습니다. 신규 프로젝트에서는 Horovod와 함께 이런 대안도 검토해보세요.

🔗 관련 용어

📚 더 배우기