聯邦學習開源框架FATE架構

2023-03-16 18:00:28

作者:京東科技 葛星宇

1.前言

本文除特殊說明外,所指的都是fate 1.9版本。

fate資料存在著多處版本功能與釋出的檔案不匹配的情況,各個模組都有獨立的檔案,功能又有關聯,坑比較多,首先要理清楚各概念、模組之間的關係。

2.網路互聯架構

1. 概念解釋:

RollSite是一個grpc通訊元件,是eggroll引擎中的一個模組,相當於我們的grpc通訊閘道器。

Exchange是RollSite中的一個功能,用於維護各方閘道器地址,並轉發訊息。參考《FATE exchange部署指南》

2. 對比解讀:

l 網狀架構相當於我們的一體化版本模式,但沒有dop平臺來維護閘道器,每方需要在組態檔裡維護其他參與方的閘道器地址。

l 星型架構的好處是隻在Exchange方維護所有參與方的閘道器地址,前提是需要信任Exchange,並且流量全部都需要從Exchange方中轉,相當於我們的中心化版本。但不支援證書。

3. Exchange設定

在Exchange上設定路由表:

在各party方設定預設路由指向exchange,不需要再設定每個party的地址。

3.總體架構

FATE支援eggroll和spark兩種計算引擎,搭配不同的通訊元件,共五種組合,不同的通訊模組不能相容。

參考:《不同型別FATE的架構介紹》

區別:

l RabbitMQ是一個簡單易上手的MQ

l Pulsar相比RabbitMQ,可以支援更大規模的叢集化部署,也支援exchange模式的網路結構。

l Slim FATE相比其他模式,最大化減少叢集所需的元件,可以使用在小規模聯邦學習計算,IOT裝置等情況。

3.1.基於EggRoll引擎的架構

Eggroll是FATE原生支援的計算儲存引擎,包括以下三個元件:

l rollsite負責資料傳輸,以前的版本里叫 Proxy+Federation

l nodemanager負責儲存和計算

l clustermanager負責管理nodemanager

3.2.基於spark+hdfs+rabbitMQ的架構

3.3. 基於spark+hdfs+Pulsar的架構

3.4. spark_local (Slim FATE)

支援rabbitMQ替換pulsar

4. 元件原始碼

所有的fate專案都在這個叫FederateAI社群的URL下:https://github.com/FederatedAI

主專案:FATE是一個彙總的檔案和超鏈集合, 學習入口線上檔案

關聯專案:

•KubeFATE docker和k8s的部署

•AnsibleFATE 相當於我們的圖形化部署版的底層指令碼 學習入口

•FATE-Flow 聯合學習任務流水線管理模組,註冊、管理和排程中心。

•EggRoll 第一代fate的計算引擎

•FATE-Board 聯合學習過程視覺化模組,目前只能檢視一些記錄

•FATE-Serving 線上聯合預測,學習入口

•FATE-Cloud 聯邦學習雲服務,類似於我們的dop平臺,管理功能。

•FedVision 聯邦學習支援的視覺化物件檢測平臺

•FATE-Builder fate編譯工具

•FedLCM 新增的專案:建立 FATE 聯邦並部署FATE範例。目前僅支援部署以Spark和Pulsar作為基礎引擎,並使用Exchange實現互相連線的

5. FATE-Flow

FATE Flow是排程系統,根據使用者提交的作業DSL,排程演演算法元件執行。

官網檔案

服務能力:

· 資料接入

· 任務元件註冊中心

· 聯合作業&任務排程

· 多方資源協調

· 資料流動追蹤

· 作業實時監測

· 聯合模型註冊中心

· 多方合作許可權管理

· 系統高可用

· CLI、REST API、Python API

5.1. 流程架構

舊版,圖比較立體

· DSL Parser:是排程的核心,通過 DSL parser 可以拿到上下游關係、依賴等。

· Job Scheduler:是 DAG 層面的排程,把 DAG 作為一個 Job,把 DAG 裡面的節點 run 起來,就稱為一個 task。

· Federated Task Scheduler:最小排程粒度就是 task,需要排程多方執行同一個元件但引數演演算法不同的 task,結束後,繼續排程下一個元件,這裡就會涉及到協同排程的問題。

· Job Controller:聯邦任務控制器

· Executor:聯邦任務執行節點,支援不同的 Operator 容器,現在支援 Python 和 Script 的 Operator。Executor,在我們目前的應用中拉起 FederatedML 定義的一些元件,如 data io 資料輸入輸出,特徵選擇等模組,每次調起一個元件去 run,然後,這些元件會呼叫基礎架構的 API,如 Storage 和 Federation Service ( API 的抽象 ) ,再經過 Proxy 就可以和對端的 FATE-Flow 進行協同排程。

· Tracking Manager:任務輸入輸出的實時追蹤,包括每個 task 輸出的 data 和 model。

· Model Manager:聯邦模型管理器

5.2. api service

DataAccess 資料上傳,下載,歷史記錄,參考範例

Job 提交(並執行),停止,查詢,更新,設定,列表,task查詢

Tracking

Pipeline

Model

Table

使用者端命令列實際上是對api的包裝呼叫,可以參考其範例

Python呼叫api範例

5.3. 演演算法模組

Federatedml模組包括許多常見機器學習演演算法聯邦化實現。所有模組均採用去耦的模組化方法開發,以增強模組的可延伸性。具體來說,我們提供:

1.聯邦統計: 包括隱私交集計算,並集計算,皮爾遜係數, PSI等

2.聯邦特徵工程:包括聯邦取樣,聯邦特徵分箱,聯邦特徵選擇等。

3.聯邦機器學習演演算法:包括橫向和縱向的聯邦LR, GBDT, DNN,遷移學習等

4.模型評估:提供對二分類,多分類,迴歸評估,聚類評估,聯邦和單邊對比評估

5.安全協定:提供了多種安全協定,以進行更安全的多方互動計算。

Figure 1: Federated Machine Learning Framework

可開發在fate框架下執行的演演算法:指南

6. FATE-Serving

6.1. 功能架構

6.2. 部署邏輯架構

Adatptor:預設的情況使用系統自帶的MockAdatptor,僅返回固定資料用於簡單測試,實際生產環境中需要使用者需要自行開發並對接自己的業務系統。(這部分可以看看能不能對接咱們自己的線上預測系統。)

l 支援使用rollsite/nginx/fateflow作為多方任務協調通訊代理

l rollsite支援fate on eggroll的場景,僅支援grpc協定,支援P2P組網及星型組網模式

l nginx支援所有引擎場景,支援http與grpc協定,預設為http,支援P2P組網及星型組網模式

l fateflow支援所有引擎場景,支援http與grpc協定,預設為http,僅支援P2P組網模式,也即只支援互相設定對端fateflow地址

6.3. 部署範例圖

6.4. 工作時序圖

6.5. 模型推播流程

藍色為guest叢集,灰色代表host叢集

1. 通過fate flow建模 2. 分別部署guest方 Fate-serving 與host方Fate-serving

3. 分別設定好guest方Fate-flow與guest方Fate-serving、host方Fate-flow 與host方Fate-serving。

4. Fate-flow推播模型

5. Fate-flow將模型繫結serviceId

6. 以上操作完成後,可以在serving-admin頁面上檢視模型相關資訊(此步操作非必需)。

7. 可以在serving-admin頁面上測試呼叫(此步操作非必需)。

6.6. 搭配nginx代理

https://fate-serving.readthedocs.io/en/develop/example/nginx/

FATE-Serving 之間的互動可以通過nginx反向代理轉發grpc請求,以下幾種場景設定如下:

· 場景一:雙方不設定TLS,通過nginx四層代理轉發

· 場景二:雙方設定TLS,通過nginx四層代理轉發,雙方分別進行證書校驗

· 場景三:資料使用方設定Client端證書,Nginx設定Server端證書,Host不設定證書,通過nginx七層代理轉發,由Client端和nginx進行證書校驗

7. FATE Cloud

FATE Cloud由負責聯邦站點管理的雲管理端Cloud Manager和站點使用者端管理端FATE Manager組成,提供了聯邦站點的註冊與管理、叢集自動化部署與升級、叢集監控、叢集許可權控制等核心功能。

聯邦雲管理端(Cloud Manager)

聯邦雲管理端即聯邦資料網路的管理中心,負責統一運營和管理FATE Manager及各站點,監控站點的服務與聯邦合作建模,執行聯邦各許可權控制,保證聯邦資料合作網路的正常運作;

聯邦站點管理端(FATE Manager)

聯邦站點管理端,負責管理和維護各自的聯邦站點,為站點提供加入聯邦組織、執行站點服務的自動化部署與升級,監控站點的聯邦合作與叢集服務,並管理站點使用者角色與應用許可權;

產品手冊

8. 部署測試

共有4類部署方式,單機的安裝模式是隻提供了單機的安裝檔案,也可以研究怎麼擴充套件成叢集模式。

| | 單機(不推薦生產用) | 叢集(生產推薦) | | 非容器 | AllinOne | ansible | | 容器 | docker compose | k8s |

部署時會要求設定機器對應的角色,只能選host,guest和Exchange,其中host和guest並沒有區別,實際執行聯邦時還是在job的設定中去設定哪一方是guest,哪一方是host,任務只能在guest方提交。

8.1. AllinOne

所有的元件都部署在一臺機器上,比較適合開發偵錯,參考連結

8.2. ansible

嘗試用ansible部署時遇到了python相關的錯誤,指導檔案也缺少詳細的步驟,沒有相關錯誤的說明。

8.3. k8s

手上沒有k8s環境,暫未測試。

參考檔案:《KubeFATE 部署FATE支援引擎介紹》

8.4. docker compose

容器部署嘗試用docker compose方式部署了一對,比較順利,參考了2篇官方文章,前邊的準備步驟和安裝過程參考此文,「驗證部署」及之後的步驟參考《Docker Compose 部署 FATE》

不同點如下:

8.4.1. 準備階段

下載映象較慢,如果大批次部署,可以搭建內網映象服務。

| Role | party-id | OS | IP | | | host | 20001 | Centos7.6 | 11.50.52.81 | 8C64G | | guest | 20002 | Centos7.6 | 11.50.52.62 | 8C64G | | 部署機 | | Centos7.6 | 11.50.52.40 | |

以上內容替代檔案中對應的部分內容。

一開始我只部署了一臺host,本來打算這2臺做一個叢集,後來發現檔案裡沒提這種方式,只好先按檔案實驗一次,於是又部署了guest,這樣在guest的設定裡已經寫好了host的地址,於是手動將設定更新到了host的/data/projects/fate/confs-20001/confs/eggroll/conf/route_table.json

發現不需要重啟容器後續步驟也沒報錯,說明可以動態修改路由資訊。

8.4.2. hetero_lr測試

進入容器的時候,容器名包含的平臺id需要修改成實際的。

json格式定義說明檔案

fateflow/examples/lr/test_hetero_lr_job_conf.json 中不同點,

修改對應的平臺id

 "initiator": {
 "role": "guest",
 "party_id": 20002
 },
 "role": {
 "guest": [
 20002
 ],
 "host": [
 20001
 ],
 "arbiter": [
 20001
 ]
 },
 

按檔案寫資源不夠執行不了,需要修改如下

"job_parameters": {

    "common": {

      "task_parallelism": 1,

      "computing_partitions": 1,

      "task_cores": 1

    }

  },

不要修改fateflow/examples/lr/test_hetero_lr_job_dsl.json檔案,檔案中的設定是舊版本的,修改了就不能執行了,裡面的DataIO元件已廢棄。

執行測試後可以通過board檢視,成功的id:202211031508511267810

http://11.50.52.62:8080/

http://11.50.52.81:8080/

8.4.3. 模型部署

# flow model deploy --model-id arbiter-20001#guest-20002#host-20001#model --model-version 202211031508511267810

輸出了產生的model_version是202211031811059832400

1. 修改載入模型的設定

# cat > fateflow/examples/model/publish_load_model.json <<EOF
{
  "initiator": {
    "party_id": "20002",
    "role": "guest"
  },
  "role": {
    "guest": [
      "20002"
    ],
    "host": [
      "20001"
    ],
    "arbiter": [
      "20001"
    ]
  },
  "job_parameters": {
    "model_id": "arbiter-20001#guest-20002#host-20001#model",
    "model_version": "202211031811059832400"
  }
}
EOF

2. 修改繫結模型的設定

# cat > fateflow/examples/model/bind_model_service.json <<EOF
{
    "service_id": "test",
    "initiator": {
        "party_id": "20002",
        "role": "guest"
    },
    "role": {
        "guest": ["20002"],
        "host": ["20001"],
        "arbiter": ["20001"]
    },
    "job_parameters": {
        "work_mode": 1,
        "model_id": "arbiter-20001#guest-20002#host-20001#model",
        "model_version": "202211031811059832400"
    }
}
EOF

3. 線上測試

傳送以下資訊到"GUEST"方的推理服務"{SERVING_SERVICE_IP}:8059/federation/v1/inference"

# curl -X POST -H 'Content-Type: application/json' -i 'http://11.50.52.62:8059/federation/v1/inference' --data '{
  "head": {
    "serviceId": "test"
  },
  "body": {
    "featureData": {
        "x0": 1.88669,
        "x1": -1.359293,
        "x2": 2.303601,
        "x3": 2.00137,
        "x4": 1.307686
    },
    "sendToRemoteFeatureData": {
        "phone_num": "122222222"
    }
  }
}'

9.在Jupyther中構建任務

Jupyter Notebook是web介面IDE。已整合在fate-client容器中。

10. 總結

本文旨在從宏觀的角度分析FATE的原始碼分佈、總體架構、主要功能及核心流程,尚有許多細節和功能未深入研究,歡迎大家留言,互相學習。