10.1.4.3. 多机使用说明

10.1.4.3.1. 环境准备

准备两台开发机,确保两者直接可以免密登录。

保证两台开发机上需要运行的代码的的文件目录和内容是一样的。

10.1.4.3.2. 启动docker

在第一台机器上启动docker。

nvidia-docker run -d -p 10022:22 -it --shm-size="15g" -v ~/.ssh:/root/.ssh ${DOCKER_PATH}

docker exec -it 096e26686644 bash

其中 096e26686644 是第一步启动容器的镜像名字,可以使用 docker ps 查看。

在第二台机器上启动docker。

nvidia-docker run -d -p 10023:22 -it --shm-size="15g" -v ~/.ssh:/root/.ssh ${DOCKER_PATH}

docker exec -it f0f456bd2824 bash

这里注意映射ssh的端口号变了,第一台机器是10022,第二台机器是10023,保证两者不一样即可。

为了保证两台开发机docker内部的开发目录是一样的,可以使用 -v 挂载相同的开发目录即可。

另外可以测试两个docker容器之间是否可以免密登录:使用ifconfig命令查看第二台机器上的容器的ip地址,例如是: 172.17.0.12 ,回到第一台机器上的容器,使用 ssh -p 22 172.17.0.12 ,观察两台机器是否可以免密登录。如果可以了就可以进行下一步了。

10.1.4.3.3. 使用torchrun启动多机多卡训练脚本

# node1:
torchrun --nnodes=2 --nproc_per_node=4 --rdzv_id=8888 --rdzv_backend=c10d --rdzv_endpoint=hostip1 tools/train.py --config configs/classification/resnet18.py --stage float --launcher torch
# node2(rdzv_id需要和node1完全一致):
torchrun --nnodes=2 --nproc_per_node=4 --rdzv_id=8888 --rdzv_backend=c10d --rdzv_endpoint=hostip1 tools/train.py --config configs/classification/resnet18.py --stage float --launcher torch

hostip1 表示第一台机器上的容器的ip地址,使用 ifconfig 即可查看。

--nnodes 2 :2表示总机器数。

--nproc_per_node 4 :4表示每个机器上gpu的数量。(你可能需要手动把configs/classification/mobilenetv1_imagenet.py文件中的gpu数量改为4个)

运行该命令就可以看到多机多卡的事例正确运行了。