使用KubeFATE部署单机联邦学习环境(一)

目录

一、基础知识

1.KubeFATE

2.FATE整体架构

3.基本工作流程

二、使用docker-compose部署KubeFATE(以下操作均在root权限下操作)

1.安装docker

2.安装docker-compose

3.在要运行的目标机上下载FATE的docker镜像并加载

4.在部署机上下载并解压Kubefate1.3的kubefate-docker-compose.tar.gz资源包

5.定义需要部署的实例数目用于生成部署脚本并进行部署

6.在目标机上验证

7.删除部署


一、基础知识

1.KubeFATE

FATE(Federated AI Technology Enabler)是一个联邦学习框架,能有效帮助多个机构在满足用户隐私保护、数据安全和政府法规的要求下,进行数据使用和建模。但由于其系统的分布式特性,导致使用存在一定门槛。此外由于多个服务之间有相互依赖,一个服务的失败可能导致整个集群的不可用,这给系统运维也带来了一定的挑战。基于这个出发点,微众和VMware联合开发了KubeFATE项目,致力于解决联邦学习的使用门槛和降低运维的成本。

由于KubeFATE使用了容器技术对FATE进行了封装,因此相对于传统的安装部署,使用KubeFATE有以下优点:

  1. 使用简单,免除缺失依赖软件包的烦恼。
  2. 配置方便,一个配置文件就能部署多套集群。
  3. 管理灵活,可按需增减集群规模。
  4. 适用于云环境。

目前KubeFATE支持使用Docker-Compose和Kubernetes两种方式来部署和管理FATE集群,分别面向了测试开发和生产这两种使用场景。本文主要关注于测试开发的部署,因此在接下来的部署中会使用Docker-Compose这种方式。

2.FATE整体架构

  • FATE Flow:该服务分为Client和Server两部分,其中Client部分由用户使用,用于向FATE集群提交联邦学习任务;FATE Flow Server是FATE集群对外提供服务的入口,同时它也负责调度、执行用户提交的任务请求和协调任务参与方。

  • MySQL:与任务相关的一些元数据,如创建时间,状态都会存在MySQL中。

  • EGG/ROLL:向训练任务提供了分布式计算和存储能力。

  • Meta Service:一组数据或一个文件,可以被切片并分布在不同的Egg上,Meta service负责管理和定位文件的切片信息。

  • Federation:由于联邦学习的特殊性质,在训练中,各个参与方之间往往会进行若干次数据互换。该服务为训练任务提供发送和接受数据的功能。

  • Proxy:该服务是一个反向代理,是FATE集群对外(训练其他参与方)的唯一入口。

  • FATE Board:向用户提供训练任务的可视化。

  • FATE Serving:在线推理服务,用户可以把训练好模型推送到该服务后作在线推理。

3.基本工作流程

  1. 根据用户定义的配置文件生成FATE集群的启动文件。
  2. 拷贝启动文件到指定机器,并用docker-compose命令启动容器。
  3. 按照需求进行配置完成训练。

通常,负责生成启动文件的服务器称为部署机,而负责运行容器的服务器称为目标机,部署机和目标机是在逻辑上的划分。在本文中,部署机和目标机为同一台机器。

二、使用docker-compose部署KubeFATE(以下操作均在root权限下操作)

1.安装docker

# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh
# usermod -aG docker $(whoami)
# exec $SHELL
# docker version                 //验证是否安装成功

 出现红框内的提示是因为没有将docker设置为开机自启,可以用以下命令设置开机自启。

# systemctl enable docker            //设置docker服务开机自启
# systemctl restart docker           //重启docker服务

2.安装docker-compose

# curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-#(uname -s)-#(uname -m)" -o /usr/local/bin/docker-compose
//网络问题无法访问github可使用下面这行
# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose
# docker-compose version            //验证安装

 如果以上两种方法都不可以的话,可以使用python的pip进行安装。

# apt install python3-pip            //安装pip
# pip install docker-compose         //安装docker-compose
# docker-compose version             //验证安装

3.在要运行的目标机上下载FATE的docker镜像并加载

//国内用户使用以下命令比较快,下载大小6.7G的镜像包
# wget https://webank-ai-1251170195.cos.ap-guangzhou.myqcloud.com/fate_1.3.0-images.tar.gz 

# docker load -i fate_1.3.0-images.tar.gz         //加载镜像,过程会很慢

# docker images                //验证下载的镜像
REPOSITORY                         TAG 
federatedai/egg                    1.3.0-release
federatedai/fateboard              1.3.0-release
federatedai/meta-service           1.3.0-release
federatedai/python                 1.3.0-release
federatedai/roll                   1.3.0-release
federatedai/proxy                  1.3.0-release
federatedai/federation             1.3.0-release
federatedai/serving-server         1.2.2-release
federatedai/serving-proxy          1.2.2-release
redis                              5
mysql                              8

4.在部署机上下载并解压Kubefate1.3的kubefate-docker-compose.tar.gz资源包

# curl -OL https://github.com/FederatedAI/KubeFATE/releases/download/v1.3.0/kubefate-docker-compose.tar.gz

# tar -xzf kubefate-docker-compose.tar.gz

5.定义需要部署的实例数目用于生成部署脚本并进行部署

# cd docker-deploy/            //进入docker-deploy目录

# vi parties.conf              //编辑parties.conf配置文件

user=root                                   
dir=/data/projects/fate                     
partylist=(10000)                      
partyiplist=(192.168.1.1)       //此处替换为目标机的IP
servingiplist=(192.168.1.1)     //此处替换为目标机的IP
exchangeip=

# bash generate_config.sh          //生成部署文件

# bash docker_deploy.sh all        //执行启动部署集群脚本
//需要输入几次目标机的root密码

6.在目标机上验证

# docker ps                //验证集群状态

CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                 NAMES
f8ae11a882ba        fatetest/fateboard:1.3.0-release      "/bin/sh -c 'cd /dat…"   5 days ago          Up 5 days           0.0.0.0:8080->8080/tcp                confs-10000_fateboard_1
d72995355962        fatetest/python:1.3.0-release         "/bin/bash -c 'sourc…"   5 days ago          Up 5 days           9360/tcp, 9380/tcp                    confs-10000_python_1
dffc70fc68ac        fatetest/egg:1.3.0-release            "/bin/sh -c 'cd /dat…"   7 days ago          Up 7 days           7778/tcp, 7888/tcp, 50001-50004/tcp   confs-10000_egg_1
dc23d75692b0        fatetest/roll:1.3.0-release           "/bin/sh -c 'cd roll…"   7 days ago          Up 7 days           8011/tcp                              confs-10000_roll_1
7e52b1b06d1a        fatetest/meta-service:1.3.0-release   "/bin/sh -c 'java -c…"   7 days ago          Up 7 days           8590/tcp                              confs-10000_meta-service_1
50a6323f5cb8        fatetest/proxy:1.3.0-release          "/bin/sh -c 'cd /dat…"   7 days ago          Up 7 days           0.0.0.0:9370->9370/tcp                confs-10000_proxy_1
4526f8e57004        redis:5                                   "docker-entrypoint.s…"   7 days ago          Up 7 days           6379/tcp                              confs-10000_redis_1
586f3f2fe191        fatetest/federation:1.3.0-release     "/bin/sh -c 'cd /dat…"   7 days ago          Up 7 days           9394/tcp                              confs-10000_federation_1
ec434dcbbff1        mysql:8                                   "docker-entrypoint.s…"   7 days ago          Up 7 days           3306/tcp, 33060/tcp                   confs-10000_mysql_1
68b1d6c68b6c        federatedai/serving-proxy:1.2.2-release    "/bin/sh -c 'java -D…"   32 hours ago        Up 32 hours         0.0.0.0:8059->8059/tcp, 0.0.0.0:8869->8869/tcp, 8879/tcp   serving-10000_serving-proxy_1
7937ecf2974e        redis:5                                    "docker-entrypoint.s…"   32 hours ago        Up 32 hours         6379/tcp                                                   serving-10000_redis_1
00a8d98021a6        federatedai/serving-server:1.2.2-release   "/bin/sh -c 'java -c…"   32 hours ago        Up 32 hours         0.0.0.0:8000->8000/tcp                                     serving-10000_serving-server_1
# docker exec -it confs-10000_python_1 bash                //进入集群10000的python容器

# cd /data/projects/fate/python/examples/toy_example       //进入测试文件夹

# python run_toy_example.py 10000 10000 1                  //执行测试脚本

如果测试通过,屏幕将显示类似如下消息:

"2019-08-29 07:21:25,353 - secure_add_guest.py[line:96] - INFO: begin to init parameters of secure add example guest"
"2019-08-29 07:21:25,354 - secure_add_guest.py[line:99] - INFO: begin to make guest data"
"2019-08-29 07:21:26,225 - secure_add_guest.py[line:102] - INFO: split data into two random parts"
"2019-08-29 07:21:29,140 - secure_add_guest.py[line:105] - INFO: share one random part data to host"
"2019-08-29 07:21:29,237 - secure_add_guest.py[line:108] - INFO: get share of one random part data from host"
"2019-08-29 07:21:33,073 - secure_add_guest.py[line:111] - INFO: begin to get sum of guest and host"
"2019-08-29 07:21:33,920 - secure_add_guest.py[line:114] - INFO: receive host sum from guest"
"2019-08-29 07:21:34,118 - secure_add_guest.py[line:121] - INFO: success to calculate secure_sum, it is 2000.0000000000002"

这样一个单方的FATE实例就部署完成了。

7.删除部署

如果需要删除部署,则在部署机器上运行以下命令可以停止所有FATE集群:

# bash docker_deploy.sh --delete all

如果想要彻底删除在运行机器上部署的FATE,可以分别登录节点,然后运行命令:

# cd /data/projects/fate/confs-<id>/                //此处的ID就是集群的ID
# docker-compose down
# rm -rf ../confs-<id>/

猜你喜欢

转载自blog.csdn.net/SAGIRIsagiri/article/details/124105064