前言
想通过conda搭建带有horovod的环境,发现很麻烦,转变思路通过docker进行环境搭建。
0. 硬件说明
0.1 硬件信息及网络配置
现有三台设备,系统为ubuntu20.04,我们为其设定固定ip。
- node1 192.168.1.111
- node2 192.168.1.112
- node3 192.168.1.113
为了方便起见我们将上述设置信息写入hosts,为host起一个别名。
sudo vim /etc/hosts
写入以下信息:
192.168.1.111 node1
192.168.1.112 node2
192.168.1.113 node3
0.2 准备工作
注意:以下操作需要在三台设备上操作三次。
SSH安装及配置
# ssh安装
sudo apt-get install ssh
# ssh生成秘钥
sudo ssh-keygen
# 回车三次即可
到这里ssh的安装就完成了,接下来我们需要设置三台设备之间root用户的免密登录。
-
首先设置root的密码
sudo passwd root
这里直接输入密码和确认密码,密码输入过程是不可见的。
确认之后会提示密码修改完成。
-
然后修改ssh的配置文件,允许其他设备可以通过ssh登录root用户。
sudo vim /ets/ssh/sshd_config
这里只修改两个地方
# 允许root登录 改为yes PermitRootLogin yes # 公钥许可 改为yes PubkeyAuthentication yes
修改后的记结果如下图(这里只截取了修改的部分)
-
最后是免密登录
sudo ssh-copy-id node1 sudo ssh-copy-id node2 sudo ssh-copy-id node3
在输入命令之后输入之前设置的root密码就可以。
另外请注意显卡驱动的安装,安装最新的驱动就可以。
1. docker安装
这里我们直接参考nvidia-docker的安装教程:
# 以下内容来自于官网安装教程
# Docker-CE on Ubuntu can be setup using Docker’s official convenience script:
curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
# Setup the package repository and the GPG key:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Install the nvidia-container-toolkit package (and dependencies) after updating the package listing:
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
2. horovod docker安装
这里我们参看horovod的官方文档:
需要注意两个问题:
-
是horovod镜像的获取,这里我在dockerhub中进行了查看,horovod的镜像更新是比较频繁的基本上一个月会更新一次,最新的版本(2023.03.15)支持情况如下:
cuda=11.3 cudnn=8.2.1 nccl=2.9.9 python=3.8 tensorflow=2.9.2 pytorch=1.12.1 mxnet=1.9.1
这个镜像对spark也是支持的,支持的版本是3.3.0
-
每个设备中需要创建一个docker容器,同时不同容器之间的需要通过ssh免密登录。
我之前看到一种方案直接在docker中构建ssh免密登录,事实上我们可以直接利用宿主机的ssh免密登录。
注意:以下操作需要在三台设备上操作三次。
2.1 horovod镜像拉取
我们通过一下指令对最新的镜像进行拉取:
sudo docker pull horovod/horovod:latest
整个镜像大小为6.9G,下载会比较久。
2.2 生成容器
我们通过以下指令生成镜像:
docker run -it --network=host -v /root/.ssh:/root/.ssh -v /home/python_projects:/usr/local/python_projects --name horovod-env --gpus all -it horovod/horovod:latest
这里需要对关键参数进行说明:
--network=host 容器和宿主机共享Network namespace
-v /root/.ssh:/root/.ssh 将宿主机的ssh配置映射到容器的ssh
以上两条参考了horovod in docker的文档,可以实现容器之间免密ssh。
-v /home/python_projects:/usr/local/python_projects
将宿主机的文件映射到容器,如果你使用了pycharm的ssh解释器,可以将pycharm的映射路径映射到容器,这样修改会非常容易。
显示如图说明环境配置成功,注意这里我们已经在容器内部。
可以简单测试下cuda、torch等等。
注意:以下操作不需要在三台设备重复操作
2.3 分布式训练
参考hovorod in docker(因为horovod in docker的文档太老了,我们进行一些修改):
在node2和node3我们运行以下指令:
bash -c "/usr/sbin/sshd -p 12345; sleep infinity"
在node1运行以下指令:
cd /你的工程
horovodrun -np 3 -H node1:1,node2:1,node3:1 -p 12345 python 你的训练代码.py
对参数进行一些解释:
-np 一共有几张卡
-H 设备名:设备有几张卡
结语
- 如果熟悉docker,这个流程是相当高效的分布式训练部署方案
- horovod的文档是比较旧的,所以使用过程中有问题需要多查
- 后续会想办法测试网络带宽对分布式训练的影响
如果有问题请留言。