升级至 Flower 1.0#

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]]]:

可选的改进措施#

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

  • Remove "placeholder" methods from subclasses of Client or NumPyClient. If you, for example, use server-side evaluation, then empy placeholder implementations of evaluate are no longer necessary.

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

更多帮助#

Most official Flower code examples are already updated to Flower 1.0, they can serve as a reference for using the Flower 1.0 API. If there are further questionsm, join the Flower Slack and use the channgel #questions.