【FATE實戰】縱向聯邦學習FATE框架下實戰的過程解釋
在使用FATE進行聯邦學習研究的時候,網上的教程通常只是說教我們怎麼上傳FATE框架自帶的資料去測試整個框架在本機上有沒有問題。
下面一個過程就是我們怎麼去理解我們在使用FATE進行聯邦學習的時候使用到的幾個配置檔案的作用。
首先我是從【聯邦學習】FATE框架:縱向聯邦學習練習——波士頓房價找到FATE框架練習:實現橫向邏輯迴歸任務的訓練及預測和二、 FATE實戰:實現橫向邏輯迴歸任務的訓練及預測
這三個連結可以幫助我們去學習FATE框架的實戰。這裡我用自己的理解上傳自己想要上傳的資料,使用自己想要的結構去建立模型。
#################################################################################################################################################################
首先,我們需要做的是上傳檔案。
上傳檔案需要確定的第一步是你已經進入了fate容器
如果fate沒有啟動過,就cd到docker_standalone_fate_1.6.0資料夾
執行install_standalone_docker.sh
cd docker_standalone_fate_1.6.0 bash install_standalone_docker.sh
install_standalone_docker.sh檔案長這樣
docker run -d就是守護方式開啟容器,--name就是把容器命名為fate,-p就是將容器的埠暴露給宿主機埠 格式:host_port:container_port 或者 host_ip:host_port:container_port,後面的fate:latest就是映象的名字。
docker ps -a就是把所有執行著的和執行過的(但是沒有刪除,還可以重新執行的)容器顯示出來。結果如下:
如果啟動成功就可以看到
我們也可以通過docker ps看我們正在執行的容器
當然,還有一種情況就是fate執行過,但是關閉了(docker stop),沒有刪除(docker rm)。就可能會報錯
這個時候我們使用
docker restart fate
即可。
然後問題解決我們就可以進入fate容器內部:
docker exec -it fate /bin/bash
然後就可以愉快地進入我們的上傳檔案了~
上傳檔案需要的python指令碼是
python ${your_install_path}/fate_flow/fate_flow_client.py -f upload -c ${upload_data_json_path}
用自己的路徑就是
python python/fate_flow/fate_flow_client.py -f upload -c examples/dsl/v1/homo_logistic_regression/upload_data_host.json python python/fate_flow/fate_flow_client.py -f upload -c examples/dsl/v1/homo_logistic_regression/upload_data_guest.json # 下面這條upload_data_test.json 是上傳測試資料,僅僅在作evaluation時需要上傳,執行普通的train_job可以不用上傳 python python/fate_flow/fate_flow_client.py -f upload -c examples/dsl/v1/homo_logistic_regression/upload_data_test.json
這裡的-f和-c啊,和前面的docker -d,docker ps -a啥引數啊,完全不一樣,不是一個出處的!我們如何去理解這列的引數呢?
這裡的引數就和python/fate_flow/fate_flow_client.py裡的fate_flow_client.py檔案有關,檔案裡面關於引數的部分長這樣:
-f是要傳函式引數,我們傳的upload函式在
DATA_FUNC + MODEL_FUNC + JOB_FUNC + JOB_OPERATE_FUNC + TASK_OPERATE_FUNC + TABLE_FUNC +
TRACKING_FUNC + PERMISSION_FUNC
裡面。其中各個函式集合裡面有:
upload是DATA_FUNC裡面的函式,然後我們再去看DATA_FUNC:
其中沒啥有用的,就是一個上傳檔案的程式碼,主要是可以讓我們熟悉這個fate_flow_client.py的程式碼。
然後是fate_flow_client.py 的-c引數,上圖可以知道-c是要上傳config一個配置檔案upload_data_host.json,這個檔案長這樣:
其中"file"就是我們要上傳檔案的絕對路徑,一般都是在容器內部,其中容器內部的資料檔案都有哪些呢?
一般自己上傳資料檔案的話,可以自己在容器自己建立一個資料夾,再用cp指令從虛擬機器(我用的VMware centos7)傳到容器裡面。在修改conf.json檔案裡面的file絕對路徑和
table_name的表格標籤,再放到自己定義的一個namespace裡面,一般測試用的放experiment裡面,也可以自己想一個namespace名字放裡面。這個主要是後面的訓練conf.json檔案需要。
upload_data_guest.json和test檔案都差不多。可以自己用
vim /fate/examples/dsl/v1/homo_logistic_regression/upload_data_guest.json
vim /fate/examples/dsl/v1/homo_logistic_regression/upload_data_test.json
檢視。如果容器沒有下載vim可以docker容器中安裝vim。
#################################################################################################################################################################
其次,我們需要在v1資料夾下選擇示例dsl和conf進行訓練:(也可以用v2資料夾的dsl和conf檔案進行訓練,我喜歡v2,具體看二、 FATE實戰:實現橫向邏輯迴歸任務的訓練及預測第四部分)
命令為:
python python/fate_flow/fate_flow_client.py -f submit_job -d examples/dsl/v1/homo_logistic_regression/test_homolr_train_job_dsl.json -c examples/dsl/v1/homo_logistic_regression/test_homolr_train_job_conf.json
啊,這個.py我們之前看過,這個-f 後面的函式是submit_job在裡面也有,在.py檔案裡的內容為:
-c後面傳的是conf.json和-d後面是dsl.json檔案,其中test_homolr_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_homo_guest",
"namespace": "experiment"
}
]
}
}
},
"host": {
"args": {
"data": {
"train_data": [
{
"name": "breast_homo_host",
"namespace": "experiment"
}
]
}
},
"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": "rmsprop",
"tol": 1e-05,
"alpha": 0.01,
"max_iter": 30,
"early_stop": "diff",
"batch_size": -1,
"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
}
}
}
}
conf.json檔案需要確保name 和namespace與前面的upload檔案的一致。
dsl檔案test_homolr_train_job_dsl.json長這樣:
{ "components" : { "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" ] } } } } }
dsl是模型結構,結構是長這樣:
像是另一個fast_secureboost的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"], "model": ["dataio"] }, "need_deploy": false }, "intersection_0": { "module": "Intersection", "input": { "data": { "data": [ "dataio_0.train" ] } }, "output": { "data": ["train"] } }, "intersection_1": { "module": "Intersection", "input": { "data": { "data": [ "dataio_1.eval" ] } }, "output": { "data": ["eval"] }, "need_deploy": false }, "fast_secureboost_0": { "module": "HeteroFastSecureBoost", "input": { "data": { "train_data": [ "intersection_0.train" ], "eval_data": [ "intersection_1.eval" ] } }, "output": { "data": ["train"], "model": ["train"] } }, "evaluation_0": { "module": "Evaluation", "input": { "data": { "data": [ "fast_secureboost_0.train" ] } } } } }
結果長這樣:
之後看進展再寫吧~