使用策略#

Flower 允许通过 Strategy 抽象类对学习过程进行完全定制。核心框架中提供了许多内置策略。

有三种方法可以自定义 Flower 在服务器端协调学习过程的方式:

  • 使用现有策略,例如 FedAvg

  • 使用回调函数定制现有策略

  • 实施新策略

使用现有策略#

Flower 内置了许多流行的联邦学习策略。内置策略的实例化方法如下:

import flwr as fl

strategy = fl.server.strategy.FedAvg()
fl.server.start_server(config=fl.server.ServerConfig(num_rounds=3), strategy=strategy)

这会创建一个所有参数都保持默认值的策略,并将其传递给 start_server 函数。通常建议在实例化过程中调整一些参数:

import flwr as fl

strategy = fl.server.strategy.FedAvg(
    fraction_fit=0.1,  # Sample 10% of available clients for the next round
    min_fit_clients=10,  # Minimum number of clients to be sampled for the next round
    min_available_clients=80,  # Minimum number of clients that need to be connected to the server before a training round can start
)
fl.server.start_server(config=fl.server.ServerConfig(num_rounds=3), strategy=strategy)

使用回调函数定制现有策略#

现有的策略提供了多种自定义行为的方法。回调函数允许策略在执行过程中调用用户提供的代码。

配置客户匹配和客户评估#

服务器可以通过向 on_fit_config_fn 提供一个函数,在每一轮向客户端传递新的配置值。提供的函数将被策略调用,并且必须返回一个配置键值对的字典,该字典将被发送到客户端。在每一轮联邦学习期间,它必须返回一个任意配置值 dictionary :code:`client.fit`和 :code:`client.evaluate`函数。

import flwr as fl

def get_on_fit_config_fn() -> Callable[[int], Dict[str, str]]:
    """Return a function which returns training configurations."""

    def fit_config(server_round: int) -> Dict[str, str]:
        """Return a configuration with static batch size and (local) epochs."""
        config = {
            "learning_rate": str(0.001),
            "batch_size": str(32),
        }
        return config

    return fit_config

strategy = fl.server.strategy.FedAvg(
    fraction_fit=0.1,
    min_fit_clients=10,
    min_available_clients=80,
    on_fit_config_fn=get_on_fit_config_fn(),
)
fl.server.start_server(config=fl.server.ServerConfig(num_rounds=3), strategy=strategy)

on_fit_config_fn`可用于将任意配置值从服务器传递到客户端,并在每一轮改变这些值,例如,调整学习率。客户端将在自己的 :code:`client.fit() 函数中接收 on_fit_config_fn 返回的字典。

on_fit_config_fn 类似,还有 on_evaluate_config_fn 用于定制发送到 client.evaluate() 的配置

配置服务器端评估#

服务器端评估可通过向 evaluate_fn 传递评估函数来启用。

实施新策略#

编写完全自定义的策略涉及的内容较多,但灵活性最高。阅读 `实施策略 <how-to-implement-strategies.html>_ 指南,了解更多信息。