数据科学

集成 Flower和 NVIDIA FLARE,加速联邦学习生态系统发展

近年来, FlowerNVIDIA 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)。

A diagram shows a Flower ServerApp icon and three Flower ClientApp icons connected through the NVIDIA FLARE Runtime.
图 1。Flower 和 NVIDIA FLARE 集成

这种集成不仅无缝,而且功能强大。它可以解锁以下功能:

  • 轻松调配: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) 。

A diagram shows the FLARE server and gRPC client (LGC) communicating with Flower SuperLink and the ServerApp. There are bidirectional arrows leading from the server to two sites, each with FLARE Client, gRPC server (LGS), Flower SuperNode, and ClientApp.
图 2. 在 FLARE 中集成 Flower 应用

以下是 Flower SuperNode 和 Flower SuperLink 之间的通信路径:

  1. Flower SuperNode 会生成 gRPC 消息,并将其发送给 FLARE 客户端中托管的 LGS。
  2. FLARE 客户端将此消息作为可靠的 FLARE 消息转发到 FLARE 服务器。
  3. 在 FLARE 服务器中,本地 gRPC 客户端 (LGC) 与 Flower SuperLink 进行交互,将消息转发到预期目的地。
  4. SuperLink 会处理消息,并将响应发送回 FLARE 服务器中的 LGC。
  5. FLARE 服务器将响应路由回 FLARE 客户端。
  6. 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 设置中运行应用时相同的结果。

为了证明这一点,我们进行了一项实验:

  1. 我们在两个环境 ( FLARE 内的独立 Flower 和 Flower) 中为客户端使用相同的随机种子初始化了 Flower 应用。
  2. 我们追踪并绘制了这两个场景的训练曲线(图 3)。
Two graphs show exactly the same loss curves for two clients regardless of whether they were run in Flower natively or within the NVIDIA FLARE runtime environment.
图 3. 在本机 (a) 或 FLARE (b) 中运行 Flower 应用程序的对比

当叠加两个设置中的训练曲线时,它们会精确对齐,确认通过 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 跟踪当前的训练步骤。

A plot shows how accuracy metrics are streamed to the server and visualized.
图 4。使用 FLARE 的实验跟踪运行并使用 TensorBoard 在中央服务器中可视化的 Flower ClientApps

通过这种集成,研究人员和开发者可以:

  • 轻松监控进度 :直接在熟悉的 Flower 工作流程中精确追踪实验。
  • 使用统一的功能:利用 FLARE 的工业级功能,同时不会放弃 Flower 的简单性。

有关更多信息,请参阅在/NVIDIA/NVFlare GitHub 库中使用 TensorBoard 流式传输运行模拟

总结

这仅仅是两个前沿 FL 框架结合在一起时可能实现的目标的开始。Flower 和 NVIDIA Flare 集成为更高效、更可扩展且功能丰富的联邦学习应用程序打开了大门!

对于研究人员和开发者而言,在 FL 环境中保持再现性至关重要。通过这种集成,可确保再现性,从而确保对实验和结果的信任。无缝集成也成为可能,消除了使用 FLARE 进行企业级部署的障碍。

通过在两个部署中保留相同的结果,我们确保您可以放心地使用 FLARE 的强大运行时,而不会影响其 Flower 应用程序的可靠性或性能。

有关更多信息,请参阅以下资源:

有任何问题或意见吗?请通过 federatedlearning@nvidia.com 联系我们。

 

标签