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_rsa 和 authorized_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端口的情况下运行(例如:同一主机上的多个容器):
配置你的 ~/.ssh/config 文件,为每个容器分配自定义主机名和端口
Host host1 HostName 192.168.1.10 Port 1234 Host host2 HostName 192.168.1.10 Port 2345
直接使用
horovodrun,就像每个容器都是一个具有自己IP的独立主机$ horovodrun -np 8 -H host1:4,host2:4 python keras_mnist_advanced.py