Horovod in Docker

为了简化安装流程,我们发布了参考Dockerfiles,以便您能在几分钟内开始使用Horovod。这些容器在/examples目录中包含Horovodexamples

预构建的带有Horovod的Docker容器可在DockerHub上获取,支持GPU、CPU和Ray

在单台机器上运行

容器构建完成后,使用 nvidia-docker 运行它。

注意: 你可以用特定预构建的带Horovod的Docker容器来替换horovod/horovod:latest,而不用自己构建。

$ nvidia-docker run -it horovod/horovod:latest
root@c278c88dd552:/examples# horovodrun -np 4 -H localhost:4 python keras_mnist_advanced.py

如果您没有在特权模式下运行容器,可能会看到以下消息:

[a8c9914754d2:00040] Read -1, expected 131072, errno = 1

你可以忽略这条消息。

在多台机器上运行

这里我们描述一个简单的示例,涉及一个共享文件系统 /mnt/share,使用一个通用端口号 12345 用于在所有容器上运行的 SSH 守护进程。/mnt/share/ssh 将包含一个典型的 id_rsaauthorized_keys 对,允许 passwordless authentication

注意: 这些不是硬性要求,但它们能让示例更简洁。共享文件系统可以通过在机器间rsyncing SSH配置和代码来替代,而通用SSH端口可以通过在/root/.ssh/ssh_config文件中定义的机器特定端口来替代。

主工作节点:

host1$ nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh horovod/horovod:latest
root@c278c88dd552:/examples# horovodrun -np 16 -H host1:4,host2:4,host3:4,host4:4 -p 12345 python keras_mnist_advanced.py

次要工作节点:

host2$ nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh horovod/horovod:latest \
    bash -c "/usr/sbin/sshd -p 12345; sleep infinity"
host3$ nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh horovod/horovod:latest \
    bash -c "/usr/sbin/sshd -p 12345; sleep infinity"
host4$ nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh horovod/horovod:latest \
    bash -c "/usr/sbin/sshd -p 12345; sleep infinity"

添加Mellanox RDMA支持

如果您有Mellanox网卡,我们建议您在容器中挂载Mellanox设备(/dev/infiniband) 并启用IPC_LOCK功能以进行内存注册:

$ nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh --cap-add=IPC_LOCK --device=/dev/infiniband horovod/horovod:latest
root@c278c88dd552:/examples# ...

您需要在主工作节点和辅助工作节点上指定这些额外的配置选项。

在不同端口上运行容器

在无通用SSH端口的情况下运行(例如:同一主机上的多个容器):

  1. 配置你的 ~/.ssh/config 文件,为每个容器分配自定义主机名和端口

    Host host1
      HostName 192.168.1.10
      Port 1234
    
    Host host2
      HostName 192.168.1.10
      Port 2345
    
  2. 直接使用 horovodrun,就像每个容器都是一个具有自己IP的独立主机

    $ horovodrun -np 8 -H host1:4,host2:4 python keras_mnist_advanced.py