[ENG]
为了让任务模型的构建更加灵活,目前 FATE 使用了一套自定的领域特定语言 (DSL) 来描述任务。在 DSL 中,各种模块(例如数据读写 data_io,特征工程 feature-engineering, 回归 regression,分类 classification)可以通向一个有向无环图 (DAG) 组织起来。通过各种方式,用户可以根据自身的需要,灵活地组合各种算法模块。
除此之外,每个模块都有不同的参数需要配置,不同的 party 对于同一个模块的参数也可能有所区别。为了简化这种情况,对于每一个模块,FATE 会将所有 party 的不同参数保存到同一个运行配置文件(Submit Runtime Conf)中,并且所有的 party 都将共用这个配置文件。这个指南将会告诉你如何创建一个 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。
|
除了 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 的 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。