在Juypter Notebook中構建聯邦學習任務

題圖攝於頤和園

(本文作者系 VMware 中國研發雲原生實驗室工程師,聯邦學習 FATE / KubeFATE 開源項目貢獻者。)

需要加入KubeFATE開源項目討論羣的同學,請關注本公衆號後回覆 “kubefate” 即可。

相關文章:

使用Docker Compose 部署FATE v1.5.0

VMware招聘聯邦學習和雲原生開發工程師

概要

聯邦學習開源框架 FATE 發佈了1.5版本。由於該版本爲長期支持版本(LTS),因此無論是在性能和穩定性上相對於之前的版本都有了比較大的提升,建議還沒有升級的用戶可以及時更新。

FATE 在 v1.5 有兩個比較重要的改動,一個是可以使用 Spark 作爲底層計算引擎;另一個則是提供了 "fate_client" 開發工具。後者在很大程度上方便了用戶與FATE 集羣的交互,本文將配合 Juypter Notebook 來着重介紹 "fate_client" 的使用。而對使用 Spark 作爲底層計算引擎感興趣的讀者可以關注本系列文章,我們將會在後續文章中對其架構和使用進行介紹。

Jupyter Notebook 環境準備

對於使用 KubeFATE 來部署集羣的用戶來說,部署完成後通過docker或者kubectl命令列出容器時會發現一個名爲 "client" 的容器。該容器是是一個 Jupyter Notebook 服務,並且已經集成了 "fate_client",因此用戶打開 Notebook 後可以直接使用相應的包與 FATE 集羣進行交互。

Notebook 服務的訪問方式根據部署方式而異,詳情如下:

  • docker-compose 方式部署:訪問部署節點的20000端口,如192.168.0.1:20000。

  • Kubernetes 方式部署:通過域名方式訪問,如通過"9999.notebook.kubefate.net"來訪問party 9999的notebook,域名的設置詳情請參考"optional-add-kubefatenet-to-host-file"。

對於沒有使用 KubeFATE 來部署集羣的用戶,則需要額外啓動 Juypter Notebook服務和通過 pip 的方式安裝"fate_client"。假設用戶已經具備python 3.7環境則步驟如下:

$ pip install notebook fate-client
$ jupyter notebook --ip=0.0.0.0 --port=20000 --allow-root --debug --no-browser --NotebookApp.token='' --NotebookApp.password=''

上面的第二條命令會啓動 Juypter Notebook 服務並監聽 20000 端口,待服務啓動完畢後則可以通過的方式 "IP:Port" 的方式訪問 Notebook,下圖展示通過瀏覽器訪問 Notebook 服務。

通過 KubeFATE 部署的 Jupyter Notebook 自帶了一些例子,這些例子是通過 fml_manager 來跟 FATE 集羣進行交互的,在不久的未來 fml_manager 將與 fate_client 進行整合,因此本文不再詳述。

FATE Client 簡介

目前 fate_client 已經打包上傳到了PyPI 上,因此可直接通過pip install的方式來安裝。

從代碼上來看其主要分爲了三個部分,分別如下:

flow_sdk

這是對 fate_flow 所提供的 HTTP API 的一層封裝,因此對於 FATE 中常用的數據結構如 job、component 等都有相應的操作,用戶可以在代碼中導入它來跟 FATE集羣進行交互。一個通過 flow_sdk 來提交訓練任務的例子如下:

上面的 Python 代碼中通過FlowClient('127.0.0.1', 9380, 'v1')初始化了與fate_flow的鏈接。

隨後調用job.submit提交任務,任務的配置和DSL文件分別由conf_pathdsl_path指定。更多關於 flow_sdk 支持的操作可以參考 "flow_sdk/README.rst"

flow_client

這個模塊是在 fate_sdk 之上的一層封裝,通過它可以直接以命令行的方式來跟FATE集羣進行交互。

flow_client 在第一次使用時需要先進行初始化,需要指定 fate_flow 的地址,命令如下:

初始化只需要執行一次,完成後可以通過以下例子來提交任務:

$ flow job submit -c fate_flow/examples/test_hetero_lr_job_conf.json -d fate_flow/examples/test_hetero_lr_job_dsl.json

更多關於 flow_client 支持的指令可以參考"flow_client/README.rst"。

pipeline

此模塊同樣也是基於 fate_sdk 之上的一層封裝,其最核心的功能是把FATE所有支持的算法都封裝成了 python 中的類。以往任務的流程只能通過 json 文件去定義,但通過 pipeline 模塊,用戶可以通過代碼以更加簡潔和方便的方式去定義任務流程。

pipeline 最終會通過 flow_sdk 把任務提交到 FATE 集羣上執行,因此它需要通過初始化來傳遞 fate_flow 的地址給 flow_sdk。一個初始化的例子如下:

$ flow init  --ip 127.0.0.1 --port 9380 -d ./log

其中-d指定了輸出日誌的路徑。

使用 Pipeline 構建任務的具體例子可參考下一節,至於pipeline的更多詳情可以參考"pipeline/README.rst"

在 Notebook 中定義並提交任務

接下來將通過一個例子來詳細講述如何通過 "Pipeline" 來定義和執行任務,下面用到的"usage_of_fate_client.ipynb",用戶可以自行下載並上傳到 Notebook服務上使用。

Notebook 更改自 FATE 的 "pipeline-mini-demo.py"。

該例子按列把原數據集 "breast_cancer" 拆分了 "breast_hetero_guest" 和 "breast_hetero_host" 兩部分,其中參與訓練的 host 方持有不帶標籤的 "breast_hetero_host" ,而 guest 方則持有帶有標籤的 "breast_hetero_guest" 。隨後 guest 和 host 將聯合起來對數據集進行異構邏輯迴歸訓練,最後當訓練完成後還會使用模型執行離線推理任務。

爲了簡化,Notebook 的例子中只出現了一個 FATE 集羣,該集羣同時承擔了guest 和 host 的角色。但在現實應用中,這兩個角色應由不同的 FATE 集羣擔任。

對於不是通過 KubeFATE 來部署集羣的用戶來說,還需要依照上一節提到的方式爲 "Pipeline" 進行初始化,反之只需要直接通過瀏覽器訪問 Notebook 即可,無需進行初始化操作。爲方便起見,以下訪問的 Notebook 服務經由 KubeFATE 部署,其 party_id 爲 10000。

下面每一步執行的日誌都會輸出到Pipeline/logs目錄下,用戶可以很方便地通過 Notebook 查看。

上傳數據

在FATE中執行訓練任務需要把原數據集上傳到集羣中,並且需要指定("namespace", "name")來作爲其在系統中的唯一標識。在下面的代碼中定義了 guest_train_data 和 host_train_data 兩個數據集,並把原數據 "breast_hetero_guest.csv" 和  "breast_hetero_host.csv" 分別上傳到對應的數據集當中。

定義訓練組件

在下面的代碼中首先用guest_train_datahost_train_dataguest_eval_datahost_eval_data指定了任務所需要用到的數據。在任務的 pipeline 通過PipeLine()初始化之後,使用set_initiatorset_roles來設定 guest 和 host 的相關信息。最後定義了 Reader、DataIO、Interp 和 HeteroLR。其中 reader_0 和 reader_1 分別用於讀取訓練和驗證的數據;dataio_0 和 dataio_1 用於把讀取到的數據轉爲後續組件使用所需的格式;interp_0 和 interp_1分別用於求訓練數據集和驗證數據集的交集;hetero_lr_0 則定義了異構邏輯迴歸算法的具體參數。

構建訓練流程並執行

這個代碼段首先通過調用add_component()把上一步定義的組件加入到了任務的pipeline 中,調用的順序需要與組件的執行順序一致。然後通過compile()來驗證和編譯 pipeline,接着通過job_parameters來指定任務的計算引擎、工作模式等參數,最後調用fit來提交併運行任務。

定義並執行預測

預測的任務通過一個新的 pipeline 實例predict_pipeline來完成。在預測前需要通過pipeline.deploy_component()來部署必要的組件,然後在predict_pipeline中使用。

預測的結果可以通過 FATEBoard 的來查看,結果如下:

目前在 FATE 中已經自帶了很多使用 "Pipeline" 的例子: examples/pipeline,感興趣的讀者可以把它們轉換到 Notebook 裏面來使用。

總結

相對與之前的版本,FATE v1.5 在各方面都有了比較大的提升,特別是在方便用戶的使用上作出非常多的改進。本文只對其中一部分更新進行了介紹,對於更加詳細的內容可以參考 FATE 的github代碼 (https://github.com/FederatedAI/FATE/tree/v1.5.0) 和官方網站 (https://fate.fedai.org)

原文鏈接

https://github.com/FederatedAI/KubeFATE/wiki/%E5%9C%A8Juypter-Notebook%E4%B8%AD%E4%BD%BF%E7%94%A8FATE-Client%E6%9E%84%E5%BB%BA%E4%BB%BB%E5%8A%A1

需要加入KubeFATE開源項目討論羣的同學,請先關注本公衆號,然後回覆 “kubefate” 即可。

要想了解雲原生、人工智能和區塊鏈等技術原理,請立即長按以下二維碼,關注本公衆號亨利筆記 ( henglibiji ),以免錯過更新。

歡迎轉發、收藏和點 “在看”和贊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章