【问题标题】:TensorFlow Horovod: NCCL and MPITensorFlow Horovod:NCCL 和 MPI
【发布时间】:2019-04-29 03:37:43
【问题描述】:

HorovodNCCL 和 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 在哪些场景中用于分布式深度学习,以及他们在训练工作中的职责是什么,我将不胜感激。

【问题讨论】:

  • this 没有回答您的问题吗?
  • 我的问题更针对于在 Horovod 培训期间使用 NCCL 的哪些操作以及 MPI 仍然需要哪些操作,因为它们在功能上重叠很多。
  • @Alex:也许this presentation 可以给你一些关于在 Horovod 中使用 MPI 的提示。

标签: python tensorflow deep-learning mpi


【解决方案1】:

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

将 NCCL 引入 horovod 后,即使在 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

【讨论】:

    【解决方案2】:

    MPI(消息传递接口)是一种用于并行计算的消息传递标准(Wikipedia)。大多数情况下,您在使用 Horovod 时会使用 Open MPI,这是 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 脚本的少数实例并管理环境(等级、大小、哪个进程是“主”等),以便用户轻松管理运行。

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 1970-01-01
      • 2014-02-05
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2016-01-01
      • 2011-12-13
      相关资源
      最近更新 更多