DSL 配置和运行配置 V1¶
[ENG]
为了让任务模型的构建更加灵活,目前 FATE 使用了一套自定的领域特定语言 (DSL) 来描述任务。在 DSL 中,各种模块(例如数据读写 data_io,特征工程 feature-engineering, 回归 regression,分类 classification)可以通向一个有向无环图 (DAG) 组织起来。通过各种方式,用户可以根据自身的需要,灵活地组合各种算法模块。
除此之外,每个模块都有不同的参数需要配置,不同的 party 对于同一个模块的参数也可能有所区别。为了简化这种情况,对于每一个模块,FATE 会将所有 party 的不同参数保存到同一个运行配置文件(Submit Runtime Conf)中,并且所有的 party 都将共用这个配置文件。这个指南将会告诉你如何创建一个 DSL 配置文件。
DSL 配置文件¶
DSL 的配置文件采用 json 格式,实际上,整个配置文件就是一个 json 对象 (dict)。在这个 dict 的第一级是 “components”,用来表示这个任务将会使用到的各个模块。
{
"components" : {
...
}
}
每个独立的模块定义在 “components” 之下,例如:
"dataio_0": {
"module": "DataIO",
"input": {
"data": {
"data": [
"args.train_data"
]
}
},
"output": {
"data": ["train"],
"model": ["dataio"]
},
"need_deploy": true
}
正如这个例子,用户需要使用模块名加数字 _num 作为对应模块的 key,例如 dataio_0,并且数字应从 0 开始计数。
参数说明¶
- module
用来指定使用的模块。这个参数的内容需要和 federatedml/conf/setting_conf 下各个模块的文件名保持一致(不包括 .json 后缀)。
- input
分为两种输入类型,分别是 data 和 model。
Data: 有三种可能的输入类型
data: 一般被用于 data_io 模块, feature_engineering 模块或者 evaluation 模块
train_data: 一般被用于 homo_lr, heero_lr 和 secure_boost 模块。如果出现了 train_data 字段,那么这个任务将会被识别为一个 fit 任务
eval_data: 如果存在 train_data 字段,那么该字段是可选的。如果选择保留该字段,则 eval_data 指向的数据将会作为 validation set。若不存在 train_data 字段,则这个任务将被视作为一个 predict 或 transform 任务。
Model: 有两种可能的输入类型:
model: 用于同种类型组件的模型输入。例如,hetero_binning_0 会对模型进行 fit,然后 hetero_binning_1 将会使用 hetero_binning_0 的输出用于 predict 或 transform。代码示例:
"hetero_feature_binning_1": { "module": "HeteroFeatureBinning", "input": { "data": { "data": [ "dataio_1.eval_data" ] }, "model": [ "hetero_feature_binning_0.fit_model" ] }, "output": { "data": ["eval_data"], "model": ["eval_model"] } }
isometric_model: 用于指定继承上游组件的模型输入。 例如,feature selection 的上游组件是 feature binning,它将会用到 feature binning 的信息来作为 feature importance。代码示例:
"hetero_feature_selection_0": { "module": "HeteroFeatureSelection", "input": { "data": { "data": [ "hetero_feature_binning_0.train" ] }, "isometric_model": [ "hetero_feature_binning_0.output_model" ] }, "output": { "data": ["train"], "model": ["output_model"] } }
output: 和 input 一样,有 data 和 model 两种类型。
Data: 指定输出的 data 名
Model: 指定输出的 model 名
运行配置 Submit Runtime Conf¶
除了 DSL 的配置文件之外,用户还需要准备一份运行配置(Submit Runtime Conf)用于设置各个组件的参数。
- initiator
在运行配置的开头,用户需要定义 initiator。例如
"initiator": { "role": "guest", "party_id": 10000 }
- role
所有参与这个任务的 roles 都需要在运行配置中指定。在 role 字段中,每一个元素代表一种角色以及承担这个角色的 party_id。每个角色的 party_id 以列表形式存在,因为一个任务可能涉及到多个 party 担任同一种角色。
"role": { "guest": [ 10000 ], "host": [ 10000 ], "arbiter": [ 10000 ] }
- role_parameters
这一部分的参数对于不同的 party 都有所区别。同样地,每一个参数也是用列表的方式呈现。在 role_parameters 中,party 名被作为每一项元素的 key,而 value 则是具体提的参数内容。例如:
"guest": { "args": { "data": { "train_data": [ { "name": "1ca0d9eea77e11e9a84f5254005e961b", "namespace": "arbiter-10000#guest-10000#host-10000#train_input#guest#10000" } ] } }, "dataio_0": { "with_label": [ true ], ... } }, "host": { "args": { "data": { "train_data": [ { "name": "3de22bdaa77e11e99c5d5254005e961b", "namespace": "arbiter-10000#guest-10000#host-10000#train_input#host#10000" } ] } }, "dataio_0": { ... } ... }
就像上面这个例子,对于每一个 party,它们的输入参数 train_data,eval_data 都应该以列表形式存在。name 和 namespace 字段则是用来指定用来上传数据的表格位置。
用户还可以分别配置每一个组件的参数。组件名需要和 DSL 配置文件中的组件名保持一致。每个组件具体的参数列表可以在 federatedml/param 的 Param 类中找到。
- algorithm_parameters
如果用户希望定义一些所有 party 都共享的参数,那么可以在 algorithm_parameters 中设置。例如:
"hetero_feature_binning_0": { ... }, "hetero_feature_selection_0": { ... }, "hetero_lr_0": { "penalty": "L2", "optimizer": "rmsprop", "eps": 1e-5, "alpha": 0.01, "max_iter": 10, "converge_func": "diff", "batch_size": 320, "learning_rate": 0.15, "init_param": { "init_method": "random_uniform" }, "cv_param": { "n_splits": 5, "shuffle": false, "random_seed": 103, "need_cv": false, } }
和上一个部分一样,在 algorithm_parameters 中,每一个参数的 key 都是在 DSL 配置文件中定义好的组件名。
在完成这些配置文件并提交任务之后,fate-flow 将会把 role_parameters 和 algorithm_parameters 中的所有参数合并。如果合并之后,仍然存在没有定义的参数,fate-flow 则会使用默认值。fate-flow 会将这些参数分发到对应的 party,并开始联邦建模任务。
多个 Host 情况下的配置¶
对于存在多个 Host 的模型,所有 Host 的 party_id 都应该在 role 中列举出来。例如:
"role": {
"guest": [
10000
],
"host": [
10000, 10001, 10002
],
"arbiter": [
10000
]
}
每个针对 Host 的参数都应该以列表的方式储存,列表中组件的个数和 Host 的个数应保持一致。
"host": {
"args": {
"data": {
"train_data": [
{
"name": "hetero_breast_host_1",
"namespace": "hetero_breast_host"
},
{
"name": "hetero_breast_host_2",
"namespace": "hetero_breast_host"
},
{
"name": "hetero_breast_host_3",
"namespace": "hetero_breast_host"
}
]
}
},
"dataio_0": {
"with_label": [false, false, false],
"output_format": ["dense", "dense", "dense"],
"outlier_replace": [true, true, true]
}
注意 algorithm_parameters 里面的参数不需要额外处理,FATE 会自动把这些参数复制给每一个 party。