bytescheduler在不同机器节点上的docker实现

1.目标

在不同机器节点上以docker为载体,使用RDMA通信方式

  • node-03、node-04两个机器节点
  • 使用RDMA通信方式,200.x 节点IP
  • 使用开源代码提供的dockerfile构建docker

2.基础镜像从何而来

目的:配置运行环境,最终结果是一个静态的image

2.1 dockerfile——读懂运行环境如何搭建

开源地址

FROM horovod/horovod:0.16.4-tf1.14.0-torch1.1.0-mxnet1.4.1-py2.7                                    
#FROM horovod/horovod:0.16.1-tf1.12.0-torch1.0.0-mxnet1.4.0-py2.7                                   
#FROM horovod/horovod:0.20.0-tf2.3.0-torch1.6.0-mxnet1.6.0.post0-py3.7-cuda10.1                     
#FROM horovod/horovod:0.18.1-tf1.14.0-torch1.2.0-mxnet1.5.0-py3.6                                   
                                                                                                    
ENV USE_BYTESCHEDULER=1                                                                             
ENV BYTESCHEDULER_WITH_PYTORCH=1                                                                    
ENV BYTESCHEDULER_WITHOUT_MXNET=1                                                                   
                                                                                                    
ARG HOROVOD_VERSION=b5cbf240909b467c348683c69df4d73f07147860                                        
                                                                                                    
WORKDIR /root/                                                                                      
                                                                                                    
# Apply the patch and reinstall Horovod                                                             
#RUN git clone --branch bytescheduler --recursive https://github.com/bytedance/byteps.git           
RUN git clone --branch bytescheduler --recursive git://github.com/bytedance/byteps.git              
#RUN git clone --recursive https://github.com/horovod/horovod.git && \                              
#RUN git clone --branch v0.16.1 --recursive https://github.com/horovod/horovod.git && \             
RUN git clone --branch v0.16.1 --recursive git://github.com/horovod/horovod.git && \                
    cd horovod && git reset --hard ${HOROVOD_VERSION}                                               
RUN cp byteps/bytescheduler/bytescheduler/pytorch/horovod_pytorch.patch horovod/ && \               
    cd horovod && git apply horovod_pytorch.patch && python setup.py install                        
                                                                                                    
# Install ByteScheduler                                                                             
RUN pip install bayesian-optimization==1.0.1 && cd byteps/bytescheduler && python setup.py install  
                                                                                                    
# Examples                                                                                          
WORKDIR /root/byteps/bytescheduler/examples/                                                        

2.2 互相免密登录

需要在上述容器中做改进,然后再commit为新的image保存下来更改

2.2.1 bridge模式

bridge模式下,容器的网络是与宿主机的互相隔离,只将宿主机的一个端口与容器的进行映射
-p 8022:22,即是将宿主机的8022端口与容器的22端口对应

正是因为使用的是非22端口进行容器之间的ssh,所以不能使用horovodrun运行程序,而要使用mpirun,以进行更为精细的配置

具体步骤:

  1. passwd root,增加登录密码,常用1130
  2. vim /etc/ssh/sshd_config,ssh的配置文件,将RootLogin一行的权限打开,改为yes
  3. 重新启动ssh服务,/etc/init.d/ssh start
  4. ssh-keygen,本地客户端生成公私钥
  5. ssh-copy-id -i ~/.ssh/id_rsa.pub -p 8022 root@192.168.111.14,将密钥copy到对方主机
  6. 测试:ssh -p 8022 root@192.168.111.14
  7. 不同机器节点上的两个docker即可互相ssh免密登录

2.2.2 host模式

  • 暂时没有使用这种网络模式

host模式下,容器与宿主机共享网络协议栈,那么应该如何进行区分呢?
因为在ssh时需要指定用户,如何区分docker以及裸机的用户?

因为在免密登录时用的就是8022端口,所以就通过这个端口进行区分,在mpirun的参数中指定端口为8022

3.如何运行容器

docker run -it --rm --gpus all --network host 4135d6236dc3 /bin/bash

nvidia-docker run -it --network=host -v /mnt/share/ssh:/root/.ssh --cap-add=IPC_LOCK --device=/dev/infiniband horovod:latest

docker run -it --rm --gpus all --network=host -v /mnt/share/ssh:/root/.ssh 969ce57b1fc2 bash

 docker run --net="host" -e NVIDIA_VISIBLE_DEVICES=0 --gpus all --shm-size 8g -it 969ce57b1fc2 bash
 docker run --net="host" -e NVIDIA_VISIBLE_DEVICES=0 --gpus all --shm-size 8g -it 1d7ed8ccf728 bash
docker run --net="host" -e NVIDIA_VISIBLE_DEVICES=0 --gpus all --shm-size 128g -it 5ad166d33bdd bash
docker run  -e NVIDIA_VISIBLE_DEVICES=0 --gpus all --shm-size 128g -p 8022:22 -it 5ad166d33bdd bash

/root/byteps/bytescheduler/examples/mxnet-image-classification

运行之后记得打开ssh服务, /etc/init.d/ssh start

export LD_LIBRARY_PATH=/usr/local/cuda/lib64

4.程序运行语句

mpirun --allow-run-as-root -np 2 -H ubuntu90:1,sugon92:1 -bind-to none -map-by slot -mca plm_rsh_args "-p 31028" -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib -mca btl_tcp_if_include eno1 python tensorflow_mnist.py

mpirun --allow-run-as-root -np 2 -H 192.168.111.13:1,192.168.111.14:1 -bind-to none -map-by slot -mca plm_rsh_args "-p 8022" -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eno33np0 -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib -mca btl_tcp_if_include eno33np0 python pytorch_horovod_benchmark.py --num-iters 100 --model resnet50 --partition 10000
以上命令可行,看起来需要设定一个比较小的partition值

如果使用模型是resnet50,那么不能设置num-classes为10000
resnet18可以设置num-classes为10000

partition过大,就会造成多处all-reduce,进而发生冲突,所以一定要减小

–num-iters 100
–model resnet通信量比较小,效果不好在所难免,所以使用vgg16
–num-classes 作者回答是使用10000
–partition :最好还是用较小的值?
One or more tensors were submitted to be reduced, gathered or broadcasted by subset of ranks and are waiting for remainder of ranks for more than 60 seconds. This may indicate that different ranks are trying to submit different tensors or that only subset of ranks is submitting tensors, which will cause deadlock.

export BYTESCHEDULER_CREDIT=16000000
export BYTESCHEDULER_PARTITION= 8000000
export USE_BYTESCHEDULER=1
两个环境变量设置为很大的数字,则效果与horovod一样

mpirun --allow-run-as-root -np 2 -H 192.168.111.13:1,192.168.111.14:1 -bind-to none -map-by slot -mca plm_rsh_args "-p 8022" -x NCCL_DEBUG=INFO -x NCCL_SOCKET_IFNAME=eno33np0 -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib -mca btl_tcp_if_include eno33np0 python pytorch_horovod_benchmark.py --num-iters 100 --model vgg16 --num-classes 10000

5.结果讨论

  1. 单docker多卡
  2. 双docker双卡,使用horovodrun即可
    horovodrun -np 2 -H 172.17.0.3:1,172.17.0.4:1 --verbose python pytorch_horovod_benchmark.py
  3. 不同机器节点双docker双卡
    horovodrun -np 2 -p 8022 -H 192.168.111.13:1,192.168.111.14:1 --verbose python pytorch_horovod_benchmark.py
    以上命令无法运行,因为容器互相ssh走的是8022端口,非22端口必须要用mpirun做更为精细的配置

357.7 ±46.3

只用horovod是405.8

如果不用BS,必须在多个终端同时设置环境变量

109.3 ±0.8

685.5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值