Horovod 介紹
Horovod 是什麼?
Horovod 是 Uber 開發的 分布式深度學習框架,專注於用 數據並行(Data Parallelism) 的方式,在多台機器、多張 GPU 上同時訓練模型。它透過高效能的 AllReduce 操作來同步各張 GPU 計算得到的梯度,把多 GPU 訓練的效率做到接近理論峰值。
主要用途
- 多機多卡數據並行
- 模型規模「不會太大」到需要模型並行
- 需要快速讓單機程式 scale 到集群
核心概念:AllReduce
- AllReduce 是分布式通訊的基本操作之一,用來把多個節點的資料「合併」後再「分發」回每個節點。
- 在梯度同步時,Horovod 會把每個 GPU 的梯度進行 AllReduce → 各 GPU 得到相同、平均的梯度 → 各自更新模型參數 → 讓模型在所有 GPU 上保持同步。
Horovod 設計理念
- 簡單:對現有 TensorFlow、PyTorch、MXNet 程式碼影響最小。
- 高效:使用 NCCL(NVIDIA Collective Communication Library)、MPI 或 Gloo 作為後端,提供高速梯度同步。
- 跨框架:同一套 Horovod 可用在多種深度學習框架。
Horovod 的訓練流程
- 在每個 GPU 上啟動一個進程(通常透過
horovodrun
或mpirun
)。 - 各進程各自執行前向、反向計算。
- 在 backward 完成後,各 GPU 的梯度用 AllReduce 同步。
- 同步完成 → 各 GPU 用相同梯度做 optimizer.step() → 保持模型參數一致。
安裝方法
pip install horovod
PyTorch 範例
import horovod.torch as hvd hvd.init() # 初始化 Horovod torch.cuda.set_device(hvd.local_rank()) # 每個進程綁定對應的 GPU model = Net().cuda() optimizer = torch.optim.SGD(model.parameters(), lr=0.01 * hvd.size()) # 根據進程數調整學習率 optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters()) hvd.broadcast_parameters(model.state_dict(), root_rank=0) # 同步初始模型權重 # 後續就照正常 train loop 寫 loss.backward()、optimizer.step() 即可
Horovod 常用環境變數
HOROVOD_FUSION_THRESHOLD
: 控制一次 AllReduce 的最大 tensor 大小,提高效率HOROVOD_TIMELINE
: 啟用 performance profilingHOROVOD_CPU_OPERATIONS
: 在 CPU 執行 AllReduce,可避開 NCCL 問題但會慢
Horovod限制
Horovod 不處理模型並行,也沒有 ZeRO 這種顯存分片優化 → 遇到超大模型會需要別的工具如 DeepSpeed 或 Megatron-LM。