Horovod 安装指南¶
要求¶
GNU Linux 或 macOS
Python >= 3.6
g++-5或更高版本,或其他支持 C++14 的编译器CMake 3.13 或更新版本
TensorFlow (>=1.15.0), PyTorch (>=1.5.0), 或 MXNet (>=1.4.1)
(可选) MPI
为了在GPU上获得最佳性能:
要安装 Horovod 与 TensorFlow 2.10 或更高版本,你需要一个支持 C++17 的编译器,例如 g++8 或更新的版本。
如果 Horovod 找不到 CMake 3.13 或更新版本,构建脚本将尝试拉取最新的 CMake 二进制文件并从临时位置运行它。要选择特定的二进制文件,您也可以在安装 Horovod 之前在环境中设置 HOROVOD_CMAKE。
Horovod 不支持 Windows。
框架¶
你可以为TensorFlow、PyTorch和MXNet构建Horovod。默认情况下,Horovod会尝试构建对所有框架的支持。至少需要启用一个框架才能成功安装Horovod。
为确保在尝试安装 Horovod 之前正确安装框架依赖项,请附加标识所需框架的额外参数:
$ pip install horovod[tensorflow,keras,pytorch,mxnet,spark]
除了单独指定框架要求外,您还可以统一要求所有框架:
$ pip install horovod[all-frameworks]
这在将Horovod作为依赖项集合的一部分一次性构建时非常有用,依赖pip编译器来确定正确的安装顺序。
TensorFlow¶
为确保Horovod构建时启用TensorFlow支持:
$ HOROVOD_WITH_TENSORFLOW=1 pip install horovod[tensorflow]
要跳过 TensorFlow,请在您的环境中设置 HOROVOD_WITHOUT_TENSORFLOW=1。
PyTorch¶
为确保Horovod构建时启用PyTorch支持:
$ HOROVOD_WITH_PYTORCH=1 pip install horovod[pytorch]
要跳过 PyTorch,请在您的环境中设置 HOROVOD_WITHOUT_PYTORCH=1。
MXNet¶
为确保Horovod构建时启用MXNet CPU支持:
$ HOROVOD_WITH_MXNET=1 pip install horovod[mxnet]
某些 MXNet 版本与 Horovod 不兼容:
MXNet 1.4.0 及更早版本存在 GCC 兼容性问题。使用 MXNet 1.4.1 或更高版本配合 Horovod 0.16.2 或更高版本来避免这些兼容性问题。
MXNet 1.5.1、1.6.0、1.7.0 和 1.7.0.post1 缺少 MKLDNN 头文件,因此它们无法与 Horovod 协同工作。请分别使用 1.5.1.post0、1.6.0.post0 和 1.7.0.post0 版本。
MXNet 1.6.0.post0 和 1.7.0.post0 仅以 mxnet-cu101 和 mxnet-cu102 形式提供。
要跳过 MXNet,请在您的环境中设置 HOROVOD_WITHOUT_MXNET=1。
Keras¶
独立 Keras 支持目前仅适用于 TensorFlow 后端。
为确保Horovod构建时支持Keras:
$ HOROVOD_WITH_TENSORFLOW=1 pip install horovod[tensorflow,keras]
没有为Keras构建插件,但必须启用TensorFlow插件才能将Horovod与Keras一起使用。
控制器¶
控制器用于协调Horovod进程之间的工作(确定要处理哪些张量)。我们为MPI和Gloo都提供了控制器实现。默认情况下,Horovod将尝试构建对两者的支持。必须至少启用一个控制器才能使Horovod成功安装。
MPI¶
MPI是Horovod的原始控制器。它使用mpirun来启动工作进程(当使用MPI时,horovodrun会在底层使用mpirun)。
要使用 Horovod 与 MPI,请安装 Open MPI 或其他 MPI 实现。 了解如何安装 Open MPI 在此页面。
注意: Open MPI 3.1.3 存在一个可能导致挂起的问题。推荐的解决方法是降级到 Open MPI 3.1.2 或升级到 Open MPI 4.0.0。
要强制Horovod安装时支持MPI,请在您的环境中设置
HOROVOD_WITH_MPI=1。要强制Horovod跳过构建MPI支持,请设置
HOROVOD_WITHOUT_MPI=1。
如果你的安装中同时启用了MPI和Gloo,那么MPI将成为默认控制器。
Gloo¶
Gloo 是 Horovod 的一个较新的控制器,除了 CMake 外,安装时不需要额外的依赖项。
当与NCCL结合作为控制器使用时,Gloo在标准基准测试中的表现几乎与MPI相同。
要强制Horovod安装时支持Gloo,请在您的环境中设置
HOROVOD_WITH_GLOO=1。要强制Horovod跳过构建Gloo支持,设置
HOROVOD_WITHOUT_GLOO=1。
Gloo 模式使用 horovodrun 来启动工作进程。
使用 Horovod 的弹性/容错 API 需要 Gloo。
注意: macOS用户必须安装 libuv 才能使用 Gloo:
$ brew install libuv
张量操作¶
为了在GPU上以最佳性能运行,我们建议按照Horovod on GPU指南安装支持NCCL的Horovod。
对于CPU上的张量数据,您可以使用MPI、Gloo和Intel的oneCCL。默认情况下,您的控制器所使用的框架将用于CPU操作。您可以通过在环境中设置HOROVOD_CPU_OPERATIONS来覆盖此设置。
NCCL¶
NCCL 支持 Allreduce、Allgather、Broadcast 和 Alltoall 操作。您可以在安装时通过设置
HOROVOD_GPU_OPERATIONS=NCCL 来启用这些功能。
NCCL 操作在 Nvidia (CUDA) 和 AMD (ROCm) GPU 上均受支持。您可以在环境中设置 HOROVOD_GPU 来指定使用 CUDA 或 ROCm 进行构建。如果未指定,则默认使用 CUDA。
请注意,Alltoall 需要 NCCL 版本 >= 2.7.0。
MPI¶
当使用MPI控制器时,如果NCCL不可用,或者张量在allreduce请求之前被放置在主机内存中,将使用MPI。在NCCL不可用的情况下,MPI已被证明在CPU张量操作方面优于Gloo。
MPI 也可以用于 GPU 操作,但在大多数情况下不建议这样做。更多详情请参见 Horovod on GPU。
Gloo¶
当使用Gloo控制器时,Gloo将默认替代MPI用于CPU操作。
oneCCL¶
oneCCL是英特尔用于加速CPU上集合操作的库。更多详情请参见 Horovod with Intel(R) oneCCL。
设置 HOROVOD_CPU_OPERATIONS=CCL 以使用 oneCCL。
检查构建¶
成功安装 Horovod 后,运行:
$ horovodrun --check-build
每个成功启用的功能都将标记为‘X’。如果您打算安装带有未列为已启用功能的Horovod,可以重新安装Horovod,设置适当的环境变量以诊断故障:
$ pip uninstall horovod
$ HOROVOD_WITH_...=1 pip install --no-cache-dir horovod
使用Conda (+pip)安装Horovod¶
要使用 Conda 安装 PyTorch、TensorFlow、MXNet、Horovod,以及 GPU 依赖项,例如 NVIDIA CUDA Toolkit、cuDNN、NCCL 等,请参阅 构建支持 GPU 的 Horovod Conda 环境。
环境变量¶
可选的环境变量,可用于配置 Horovod 的安装过程。
可能的值用花括号给出:{}。
HOROVOD_DEBUG- {1}. 安装一个调试版本的Horovod,包含已检查的断言、禁用的编译器优化等。HOROVOD_BUILD_ARCH_FLAGS- 为您的构建架构传递额外的C++编译标志。HOROVOD_CUDA_HOME- 可找到CUDA包含和库目录的路径。HOROVOD_BUILD_CUDA_CC_LIST- 用于构建Horovod CUDA内核的计算能力列表(示例:HOROVOD_BUILD_CUDA_CC_LIST=60,70,75)HOROVOD_ROCM_HOME- 可找到ROCm包含和库目录的路径。HOROVOD_NCCL_HOME- 可找到NCCL包含和库目录的路径。HOROVOD_NCCL_INCLUDE- NCCL头文件目录路径。HOROVOD_NCCL_LIB- NCCL库目录的路径。HOROVOD_NCCL_LINK- {SHARED, STATIC}。链接NCCL库的模式。对于CUDA默认为STATIC,对于ROCm默认为SHARED。HOROVOD_WITH_GLOO- {1}. 要求Horovod在构建时启用Gloo支持。HOROVOD_WITHOUT_GLOO- {1}. 跳过使用Gloo支持进行构建。HOROVOD_WITH_MPI- {1}. 要求启用 MPI 支持构建 Horovod。HOROVOD_WITHOUT_MPI- {1}. 跳过构建MPI支持。HOROVOD_GPU- {CUDA, ROCM}. 用于GPU操作的框架。HOROVOD_GPU_OPERATIONS- {NCCL, MPI}. 用于GPU张量allreduce、allgather和broadcast操作的框架。HOROVOD_GPU_ALLREDUCE- {NCCL, MPI}. 用于GPU张量全归约的框架。HOROVOD_GPU_ALLGATHER- {NCCL, MPI}. 用于GPU张量全收集的框架。HOROVOD_GPU_BROADCAST- {NCCL, MPI}. 用于GPU张量广播的框架。HOROVOD_GPU_ALLTOALL- {NCCL, MPI}. 用于GPU张量alltoall操作的框架。HOROVOD_GPU_REDUCESCATTER- {NCCL, MPI}. 用于GPU张量reduce-scatter操作的框架。HOROVOD_ALLOW_MIXED_GPU_IMPL- {1}. 允许Horovod安装时使用NCCL allreduce和MPI GPU allgather / broadcast / alltoall / reducescatter。由于可能发生死锁,不建议使用。HOROVOD_CPU_OPERATIONS- {MPI, GLOO, CCL}. 用于CPU张量allreduce、allgather和broadcast操作的框架。HOROVOD_CMAKE- 用于构建 Horovod 的 CMake 二进制文件的路径。HOROVOD_WITH_TENSORFLOW- {1}. 要求Horovod安装时启用TensorFlow支持。HOROVOD_WITHOUT_TENSORFLOW- {1}. 跳过安装TensorFlow支持。HOROVOD_WITH_PYTORCH- {1}. 要求Horovod安装时启用PyTorch支持。HOROVOD_WITHOUT_PYTORCH- {1}. 跳过安装PyTorch支持。HOROVOD_WITH_MXNET- {1}. 要求Horovod安装时启用MXNet支持。HOROVOD_WITHOUT_MXNET- {1}. 跳过安装MXNet支持。