AI-train

多机多卡训练

Reference

docker 网络配置

初始化集群

选择 server1 作为 manager 节点,在此服务器上执行初始化命令:docker swarm init, 执行之后可以生成加入该集群的命令。

加入集群

将 server2 作为 worker 节点加入集群,进入 server2 执行join命令:

1
$ docker swarm join --token SWMTKN-1-5g90q48weqrtqryq4kj6ow0e8xm9wmv9o6vgqc5j320ymybd5c-8ex8j0bc40s6hgvy5ui5gl4gy 10.0.18.1:2377

创建网络

在manager中创建overlay网络::

1
docker network create --driver=overlay --attachable my-net

查看当前网络状态
docker network ls

同步网络

进入work节点查看网络状态docker network ls,没有上一步创建的网络。

这时需要开启一个容器,指定网络为my-network,docker会自动同步对应网络。

1
docker run -it --gpus all --name vc2 -network my-net--shm-size 128g  -v /path/work:/root/work vc2:5.2

运行容器搭建

分别在manager和worker启动容器

验证网络

启动容器后,可以使用docker inspect vc2来查看容器的网络结构。

分别进入manager和worker上的容器,ping对方的ip测试是否通。

开启容器间免密访问

  • 安装openssh-server服务
    分别在manager和worker节点的容器中安装openssh-server服务并启动:

    1
    2
    3
    4
    # 安装ssh服务
    apt-get install openssh-server -y
    # 启动ssh服务
    /etc/init.d/ssh start
  • 配置免密登录
    分别在manager,worker节点的容器中执行ssh-keygen -t rsa命令,一直回车即可

    • 将manager节点中的~/.ssh/id_rsa.pub的内容复制写入到manager节点和worker节点中的~/.ssh/authorized_keys文件中。
    • 将worker节点中的~/.ssh/id_rsa.pub的内容复制写入到manager节点和worker节点中的~/.ssh/authorized_keys文件中。

最后测试容器之间是否可以免密登录。

配置NCCL网络

在容器中使用ifconfig查看使用的网卡。

将这个环境变量写入到 /etc/profile 中:

1
2
3
...
#需要注意NCCL的配置,这里需要根据机器的情况指定NCCL的通讯网卡
export NCCL_SOCKET_IFNAME=eth0

然后使用source /etc/profile让其生效,worker节点执行同样的操作。

多机训练

在工程目录下新建hostfile文件,写入:

1
2
manager-ip slots=8
worker-ip slots=8

执行训练

在manager节点的工程目录下,运行:

1
2
3
4
5
deepspeed --hostfile hostfile src/train.py \
--deepspeed zero.json \
--stage sft \
--model_name_or_path /home/user/code/llava \
...

分别去两台服务器中执行nvidia-smi,可以看到显卡均有被使用。

Contents
  1. 1. docker 网络配置
    1. 1.1. 初始化集群
    2. 1.2. 加入集群
    3. 1.3. 创建网络
    4. 1.4. 同步网络
  2. 2. 运行容器搭建
    1. 2.1. 验证网络
    2. 2.2. 开启容器间免密访问
    3. 2.3. 配置NCCL网络
    4. 2.4. 多机训练
    5. 2.5. 执行训练
|