联邦学习框架FATE实践(训练/测试步骤及参数说明)

一、FATE概念

1. 角色

在Fate的概念中分成3种角色,Guest、Host、Arbiter
(1)Guest表示数据应用方,在纵向算法中,Guest往往是有标签y的一方。一般是由Guest发起建模流程。
(2)Host是数据提供方
(3)arbiter是用来辅助多方完成联合建模的,主要的作用是用来聚合梯度或者模型,比如纵向lr里面,各方将自己一半的梯度发送给arbiter,然后arbiter再联合优化等等,arbiter还参与以及分发公私钥,进行加解密服务等等。

二、训练

1. 准备

在FATE中构建算法模型,需要准备三个配置文件。
(1)上传数据配置文件:用于上传数据
(2)DSL配置文件:用于定义建模任务
(3)运行配置文件:用于设置每个组件的参数

2. 定义上传数据配置文件

(1)参数说明:

file: 文件路径
head: 指定数据文件是否包含表头
partition: 指定用于存储数据的分区数
work_mode: 指定工作模式,0代表单机版,1代表集群版
table_name&namespace: 存储数据表的标识符号

(2)示例
{
  "file": "examples/data/breast_b.csv",
  "head": 1,
  "partition": 10,
  "work_mode": 0,
  "table_name": "hetero_breast_b",
  "namespace": "hetero_guest_breast"
}

3. 定义DSL 配置文件

(1)概念

FATE 使用特定语言 DSL 来描述任务,各种模块可通过一个有向无环图组织起来。DSL 配置文件采用 json 格式,整个配置文件就是一个 json 对象 (dict)。在这个 dict 的第一级是 “components”,表示这个任务将会使用到的各个模块,每个独立的模块定义在 “components” 之下。

(2)参数说明

module_name:模块的键。用户需要使用模块名加数字 _num 作为对应模块的 key,例如 dataio_0,并且数字应从 0 开始计数。这用于区分可能存在的多个相同种类的模块。
module:用来指定使用的模块。这个参数的内容需要和 federatedml/conf/setting_conf 下各个模块的文件名保持一致。模块名链接
input:输入。分为两种输入类型,分别是 data 和 model。
output:输出。和 input 一样,有 data 和 model 两种类型。
need_deploy:是或否。该字段用于指定组件是否需要部署以进行在线推断。该字段仅用于在线推论dsl推论。

(3)示例
{
  "components" : {
          "dataio_0": {
                "module": "DataIO",
                "input": {
                    "data": {
                        "data": [
                            "args.train_data"
                        ]
                    }
                },
                "output": {
                    "data": ["train"],
                    "model": ["dataio"]
                },
                "need_deploy": true
            }
      }
  }

4.定义运行配置文件

(1)概念

每个模块都有不同的参数需要配置,不同的 party 对于同一个模块的参数也可能有所区别。为了简化这种情况,对于每一个模块,FATE 会将所有 party 的不同参数保存到同一个运行配置文件(Submit Runtime Conf)中,并且所有的 party 都将共用这个配置文件。

(2)参数说明

initiator:指定启动器的角色和参与方ID。
job_parameters:设置work_mode 和processor_per_node。
role:指示所有角色的所有参与方ID。每个角色的 party_id 以列表形式存在,因为一个任务可能涉及到多个 party 担任同一种角色。
role_parameters:指定角色的参数,这一部分的参数对于不同的 party 都有所区别。数据需要匹配上传数据配置文件。
algorithm_parameters:指定所有 party 都共享的参数,每一个参数的 key 都是在 DSL 配置文件中定义好的模块名。
在完成这些配置文件并提交任务之后,fate-flow 将会把 role_parameters 和 algorithm_parameters 中的所有参数合并。如果合并之后,仍然存在没有定义的参数,fate-flow 则会使用默认值。fate-flow 会将这些参数分发到对应的 party,并开始联邦建模任务。

(3)示例
{
    "initiator": {
        "role": "guest",
        "party_id": 10000
    },
    "job_parameters": {
        "work_mode": 1
        "processor_per_node": 6
    },
    "role": {
        "guest": [
            10000
        ],
        "host": [
            10000
        ],
        "arbiter": [
            10000
        ]
    },
    "role_parameters": {"Your role parameters"},
    "algorithm_parameters": {"Your algorithm parameters"},
}

5. 训练过程

(1)上传数据

在所有数据提供者之间加载数据,上传命令:

python ${your_install_path}/fate_flow/fate_flow_client.py -f upload -c ${upload_data_json_path}

${your_install_path}: fate的安装目录
${upload_data_json_path}:上传数据配置文件路径
每个提供数据的集群(即guest和host)都需执行此步骤
不能上传具有相同table_name和namespace的不同数据集

运行此命令后,如果成功,将显示以下信息:

{
    "data": {
        "pid": 74684,
        "table_name": "breast_b",
        "namespace": "breast_hetero"
    },
    "jobId": "20190801152750392991_436",
    "meta": null,
    "retcode": 0,
    "retmsg": "success",
    "created_at": "2019-08-01 15:27:50"
}

输出所示,table_name和namespace已经列出,可以在上传配置文件中作为输入配置。

(2)开始建模

命令:

python {fate_install_path}/fate_flow/fate_flow_client.py -f submit_job -c ${runtime_config} -d ${dsl}

${runtime_config}:运行配置文件路径
${dsl}:dsl文件路径

(3)检查日志

路径:

${your_install_path}/logs/${your jobid}

${your_install_path}: fate的安装目录
${your jobid}:本次的jobid

三、测试

1. 准备

(1)为需要在预测阶段部署的模块添加或修改“ need_deploy”字段。除了通常不会在预测阶段运行的FederatedmSample和Evaluation之外,所有模块均将True设置为其默认值。“ need_deploy”字段为True表示此模块应运行“拟合”过程,并且拟合模型需要在预测阶段进行部署。
(2)除了Intersect模块之外,其他模块应该配置模型输出,这样fate-flow才能存储训练后的模型并使其在预测阶段可用。
(3)获取训练模型的model_id和model_version,获取命令:

python ${your_fate_install_path}/fate_flow/fate_flow_client.py -f job_config -j ${jobid} -r guest -p ${guest_partyid}  -o ${job_config_output_path}

${your_fate_install_path}: fate安装目录
${jobid} :任务ID
${guest_partyid}:提交工作的一方的partyId
${job_config_output_path}:存储job_config的路径

之后,包含模型信息的json文件将被下载到$ {job_config_output_path} /model_info.json中

2. 定义预测配置文件

(1)概念:

此配置文件用于配置用于预测的参数

(2)参数说明

initiator: 指定发起人的角色和参与方ID,应与训练过程相同
job_parameters:
work_mode:集群或独立,与训练过程相同。
model_id或model_version:1. 准备(3)中获取的模型指示器。
job_type:工作类型。在这种情况下,它应该是“predict”。
role: 指出所有角色的所有参与ID,应与训练过程相同
role_parameters:为每个角色设置参数。在这种情况下,“ eval_data”(意味着将要预测的数据)应同时为Guest和Host分别填写

(3)示例
{
	"initiator": {
		"role": "guest",
		"party_id": 10000
	},
	job_parameters": {
		"work_mode": 0,
		"job—type": "predict",
		"model_id": "arbiter-10000#guest-10000#host-10000#model",
		"model_version": "202005140855200605181"
	},
	"role": {
		"guest": [10000],
		"host": [10000],
		"arbiter": [10000]
	}
	                                    ,,n>]
	"role_parametersn": {                                                           
	    "guest": {
	        "args": {
	            "data": {
	                "eva_data": [{"name": "homo_breast_guest", "namespace": "homo_breast_guest"}]
                }        
	        }
        },
		"host": {                           
		    "args":{
		        "data":{
                    "eva_data": [{"name": "homo_breast_host", "namespace": "homo_breast_host"}]
  		         }
            }
        }
    }
}

3. 预测过程

命令:

python ${your_fate_install_path}/fate_flow/fate_flow_client.py -f submit_job -c ${predict_config}

${your_fate_install_path}:fate安装目录
${predict_config}:预测配置文件路径

4. 查看预测结果

查看FATE_board

http://${fate_board_ip}:${fate_board_port}/index.html#/details?job_id=${job_id}&role=guest&party_id=${guest_partyid}

$ {fate_board_ip} $ {fate_board_port}:用于部署FATE模块的ip和端口。
$ {job_id}:预测任务的job_id。
$ {guest_partyid}:GuestID

5. 下载预测结果

预测任务完成后,前100条预测结果记录将在FATE-board中可用。可以通过以下命令下载所有结果。

python ${your_fate_install_path}/fate_flow/fate_flow_client.py -f component_output_data -j ${job_id} -p ${party_id} -r ${role} -cpn ${component_name} -o ${predict_result_output_dir}

${job_id}: 预测任务ID
${party_id}: 当前用户partyID
${role}: 当前用户的角色
${component_name}: 具有预测结果的组件
${predict_result_output_dir}: 将预测结果下载到的目录

四、参考

FATE用法 https://github.com/FederatedAI/FATE/tree/master/examples/federatedml-1.x-examples
上传数据指南 https://github.com/FederatedAI/FATE/blob/master/doc/upload_data_guide_zh.rst
DSL 配置和运行配置 https://github.com/FederatedAI/FATE/blob/master/doc/dsl_conf_setting_guide_zh.rst
联邦学习与微众Fate https://blog.csdn.net/qq_28540443/article/details/104416436