联邦学习FATE入门与应用实战

FATE简介

FATE(Federated AI Technology Enabler)是微众银行基于联邦学习技术推出的全球首个工业级开源架构,它能实现基于同态加密和多方计算的安全计算协议,并支持联邦学习架构与各种机器学习算法的安全计算。项目地址:(https://github.com/FederatedAI/FATE/)

KubeFATE

image-20200507153237255

FATE的部署模型以及基于Docker-Compose快速部署联邦学习开发实验环境

Docker Compose简介

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。要了解有关Compose的所有功能的更多信息,请参阅相关文档

使用Docker compose 可以方便的部署FATE,下面是使用步骤。

目标

两个可以互通的FATE实例,每个实例均包括FATE所有组件。

环境准备

  1. 两个主机(物理机或者虚拟机,都是Centos7系统);

    VMware安装Centos7超详细过程(图文)

    注意:选择连接方式时不要选桥接模式,选择NET.

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

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

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

  5. 运行机已经下载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 常用命令

image-20200507154006773

部署架构图

image-20200506194454580

image-20200506194654839

用Docker Compose部署FATE

配置需要部署的实例数目

部署脚本提供了部署多个FATE实例的功能,下面的例子我们部署在两个机器上,每个机器运行一个FATE实例,这里两台机器的IP分别为192.168.233.129192.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-.tarserving-.tar分别复制到party对应的主机上并解包,解包后的文件默认在/data/projects/fate目录下。然后脚本将远程登录到这些主机并使用docker compose命令启动FATE实例。

命令成功执行返回后,登录其中任意一个主机:

$ ssh root@192.168.233.129

使用以下命令验证实例状态,

$ docker ps

输出显示如下,若各个组件都是运行(up)状态,说明部署成功。

image-20200507162843146

验证部署

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        #验证

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

image-20200507163058836

验证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:

image-20200507164148798

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:

image-20200507164253650

修改加载模型的配置

修改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

image-20200507165952098

修改绑定模型的配置
$ 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