10.4.3. 多机使用说明¶
10.4.3.1. 环境准备¶
准备两台开发机,确保两者直接可以免密登录。
保证两台开发机上需要运行的代码的的文件目录和内容是一样的。
10.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.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个)
运行该命令就可以看到多机多卡的事例正确运行了。