联邦学习框架FATE实践(训练/测试步骤及参数说明)
联邦学习框架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