上一篇记录了单机多卡训练,就是在一台机器上使用多张卡训练模型(我的老板说这不算是分布式🤫)
下面通过创建两个容器,模拟分布式训练,
设计难点:
(1)容器之间免密连接,就这个 了!!!!
下面是实现步骤了:
前提:
有docker、nvidia-docker、horovod
创建image,实现容器间免密登录
(我这里直接使用DockerHub提供的horovod镜像作为基础镜像,在此基础上进行修改的,大家也可以使用源代码提供的Dockerfile,进行更改)
下面是我运行的dockerfile脚本
# basic image from DockerHub
FROM horovod/horovod
# 若大家的机器可以随意访问外网,这里的export以及最下面的三句export可以不写
RUN export http_proxy= 对应的代理地址 && \
export https_proxy= 对应的代理地址 && \
export no_proxy= 对应的代理地址 && \
# install openssh-server
apt-get update && apt-get install -y openssh-server && \
# passwordless
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys && \
chmod 600 /root/.ssh/authorized_keys && \
# ssh_config is for client,sshd_config is for server
# the following two sentences: sshd服务的那边的配置,一个是允许空密码,一个是允许root密码登录。
sed -i 's/PermitEmptyPasswords yes/PermitEmptyPasswords no /' /etc/ssh/sshd_config && \
sed -i 's/PermitRootLogin without-password/PermitRootLogin yes /' /etc/ssh/sshd_config && \
# the following two sentences: ssh_config的配置是描述 ssh客户端发起请求的时候不再提示需要检查对方是不是在knowhosts列表中.后面这个不配置的话,会跳出一个交互性的会话框,要输入yes
echo " StrictHostKeyChecking no" >> /etc/ssh/ssh_config && \
echo " UserKnownHostsFile /dev/null" >> /etc/ssh/ssh_config && \
# cancel proxy 镜像构建完后取消代理,不然生成的镜像之后不好使用
export HTTP_PROXY="" && \
export HTTPS_PROXY="" && \
export NO_PROXY=""
构建镜像
docker build -t horovod:test1 .
# 这里的horovod:test1表示你创建的镜像的标签,后面的.表示运行当前目录下的dockerfile,还有多种构建镜像方式,可google
出现类似这样结果就表示创建镜像成功:
进入容器
nvidia-docker run -it horovod:test1 bash
# 同样的,如果有访问外网的限制,上述命令中可写为
# nvidia-docker run -it -e http_proxy="xxx" -e https_proxy="xxx" -e no_proxy="xxx" horovod:test1 bash 这里面的xxx是你的服务器的IP地址和端口
进入容器后,启动sshd服务
(每个容器进入后都要启动sshd服务才可以哟)
/sbin/sshd命令
此时,
ssh root@容器IP
便可以访问其他容器了,
exit
可退出其他容器,回到上一级容器内
注:如何查看容器IP,在进入容器之前,输入命令:
docker inspect 容器id
# 容器id可通过docker ps查看,或者你在进入容器后root@xxxxx中的xxxx就是id,取前四位就可以了
开始训练
在其中一个容器内,输入
horovodrun -np 4 -H 172.17.0.3:2,172.17.0.4:2 python pytorch/pytorch_mnist.py
# 这里的172.17.0.3和172.17.0.4分别是两个容器的IP地址
其中,
当使用-H
指定多个主机时,这里的-np
就是所有主机上可用的和。
用卡情况:
暂时完结啦!!!!
后面有机会再更新关于在pod中做容器实现分布式训练。