分布式训练-多机多卡 通过docker安装horovod框架

前言

想通过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/host

写入以下信息:

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
    ```docker hub
    在输入命令之后输入之前设置的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的官方文档:

分布式训练-多机多卡 通过docker安装horovod框架_第1张图片
需要注意两个问题:

  1. 是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

  2. 每个设备中需要创建一个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的映射路径映射到容器,这样修改会非常容易。

分布式训练-多机多卡 通过docker安装horovod框架_第2张图片
显示如图说明环境配置成功,注意这里我们已经在容器内部。
可以简单测试下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 设备名:设备有几张卡

结语

  1. 如果熟悉docker,这个流程是相当高效的分布式训练部署方案
  2. horovod的文档是比较旧的,所以使用过程中有问题需要多查
  3. 后续会想办法测试网络带宽对分布式训练的影响

如果有问题请留言。

你可能感兴趣的:(linux,docker,分布式)