Fate如何安装?本文续这篇文章

背景

很多中文网络的FATE的教程都是直接使用DSL的教程,可能【有点老旧】,该换新了。

Fate是一个服务,还原联邦学习联邦学习场景,在联邦里的各个方被FATE分成了client和host两种身份,当然还有个arbiter身份,这个暂时不管。各方都想要共享数据,以获得更大的数据集训练得到更好的模型,但是各方又不相互信任,所以需要一个可信第三方FATE来完成。

FATE把【数据集中带有标签】的用户分类为client,其余不带标签的用户被分类为host。

在 FATE 框架中,横向联邦的场景被称为 homo,纵向的被称为 hetero,比如 纵向安全提升树模型就叫做 hetero secure boost。是什么模型不重要,主要是把这个场景给解释清楚就行。

上传

官方文档:https://fate.readthedocs.io/en/latest/tutorial/pipeline
强烈建议对着官方文档看我这个!

工具

FATE框架可以使用pipeline工具进行上传。

先下载fate_client,因为Pipeline是fate_client里的一个工具。

pip install fate_client

根据文档,想要使用pipeline,需要命令行配合使用

pipeline init --ip=xxx --port=xxx

先terminal里面对pipeline初始化才能使用pipeline,ip和port要跟FATE启动时的ip和port要对应,如果是standalone,那么ip是127.0.0.1,port一般是9380。

如果记不清fate的配置了,使用(暂时还没找到,等着补上

flow 

如果记不清pipeleine的配置了,使用pipeline config show查看

开发

python文件,如下代码即可上传【数据文件】。FATE的上传的数据应当是什么样的?官方文档

这个教程就用这个tabular的文件了,这个可以看文档给出的example,那个路径其实是fate github的路径,打开文档中的hetero_breast_guest后具体是这样的,文档中的数据集都在这里:https://github.com/FederatedAI/FATE/tree/master/examples/data 在这里插入图片描述
你可以直接从github上下载,也可以复制粘贴,但是要注意,检查最后一行是否空行!,如果是空行,删掉,不然FATE会报错。可以具体看我这个亲自踩坑的博客

每一个上传的数据都会有自己的table_name和namespace,fate用这两个字段来命名区分每一个上传的数据。

pipeline的initiator绑定此pipeline是谁的,set roles标明此任务是由哪些人们一起做。
下面的例子意思是“此pipeline属于guest,他的id号是9999,此任务由id是9999的guest和id是10000的host共同完成”。guest和host参数除了可以是一个数字,也可以是一个list,比如guest=[1,2,3,4]

from pipeline.backend.pipeline import PipeLine

pipeline = PipeLine() \
        .set_initiator(role='guest', party_id=9999) \
        .set_roles(guest=9999, host=10000) 


data_path='/root/Downloads/dummy.csv'
table_name='dummy'
namespace='dummy'
pipeline.add_upload_data(file=data_path,table_name=table_name,namespace=namespace)
pipeline.upload(drop=1) # drop表示是否覆盖已经上传的table

成功运行后,terminal会出现类似字样。在这里插入图片描述

从FATE服务中获得数据

官方文档:https://fate.readthedocs.io/en/latest/tutorial/pipeline/pipel...强烈建议对着官方文档看我这个!

另,文档中的sbt,其实就是Secure Boost Tree,一个决策树模型,因为使用了FATE,所以叫Secure。

工具

FATE中使用Reader类,从FATE框架中获得数据。

文档中说“load data”,我一开始以为load data是从本地load,汗!文档最好改成load data from FATE service……

使用Reader类获得数据后,可以使用DataTransform类进行变换。文档和代码有提,可以参考文档。使用Intersection可以获得两份数据的PSI,参考Component文档intersection文档.

Python

Reader同样也需要绑定party,但是是要绑定数据提供方的身份和id。比如有一份数据A是guest id10提供的,在定义Reader的时候要绑定guest id10才能成功读取。

注意:一般来说,在联邦学习中所谓的“获取数据”是把本方有的数据与联邦方有的数据做“融合”后再用作本次的训练,所以一般会涉及官方文档中的intersection类,而下面的例子是自己获得自己上传过的数据,只是做简单的演示,虽然简单,但是对于理解FATE中的类有帮助。

from pipeline.component import Reader, DataTransform, HeteroSecureBoost, Evaluation
from pipeline.interface import Data
# set pipeline operation party ids.
pipeline = PipeLine() \
        .set_initiator(role='guest', party_id=9999) \
        .set_roles(guest=9999)#, host=10000) 不需要加入其他host

reader_0 = Reader(name="reader_0")
# bind reader operation tables
reader_0.get_party_instance(role='guest', party_id=9999).component_param(
    table={"name": "dummy", "namespace": "dummy"})

data_transform_0 = DataTransform(name="data_transform_0")
# bind transformation operation party
data_transform_0.get_party_instance(role='guest', party_id=9999).component_param(
    with_label=True)

# state a boost tree and evaluation
hetero_secureboost_0 = HeteroSecureBoost(name="hetero_secureboost_0",
                                         num_trees=5,
                                         bin_num=16,
                                         task_type="classification",
                                         objective_param={"objective": "cross_entropy"},
                                         encrypt_param={"method": "paillier"},
                                         tree_param={"max_depth": 3})


# add everyone into pipeline and ready for training
pipeline.add_component(reader_0)
pipeline.add_component(data_transform_0,data=Data(train_data=reader_0.output.data))
pipeline.add_component(hetero_secureboost_0, data=Data(train_data=data_transform_0.output.data))
pipeline.compile()


# training
pipeline.fit()

# load another dataset via predict_pipeline
# predict_pipeline.predict()

保存

对于一个pipeline可以通过dump把所有信息保存到pkl中。

# save results 
pipeline.dump("pipeline_saved.pkl")

Yonggie
95 声望4 粉丝