【FATE实战】纵向联邦学习FATE框架下实战的过程解释(1)


在使用FATE进行联邦学习研究的时候,网上的教程通常只是说教我们怎么上传FATE框架自带的数据去测试整个框架在本机上有没有问题。

下面一个过程就是我们怎么去理解我们在使用FATE进行联邦学习的时候使用到的几个配置文件的作用。

首先我是从【联邦学习】FATE框架:纵向联邦学习练习——波士顿房价找到FATE框架练习:实现横向逻辑回归任务的训练及预测和二、 FATE实战:实现横向逻辑回归任务的训练及预测

这三个链接可以帮助我们去学习FATE框架的实战。这里我用自己的理解上传自己想要上传的数据,使用自己想要的结构去建立模型。

#################################################################################################################################################################

首先,我们需要做的是上传文件。

上传文件需要确定的第一步是你已经进入了fate容器

如果fate没有启动过,就cd到docker_standalone_fate_1.6.0文件夹

执行install_standalone_docker.sh

cd docker_standalone_fate_1.6.0
bash install_standalone_docker.sh

install_standalone_docker.sh文件长这样

 docker run -d就是守护方式打开容器,--name就是把容器命名为fate,-p就是将容器的端口暴露给宿主机端口 格式:host_port:container_port 或者 host_ip:host_port:container_port,后面的fate:latest就是镜像的名字。

docker ps -a就是把所有运行着的和运行过的(但是没有删除,还可以重新运行的)容器显示出来。结果如下:

如果启动成功就可以看到

 我们也可以通过docker ps看我们正在运行的容器

 当然,还有一种情况就是fate运行过,但是关闭了(docker stop),没有删除(docker rm)。就可能会报错

这个时候我们使用

docker restart fate

即可。

然后问题解决我们就可以进入fate容器内部:

docker exec -it fate /bin/bash

 然后就可以愉快地进入我们的上传文件了~

上传文件需要的python脚本是

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

用自己的路径就是

python python/fate_flow/fate_flow_client.py -f upload -c  examples/dsl/v1/homo_logistic_regression/upload_data_host.json 
python python/fate_flow/fate_flow_client.py -f upload -c  examples/dsl/v1/homo_logistic_regression/upload_data_guest.json 
# 下面这条upload_data_test.json 是上传测试数据,仅仅在作evaluation时需要上传,执行普通的train_job可以不用上传
python python/fate_flow/fate_flow_client.py -f upload -c  examples/dsl/v1/homo_logistic_regression/upload_data_test.json 

这里的-f和-c啊,和前面的docker -d,docker ps -a啥参数啊,完全不一样,不是一个出处的!我们如何去理解这列的参数呢?

这里的参数就和python/fate_flow/fate_flow_client.py里的fate_flow_client.py文件有关,文件里面关于参数的部分长这样:

 -f是要传函数参数,我们传的upload函数在

DATA_FUNC + MODEL_FUNC + JOB_FUNC + JOB_OPERATE_FUNC + TASK_OPERATE_FUNC + TABLE_FUNC +
TRACKING_FUNC + PERMISSION_FUNC

里面。其中各个函数集合里面有:

 upload是DATA_FUNC里面的函数,然后我们再去看DATA_FUNC:

 其中没啥有用的,就是一个上传文件的代码,主要是可以让我们熟悉这个fate_flow_client.py的代码。

然后是fate_flow_client.py 的-c参数,上图可以知道-c是要上传config一个配置文件upload_data_host.json,这个文件长这样:

 其中"file"就是我们要上传文件的绝对路径,一般都是在容器内部,其中容器内部的数据文件都有哪些呢?

 一般自己上传数据文件的话,可以自己在容器自己创建一个文件夹,再用cp指令从虚拟机(我用的VMware centos7)传到容器里面。在修改conf.json文件里面的file绝对路径和

table_name的表格标签,再放到自己定义的一个namespace里面,一般测试用的放experiment里面,也可以自己想一个namespace名字放里面。这个主要是后面的训练conf.json文件需要。

upload_data_guest.json和test文件都差不多。可以自己用

vim /fate/examples/dsl/v1/homo_logistic_regression/upload_data_guest.json
vim /fate/examples/dsl/v1/homo_logistic_regression/upload_data_test.json

查看。如果容器没有下载vim可以docker容器中安装vim。

#################################################################################################################################################################

其次,我们需要在v1文件夹下选择示例dsl和conf进行训练:(也可以用v2文件夹的dsl和conf文件进行训练,我喜欢v2,具体看二、 FATE实战:实现横向逻辑回归任务的训练及预测第四部分)

命令为:

python python/fate_flow/fate_flow_client.py -f submit_job -d examples/dsl/v1/homo_logistic_regression/test_homolr_train_job_dsl.json -c examples/dsl/v1/homo_logistic_regression/test_homolr_train_job_conf.json

啊,这个.py我们之前看过,这个-f 后面的函数是submit_job在里面也有,在.py文件里的内容为:

 -c后面传的是conf.json和-d后面是dsl.json文件,其中test_homolr_train_job_conf.json长这样:

{
"initiator": {
"role": "guest",
"party_id": 10000
},
"job_parameters": {
"work_mode": 0
},
"role": {
"guest": [
10000
],
"host": [
10000
],
"arbiter": [
10000
]
},
"role_parameters": {
"guest": {
"args": {
"data": {
"train_data": [
{
"name": "breast_homo_guest",
"namespace": "experiment"
}
]
}
}
},
"host": {
"args": {
"data": {
"train_data": [
{
"name": "breast_homo_host",
"namespace": "experiment"
}
]
}
},
"evaluation_0": {
"need_run": [
false
]
}
}
},
"algorithm_parameters": {
"dataio_0": {
"with_label": true,
"label_name": "y",
"label_type": "int",
"output_format": "dense"
},
"homo_lr_0": {
"penalty": "L2",
"optimizer": "rmsprop",
"tol": 1e-05,
"alpha": 0.01,
"max_iter": 30,
"early_stop": "diff",
"batch_size": -1,
"learning_rate": 0.15,
"decay": 1,
"decay_sqrt": true,
"init_param": {
"init_method": "zeros"
},
"encrypt_param": {
"method": null
},
"cv_param": {
"n_splits": 4,
"shuffle": true,
"random_seed": 33,
"need_cv": false
}
}
}
}

conf.json文件需要确保name 和namespace与前面的upload文件的一致。

dsl文件test_homolr_train_job_dsl.json长这样:

{
    "components" : {
        "dataio_0": {
            "module": "DataIO",
            "input": {
                "data": {
                    "data": [
                        "args.train_data"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["dataio"]
            }
         },
        "feature_scale_0": {
            "module": "FeatureScale",
            "input": {
                "data": {
                    "data": [
                        "dataio_0.train"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["feature_scale"]
            }
        },
        "homo_lr_0": {
            "module": "HomoLR",
            "input": {
                "data": {
                    "train_data": [
                        "feature_scale_0.train"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["homolr"]
            }
        },
        "evaluation_0": {
            "module": "Evaluation",
            "input": {
                "data": {
                    "data": [
                        "homo_lr_0.train"
                    ]
                }
            }
        }
    }
}

dsl是模型结构,结构是长这样:

 像是另一个fast_secureboost的dsl:

{
    "components": {
        "dataio_0": {
            "module": "DataIO",
            "input": {
                "data": {
                    "data": [
                        "args.train_data"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["dataio"]
            }
         },
        "dataio_1": {
            "module": "DataIO",
            "input": {
                "data": {
                    "data": [
                        "args.eval_data"
                    ]
                },
                "model": [
                    "dataio_0.dataio"
                ]
            },
            "output": {
                "data": ["eval"],
                "model": ["dataio"]
            },
            "need_deploy": false
         },
        "intersection_0": {
            "module": "Intersection",
            "input": {
                "data": {
                    "data": [
                        "dataio_0.train"
                    ]
                }
            },
            "output": {
                "data": ["train"]
            }
        },
        "intersection_1": {
            "module": "Intersection",
            "input": {
                "data": {
                    "data": [
                        "dataio_1.eval"
                    ]
                }
            },
            "output": {
                "data": ["eval"]
            },
            "need_deploy": false
                   },
        "fast_secureboost_0": {
            "module": "HeteroFastSecureBoost",
            "input": {
                "data": {
                    "train_data": [
                        "intersection_0.train"
                    ],
                    "eval_data": [
                        "intersection_1.eval"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["train"]
            }
        },
        "evaluation_0": {
            "module": "Evaluation",
            "input": {
                "data": {
                    "data": [
                        "fast_secureboost_0.train"
                    ]
                }
            }
        }
    }
}

结果长这样:

 之后看进展再写吧~

相关