KubeFATE: 用云原生技术赋能联邦学习(一)
題圖攝于北海公園
聯邦學習是AI領域一個新興的方向,被認為是 AI 領域最重要的研究和應用趨勢之一。聯邦學習可在用戶之間進行聯合建模,構造精確的人工智能模型,同時數據不用離開機構,可以保證雙方數據的隱私安全性,應用前景廣闊,因此,聯邦學習已經得到越來越廣泛的關注。
我們 VMware 云原生實驗室的團隊參與了聯邦學習開源項目 FATE 和 KubeFATE 的開發,文后附有作者相關課程的視頻。
(本文作者系VMware云原生實驗室工程師陳家豪,FATE / KubeFATE開源聯邦學習項目的貢獻者。)
概述
FATE?整體架構
一個正常工作的 FATE 集群里面包含了若干組件,其中有些負責任務調度、有些負責存儲,各個組件各司其職,聯合起來一起完成任務。一個 FATE 集群所包含的組件如下圖所示。
?FATE整體架構圖
各個服務的功能描述如下:
FATE Flow:該服務分為 Client 和Server兩部分,其中Client部分由用戶使用,用于向FATE集群提交聯邦學習任務;FATE Flow Server是FATE集群對外提供服務的入口,同時它也負責調度、執行用戶提交的任務請求和協調任務參與方。
MySQL:與任務相關的一些元數據,如創建時間,狀態都會存在MySQL中。
EGG/ROLL:向訓練任務提供了分布式計算和存儲能力。
Meta Service:一組數據或一個文件,可以被切片并分布在不同的Egg上,Meta service負責管理和定位文件的切片信息。
Federation:由于聯邦學習的特殊性質,在訓練中,各個參與方之間往往會進行若干次數據互換。該服務為訓練任務提供發送和接受數據的功能。
Proxy:該服務是一個反向代理,是FATE集群對外(訓練其他參與方)的唯一入口。
FATE Board:向用戶提供訓練任務的可視化。
FATE Serving:在線推理服務,用戶可以把訓練好模型推送到該服務后作在線推理。
KubeFATE簡介
由于FATE集群包含了眾多服務,并且每一個服務的啟動都需要不同的配置和依賴,以至于使用存在一定門檻。此外由于多個服務之間有相互依賴,一個服務的失敗可能導致整個集群的不可用,這給系統的運維也帶來了一定的挑戰。基于這個出發點,VMware和微眾聯合開發了KubeFATE項目,致力于解決聯邦學習的使用門檻和降低運維的成本。目前,KubeFATE和FATE最新的版本為1.3.0,本文后續所有與它們相關的操作都將基于此版本。
由于KubeFATE使用了容器技術對FATE進行了封裝,因此相對于傳統的安裝部署,使用KubeFATE有以下優點:
1.????使用簡單,免除缺失依賴軟件包的煩惱。
2.????配置方便,一個配置文件就能部署多套集群。
3.????管理靈活,可按需增減集群規模。
4.????適用于云環境。
目前KubeFATE支持使用Docker-Compose和Kubernetes兩種方式來部署和管理FATE集群,分別面向了測試開發和生產這兩種使用場景。本文主要關注于測試開發的部署,因此在接下來的部署中會使用Docker-Compose這種方式。Kubernetes的方式將另文敘述。
KubeFATE的工作流程主要分成兩部分,分別是
根據用戶定義的配置文件生成FATE集群的啟動文件。
拷貝啟動文件到指定機器上,并使用docker-compose命令啟動容器。
通常,負責生成啟動文件的服務器稱為部署機,而負責運行容器的服務器稱為目標機,部署機和目標機是在邏輯上的劃分。在本文中,部署機和目標機為同一臺機器。
部署機與目標機關系圖
使用KubeFATE和Docker-Compose來部署單節點聯邦學習平臺
由于KubeFATE使用了容器作為其底層工具,因此在開始使用KubeFATE之前,這里也簡單介紹下容器、Docker等相關的概念。
容器也稱Linux Container(簡稱LXC),它是與系統其他部分隔離開的一系列進程,主要由Namespace和Cgroup兩大機制來保證實現。其優點是:
1.????高資源利用與隔離
2.????輕量級
3.????跨Linux發行
Docker屬于 LXC的一種封裝,提供簡單易用的容器使用接口。它可以將應用程序與依賴,打包在一個文件里面,而當程序要運行的時候,Docker就為這個程進行一些配置,使得該進程與系統中的其他進程隔離。總體來說,Docker向用戶提供了一套簡單易用的接口,以至于用戶可以很方便使用容器。而Docker-Compose 是對Docker 容器進行編排的工具,通過它用戶可以很方便的配置和管理多個容器。至于更多關于Docker的詳細資料,請大家參考Docker 官網:https://www.docker.com
部署架構圖
?準備工作一臺機器,虛擬機或者物理機,推薦2CPU,8GB內存,Linux操作系統并且能聯網,并以root用戶登錄。下文中部署機器和目標機器為同一臺,IP地址為192.168.1.1 。
在目標機上安裝Docker
#?curl?-fsSL?https://get.docker.com?-o?get-docker.sh #?sh?get-docker.sh #?usermod -aG docker $(whoami) #?exec?$SHELL ?驗證安裝
#?docker?versionClient:?Docker?Engine?-?CommunityVersion:???????????19.03.7API?version:???????1.40Go?version:????????go1.12.17Git?commit:????????7141c199a2Built:?????????????Wed?Mar??4?01:22:36?2020OS/Arch:???????????linux/amd64Experimental:??????falseServer:?Docker?Engine?-?Community Engine:Version:??????????19.03.7API?version:??????1.40?(minimum?version?1.12)Go?version:???????go1.12.17Git?commit:???????7141c199a2Built:????????????Wed?Mar??4?01:21:08?2020 在目標機上安裝Docker-Compose?#?curl?-L?"https://github.com/docker/compose/releases/download/1.25.4/docker-compose-#(uname?-s)-#(uname?-m)"?-o?/usr/local/bin/docker-compose#?chmod?+x?/usr/local/bin/docker-compose ?驗證安裝#?docker-compose?versiondocker-compose?version?1.25.4,?build?unknown docker-py?version:?4.2.0 CPython?version:?2.7.17 OpenSSL?version:?OpenSSL?1.1.1??11?Sep?2018 ?在目標機上下載Docker 鏡像(可選)?對于國內用戶來說從Dockerhub上下載鏡像可能會比較慢,可用以下方式代替: #?wget?https://webank-ai-1251170195.cos.ap-guangzhou.myqcloud.com/fate_1.3.0-images.tar.gz?#?docker?load?-i?fate_1.3.0-images.tar.gz? 驗證下載鏡像#?docker?images REPOSITORY?????????????????????????TAG? federatedai/egg????????????????????1.3.0-release federatedai/fateboard??????????????1.3.0-release federatedai/meta-service???????????1.3.0-release federatedai/python?????????????????1.3.0-release federatedai/roll???????????????????1.3.0-release federatedai/proxy??????????????????1.3.0-release federatedai/federation?????????????1.3.0-release federatedai/serving-server?????????1.2.2-release federatedai/serving-proxy??????????1.2.2-release redis??????????????????????????????5 mysql??????????????????????????????8 在部署機上下載并解壓Kubefate1.3的kubefate-docker-compose.tar.gz資源包#?curl?-OL?https://github.com/FederatedAI/KubeFATE/releases/download/v1.3.0/kubefate-docker-compose.tar.gz#?tar?-xzf?kubefate-docker-compose.tar.gz 在部署機上定義需要部署的實例數目進入docker-deploy目錄#?cd?docker-deploy/編輯parties.conf如下#?vi?parties.conf?user=root??????????????????????????????????? dir=/data/projects/fate????????????????????? partylist=(10000)?????????????????????? partyiplist=(192.168.1.1)???????#此處替換為目標機的IP servingiplist=(192.168.1.1)?????#此處替換為目標機的IP exchangeip= ?在部署機上執行生成集群啟動文件腳本?#?bash?generate_config.sh??????????#?生成部署文件 ?在部署機上執行啟動集群腳本?#?bash?docker_deploy.sh?all命令輸入后需要用戶輸入兩次目標機的root用戶的密碼 在目標機上驗證集群狀態?#?docker?psCONTAINER?ID????????IMAGE?????????????????????????????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS?????????????????????????????????NAMES f8ae11a882ba????????fatetest/fateboard:1.3.0-release??????"/bin/sh?-c?'cd?/dat…"???5?days?ago??????????Up?5?days???????????0.0.0.0:8080->8080/tcp????????????????confs-10000_fateboard_1 d72995355962????????fatetest/python:1.3.0-release?????????"/bin/bash?-c?'sourc…"???5?days?ago??????????Up?5?days???????????9360/tcp,?9380/tcp????????????????????confs-10000_python_1 dffc70fc68ac????????fatetest/egg:1.3.0-release????????????"/bin/sh?-c?'cd?/dat…"???7?days?ago??????????Up?7?days???????????7778/tcp,?7888/tcp,?50001-50004/tcp???confs-10000_egg_1 dc23d75692b0????????fatetest/roll:1.3.0-release???????????"/bin/sh?-c?'cd?roll…"???7?days?ago??????????Up?7?days???????????8011/tcp??????????????????????????????confs-10000_roll_1 7e52b1b06d1a????????fatetest/meta-service:1.3.0-release???"/bin/sh?-c?'java?-c…"???7?days?ago??????????Up?7?days???????????8590/tcp??????????????????????????????confs-10000_meta-service_1 50a6323f5cb8????????fatetest/proxy:1.3.0-release??????????"/bin/sh?-c?'cd?/dat…"???7?days?ago??????????Up?7?days???????????0.0.0.0:9370->9370/tcp????????????????confs-10000_proxy_1 4526f8e57004????????redis:5???????????????????????????????????"docker-entrypoint.s…"???7?days?ago??????????Up?7?days???????????6379/tcp??????????????????????????????confs-10000_redis_1 586f3f2fe191????????fatetest/federation:1.3.0-release?????"/bin/sh?-c?'cd?/dat…"???7?days?ago??????????Up?7?days???????????9394/tcp??????????????????????????????confs-10000_federation_1 ec434dcbbff1????????mysql:8???????????????????????????????????"docker-entrypoint.s…"???7?days?ago??????????Up?7?days???????????3306/tcp,?33060/tcp???????????????????confs-10000_mysql_1 68b1d6c68b6c????????federatedai/serving-proxy:1.2.2-release????"/bin/sh?-c?'java?-D…"???32?hours?ago????????Up?32?hours?????????0.0.0.0:8059->8059/tcp,?0.0.0.0:8869->8869/tcp,?8879/tcp???serving-10000_serving-proxy_1 7937ecf2974e????????redis:5????????????????????????????????????"docker-entrypoint.s…"???32?hours?ago????????Up?32?hours?????????6379/tcp???????????????????????????????????????????????????serving-10000_redis_1 00a8d98021a6????????federatedai/serving-server:1.2.2-release???"/bin/sh?-c?'java?-c…"???32?hours?ago????????Up?32?hours?????????0.0.0.0:8000->8000/tcp?????????????????????????????????????serving-10000_serving-server_1 ?在目標機上驗證集群是否正確安裝#?docker?exec?-it?confs-10000_python_1?bash#?cd?/data/projects/fate/python/examples/toy_example#?python?run_toy_example.py?10000?10000?1如果測試通過,屏幕將顯示類似如下消息:"2019-08-29?07:21:25,353?-?secure_add_guest.py[line:96]?-?INFO:?begin?to?init?parameters?of?secure?add?example?guest" "2019-08-29?07:21:25,354?-?secure_add_guest.py[line:99]?-?INFO:?begin?to?make?guest?data" "2019-08-29?07:21:26,225?-?secure_add_guest.py[line:102]?-?INFO:?split?data?into?two?random?parts" "2019-08-29?07:21:29,140?-?secure_add_guest.py[line:105]?-?INFO:?share?one?random?part?data?to?host" "2019-08-29?07:21:29,237?-?secure_add_guest.py[line:108]?-?INFO:?get?share?of?one?random?part?data?from?host" "2019-08-29?07:21:33,073?-?secure_add_guest.py[line:111]?-?INFO:?begin?to?get?sum?of?guest?and?host" "2019-08-29?07:21:33,920?-?secure_add_guest.py[line:114]?-?INFO:?receive?host?sum?from?guest" "2019-08-29?07:21:34,118?-?secure_add_guest.py[line:121]?-?INFO:?success?to?calculate?secure_sum,?it?is?2000.0000000000002"通過上述步驟,一個FATE的實例(單方)部署完成,后續文章將介紹如何部署多方互聯進行聯邦學習的訓練。
常見問題如果前文的“toy_example”嘗試數次后仍沒有跑過,可以考慮是否因CPU版本太舊以至于指令集不支持的問題。具體操作如下:
1.????進入egg容器#?docker?exec?-it?confs-xxxx_egg_1?bash2.????查看storage-service日志#?cat?storage-service-cxx/logs/error.log如果日志出現“Illegal instruction (core dumped)”則考慮使用CPU更新點的服務器重新部署。如果該日志沒有輸出則可以通過docker log的方式逐個查看服務日志以定位具體問題。
(未完待續)
日前,本文作者陳家豪為大家分享的聯邦學習直播課程視頻回顧:
相關文章:
聯邦學習:人工智能的最后一公里
如果你對聯邦學習感興趣,可申請加入“KubeFATE開源社區群”交流,入群需要真實身份,并改昵稱:姓名@單位。請先關注“亨利筆記”公眾號,在公眾號后臺發送"FATE"信息即可。
總結
以上是生活随笔為你收集整理的KubeFATE: 用云原生技术赋能联邦学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么会学习感觉痛苦
- 下一篇: (附源码)springboot学生宿舍管