最新联邦学习实战-2-用FATE从零实现横向逻辑回归(1),2024年最新面试流程4轮技术面+1轮HR

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

columns = {}

for idx, n in enumerate(col_names):

columns[n] = “x%d”%idx

breast = breast.rename(columns=columns)

breast[‘y’] = breast_dataset.target

breast[‘idx’] = range(breast.shape[0])

idx = breast[‘idx’]

breast.drop(labels=[‘idx’], axis=1, inplace = True)

breast.insert(0, ‘idx’, idx)

breast = breast.sample(frac=1)

train = breast.iloc[:469]

eval = breast.iloc[469:]

breast_1_train = train.iloc[:200]

breast_1_train.to_csv(‘breast_1_train.csv’, index=False, header=True)

breast_2_train = train.iloc[200:]

breast_2_train.to_csv(‘breast_2_train.csv’, index=False, header=True)

eval.to_csv(‘breast_eval.csv’, index=False, header=True)

注意:官方地址中的csv文件是有问题的,要运行这个切割数据集自己生成新的数据集文件

三、利用FATE构建横向联邦学习Pipeline

===================================================================================

用FATE构建横向联邦学习Pipeline,涉及到三个方面的工作:

  • 数据转换输入

将数据文件(csv、txt)等转换成为FATE独有的基础数据结构DTable,从而方便进一步的操作

微信图片_20210816181410

模型训练

FATE以模型训练构建流水线pipeline

模型评估:(可选)

评估模型性能的手段

如果只使用框架自带的模型,那么其实我们需要修改的就是配置文件即可

3.1 数据转换输入


新建一个项目目录chapter05(我这里创建的叫chapter05因为对应书第五章内容,可自行修改)

将数据集放到该目录下的data目录中:

完成数据转换,需要一个配置文件和一个启动程序:

配置文件

upload_data.json文件编写配置,内容为:

{

“file”: “data/breast_1_train.csv”,

“head”: 1,

“partition”: 16,

“work_mode”: 0,

“table_name”: “homo_breast_1_train”,

“namespace”: “homo_host_breast_train”

}

字段说明:

  1. file: 数据文件路径,相对于当前所在路径

  2. head: 指定数据文件是否包含表头

  3. partition: 指定用于存储数据的分区数

  4. work_mode: 指定工作模式,0代表单机版,1代表集群版

  5. table_name:转换为DTable格式的表名

  6. namespace: DTable格式的表名对应的命名空间

  7. backend: 指定后端,0代表EGGROLL, 1代表SPARK加RabbitMQ, 2代表SPARK加Pulsar (暂时未用到)

fate-flow上传数据

使用fate-flow上传数据。从FATE-1.5开始,推荐使用 FATE-Flow Client Command Line 执行FATE-Flow任务。

提示:

{

“retcode”: 100,

“retmsg”: “Fate flow CLI has not been initialized yet or configured incorrectly. Please initialize it before using CLI at the first time. And make sure the address of fate flow server is configured correctly. The configuration file path is: /ai/xwj/federate_learning/fate_dir/standalone_fate_master_1.6.0/venv/lib/python3.6/site-packages/flow_client/settings.yaml.”

}

解决:先初始化flow

使用flow首先要初始化一下:

flow init文档

Fate Flow 命令行初始化命令。用户可选择提供fate服务器配置文件路径或指定fate服务器ip地址及端口进行初始化。注意:若用户同时使用上述两种方式进行初始化,CLI将优先读取配置文件内容,而用户所配置的服务器ip地址及端口信息将被忽略。

因为之前init命令直接已经启动了flow,所以直接初始化即可

flow init --ip 127.0.0.1 --port 9380

{

“retcode”: 0,

“retmsg”: “Fate Flow CLI has been initialized successfully.”

}

因为之前上传命令会自动将原始的本地文件转为DTable格式

flow data upload -c upload_data.json

注意,我使用的是新版本,新版本支持命令行直接使用

如果提示没有flow命令,那么可能没有使用提供的conda环境,解决如下:

source bin/init_env.sh

{

“data”: {

“board_url”: “http://127.0.0.1:8080/index.html#/dashboard?job_id=202108151639113656812&role=local&party_id=0”,

“job_dsl_path”: “/home/jiangbo/FATE/standalone_fate_master_1.6.0/jobs/202108151639113656812/job_dsl.json”,

“job_id”: “202108151639113656812”,

“job_runtime_conf_on_party_path”: “/home/jiangbo/FATE/standalone_fate_master_1.6.0/jobs/202108151639113656812/local/job_runtime_on_party_conf.json”,

“job_runtime_conf_path”: “/home/jiangbo/FATE/standalone_fate_master_1.6.0/jobs/202108151639113656812/job_runtime_conf.json”,

“logs_directory”: “/home/jiangbo/FATE/standalone_fate_master_1.6.0/logs/202108151639113656812”,

“model_info”: {

“model_id”: “local-0#model”,

“model_version”: “202108151639113656812”

},

“namespace”: “homo_host_breast_train”,

“pipeline_dsl_path”: “/home/jiangbo/FATE/standalone_fate_master_1.6.0/jobs/202108151639113656812/pipeline_dsl.json”,

“table_name”: “homo_breast_1_train”,

“train_runtime_conf_path”: “/home/jiangbo/FATE/standalone_fate_master_1.6.0/jobs/202108151639113656812/train_runtime_conf.json”

},

“jobId”: “202108151639113656812”,

“retcode”: 0,

“retmsg”: “success”

}

访问board_url可以在浏览器中看到对应的详情:

img

对于breast_2_train.csv以及测试集合同样的过程:

测试集上传到两个参与方,并各自转换为DTable格式

{

“file”: “data/breast_2_train.csv”,

“head”: 1,

“partition”: 16,

“work_mode”: 0,

“table_name”: “homo_breast_2_train”,

“namespace”: “homo_guest_breast_train”

}

// host

{

“file”: “data/breast_eval.csv”,

“head”: 1,

“partition”: 16,

“work_mode”: 0,

“table_name”: “homo_breast_1_eval”,

“namespace”: “homo_host_breast_eval”

}

// guest

{

“file”: “data/breast_eval.csv”,

“head”: 1,

“partition”: 16,

“work_mode”: 0,

“table_name”: “homo_breast_2_eval”,

“namespace”: “homo_guest_breast_eval”

}

3.2 模型训练


借助FATE,我们可以使用组件的方式来构建联邦学习,而不需要用户从新开始编码,FATE构建联邦学习Pipeline是通过自定义dsl和conf两个配置文件来实现:

DSL 配置和运行配置 V1

dsl文件:用来描述任务模块,将任务模块以有向无环图(DAG)的形式组合在一起。

conf文件:设置各个组件的参数,比如输入模块的数据表名;算法模块的学习率、batch大小、迭代次数等。

我们本实验使用的是模型:逻辑回归

进入examples/dsl/v1/homo_logistic_regression文件夹中:

使用test_homolr_train_job_dsl.json、test_homolr_train_job_conf.json两个文件来辅助构建横向联邦学习模型

3.2.1 DSL配置文件

为了让任务模型的构建更加灵活,目前 FATE 使用了一套自定的领域特定语言 (DSL) 来描述任务。在 DSL 中,各种任务模块(例如数据读写 data_io,特征工程 feature-engineering, 回归 regression,分类 classification)可以通向一个有向无环图 (DAG) 组织起来。通过各种方式,用户可以根据自身的需要,灵活地组合各种算法模块。

DSL 的配置文件采用 json 格式,实际上,整个配置文件就是一个 json 对象 (dict)。在这个 dict 的第一级是 “components”,用来表示这个任务将会使用到的各个模块。用户需要使用模块名加数字 _num 作为对应模块的 key,例如 dataio_0,并且数字应从 0 开始计数。

具体的参数见官方文档连接(上面)

test_homolr_train_job_dsl.json:

定义了四个模块已经构成了基本的联邦学习流水线(feature_scale_0为1.6.0新增),可直接使用(复制一份)

{

“components” : {

// 数据IO组件,用于将本地数据转为DTable

“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”

]

}

}

}

}

}

这里的args.train_data是根据下面的运行配置conf来的

其次配置文件之间的指定关系如下:

llixaM

3.2.2 运行配置 Submit Runtime Conf

每个模块都有不同的参数需要配置,不同的 party 对于同一个模块的参数也可能有所区别。为了简化这种情况,对于每一个模块,FATE 会将所有 party 的不同参数保存到同一个运行配置文件(Submit Runtime Conf)中,并且所有的 party 都将共用这个配置文件。

除了 DSL 的配置文件之外,用户还需要准备一份运行配置(Submit Runtime Conf)用于设置各个组件的参数。

test_homolr_train_job_conf.json 修改如下:

{

// 创始人

“initiator”: {

“role”: “guest”,

“party_id”: 10000

},

“job_parameters”: {

“work_mode”: 0 // 0代表单机版,1代表集群版

},

// 所有参与此任务的角色

// 每一个元素代表一种角色以及承担这个角色的party_id,是一个列表表示同一角色可能有多个实体ID

“role”: {

“guest”: [

10000

],

“host”: [

10000

],

// 仲裁者

“arbiter”: [

10000

]

},

// 对于权限角色的进一步参数配置

“role_parameters”: {

“guest”: {

“args”: {

“data”: {

“train_data”: [

{

“name”: “homo_breast_2_train”, // 修改DTable的表名

“namespace”: “homo_guest_breast_train” // 修改命名空间

}

]

}

},

“dataio_0”: {

“label_name”: [“y”] // 添加标签对应的列属性名称

}

},

“host”: {

“args”: {

“data”: {

“train_data”: [

{

“name”: “homo_breast_1_train”, // 同理修改

“namespace”: “homo_host_breast_train”

}

]

}

},

“dataio_0”: {

“label_name”: [“y”] // 添加标签对应的列属性名称

},

“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”: “sgd”,

“tol”: 1e-05,

“alpha”: 0.01,

“max_iter”: 10,

“early_stop”: “diff”,

“batch_size”: 500,

“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

}

}

}

}

关于角色,解释如下:

  • arbiter是用来辅助多方完成联合建模的,它的主要作用是聚合梯度或者模型。比如纵向lr里面,各方将自己一半的梯度发送给arbiter,然后arbiter再联合优化等等。

  • guest代表数据应用方。

  • host是数据提供方。

  • local是指本地任务, 该角色仅用于upload和download阶段中。

3.2.3 提交参数,训练模型

Job submit

  • 介绍: 提交执行pipeline任务。

  • 参数:

| 编号 | 参数 | Flag_1 | Flag_2 | 必要参数 | 参数介绍 |

| :-: | — | — | — | — | — |

| 1 | conf_path | -c | –conf-path | 是 | 任务配置文件路径 |

| 2 | dsl_path | -d | –dsl-path | 否 | DSL文件路径. 如果任务为预测任务,该字段可以不输入。另外,用户可以提供可用的自定义DSL文件用于执行预测任务。 |

执行:

flow job submit -c test_homolr_train_job_conf.json -d test_homolr_train_job_dsl.json

dqV03m

45Ss9k

COVndQ

注意:需要全部为勾号才说明运行成功

可以看到运行的结果:微信图片_20210816183914

3.3 评估模型


为了评估模型的效果,我们重新修改配置以检查效果:

在上传数据时,我们已经将两个评估模型的数据上传,并且转换为DTable格式

现在我们修改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_data”]

}

},

“feature_scale_0”: {

“module”: “FeatureScale”,

“input”: {

“data”: {

“data”: [

“dataio_0.train”

]

}

},

“output”: {

“data”: [“train”],

“model”: [“feature_scale”]

}

},

“feature_scale_1”: {

“module”: “FeatureScale”,

“input”: {

“data”: {

“data”: [

“dataio_1.eval_data”

]

}

},

“output”: {

“data”: [“eval_data”],

“model”: [“feature_scale”]

}

},

“homo_lr_0”: {

“module”: “HomoLR”,

“input”: {

“data”: {

“train_data”: [ // 注意这里是指定训练数据

“feature_scale_0.train”

]

}

},

“output”: {

“data”: [

“train”

],

“model”: [“homolr”]

}

},

“homo_lr_1”: {

“module”: “HomoLR”,

“input”: {

“data”: {

“eval_data”: [ // 注意:这里是指定评估数据

“feature_scale_1.eval_data”

]

},

“model”: [ // 这里指定好模型

“homo_lr_0.homolr”

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值