在docker中安装联邦学习fedml框架

在docker中安装联邦学习fedml框架

这里主要介绍docker容器跨物理机的分布式fedml的安装方法

fedml的官方安装教程:http://doc.fedml.ai/#/installation-distributed-computing

由于官方的安装教程不是基于docker的,由于某些原因,本人需要在docker环境中安装fedml

几个关键的步骤是:

  1. 在你的多个物理节点中启动多个docker容器,作为部署fedml的节点。docker容器可以预留出几个端口,用来起jupyter服务之类的。参考:
    docker run --gpus all -itd --privileged --name=fedml_x -p 1000-1010:1000-1010 ufoym/deepo /bin/bash

    这里推荐用镜像ufoym/deepo,这个镜像已经把gpu环境以及torch和tf安装好了。

  2. 要让这多个docker容器组成集群,这样容器之间才可以相互发送数据,如果你的容器全是在同一台物理机上,那么就没必要组成集群了,直接把它们当成物理机按照官方文档部署就可以了。这里有个注意的点,笔者之前对docker不熟悉,一开始把容器的ip设置为宿主机的ip,然后通过修改ssh的端口号做无密码登录,但是这样会在mpirun那里碰到问题,mpirun命令会随机占用一个容器中可用的端口号,而且没法设置,也就没法做容器和宿主的端口映射,这里浪费了很多时间,其实同节点的docker容器是可以相互内网通信的,不需要经过宿主机的端口映射,参考docker network。
    docker容器组网的方式详见官网:https://docs.docker.com/network/network-tutorial-overlay/#use-an-overlay-network-for-standalone-containers,笔者命令参考:
    host1$ docker swarm init
    
    host2$ docker swarm join --token SWMTKN-1-5g90q48weqrtqryq4kj6ow0e8xm9wmv9o6vgqc5j320ymybd5c-8ex8j0bc40s6hgvy5ui5gl4gy 172.31.47.252:2377
    
    host1$ docker network create --driver=overlay --attachable fedml-net

    到这一步,在host1中docker network ls应该能看到fedml-net,但是在host2中还看不到,没关系,继续。把容器加入到fedml-net网络中:
     

    host1$ docker network connect fedml-net fedml_x
    
    host2$ docker network connect fedml-net fedml_y

    到这一步host2中应该就能看到fedml-net网络了,可以在容器的/etc/hosts中看到其内网ip,这个ip地址每个容器都不一样,可以测试一下相互能不能ping通。

  3. 当前容器ufoym/deepo用的系统python版本是3.6,但是fedml要求是python3.7,可以装个conda和python3.7环境,在python3.7中装好torch后仍然是可以用cuda的。

  4. 设置无密码ssh,这里只需要让任务提交节点能够无密码登录其他容器就可以了,不需要两两无密码登录,可以用ssh-copy-id命令复制id,不需要按照fedml官网的方式手动复制。
     

    fedml_x$ ssh-keygen -t rsa
    
    fedml_x$ ssh-copy-id fedml_y

     

  5. 可以设置下每个容器的/etc/hosts,给每个容器映射一个新的hostname
     

  6. 把它要的几个包在每个节点装一下,还有它的git代码,在每个容器上的相同目录中拉取一份
    conda install pytorch torchvision cudatoolkit=10.2 -c pytorch -n fedml
    conda install -c anaconda mpi4py -n fedml
    pip install --upgrade wandb
    pip install scikit-learn numpy h5py setproctitle networkx paho-mqtt

     

  7. 把hostfile设置一下,测试下mpirun正不正常:
     

    mpirun -np 4 -verbose -hostfile ./mpi_host_file echo "2333"

    如果打印出来4个2333,那就没问题,否则看下日志里面报的什么错误

  8. 到https://wandb.ai/上申请一个帐号,到User Settings中复制下你的API keys。在任务提交容器中登录你的wandb,直接用命令行:wandb login登录,根据提示粘贴你的API keys就可以了。

  9. 在$CODE_HOME/fedml_experiments/distributed/fedavg中跑一下横向联邦学习的测试脚本,不需要提前手动下载数据,注意下,截止到当前20201028的fedml源码中的run_fedavg_distributed_pytorch.sh中需要把

    hostname > mpi_host_file

    注释掉,否则mpi_host_file每次都被覆盖,就跑成单机的了。

 稍作记录,以便后人

你可能感兴趣的:(联邦学习,机器学习,docker)