Fate實戰——實現集群橫向邏輯回歸
摘要
我在做集群的聯邦學習之前,用主機部署的方式,實現了單機版的橫向聯邦學習。參考了下面的兩篇文章:
聯邦學習實戰-2-用FATE從零實現橫向邏輯回歸_文杰的博客-CSDN博客
Ubuntu18.04上部署單機 Fate1.6.0, 并使用PyCharm進行開發和調試。 - 老妹兒的 - 博客園 (cnblogs.com)
參考這兩篇就可以實現單機版的部署和橫向聯邦學習,建議大家在做集群橫向聯邦學習之前,先把單機版的搞明白。搞明白單機版后,實現集群的橫向聯邦。我的集群是個星型的集群,三個節點通過exchange相鏈接,三個節點的patryid分別是9999,10000,8888。文章對實現過程做個記錄。
1 切分數據集
數據集和單機版的一樣也是采用威斯康星州臨床科學中心開源的乳腺癌腫瘤數據集
from sklearn.datasets import load_breast_cancer
為了模擬橫向聯邦建模的場景,我們首先在本地將乳腺癌數據集切分為特征相同的橫向聯邦形式,當前的breast數據集有569條樣本,我們將前面的469條作為訓練樣本,后面的100條作為評估測試樣本。
從469條訓練樣本中,選取前200條作為公司A的本地數據,保存為breast_1_train.csv,將剩余的269條數據作為公司B的本地數據,保存為breast_2_train.csv。
測試數據集可以不需要切分,兩個參與方使用相同的一份測試數據即可,文件命名為breast_eval.csv。
splitDataset.py
from sklearn.datasets import load_breast_cancer import pandas as pd breast_dataset = load_breast_cancer() breast = pd.DataFrame(breast_dataset.data, columns=breast_dataset.feature_names) breast = (breast-breast.mean())/(breast.std()) col_names = breast.columns.values.tolist() 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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
注:這一部分的邏輯和單機版的保持一致,我沒有做更改。
2 數據轉換輸入
在集群的fate01上的/data/projects/fate目錄下新建chapter05文件夾(單機版叫這個名字,我也懶得換了),進入chapter05文件夾然后新建data文件夾,然后將數據集放到該目錄下的data目錄中。
參與的節點重復上面的操作,每個節點放置一份數據。
完成數據轉換,需要一個配置文件和一個啟動程序,我演示第一個節點的操作。
編寫訓練集的配置文件
upload_train.json
{ "file": "chapter05/data/breast_1_train.csv", //訓練集的路徑,我們這次試用fate_flow_client.py上傳數據,默認的home路徑是/data/projects/fate,所以我們需要把剩下的路徑補充完整 "head": 1, "partition": 1,//是否要分區,小數據不用分區 "work_mode": 1,//0是單機,1是集群,我們要注意 "table_name": "homo_breast_1_train", "namespace": "homo_host_breast_train"http://后面這兩個字段一個是數據集的名字和命名空間,這個在后面的配置中要用到。 }
1
2
3
4
5
6
7
8
編寫驗證集的配置文件
upload_eval.json
{ "file": "chapter05/data/breast_eval.csv", //訓練集的路徑,我們這次試用fate_flow_client.py上傳數據,默認的home路徑是/data/projects/fate,所以我們需要把剩下的路徑補充完整 "head": 1, "partition": 1,//是否要分區,小數據不用分區 "work_mode": 1,//0是單機,1是集群,我們要注意 "table_name": "homo_breast_eval", "namespace": "homo_host_breast_eval"http://后面這兩個字段一個是數據集的名字和命名空間,這個在后面的配置中要用到。 }
1
2
3
4
5
6
7
8
上面的配置每個節點都配置一份,切分數據集時,訓練集切了兩份,驗證集只有一份,所以驗證集配置成一樣的,訓練我在fate01和fate03上使用的breast_1_train.csv,在fate02上用breast_2_train.csv,大家根據自己的情況修改配置文件即可。
下面執行上傳數據的操作,有兩種方式上傳數據,一種是用fate_flow_client.py上傳數據,一種使用flow命令上傳數據,我在使用flow上傳數據時遇到一些問題,所以先演示如何使用fate_flow_client.py上傳數據。具體的詳細使用可以查閱官方的文檔。
官方文檔:上傳數據指南 — FATE documentation
啟動虛擬環境,并進入chapter05下面,如圖:
然后執行:
python ../fate_flow/python/fate_flow_client.py -f upload -c upload_train.json
1
-f :函數名稱
-c :配置文件
將驗證集也上傳上去:
fate02和fate03重復上面的步驟,把訓練集和測試傳上去。
到這里數據集已經上傳,接著就可以開始做訓練了。
3 模型訓練
為了讓任務模型的構建更加靈活,目前 FATE 使用了一套自定的領域特定語言 (DSL) 來描述任務。在 DSL 中,各種模塊(例如數據讀寫 data_io,特征工程 feature-engineering, 回歸 regression,分類 classification)可以通向一個有向無環圖 (DAG) 組織起來。通過各種方式,用戶可以根據自身的需要,靈活地組合各種算法模塊。
除此之外,每個模塊都有不同的參數需要配置,不同的 party 對于同一個模塊的參數也可能有所區別。為了簡化這種情況,對于每一個模塊,FATE 會將所有 party 的不同參數保存到同一個運行配置文件(Submit Runtime Conf)中,并且所有的 party 都將共用這個配置文件。這個指南將會告訴你如何創建一個 DSL 配置文件。
官方的文檔:DSL 配置和運行配置 V1 — FATE documentation
所以我們需要寫一個DSL配置文件和Config文件。
1)DSL文件配置
文件名字:test_homolr_train_job_dsl.json
{ "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" ] }, "output": { "data": [ "eval_data" ], "model": ["homolr"] } }, "evaluation_0": { "module": "Evaluation", "input": { "data": { "data": [ "homo_lr_0.train" ] } } }, "evaluation_1": { "module": "Evaluation", "input": { "data": { "data": [ "homo_lr_1.eval_data" ] } } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
我在DSL里面配置了訓練集組件和驗證集組件,這個組件的配置在單機版的橫向聯邦中提到過。
2)Config配置文件
文件名字:test_homolr_train_job_conf.json
{ "initiator": { "role": "guest", "party_id": 9999 }, "job_parameters": { "work_mode": 1 }, "role": { "guest": [ 9999 ], "host": [ 10000,8888 ], "arbiter": [ 9999 ] }, "role_parameters": { "guest": { "args": { "data": { "train_data": [ { "name": "homo_breast_2_train", "namespace": "homo_host_breast_train" } ], "eval_data": [ { "name": "homo_breast_eval", "namespace": "homo_host_breast_eval" } ] } }, "dataio_0": { "label_name": ["y"] } }, "host": { "args": { "data": { "train_data": [ { "name": "homo_breast_1_train", "namespace": "homo_host_breast_train" }, { "name": "homo_breast_2_train", "namespace": "homo_host_breast_train" } ], "eval_data": [ { "name": "homo_breast_eval", "namespace": "homo_host_breast_eval" }, { "name": "homo_breast_eval", "namespace": "homo_host_breast_eval" } ] } }, "dataio_0": { "label_name": ["y","y"] }, "evaluation_0": { "need_run": [ false,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 } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
寫完上面的配置文件后,將他們放到guest的chapter05文件夾下面,然后就可以開始訓練了。
在fate02的chapter05中,啟動虛擬環境,執行訓練。
cd /data/projects/fate/chapter05 source ../bin/init_env.sh python ../python/fate_flow/fate_flow_client.py -f submit_job -c test_homolr_train_job_conf.json -d test_homolr_train_job_dsl.json
1
2
3
如果出現如下圖的錯誤,說明flow的服務沒有啟動這時候就需要重啟所有的服務,執行命令:
cd /data/projects/common/supervisord sh service.sh restart all
1
2
然后在執行提交任務的指令,出現下面的信息就說明任務提交成功。
查看fate01、fate02、fate03的運行狀態,如下圖:
看到下圖所有的訓練組件變成綠色,恭喜你,成功了!!!
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。