当前位置: 首页 > Linux

【FATE联邦学习】如何上传、读取、训练和保存数据

时间:2023-04-06 02:20:06 Linux

Fate?本文是本文的续篇。背景中文网很多FATE教程都是直接使用DSL的教程,可能[有点旧],是时候换一个新的了。Fate是一个还原联邦学习场景的服务。联邦中的每一方都被Fate分成了client和host两个身份。当然,还有一个仲裁者的身份,暂时忽略。各方都希望共享数据以获得更大的数据集来训练更好的模型,但是各方之间并不信任彼此,因此需要一个可信的第三方FATE来完成。FATE将[数据集中带有标签]的用户归类为客户端,其余没有标签的用户归类为主机。在FATE框架中,水平联邦场景称为homo,垂直联邦场景称为heter。例如,垂直安全提升树模型称为heterosecureboost。不管是什么模型,主要是把场景交代清楚。上传官方文档:https://fate.readthedocs.io/en/latest/tutorial/pipeline强烈推荐阅读官方文档!工具可以使用管道工具上传FATE框架。先下载fate_client,因为Pipeline是fate_client中的一个工具。pipinstallfate_client根据文档,如果要使用管道,需要使用命令行配合管道init--ip=xxx--port=xxx首先在终端中初始化管道才能使用管道,并且ip和port必须和FATE启动时的ip和port要对应,如果是standalone,那么ip是127.0.0.1,端口一般是9380。如果记不住fate的配置,use(我还没找到,等流添加好了,如果记不住pipeline的配置,用pipelineconfigshow查看开发python文件,上传【数据文件】有如下内容代码。FATE上传的数据应该是什么样的?官方文档中的这个教程使用的就是这个表格文件。可以参考文档中给出的例子。路径其实就是fategithub的路径。打开文档中的hetero_breast_guest后,是这个样子的。文档中的数据集在这里:https://github.com/FederatedAI/FATE/tree/master/examples/data可以直接从github上下载,也可以复制粘贴,但是要注意,检查最后一行是否是空的!,如果是空行就删掉,否则FATE会报错。详情可以看我的个人博客。每一个上传的数据都会有自己的table_name和namespace,fate就是通过这两个字段来命名和区分每一个上传的数据。管道的发起者与拥有管道的人绑定,设置的角色表明哪些人参与了这个任务。下面的例子意思是“这个pipeline属于id号为9999的guest,这个任务是由id为9999的guest和id为10000的host共同完成的”。guest和host参数可以是数字或列表,如guest=[1,2,3,4]。frompipeline.backend.pipelineimportPipeLinepipeline=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表示是否覆盖上传的表操作成功后,终端会出现相似词。从FATE服务获取数据官方文档:https://fate.readthedocs.io/en/latest/tutorial/pipeline/pipel...强烈推荐阅读官方文档!另外,文档中的sbt其实就是SecureBoostTree,一种决策树模型,因为使用了FATE,所以叫Secure。FATE工具中使用Reader类从FATE框架中获取数据。该文件说“加载数据”。一开始以为加载数据是本地加载的,汗!最好把文档改成从FATE服务加载数据。。。使用Reader类获取数据后,可以使用DataTransform类进行转换。文档和代码都提到了,大家可以参考文档。使用Intersection获取两个数据的PSI,参考Component文档和intersection文档。PythonReader也需要绑定当事人,但是需要绑定数据提供者的身份和id。比如有一条客人id10提供的数据A。定义Reader时,必须绑定guestid10才能读取成功。注:联邦学习中所谓的“获取数据”,一般来说就是把自己这边的数据和联邦的数据“融合”起来,然后用于本次训练,所以一般会涉及到官方中的数据文件。intersection类,下面的例子是获取自己上传的数据,只是为了简单演示。虽然简单,但是对于理解FATE中的类很有帮助。frompipeline.componentimportReader,DataTransform,HeteroSecureBoost,Evaluationfrompipeline.interfaceimportData#setpipelineoperationpartyids.pipeline=PipeLine()\.set_initiator(role='guest',party_id=9999)\.set_roles(guest=9999数据集))#,host=10000)不需要加入其他hostreader_0=Reader(name="reader_0")#绑定reader操作tablesreader_0.get_party_instance(role='guest',party_id=9999).component_param(table={"name":"dummy","namespace":"dummy"})data_transform_0=DataTransform(name="data_transform_0")#绑定转换操作partydata_transform_0.get_party_instance(role='guest',party_id=9999).component_param(with_label=True)#状态a提升树和评估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_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()#训练管道。fit()#loadanotherdatasetviapredict_pipeline#predict_pipeline.predict()如何检查提取的数据?在命盘里可以看到命盘怎么用?.培训失败怎么办?Python会提示可以使用命运板查看日志。命运盘怎么用?.Save对于一个pipeline,可以通过dump将所有信息保存到pkl中。#保存结果pipeline.dump("pipeline_saved.pkl")