近年来, 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 联系我们。