1. 程式人生 > 其它 >【FATE實戰】縱向聯邦學習FATE框架下實戰的過程解釋

【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"
                    ]
                }
            }
        }
    }
}

結果長這樣:

 之後看進展再寫吧~