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用于分布式深度学习,以及他们在培训工作中的职责,我将不胜感激。
答案 0 :(得分:0)
首先,horovod仅在开始使用MPI。
将NCCL引入horovod之后,即使在NCCL模式下,MPI仍用于提供环境信息(等级,大小和local_rank)。 NCCL文档有一个示例,说明了每个过程设置如何在一个设备中利用MPI:
以下代码是在MPI上下文中创建通信器的示例,每个MPI等级使用一个设备。
答案 1 :(得分:0)
MPI(消息传递接口)是在并行计算(Wikipedia)中使用的消息传递标准。在大多数情况下,使用Horovod(这是MPI标准的开源实现)时,您会使用Open MPI。
MPI实现使一个人可以轻松地并行运行多个程序实例。程序代码保持相同,但仅在几个不同的进程中运行。此外,MPI库公开了一个API,可轻松在这些进程之间共享数据和信息。
Horovod使用此机制来运行正在运行神经网络的Python脚本的某些进程。这些过程应该在神经网络运行期间知道并共享一些信息。其中一些信息与环境有关,例如:
其中一些信息与神经网络的训练过程有关,例如:
有更多的信息可以共享,上面的项目符号就是其中一些。
起初,Horovod使用MPI满足以上所有要求。然后,Nvidia发布了NCCL,它是一个包含许多用于GPU之间高性能通信的算法的库。为了提高整体性能,Horovod开始将NCCL用于(4)和主要(5)之类的事情,因为NCCL允许更高效地在GPU之间共享此数据。
在Nvidia docs中,我们可以看到NCCL可以与MPI结合使用,并且通常:
MPI用于CPU-CPU通信,而NCCL用于GPU-GPU通信。
Horovod仍然使用MPI运行少数几个Python脚本实例,并管理环境(等级,大小,哪个进程是“主”等),以允许用户轻松管理运行。