聯邦學習框架FATE實踐(訓練/測試步驟及參數說明)
一、FATE概念
1. 角色
在Fate的概念中分成3種角色,Guest、Host、Arbiter
(1)Guest表示數據應用方,在縱向算法中,Guest往往是有標籤y的一方。一般是由Guest發起建模流程。
(2)Host是數據提供方
(3)arbiter是用來輔助多方完成聯合建模的,主要的作用是用來聚合梯度或者模型,比如縱向lr裏面,各方將自己一半的梯度發送給arbiter,然後arbiter再聯合優化等等,arbiter還參與以及分發公私鑰,進行加解密服務等等。
二、訓練
1. 準備
在FATE中構建算法模型,需要準備三個配置文件。
(1)上傳數據配置文件:用於上傳數據
(2)DSL配置文件:用於定義建模任務
(3)運行配置文件:用於設置每個組件的參數
2. 定義上傳數據配置文件
(1)參數說明:
file
: 文件路徑
head
: 指定數據文件是否包含表頭
partition
: 指定用於存儲數據的分區數
work_mode
: 指定工作模式,0代表單機版,1代表集羣版
table_name&namespace
: 存儲數據表的標識符號
(2)示例
{
"file": "examples/data/breast_b.csv",
"head": 1,
"partition": 10,
"work_mode": 0,
"table_name": "hetero_breast_b",
"namespace": "hetero_guest_breast"
}
3. 定義DSL 配置文件
(1)概念
FATE 使用特定語言 DSL 來描述任務,各種模塊可通過一個有向無環圖組織起來。DSL 配置文件採用 json 格式,整個配置文件就是一個 json 對象 (dict)。在這個 dict 的第一級是 “components”,表示這個任務將會使用到的各個模塊,每個獨立的模塊定義在 “components” 之下。
(2)參數說明
module_name
:模塊的鍵。用戶需要使用模塊名加數字 _num 作爲對應模塊的 key,例如 dataio_0,並且數字應從 0 開始計數。這用於區分可能存在的多個相同種類的模塊。
module
:用來指定使用的模塊。這個參數的內容需要和 federatedml/conf/setting_conf 下各個模塊的文件名保持一致。模塊名鏈接
input
:輸入。分爲兩種輸入類型,分別是 data 和 model。
output
:輸出。和 input 一樣,有 data 和 model 兩種類型。
need_deploy
:是或否。該字段用於指定組件是否需要部署以進行在線推斷。該字段僅用於在線推論dsl推論。
(3)示例
{
"components" : {
"dataio_0": {
"module": "DataIO",
"input": {
"data": {
"data": [
"args.train_data"
]
}
},
"output": {
"data": ["train"],
"model": ["dataio"]
},
"need_deploy": true
}
}
}
4.定義運行配置文件
(1)概念
每個模塊都有不同的參數需要配置,不同的 party 對於同一個模塊的參數也可能有所區別。爲了簡化這種情況,對於每一個模塊,FATE 會將所有 party 的不同參數保存到同一個運行配置文件(Submit Runtime Conf)中,並且所有的 party 都將共用這個配置文件。
(2)參數說明
initiator
:指定啓動器的角色和參與方ID。
job_parameters
:設置work_mode 和processor_per_node。
role
:指示所有角色的所有參與方ID。每個角色的 party_id 以列表形式存在,因爲一個任務可能涉及到多個 party 擔任同一種角色。
role_parameters
:指定角色的參數,這一部分的參數對於不同的 party 都有所區別。數據需要匹配上傳數據配置文件。
algorithm_parameters
:指定所有 party 都共享的參數,每一個參數的 key 都是在 DSL 配置文件中定義好的模塊名。
在完成這些配置文件並提交任務之後,fate-flow 將會把 role_parameters 和 algorithm_parameters 中的所有參數合併。如果合併之後,仍然存在沒有定義的參數,fate-flow 則會使用默認值。fate-flow 會將這些參數分發到對應的 party,並開始聯邦建模任務。
(3)示例
{
"initiator": {
"role": "guest",
"party_id": 10000
},
"job_parameters": {
"work_mode": 1
"processor_per_node": 6
},
"role": {
"guest": [
10000
],
"host": [
10000
],
"arbiter": [
10000
]
},
"role_parameters": {"Your role parameters"},
"algorithm_parameters": {"Your algorithm parameters"},
}
5. 訓練過程
(1)上傳數據
在所有數據提供者之間加載數據,上傳命令:
python ${your_install_path}/fate_flow/fate_flow_client.py -f upload -c ${upload_data_json_path}
${your_install_path}
: fate的安裝目錄
${upload_data_json_path}
:上傳數據配置文件路徑
每個提供數據的集羣(即guest和host)都需執行此步驟
不能上傳具有相同table_name和namespace的不同數據集
運行此命令後,如果成功,將顯示以下信息:
{
"data": {
"pid": 74684,
"table_name": "breast_b",
"namespace": "breast_hetero"
},
"jobId": "20190801152750392991_436",
"meta": null,
"retcode": 0,
"retmsg": "success",
"created_at": "2019-08-01 15:27:50"
}
輸出所示,table_name和namespace已經列出,可以在上傳配置文件中作爲輸入配置。
(2)開始建模
命令:
python {fate_install_path}/fate_flow/fate_flow_client.py -f submit_job -c ${runtime_config} -d ${dsl}
${runtime_config}
:運行配置文件路徑
${dsl}
:dsl文件路徑
(3)檢查日誌
路徑:
${your_install_path}/logs/${your jobid}
${your_install_path}
: fate的安裝目錄
${your jobid}
:本次的jobid
三、測試
1. 準備
(1)爲需要在預測階段部署的模塊添加或修改“ need_deploy”字段。除了通常不會在預測階段運行的FederatedmSample和Evaluation之外,所有模塊均將True設置爲其默認值。“ need_deploy”字段爲True表示此模塊應運行“擬合”過程,並且擬合模型需要在預測階段進行部署。
(2)除了Intersect模塊之外,其他模塊應該配置模型輸出,這樣fate-flow才能存儲訓練後的模型並使其在預測階段可用。
(3)獲取訓練模型的model_id和model_version,獲取命令:
python ${your_fate_install_path}/fate_flow/fate_flow_client.py -f job_config -j ${jobid} -r guest -p ${guest_partyid} -o ${job_config_output_path}
${your_fate_install_path}
: fate安裝目錄
${jobid}
:任務ID
${guest_partyid}
:提交工作的一方的partyId
${job_config_output_path}
:存儲job_config的路徑
之後,包含模型信息的json文件將被下載到$ {job_config_output_path} /model_info.json中
2. 定義預測配置文件
(1)概念:
此配置文件用於配置用於預測的參數
(2)參數說明
initiator
: 指定發起人的角色和參與方ID,應與訓練過程相同
job_parameters
:
work_mode:集羣或獨立,與訓練過程相同。
model_id或model_version:1. 準備(3)中獲取的模型指示器。
job_type:工作類型。在這種情況下,它應該是“predict”。
role
: 指出所有角色的所有參與ID,應與訓練過程相同
role_parameters
:爲每個角色設置參數。在這種情況下,“ eval_data”(意味着將要預測的數據)應同時爲Guest和Host分別填寫
(3)示例
{
"initiator": {
"role": "guest",
"party_id": 10000
},
job_parameters": {
"work_mode": 0,
"job—type": "predict",
"model_id": "arbiter-10000#guest-10000#host-10000#model",
"model_version": "202005140855200605181"
},
"role": {
"guest": [10000],
"host": [10000],
"arbiter": [10000]
}
,,n>]
"role_parametersn": {
"guest": {
"args": {
"data": {
"eva_data": [{"name": "homo_breast_guest", "namespace": "homo_breast_guest"}]
}
}
},
"host": {
"args":{
"data":{
"eva_data": [{"name": "homo_breast_host", "namespace": "homo_breast_host"}]
}
}
}
}
}
3. 預測過程
命令:
python ${your_fate_install_path}/fate_flow/fate_flow_client.py -f submit_job -c ${predict_config}
${your_fate_install_path}
:fate安裝目錄
${predict_config}
:預測配置文件路徑
4. 查看預測結果
查看FATE_board
http://${fate_board_ip}:${fate_board_port}/index.html#/details?job_id=${job_id}&role=guest&party_id=${guest_partyid}
$ {fate_board_ip} $ {fate_board_port}
:用於部署FATE模塊的ip和端口。
$ {job_id}
:預測任務的job_id。
$ {guest_partyid}
:GuestID
5. 下載預測結果
預測任務完成後,前100條預測結果記錄將在FATE-board中可用。可以通過以下命令下載所有結果。
python ${your_fate_install_path}/fate_flow/fate_flow_client.py -f component_output_data -j ${job_id} -p ${party_id} -r ${role} -cpn ${component_name} -o ${predict_result_output_dir}
${job_id}
: 預測任務ID
${party_id}
: 當前用戶partyID
${role}
: 當前用戶的角色
${component_name}
: 具有預測結果的組件
${predict_result_output_dir}
: 將預測結果下載到的目錄
四、參考
FATE用法 https://github.com/FederatedAI/FATE/tree/master/examples/federatedml-1.x-examples
上傳數據指南 https://github.com/FederatedAI/FATE/blob/master/doc/upload_data_guide_zh.rst
DSL 配置和運行配置 https://github.com/FederatedAI/FATE/blob/master/doc/dsl_conf_setting_guide_zh.rst
聯邦學習與微衆Fate https://blog.csdn.net/qq_28540443/article/details/104416436