写点什么

使用 KubeFATE 快速部署联邦学习实验开发环境(二)

  • 2020-05-08
  • 本文字数:4625 字

    阅读完需:约 15 分钟

使用KubeFATE快速部署联邦学习实验开发环境(二)

在前面的文章中,我们介绍过如何使用 KubeFATE 来部署一个单节点的 FATE 联邦学习集群。在真实的应用场景中,联邦学习往往需要多个参与方联合起来一起完成任务。基于此,本文将讲述如何通过 KubeFATE 和 Docker-Compose 来部署两个参与方的 FATE 集群,并在集群上运行一些简单的测试以验证其功能的完整性。

FATE 集群的组网方式

联邦学习的训练任务需要多方参与,如图 1 所示,每一个 party node 都是一方,并且每个 party node 都有各自的一套 FATE 集群。而 party node 和 party node 之间的发现方式有两种。分别是点对点和星型。默认情况下,使用 KubeFATE 部署的多方集群会通过点对点的方式组网,但 KubeFATE 也可以单独部署 Exchange 服务以支持星型组网。


部署两方训练的集群

使用 KubeFATE 和 Docker-Compose 部署两方训练的集群


KubeFATE 的使用分成两部分,第一部分是生成 FATE 集群的启动文件(docker-compose.yaml),第二个部分是通过 docker-compose 的方式去启动 FATE 集群。从逻辑上可将进行这两部分工作的机器分别称为部署机和目标机器。


目标

两个可以互通的 FATE 实例,每个实例均包括 FATE 所有组件,实例分别部署在不同的两台机器上。

准备工作

1、两个主机(物理机或者虚拟机,Ubuntu 或 Centos7 系统,允许以 root 用户登录);


2、所有主机安装 Docker 版本 : 18+;


3、所有主机安装 Docker-Compose 版本: 1.24+;


4、部署机可以联网,所以主机相互之间可以网络互通;


5、运行机已经下载 FATE 的各组件镜像


Docker 的安装以及 FATE 镜像的下载请参考前文,接下来我们将把两台主机划分为 workspace1 和 workspace2。其中 workspace1 既作为部署机也作为目标机,而 workspace2 则作为目标机,每个机器运行一个 FATE 实例。这里两台主机的 IP 分别为 192.168.7.1 和 192.168.7.2。用户需要根据实际情况做出修改。具体部署架构如图 2 所示。



以下操作需在 workspace1 上并以 root 用户进行。


下载并解压 Kubefate1.3 的 kubefate-docker-compose.tar.gz 资源包


# curl -OLhttps://github.com/FederatedAI/KubeFATE/releases/download/v1.3.0/kubefate-docker-compose.tar.gz
# tar -xzf kubefate-docker-compose.tar.gz
复制代码

定义需要部署的实例数目

进入docker-deploy目录# cd docker-deploy/
编辑parties.conf如下# vi parties.conf
user=root dir=/data/projects/fate partylist=(10000 9999) partyiplist=(192.168.7.1 192.168.7.2) servingiplist=(192.168.7.1 192.168.7.2) exchangeip=
复制代码


根据以上定义 party 10000 的集群将部署在 workspace1 上,而 party 9999 的集群将部署在 workspace2 上。

执行生成集群启动文件脚本

# bash generate_config.sh 
复制代码

执行启动集群脚本

# bash docker_deploy.sh all
命令输入后需要用户输入4次root用户的密码
复制代码

验证集群基本功能

# docker exec -it confs-10000_python_1 bash
# cd /data/projects/fate/python/examples/toy_example
# python run_toy_example.py 10000 9999 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"
复制代码

验证 Serving-Service 功能

以下内容将会对部署好的两个 FATE 集群进行简单的训练和推理测试。训练所用到的数据集是”breast”,其中”breast”按列分为”breast_a”和”breast_b”两部分,参与训练的 host 方持有”breast_a”,而 guest 方则持有”breast_b”。guest 和 host 将联合起来对数据集进行一个异构的逻辑回归训练。最后当训练完成后还会将得到的模型推送到 FATE Serving 作在线推理。


以下操作在 workspace1 上进行:


进入python容器
# docker exec -it confs-10000_python_1 bash
进入fate_flow目录
# cd fate_flow
修改examples/upload_host.json
# vi examples/upload_host.json{ "file": "examples/data/breast_a.csv", "head": 1, "partition": 10, "work_mode": 1, "namespace": "fate_flow_test_breast", "table_name": "breast"}
把“breast_a.csv”上传到系统中
# python fate_flow_client.py -f upload -c examples/upload_host.json
复制代码


以下操作在 workspace2 上进行:


进入python容器
# docker exec -it confs-9999_python_1 bash
进入fate_flow目录
# cd fate_flow
修改examples/upload_guest.json
# vi examples/upload_guest.json{ "file": "examples/data/breast_b.csv", "head": 1, "partition": 10, "work_mode": 1, "namespace": "fate_flow_test_breast", "table_name": "breast"}
把“breast_b.csv”上传到系统中
# python fate_flow_client.py -f upload -c examples/upload_guest.json
修改examples/test_hetero_lr_job_conf.json
# vi examples/test_hetero_lr_job_conf.json{ "initiator": { "role": "guest", "party_id": 9999 }, "job_parameters": { "work_mode": 1 }, "role": { "guest": [9999], "host": [10000], "arbiter": [10000] }, "role_parameters": { "guest": { "args": { "data": { "train_data": [{"name": "breast", "namespace": "fate_flow_test_breast"}] } }, "dataio_0":{ "with_label": [true], "label_name": ["y"], "label_type": ["int"], "output_format": ["dense"] } }, "host": { "args": { "data": { "train_data": [{"name": "breast", "namespace": "fate_flow_test_breast"}] } }, "dataio_0":{ "with_label": [false], "output_format": ["dense"] } } }, ....}
复制代码


提交任务对上传的数据集进行训练


# python fate_flow_client.py -f submit_job -d examples/test_hetero_lr_job_dsl.json -c examples/test_hetero_lr_job_conf.json
复制代码


输出结果:


{    "data": {        "board_url": "http://fateboard:8080/index.html#/dashboard?job_id=202003060553168191842&role=guest&party_id=9999",        "job_dsl_path": "/data/projects/fate/python/jobs/202003060553168191842/job_dsl.json",        "job_runtime_conf_path": "/data/projects/fate/python/jobs/202003060553168191842/job_runtime_conf.json",        "logs_directory": "/data/projects/fate/python/logs/202003060553168191842",        "model_info": {            "model_id": "arbiter-10000#guest-9999#host-10000#model",            "model_version": "202003060553168191842"        }    },    "jobId": "202003060553168191842",    "retcode": 0,    "retmsg": "success"}
复制代码


训练好的模型会存储在 EGG 节点中,模型可通过在上述输出中的“model_id” 和 “model_version” 来定位。FATE Serving 的加载和绑定模型操作都需要用户提供这两个值。


查看任务状态直到”f_status”为 success,把上一步中输出的“jobId”方在“-j”后面。


# python fate_flow_client.py -f query_task -j 202003060553168191842 | grep f_status
output:
"f_status": "success", "f_status": "success",
复制代码


修改加载模型的配置,把上一步中输出的“model_id”和“model_version”与文件中的进行替换。


# vi examples/publish_load_model.json{    "initiator": {        "party_id": "9999",        "role": "guest"    },    "role": {        "guest": ["9999"],        "host": ["10000"],        "arbiter": ["10000"]    },    "job_parameters": {        "work_mode": 1,        "model_id": "arbiter-10000#guest-9999#host-10000#model",        "model_version": "202003060553168191842"    }}
复制代码


加载模型


# python fate_flow_client.py -f load -c examples/publish_load_model.json
复制代码


修改绑定模型的配置, 替换“model_id”和“model_version”,并给“service_id”赋值“test”。其中“service_id”是推理服务的标识,该标识与一个模型关联。用户向 FATE Serving 发送请求时需要带上“service_id”,这样 FATE Serving 才会知道用哪个模型处理用户的推理请求。


# vi examples/bind_model_service.json{    "service_id": "test",    "initiator": {        "party_id": "9999",        "role": "guest"    },    "role": {        "guest": ["9999"],        "host": ["10000"],        "arbiter": ["10000"]    },    "job_parameters": {        "work_mode": 1,        "model_id": "arbiter-10000#guest-9999#host-10000#model",        "model_version": "202003060553168191842"    }}
复制代码


绑定模型


# python fate_flow_client.py -f bind -c examples/bind_model_service.json
复制代码


在线测试,通过 curl 发送以下信息到 192.168.7.2:8059/federation/v1/inference


curl -X POST -H 'Content-Type: application/json' -d ' {"head":{"serviceId":"test"},"body":{"featureData": {"x0": 0.254879,"x1": -1.046633,"x2": 0.209656,"x3": 0.074214,"x4": -0.441366,"x5": -0.377645,"x6": -0.485934,"x7": 0.347072,"x8": -0.287570,"x9": -0.733474}}' 'http://192.168.7.2:8059/federation/v1/inference'
复制代码


输出结果:


{"flag":0,"data":{"prob":0.30684422824464636,"retmsg":"success","retcode":0}
复制代码


若输出结果如上所示,则验证了 serving-service 的功能是正常的。上述结果说明有以上特征的人确诊概率为 30%左右。

删除部署

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


# bash docker_deploy.sh --delete all
复制代码


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


# cd /data/projects/fate/confs-<id>/ # the id of party# docker-compose down# rm -rf ../confs-<id>/ 
复制代码


KubeFATE 开源项目:


https://github.com/FederatedAI/KubeFATE


FATE 开源项目:


https://github.com/FederatedAI/FATE


作者介绍:


陈家豪,VMware 云原生实验室工程师,FATE/KubeFATE 项目贡献者。


相关文章:


《用 FATE 进行图片识别的联邦学习实践》


《使用 KubeFATE 快速部署联邦学习实验开发环境(一)》


2020-05-08 11:442586

评论 1 条评论

发布
用户头像
这个是不是有问题啊

2021-07-21 20:19
回复
没有更多了
发现更多内容

TASKCTL分布式任务调度平台-流程控制原理

敏捷调度TASKCTL

程序员 DevOps 分布式 大数据运维 TASKCTL

【等保测评】2022年深圳等保测评公司排名看这里!

行云管家

等保 深圳 等保测评 等保2.0

Day308

爱好编程进阶

Java 程序员 后端开发

如何开发 LAXCUS 分布式应用软件(二):基本构成

LAXCUS分布式操作系统

集群架构 并行计算 分布式操作系统 分布式应用

GitHub成功收获87

爱好编程进阶

Java 程序员 后端开发

数据增强(一):imgaug

AIWeker

人工智能 深度学习 数据增强 5月月更

时序数据库为万物互联打下坚实的基石

华为云开发者联盟

数据仓库 物联网 时序数据库 GaussDB 时序数据

火山引擎入选“2022 中国边缘计算20强”榜单

火山引擎边缘云

边缘计算

我是如何做到百万数据跑批半小时结束

skow

后端 java

GitHub上最牛逼的Java教程,标星yyds:算法

爱好编程进阶

Java 程序员 后端开发

十年磨一剑|沃趣数据库云产品战略首发

沃趣科技

云原生 公有云 私有云 数据库云 沃趣科技

直播预告丨Hello HarmonyOS进阶课程第二课——计算机视觉

HarmonyOS开发者

HarmonyOS 图形图像 视觉开发

案例分享|一键式自动监测,跨境电商平台的业务转型模板

博睿数据

博睿数据 数据链DNA

跨端跨框架 UI 自动化测试方案 Flybirds

liang chen

七大章节解读「中台」的前世今生

菜根老谭

中台 中台架构

秒云助力上海金融信息技术应用创新联合攻关基地正式上线信创容器云平台

MIAOYUN

云原生 信创 智能运维 一云多芯解决方案

Swoole 定时器能实现毫秒级任务调度,你敢相信吗?

CRMEB

【IT运维】运维告警方式有哪些?哪个工具好用?

行云管家

服务器 IT运维 服务器运维

Dubbo的超时和重试

爱好编程进阶

Java 程序员 后端开发

Github标星28K+,这款可视化的对象存储服务真香

爱好编程进阶

Java 程序员 后端开发

JAVA为什么需要注解?

源字节1号

Flink与Spark Streaming在与kafka结合的区别!

爱好编程进阶

Java 程序员 后端开发

Hadoop 3

爱好编程进阶

Java 程序员 后端开发

Hadoop05【命令操作】

爱好编程进阶

Java 程序员 后端开发

ICT架构体系详细说明【3】

爱好编程进阶

程序员 后端开发

大数据培训HBase读写性能优化的详解

@零度

大数据 HBase

OpenMLDB官网升级,神秘贡献者地图带你快速进阶!

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

Docker:第二章:部署项目

爱好编程进阶

Java 程序员 后端开发

Dropzone

爱好编程进阶

Java 程序员 后端开发

GC:你要用什么方式把我丢掉?

爱好编程进阶

Java 程序员 后端开发

Github上都在疯找的阿里内部“全栈技能修炼”终于来了

爱好编程进阶

Java 程序员 后端开发

使用KubeFATE快速部署联邦学习实验开发环境(二)_开源_陈家豪_InfoQ精选文章