TensorFlow Horovod:NCCL和MPI

Ale*_*lex 7 python mpi deep-learning tensorflow

Horovod正在将NCCL和MPI 组合成分布式深度学习的包装器,例如TensorFlow.我以前没有NCCL的负责人,正在调查功能,从Nvidia网站上他们就NCCL说明了以下内容:

NVIDIA集体通信库(NCCL)实现了多GPU和多节点集合通信原语,这些原语针对NVIDIA GPU进行了性能优化.

从关于NCCL 的介绍视频中我了解到NCCL通过PCIe,NVLink,Native Infiniband,以太网工作,它甚至可以检测通过RDMA的GPU Direct是否在当前硬件拓扑中有意义并透明地使用它.

所以我质疑为什么在Horovod需要MPI?据我所知,MPI还用于通过allreduce范例有效地交换分布式节点之间的梯度.但据我所知,NCCL已经支持这些功能.

那么MPI仅用于轻松调度群集上的作业吗?对于CPU上的分布式深度学习,既然我们不能在那里使用NCCL?

如果有人可以解释MPI和/或NCCL用于分布式深度学习的情况以及他们在培训工作中的职责,我将非常感谢.

小智 7

MPI(消息传递接口)是并行计算中使用的消息传递标准(维基百科)。大多数时候,您在使用 Horovod 时会使用Open MPI,Horovod 是 MPI 标准的开源实现。

MPI 实现允许轻松地并行运行一个程序的多个实例。程序代码保持相同,只是在几个不同的进程中运行。此外,MPI 库还公开了一个 API,可以在这些进程之间轻松共享数据和信息。

Horovod 使用这种机制来运行运行神经网络的 Python 脚本的某些进程。这些进程应该在神经网络运行过程中了解并共享一些信息。其中一些信息与环境有关,例如:

  1. 当前正在运行的进程数量,以便能够正确修改神经网络的参数和超参数,例如批量大小、学习率等。
  2. 了解哪个进程是“主”进程,以便仅从单个进程打印日志并保存文件(检查点)。
  3. 当前进程的 ID(称为“等级”),以便它可以使用输入数据的特定区域。

其中一些信息是关于神经网络的训练过程,例如:

  1. 模型的权重和偏差的随机初始值,因此所有过程都将从同一点开始。
  2. 每个训练步骤结束时的权重和偏差值,因此所有进程都将以相同的值开始下一步。

还有更多信息被共享,上面的要点是其中的一些信息。

最初,Horovod 使用 MPI 来满足上述所有要求。随后,Nvidia 发布了NCCL,这是一个由许多用于 GPU 之间高性能通信的算法组成的库。为了提高整体性能,Horovod 开始将 NCCL 用于诸如 (4) 和主要 (5) 之类的事情,因为 NCCL 允许在 GPU 之间更有效地共享这些数据。

Nvidia 文档中我们可以看到 NCCL 可以与 MPI 结合使用,一般来说:

MPI用于CPU-CPU通信,NCCL用于GPU-GPU通信。

Horovod 仍然使用 MPI 来运行 Python 脚本的少数实例并管理环境(排名、大小、哪个进程是“主进程”等),以允许用户轻松管理运行。


mzh*_*ang 1

首先,horovod一开始只使用MPI。

Horovod 引入 NCCL 后,即使在 NCCL 模式下,MPI 仍然用于提供环境信息(rank、size 和 local_rank)。NCCL 文档有一个示例,展示了它如何在一个设备每个进程设置中利用 MPI:

以下代码是在 MPI 上下文中创建通信器的示例,每个 MPI 等级使用一个设备。

https://docs.nvidia.com/deeplearning/sdk/nccl-developer-guide/docs/examples.html#example-2-one-device-per-process-or-thread