近年來, Flower 和 NVIDIA FLARE 等開源系統已成為聯邦學習 (FL) 領域的關鍵工具,每個系統都有其獨特的關注點。Flower 支持統一的 FL 方法,使研究人員和開發者能夠輕松設計、分析和評估 FL 應用。 隨著時間的推移,它積累了一套豐富的策略和算法,在學術界和行業中培育了一個蓬勃發展的社區。
另一方面,NVIDIA FLARE 面向生產級應用程序,提供專為可靠性和可擴展性而構建的企業就緒型運行時環境。通過專注于強大的基礎設施,FLARE 使 FL 部署能夠無縫滿足現實世界環境的需求。
本文介紹了我們在連接這兩個框架方面所做的努力,并展示了它們的聯合優勢如何提升整個 FL 生態系統。這種集成使使用 Flower 開發的應用能夠在 FLARE 運行時上以原生方式運行,而無需修改任何代碼。通過將 Flower 廣泛采用、易于使用的設計工具和 API 與 FLARE 的工業級運行時統一起來,這種集成簡化了端到端部署流程。
結果如何?無縫、高效且易于訪問的 FL 工作流將研究創新與生產就緒性聯系起來,為研究人員和從業者等方面的聯合學習提供強力支持。
集成目標:通過 FLARE 部署 Flower 應用
愿景很簡單:讓用戶能夠直接在 FLARE 運行時中部署 Flower ServerApps 和 ClientApps,而無需修改代碼。
工作原理如下。Flower 和 FLARE 基于客戶端/服務器通信擁有相似的架構基礎。Flower 和 FLARE 都依賴 gRPC 在客戶端和服務器之間進行通信,并且都提供了多作業支持,使多個作業能夠共享客戶端和服務器,而無需在服務器主機上額外打開端口。
這種共享架構使集成這兩個框架變得簡單易行。通過將 FLARE 用作 Flower 應用的通信工具,您可以將任何 Flower 應用轉換為 FLARE 作業。此過程使 Flower 的 SuperNodes 不再通過 SuperLink 進行直接通信,而是通過 FLARE 的 runtime environment 進行路由 (圖 1)。

這種集成不僅無縫,而且功能強大。它可以解鎖以下功能:
- 輕松調配:FLARE 提供啟動套件 (包括證書) ,以簡化初始化。
- 自定義代碼部署:您可以使用 Flower 用戶友好型 API 和開發環境,針對獨特的應用需求輕松部署定制代碼。
- 經過測試的實現:您可以在 Flower 社區提供的 大量聯合算法庫 的基礎上進行構建。
- 增強安全性:內置的身份驗證和授權機制可確保安全訪問和控制。
- 可靠的通信:借助 FLARE 的 ReliableMessage 功能,可解決連接穩定性問題。
- 協議靈活性:支持多種通信協議 (包括 gRPC、HTTP、TCP 和 Redis) ,可確保靈活實施。
- 點對點通信:P2P 功能支持各方直接交互,開辟了多樣化的部署拓撲。
- 多作業效率:FLARE 的運行時環境可以同時處理多個 Flower 應用,無需額外的端口。
通過將 Flower 易于使用的開發工具和 API 與 FLARE 的強大運行時相結合,此集成彌合了 FL 研究和生產之間的差距,創建了一個從實驗輕松擴展到部署的緊密生態系統。
集成設計:通過 FLARE 規劃 Routing Flower
FL 在客戶端和服務器之間的高效通信中蓬勃發展。領先的 FL 框架 Flower 使用 gRPC 作為其通信協議。與 FLARE 集成時,您可以通過 FLARE 的運行時環境路由 Flower 的 gRPC 消息,以保持兼容性和可靠性。
這是關鍵的調整。與其直接向服務器發送消息,不如將其端點重定向到每個 FLARE 客戶端內的本地 gRPC 服務器 (LGS) 。這種簡單的重新路由使 Flower 應用能夠在 FLARE 中無縫運行,而無需更改原始應用代碼 (圖 2) 。

以下是 Flower SuperNode 和 Flower SuperLink 之間的通信路徑:
- Flower SuperNode 會生成 gRPC 消息,并將其發送給 FLARE 客戶端中托管的 LGS。
- FLARE 客戶端將此消息作為可靠的 FLARE 消息轉發到 FLARE 服務器。
- 在 FLARE 服務器中,本地 gRPC 客戶端 (LGC) 與 Flower SuperLink 進行交互,將消息轉發到預期目的地。
- SuperLink 會處理消息,并將響應發送回 FLARE 服務器中的 LGC。
- FLARE 服務器將響應路由回 FLARE 客戶端。
- FLARE 客戶端通過 LGS 將響應發送到 Flower SuperNode。
這種設計可確保 Flower 的 SuperNode 和 SuperLink 通過 FLARE 實現流暢通信。SuperNode 可以作為獨立進程運行,也可以在與 FLARE 客戶端相同的進程中運行,從而提供部署靈活性。
通過此設置,您可以利用 FLARE 強大的運行時功能,同時保持應用程序的簡單性和模塊化,增強現實世界 FL 部署中的可用性和可擴展性。
無需更改代碼即可集成
要展示此集成,請直接在 FLARE 中運行 Flower 的 PyTorch-Quickstart 示例。
首先,創建一個 Flower ServerApp:
# Define strategy strategy = FedAvg(...) # Flower ServerApp def server_fn(context: Context): # Read from config num_rounds = context.run_config[ "num-server-rounds" ] # Define config config = ServerConfig(num_rounds = num_rounds) return ServerAppComponents(strategy = strategy, config = config) # Create ServerApp app = ServerApp(server_fn = server_fn) |
接下來,定義 Flower ClientApp:
# Define FlowerClient and client_fn class FlowerClient(NumPyClient): def fit( self , parameters, config): set_weights(net, parameters) results = train(net, trainloader, testloader, epochs = 1 , device = DEVICE) return get_weights(net), len (trainloader.dataset), results def evaluate( self , parameters, config): set_weights(net, parameters) loss, accuracy = test(net, testloader) return loss, len (testloader.dataset), { "accuracy" : accuracy} def client_fn(context: Context): """Create and return an instance of Flower `Client`.""" return FlowerClient().to_client() # Flower ClientApp app = ClientApp( client_fn = client_fn, ) |
通過集成 Flower 和 FLARE,使用 Flower 框架開發的應用程序可在 FLARE 運行時中無縫運行,您無需進行任何更改。
有關端到端示例,請參閱 NVIDIA FLARE 中的 Flower App(PyTorch)。
確保再現性:使用 FLARE 運行 Flower 應用
集成框架最關鍵的一個方面是確保功能和結果保持不變。當將 Flower 應用集成到 FLARE 環境中時,我們的目標是保留與在獨立的 Flower 設置中運行應用時相同的結果。
為了證明這一點,我們進行了一項實驗:
- 我們在兩個環境 ( FLARE 內的獨立 Flower 和 Flower) 中為客戶端使用相同的隨機種子初始化了 Flower 應用。
- 我們追蹤并繪制了這兩個場景的訓練曲線(圖 3)。

當疊加兩個設置中的訓練曲線時,它們會精確對齊,確認通過 FLARE 傳遞的消息不會影響結果。
這種一致性是一個重要的里程碑,因為它證明,將 Flower 與 FLARE 集成可保持訓練過程的完整性。它使您能夠將其 Flower 應用無縫過渡到 FLARE 的運行時環境,而無需擔心性能或結果的偏差。
解鎖新的可能性:與 FLARE 實驗追蹤的混合集成
想象一下,將兩種強大框架的精華結合起來:Flower 直觀的 FL 開發工具與 FLARE 強大的運行時功能。通過這種混合集成,愿景將變為現實。
通過在 FLARE 運行時中部署 Flower 應用,您可以解鎖令人興奮的新功能,例如使用 SummaryWriter
的 FLARE 實驗追蹤。現在,當在 FLARE 的運行時環境中部署時,您可以將 FLARE 的 metric streaming 直接無縫集成到您的 Flower 客戶端代碼中。為此,請將 FLARE 的 SummaryWriter
添加到 Flower 的客戶端應用中:
# initializes NVFlare interface from nvflare.client.tracking import SummaryWriter # Define FlowerClient and client_fn class FlowerClient(NumPyClient): def __init__( self , context: Context): super ().__init__() self .writer = SummaryWriter() self .flwr_context = context if "step" not in context.state.metrics_records: self .set_step( 0 ) def set_step( self , step: int ): self .flwr_context.state = RecordSet(metrics_records = { "step" : MetricsRecord({ "step" : step})}) def get_step( self ): return int ( self .flwr_context.state.metrics_records[ "step" ][ "step" ]) def fit( self , parameters, config): step = self .get_step() set_weights(net, parameters) results = train(net, trainloader, testloader, epochs = 1 , device = DEVICE) self .writer.add_scalar( "train_loss" , results[ "train_loss" ], step) self .writer.add_scalar( "train_accuracy" , results[ "train_accuracy" ], step) self .writer.add_scalar( "val_loss" , results[ "val_loss" ], step) self .writer.add_scalar( "val_accuracy" , results[ "val_accuracy" ], step) self .set_step(step + 1 ) return get_weights(net), len (trainloader.dataset), results … |
在代碼示例中,您可以使用 Flower 的 metrics_records
跟蹤當前的訓練步驟。

通過這種集成,研究人員和開發者可以:
- 輕松監控進度 :直接在熟悉的 Flower 工作流程中精確追蹤實驗。
- 使用統一的功能:利用 FLARE 的工業級功能,同時不會放棄 Flower 的簡單性。
有關更多信息,請參閱在/NVIDIA/NVFlare GitHub 庫中使用 TensorBoard 流式傳輸運行模擬。
總結
這僅僅是兩個前沿 FL 框架結合在一起時可能實現的目標的開始。Flower 和 NVIDIA Flare 集成為更高效、更可擴展且功能豐富的聯邦學習應用程序打開了大門!
對于研究人員和開發者而言,在 FL 環境中保持再現性至關重要。通過這種集成,可確保再現性,從而確保對實驗和結果的信任。無縫集成也成為可能,消除了使用 FLARE 進行企業級部署的障礙。
通過在兩個部署中保留相同的結果,我們確保您可以放心地使用 FLARE 的強大運行時,而不會影響其 Flower 應用程序的可靠性或性能。
有關更多信息,請參閱以下資源:
- 利用 Flower 和 NVIDIA FLARE 論文為聯邦學習提供強力支持
- flower.ai 上的最新 Flower 版本
- NVIDIA FLARE 2.6 在 GitHub 上發布
- NVIDIA FLARE 2.6 文檔
有任何問題或意見嗎?請通過 federatedlearning@nvidia.com 聯系我們。
?