FATE简介
FATE(Federated AI Technology Enabler)是微众银行基于联邦学习技术推出的全球首个工业级开源架构,它能实现基于同态加密和多方计算的安全计算协议,并支持联邦学习架构与各种机器学习算法的安全计算。项目地址:(https://github.com/FederatedAI/FATE/)
KubeFATE
FATE的部署模型以及基于Docker-Compose快速部署联邦学习开发实验环境
Docker Compose简介
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。要了解有关Compose的所有功能的更多信息,请参阅相关文档
使用Docker compose 可以方便的部署FATE,下面是使用步骤。
目标
两个可以互通的FATE实例,每个实例均包括FATE所有组件。
环境准备
-
两个主机(物理机或者虚拟机,都是Centos7系统);
注意:选择连接方式时不要选桥接模式,选择NET.
-
所有主机安装Docker 版本 : 18+;
-
所有主机安装Docker-Compose 版本: 1.24+;
-
部署机可以联网,所以主机相互之间可以网络互通;
-
运行机已经下载FATE 的各组件镜像(离线构建镜像参考文档构建镜像)(这一步参考Docker Compose部署FATEl)
centos7上安装docker和docker-compose:
参考链接:
https://www.cnblogs.com/yufeng218/p/8370670.html
https://www.cnblogs.com/nieqibest/p/9846655.html
部署架构图
用Docker Compose部署FATE
配置需要部署的实例数目
部署脚本提供了部署多个FATE实例的功能,下面的例子我们部署在两个机器上,每个机器运行一个FATE实例,这里两台机器的IP分别为192.168.233.129和192.168.233.130
根据需求修改配置文件kubeFATE\docker-deploy\parties.conf
。
下面是修改好的文件,party 10000
的集群将部署在192.168.233.129上,而party 9999
的集群将部署在192.168.233.130上。
user=root # 运行FATE容器的用户
dir=/data/projects/fate # docker-compose部署目录
partylist=(10000 9999) # 组织id
partyiplist=(192.168.233.129 192.168.233.130) # id对应训练集群ip
servingiplist=(192.168.233.129 192.168.233.130) # id对应在线预测集群ip
exchangeip= # 通信组件标识
注意: 默认情况下不会部署exchange组件。如需部署,用户可以把服务器IP填入上述配置文件的exchangeip
中,该组件的默认监听端口为9371
在运行部署脚本之前,需要确保部署机器可以ssh免密登录到两个运行节点主机上。user代表免密的用户。
执行部署脚本
以下修改可在任意机器执行。这里,我以在192.168.233.129上为例:
进入目录kubeFATE\docker-deploy
,然后运行:
$ bash generate_config.sh # 生成部署文件
$ bash docker_deploy.sh all # 在各个party上部署FATE
脚本将会生成10000、9999两个组织(Party)的部署文件,然后打包成tar文件。接着把tar文件confs-.tar
、serving-.tar
分别复制到party对应的主机上并解包,解包后的文件默认在/data/projects/fate
目录下。然后脚本将远程登录到这些主机并使用docker compose命令启动FATE实例。
命令成功执行返回后,登录其中任意一个主机:
$ ssh root@192.168.233.129
使用以下命令验证实例状态,
$ docker ps
输出显示如下,若各个组件都是运行(up)状态,说明部署成功。
验证部署
docker-compose上的FATE启动成功之后需要验证各个服务是否都正常运行,我们可以通过验证toy_example示例来检测。
选择192.168.233.129这个节点验证,使用以下命令验证:
#在192.168.7.1上执行下列命令
$ docker exec -it confs-10000_python_1 bash #进入python组件容器内部
$ cd /data/projects/fate/python/examples/toy_example #toy_example目录
$ python run_toy_example.py 10000 9999 1 #验证
如果测试通过,屏幕将显示类似如下消息:
验证Serving-Service功能
Host方操作(也就是192.168.233.129)
进入python容器
$ docker exec -it confs-10000_python_1 bash
进入fate_flow目录
$ cd fate_flow
修改examples/upload_host.json
修改两个地方:work_mode 改为1,table_name改为breast
$ 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"
}
上传数据
$ python fate_flow_client.py -f upload -c examples/upload_host.json
output:
Guest方操作(也就是192.168.233.130)
进入python容器
$ docker exec -it confs-9999_python_1 bash
进入fate_flow目录
$ cd fate_flow
修改examples/upload_guest.json
修改两个地方:work_mode 改为1,table_name改为breast
$ 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"
}
上传数据
$ 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 //1.改为9999
},
"job_parameters": {
"work_mode": 1
},
"role": {
"guest": [9999], //2.改为9999
"host": [10000],
"arbiter": [10000]
},
"role_parameters": {
"guest": {
"args": {
"data": {
"train_data": [{"name": "breast", "namespace": "fate_flow_test_breast"}] //3.name改成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"}] //4.name改成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
output:
修改加载模型的配置
修改model_id,model_version为output对应的结果,party_id为9999,guest为9999
$ 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": "202005060700240702103"
}
}
加载模型
$ python fate_flow_client.py -f load -c examples/publish_load_model.json
修改绑定模型的配置
$ vi examples/bind_model_service.json
{
"service_id": "test",//自定义:如test
"initiator": {
"party_id": "9999",//修改
"role": "guest"
},
"role": {
"guest": ["9999"],//修改
"host": ["10000"],
"arbiter": ["10000"]
},
"job_parameters": {
"work_mode": 0,
"model_id": "arbiter-10000#guest-9999#host-10000#model",//修改
"model_version": "202005060700240702103"//修改
},
"servings": [
]
}
绑定模型
$ python fate_flow_client.py -f bind -c examples/bind_model_service.json
在线测试
发送以下信息到{SERVING_SERVICE_IP}:8059/federation/v1/inference
# HTTP Method:POST
# HEADERs:
# - Content-Type:application/json
{
"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,
}
}
}
output:
{"flag":0,"data":{"prob":0.30684422824464636,"retmsg":"success","retcode":0}
删除部署
在部署机器上运行以下命令可以停止所有FATE集群:
bash docker_deploy.sh --delete all
如果想要彻底删除在运行机器上部署的FATE,可以分别登录节点,然后运行命令:
$ cd /data/projects/fate/confs-<id>/ # <id> 组织的id,本例中代表10000或者9999
$ docker-compose down
$ rm -rf ../confs-<id>/ # 删除docker-compose部署文件
参考链接:
https://github.com/FederatedAI/KubeFATE/blob/master/docker-deploy/README_zh.md
https://www.jiqizhixin.com/articles/2020-03-13-7