TensorFlow Horovod:NCCL和MPI

时间:2018-11-27 11:45:55

标签: python tensorflow deep-learning mpi

Horovod正在将NCCL和MPI合并到用于TensorFlow中的分布式深度学习的包装器中。 我以前不是NCCL的负责人,而是在研究该功能,并从Nvidia网站上对NCCL进行了以下陈述:

  

NVIDIA集体通信库(NCCL)实现了针对NVIDIA GPU优化性能的多GPU和多节点集体通信原语。

根据关于NCCL的introduction video,我了解到NCCL通过PCIe,NVLink,Native Infiniband,以太网工作,它甚至可以检测通过RDMA进行的GPU Direct在当前硬件拓扑中是否有意义并透明地使用它。

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

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

如果有人能解释在哪种情况下将MPI和/或NCCL用于分布式深度学习,以及他们在培训工作中的职责,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先,horovod仅在开始使用MPI。

将NCCL引入horovod之后,即使在NCCL模式下,MPI仍用于提供环境信息(等级,大小和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

答案 1 :(得分:0)

MPI(消息传递接口)是在并行计算(Wikipedia)中使用的消息传递标准。在大多数情况下,使用Horovod(这是MPI标准的开源实现)时,您会使用Open MPI

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

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

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

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

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

有更多的信息可以共享,上面的项目符号就是其中一些。

起初,Horovod使用MPI满足以上所有要求。然后,Nvidia发布了NCCL,它是一个包含许多用于GPU之间高性能通信的算法的库。为了提高整体性能,Horovod开始将NCCL用于(4)和主要(5)之类的事情,因为NCCL允许更高效地在GPU之间共享此数据。

Nvidia docs中,我们可以看到NCCL可以与MPI结合使用,并且通常:

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

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