为了让任务模型的构建更加灵活,目前 FATE 使用了一套自定的领域特定语言 (DSL) 来描述任务。
在 DSL 中,各种模块(例如数据读写 data_io,特征工程 feature-engineering, 回归 regression,分类 classification)可以通向一个有向无环图 (DAG) 组织起来。通过各种方式,用户可以根据自身的需要,灵活地组合各种算法模块。
除此之外,每个模块都有不同的参数需要配置,不同的 party 对于同一个模块的参数也可能有所区别。为了简化这种情况,对于每一个模块,FATE 会将所有 party 的不同参数保存到同一个运行配置文件(Submit Runtime Conf)中,并且所有的 party 都将共用这个配置文件。
在实际的使用中(以命令行提交为例),通过-d 参数指定 DSL配置文件,通多-c 参数指定 Run Time Conf 配置文件。
对于像upload 这样单机、单模块的任务,只需要指定Run Time Conf 配置文件,而不需要指定 DSL文件。
python fate_flow_client.py -f upload -c upload_guest.json
而对于train、predict 这类多个模块组成的pipeline 而言,则需要分别指定DSL配置文件和Run Time Conf 配置文件。例如
python fate_flow_client.py -f submit_job -c train_conf.json -d train_job_dsl.json
在FATE1.5 之后的版本,对DSL进行了升级,从原来的v1版本升级到了v2版本,改动包括
DSL的配置文件采用json格式,在实际的解析中,会解析成python中的dict对象。依照不同的层级的key来获取对应的value。
以v1 版本为例,以下配置文件来自源码examples/dsl/v1/hetero_logistic_regression/test_hetero_lr_train_job_dsl.json
{
"components" : {
"dataio_0": {
"module": "DataIO",
"input": {
"data": {
"data": [
"args.train_data"
]
}
},
"output": {
"data": ["train"],
"model": ["dataio"]
}
},
"intersection_0": {
"module": "Intersection",
"input": {
"data": {
"data": [
"dataio_0.train"
]
}
},
"output": {
"data": ["train"]
}
},
"hetero_lr_0": {
"module": "HeteroLR",
"input": {
"data": {
"train_data": ["intersection_0.train"]
}
},
"output": {
"data": ["train"],
"model": ["hetero_lr"]
}
},
"evaluation_0": {
"module": "Evaluation",
"input": {
"data": {
"data": ["hetero_lr_0.train"]
}
}
}
}
}
第一级的key 是components,用来表示这个任务将会使用到的各个模块。
按照上面的例子,第二级的key有四个,dataio_0,intersection_0,hetero_lr_0,evaluation_0。也就是这个算法涉及的模块,即example中定义的hetero_logistic_regression 包含四个模块,读取数据,求交,训练,评估。
每个模块主要包括三个第三级的key
用来指定使用的模块。value 的值需要和 federatedml/conf/setting_conf 下各个模块的文件名保持一致
包含2种输入类型Data和Model,涉及3种第四级的key,data ,model和isometric_model
"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"]
}
}
"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"]
}
}
和 input 一样,有 data 和 model 两种类型
Tips:name
需要注意的是,这里定义的模块的名字,dataio_0 在job的create阶段[https://blog.csdn.net/yao544303963/article/details/119878240?spm=1001.2014.3001.5501],会用于生成task的名字,并将该task的元数据写入DB。后续job中task 涉及的组件都通过这个名字和DSL文件对应起来。
如当前job涉及两份数据的dataio, 通过递增编号加以区分,如:dataio_0 和 dataio_1。
Tips:顺序
通过观察上述DSL,可以发现,上一个模块的name 和 output中 “data” 的value 组成了下一个模块的input 的value,如dataio_0.train。这样,就将所有的模块串起来,构成了job的DAG,也即在fate board 界面看到的内容。
对比v2 的DSL,源文件为examples/dsl/v2/hetero_logistic_regression/hetero_lr_normal_dsl.json
为了便于对比,调整了一下参数的格式,在dsl部分,v2只是新增了reader 模块,其余变化不大。
Run Time Conf 也采用json的方式,用来设置各个各参数。
以v1 版本为例,以下配置文件来自源码examples/dsl/v1/hetero_logistic_regression/test_hetero_lr_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_hetero_guest",
"namespace": "experiment"
}
],
"eval_data": [
{
"name": "breast_hetero_guest",
"namespace": "experiment"
}
]
}
},
"dataio_0": {
"with_label": [
true
],
"label_name": [
"y"
],
"label_type": [
"int"
],
"output_format": [
"dense"
],
"missing_fill": [
true
],
"outlier_replace": [
true
]
},
"evaluation_0": {
"eval_type": [
"binary"
],
"pos_label": [
1
]
}
},
"host": {
"args": {
"data": {
"train_data": [
{
"name": "breast_hetero_host",
"namespace": "experiment"
}
],
"eval_data": [
{
"name": "breast_hetero_host",
"namespace": "experiment"
}
]
}
},
"dataio_0": {
"with_label": [
false
],
"output_format": [
"dense"
],
"outlier_replace": [
true
]
},
"evaluation_0": {
"need_run": [
false
]
}
}
},
"algorithm_parameters": {
"hetero_lr_0": {
"penalty": "L2",
"optimizer": "rmsprop",
"tol": 0.0001,
"alpha": 0.01,
"max_iter": 30,
"early_stop": "diff",
"batch_size": -1,
"learning_rate": 0.15,
"init_param": {
"init_method": "zeros"
},
"sqn_param": {
"update_interval_L": 3,
"memory_M": 5,
"sample_size": 5000,
"random_seed": null
},
"cv_param": {
"n_splits": 5,
"shuffle": false,
"random_seed": 103,
"need_cv": false
}
},
"intersect_0": {
"intersect_method": "rsa",
"sync_intersect_ids": true,
"only_output_key": false
}
}
}
包含如下几个一级key:
以v2 版本为例,以下配置文件来自源码examples/dsl/v2/hetero_logistic_regression/hetero_lr_normal_conf.json
{
"dsl_version": 2,
"initiator": {
"role": "guest",
"party_id": 10000
},
"role": {
"guest": [
10000
],
"host": [
9999
],
"arbiter": [
9999
]
},
"job_parameters": {
"common": {
"job_type": "train",
"backend": 0,
"work_mode": 0
}
},
"component_parameters": {
"common": {
"dataio_0": {
"output_format": "dense"
},
"hetero_lr_0": {
"penalty": "L2",
"tol": 0.0001,
"alpha": 0.01,
"optimizer": "rmsprop",
"batch_size": -1,
"learning_rate": 0.15,
"init_param": {
"init_method": "zeros"
},
"max_iter": 30,
"early_stop": "diff",
"cv_param": {
"n_splits": 5,
"shuffle": false,
"random_seed": 103,
"need_cv": false
},
"sqn_param": {
"update_interval_L": 3,
"memory_M": 5,
"sample_size": 5000,
"random_seed": null
}
},
"evaluation_0": {
"eval_type": "binary"
}
},
"role": {
"host": {
"0": {
"dataio_0": {
"with_label": false
},
"reader_0": {
"table": {
"name": "breast_hetero_host",
"namespace": "experiment"
}
}
}
},
"guest": {
"0": {
"dataio_0": {
"with_label": true
},
"reader_0": {
"table": {
"name": "breast_hetero_guest",
"namespace": "experiment"
}
}
}
}
}
}
}
无变化的一级key
更新之后的一级key
"dsl_version": "2"
涉及源码位于 python/fate_flow/scheduler/dsl_parser.py
主要功能为解析json 生成各项参数。