写点什么

使用 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:442850

评论 1 条评论

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

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

Windows(Win10/Win11) 系统开机自启

玄兴梦影

开机自启

文献解读-Effectiveness of mRNA BNT162b2 COVID-19 vaccine up to 6 months in a large integrated health system in the USA: a retrospect

INSVAST

基因检测 临床试验 生信分析 Sentieon 变异检测

IPv6升级改造三种技术方案优劣分析及选择

防火墙后吃泡面

官宣!通义灵码 AI 程序员全面上线

阿里巴巴云原生

阿里云 云原生 通义灵码

官宣!通义灵码 AI 程序员全面上线

阿里云云效

阿里云 云原生 通义灵码

实力!云起无垠入选中国信通院《数字安全护航技术能力全景图》

云起无垠

预见未来,智控风险:数据驱动风险管控新范式

用友智能财务

数据处理 财会

智慧公厕的定义、核心功能、优势与应用场景

光明源智慧厕所

2025,谁会成为 AI Agent 的新入口?|播客《编码人声》

声网

成为敏捷引领者,Scrum中文网PSM课程助你成就ScrumMaster之路

爱吃鱼的小雨

Scrum 敏捷开发 ScrumMaster认证 敏捷培训 PSM

Linux ssh 登录及免密登录

玄兴梦影

Linux 免密登录

微软开源超强小模型 Phi-4,超 GPT-4o、可商用;HeyGen 集成 Sora 推全新数字人技术

声网

📢 2025 First LOOK! CnosDB 新版本 2.4.3.1 发布 📢

CnosDB

AI rust 物联网 时序数据库 CnosDB

智慧厕所如何颠覆传统公共设施?功能与价值全面解析

光明源智慧厕所

Java验证邮箱是否有用的实现与解析

不在线第一只蜗牛

Java 前端

讯飞星火办公智能体,杜绝职场人的“年会不消停”

脑极体

AI

AICon演讲实录 | 谢皓:AI Agent 在边缘云的探索与实践

火山引擎边缘云

边缘计算 智能硬件 AI 大底座 Agents 边缘智能

2024数据库编程大赛冠军挑战赛,5位选手用DuckDB和Doris挑战成功

NineData

sql Doris NineData 云数据库技术 数据库编程大赛

杭州铭师堂的云原生升级实践

阿里巴巴云原生

阿里云 云原生

TypeScript与JavaScript的区别

秃头小帅oi

还不会 Cert Manager 自动签发证书?一文掌握

北京好雨科技有限公司

Kubernetes rainbond 云原生‘’ 企业号 2025年1月PK榜

预测市场平台 Aegis:Al Agent + Web3,为预测市场提供新的动力

股市老人

怎么制作情绪板?10个情绪板案例盘点!

职场工具箱

设计 设计师 在线白板 办公软件 可视化展示

NineData云原生智能数据管理平台新功能发布|2024年12月版

NineData

oracle DevOps Package 存储过程 NineData

见证广州地铁11号线开通:30个智慧公厕点亮城市新风貌

光明源智慧厕所

解读智慧厕所的环保与高效双重优势,助力可持续城市建设

光明源智慧厕所

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