想要一個在桌面瀏覽器中支援邊緣聯合學習、與行動應用程式良好整合、高效能且保護隱私的框架嗎?歡迎來到完全用 Rust 寫的 XayNet!
機器學習框架——包括專門用於聯邦學習的框架——已經存在。這些框架通常有助於跨孤島用例的聯合學習 - 例如,在有限數量的醫院之間進行協作學習,或在多個銀行之間處理常見用例,而無需共享有價值的敏感資料。
該儲存庫專注於屏蔽跨裝置聯合學習,以實現在數百萬個低功耗邊緣裝置(例如智慧型手機甚至汽車)中編排機器學習。透過這樣做,我們也希望在實踐中加快聯邦學習的採用速度和範圍,特別是保護最終用戶資料。所有資料都保留在私有本地場所,只有加密的人工智慧模型才會自動非同步聚合。因此,我們為人工智慧隱私困境提供了解決方案,並彌合了隱私與便利性之間經常存在的差距。例如,想像一下,語音助理可以直接在裝置層級學習新單字,並與所有其他實例共享這些知識,而無需集中記錄和收集您的語音輸入。或者,考慮一下搜尋引擎,它學會了個人化搜尋結果,而不集中收集您通常敏感的搜尋查詢…今天有成千上萬的此類用例仍然以隱私為代價。我們認為情況不應該如此,我們希望提供一種替代方案來克服這種困境。
具體來說,我們為開發者提供:
我們的聯邦學習框架不僅僅是機器學習框架。相反,它支援可能發生在異質設備上並且用例涉及許多此類設備的機器學習聯合。
因此,編寫該框架的程式語言應該為我們提供以下方面的強大支持:
Rust 是滿足這些要求的現代程式語言中極少數的選擇之一:
生鏽 1.51.0
有幾種不同的方式來運行後端:透過 docker,或將其部署到 Kubernetes 集群,或手動編譯程式碼並執行二進位檔案。
docker
和docker-compose
)和/或工作設定(如果您決定編譯 Rust 程式碼並手動執行二進位)已有了解。筆記:
在 Xaynet v0.11
中,協調器需要連接到 Redis 實例才能保存其狀態。
不要將協調器連接到生產中使用的 Redis 實例!
我們建議將協調器連接到自己的 Redis 實例。我們投入了大量的時間來確保協調器只刪除自己的數據,但在目前的開發狀態下,我們不能保證情況永遠如此。
使用 docker 設定的便利之處在於,無需在系統上設定工作 Rust 環境,因為一切都在容器內完成。
Docker Hub 上提供了最新版本的 Docker 映像。
您可以透過執行以下命令使用預設的configs/docker-dev.toml
來嘗試它們:
Xaynet v0.11以下
docker run -v ${PWD} /configs/docker-dev.toml:/app/config.toml -p 8081:8081 xaynetwork/xaynet:v0.10.0 /app/coordinator -c /app/config.toml
Xaynet v0.11+
# don't forget to adjust the Redis url in configs/docker-dev.toml
docker run -v ${PWD} /configs/docker-dev.toml:/app/config.toml -p 8081:8081 xaynetwork/xaynet:v0.11.0
docker 映像包含協調器的發布版本,沒有選用功能。
透過指向docker/docker-compose.yml
檔案來啟動協調器。它啟動了運行具有預設或可選功能的協調器所必需的所有基礎設施。請記住,該文件僅用於開發。
docker-compose -f docker/docker-compose.yml up --build
如果您願意,您可以建立協調器的最佳化發布版本,但請記住編譯速度會更慢。
docker build --build-arg RELEASE_BUILD=1 -f ./docker/Dockerfile .
選用功能可以透過建置參數COORDINATOR_FEATURES
指定。
docker build --build-arg COORDINATOR_FEATURES=tls,metrics -f ./docker/Dockerfile .
若要將協調器執行個體部署到 Kubernetes 集群,請使用位於k8s/coordinator
資料夾內的清單。清單依賴kustomize
產生( kustomize
自 v1.14 起正式受kubectl
支援)。我們建議您徹底檢查清單並根據您自己的設定(命名空間、入口等)進行調整。
請記得也要檢查(並在必要時調整)協調器的預設配置,可在k8s/coordinator/development/config.toml
中找到。
請調整k8s/coordinator/development/ingress.yaml
檔案中使用的網域,使其符合您的需求(您也可以完全跳過ingress
,只需確保從k8s/coordinator/development/kustomization.yaml
中刪除其引用即可)。
請記住, k8s/coordinator/development/ingress.yaml
上顯示的ingress
配置依賴於此儲存庫中不可用的資源,因為它們具有敏感性(例如 TLS 金鑰和憑證)。
若要驗證產生的清單,請執行:
kubectl kustomize k8s/coordinator/development
應用它們:
kubectl apply -k k8s/coordinator/development
如果您沒有透過ingress
暴露您的協調器,您仍然可以使用連接埠轉送到達它。下面的範例在連接埠8081
處建立連接埠轉發,假設協調器 pod 仍在使用app=coordinator
標籤:
kubectl port-forward $( kubectl get pods -l " app=coordinator " -o jsonpath= " {.items[0].metadata.name} " ) 8081
沒有可選功能的協調器可以透過以下方式建置和啟動:
cd rust
cargo run --bin coordinator -- -c ../configs/config.toml
該範例可以在 rust/examples/ 下找到。它使用虛擬模型,但具有網路功能,因此它是檢查與協調器的連接性的良好起點。
test-drive
確保您有一個正在運行的協調器實例,並且您將使用以下命令產生的客戶端能夠透過網路存取它。
以下是如何啟動20
參與者連接到在127.0.0.1:8081
上運行的協調器的範例:
cd rust
RUST_LOG=info cargo run --example test-drive -- -n 20 -u http://127.0.0.1:8081
有關如何運行範例的更深入詳細信息,請參閱 rust/xaynet-server/src/examples.rs 下隨附的入門指南。
如果您在運行該專案時遇到任何困難,請透過提出問題並描述您的設定和您面臨的問題來與我們聯繫。