升级至 Flower 1.0

Note

This guide is for users who have already worked with Flower 0.x and want to upgrade to Flower 1.0. Newer versions of Flower (1.13 and later) are based on a new architecture and not covered in this guide. After upgrading Flower 0.x projects to Flower 1.0, please refer to Upgrade to Flower 1.13 to make your project compatible with the lastest version of Flower.

Flower 1.0 正式发布。除了新功能,Flower 1.0 还为未来的发展奠定了稳定的基础。与 Flower 0.19(以及其他 0.x 系列版本)相比,有一些破坏性改动需要修改现有 0.x 系列项目的代码。

安装更新

下面介绍如何使用 pip 或 Poetry 将现有安装更新到 Flower 1.0:

  • pip: 安装时添加 -U.

    • `python -m pip install -U flwr``(当使用`start_server`和`start_client`时)

    • ``python -m pip install -U 'flwr[simulation]'``(当使用`start_simulation``时)

  • Poetry:更新 pyproject.toml 中的 flwr 依赖包,然后重新安装(运行 poetry install 前,别忘了通过 ``rm poetry.lock` 删除 ``poetry.lock`)。

    • flwr = "^1.0.0" (当使用 ``start_server` 和 ``start_client` 时)

    • ``flwr = { version = "^1.0.0", extras = ["simulation"] }``(当使用``start_simulation``时)

所需变更

以下更改需要手动更新。

一般情况

将所有参数作为关键字参数传递(而不是位置参数)。下面是一个例子:

  • Flower 0.19 (位置参数): start_client("127.0.0.1:8080", FlowerClient())

  • Flower 1.0(关键字参数): start_client(server_address="127.0.0.1:8080", client=FlowerClient())

客户端

  • NumPyClient的子类:将``def get_parameters(self):`改为``def get_parameters(self,config):

  • 客户端 "的子类:将 "get_parameters(self): "改为 "get_parameters(self, ins: GetParametersIns):"

策略 / start_server / start_simulation

  • start_server``start_simulation` 传递 ``ServerConfig``(而不是 dictionary)。下面是一个例子:

    • Flower 0.19: start_server(..., config={"num_rounds": 3, "round_timeout": 600.0}, ...)

    • Flower 1.0: start_server(..., config=flwr.server.ServerConfig(num_rounds=3, round_timeout=600.0), ...)

  • 将`start_simulation``中的`num_rounds=1``替换为新的`config=ServerConfig(...)`(参见前一项)

  • 删除调用 start_server 时的 ``force_final_distributed_eval` 参数。可以通过配置策略,在最后一轮训练后对所有客户端进行抽样评估,从而启用对所有客户端的分布式评估。

  • 重命名参数/数组转换函数:

    • parameters_to_weights --> parameters_to_ndarrays

    • weights_to_parameters --> ndarrays_to_parameters

  • 策略初始化:如果策略依赖于 fraction_fitfraction_evaluate 的默认值,请手动将 fraction_fitfraction_evaluate 设置为 0.1。未手动创建策略的项目(调用 start_server` ``start_simulation` 时未传递策略实例)现在应手动初始化 FedAvg,并将 `fraction_fit` `fraction_evaluate` 设为 `0.1

  • 重命名内置策略参数(例如,FedAvg`):

    • fraction_eval --> fraction_evaluate

    • min_eval_clients --> min_evaluate_clients

    • eval_fn --> evaluate_fn

  • rnd 更名为 server_round。这会影响多个方法和函数,例如 configure_fitaggregate_fitconfigure_evaluateaggregate_evaluate`evaluate_fn

  • ``evaluate_fn` 中添加 ``server_round` 和 ``config`:

    • Flower 0.19: def evaluate(parameters: NDArrays) -> Optional[Tuple[float, Dict[str, Scalar]]]:

    • Flower 1.0: def evaluate(server_round: int, parameters: NDArrays, config: Dict[str, Scalar]) -> Optional[Tuple[float, Dict[str, Scalar]]]:

定制策略

  • 参数``failures``的类型已从``List[BaseException]``变为``List[Union[Tuple[ClientProxy, FitRes], BaseException]]``(在``agregate_fit``中)和``List[Union[Tuple[ClientProxy, EvaluateRes], BaseException]]``(在``agregate_evaluate``中)

  • ``Strategy``方法 的``evaluate``现在会接收当前一轮联邦学习/评估作为第一个参数:

    • Flower 0.19: def evaluate(self, parameters: Parameters) -> Optional[Tuple[float, Dict[str, Scalar]]]:`

    • Flower 1.0: def evaluate(self, server_round: int, parameters: Parameters) -> Optional[Tuple[float, Dict[str, Scalar]]]:

可选的改进措施

除了上述必要的改动之外,还有一些潜在的改进措施:

  • 删除 ClientNumPyClient 子类中的 "占位符 "方法。例如,如果你使用服务器端评估,那么就不再需要``evaluate``的 "空占位符 "实现。

  • 通过 start_simulation 配置循环超时: start_simulation(..., config=flwr.server.ServerConfig(num_rounds=3, round_timeout=600.0), ...)

更多帮助

大多数官方的 Flower 代码示例 已经更新到 Flower 1.0,它们可以作为使用 Flower 1.0 API 的参考。如果还有其他问题,请加入 Flower Slack <https://flower.ai/join-slack/>`_ 并使用 "#questions``"。