Flower v1.12.0 版本解析:SuperExec 日志流、uint64 标识迁移与消息 TTL 机制
【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower
本篇文章基于 Flower(A Friendly Federated AI Framework)仓库中 v1.12.0 变更日志 展开,系统解读该版本引入的核心能力:flwr log远程日志流、Node ID / Run ID 迁移至 uint64、SuperLink 消息 TTL 过期机制、FAB 哈希与安装结构优化、FedRep 基线、Docker 支持增强以及 Python 3.8 支持移除等破坏性变更。读完本文,你将掌握 v1.12.0 的关键使用方式(命令行、配置项)以及其在当前仓库源码中的落地实现位置,便于升级或复现。
一、版本概览:一个承上启下的发布
v1.12.0(2024-10-14)是 Flower 演进中的一个重要里程碑:它在 1.9 版宣布弃用 Python 3.8 之后正式移除支持,将最低版本提升至 Python 3.9(推荐 3.11),同时为后续的 FlowerTune LLM Leaderboard、SuperExec 运行体系铺路。按官方变更日志,该版本由Adam Narozniak、Charles Beauville、Daniel J. Beutel等 15 位贡献者共同完成。
从仓库现状看,v1.12.0 提到的多项能力至今仍在框架中承担核心职责,例如:
flwr log命令的实现位于 framework/py/flwr/cli/log.py;- 消息 TTL 的超时判断逻辑位于 framework/py/flwr/server/superlink/linkstate/utils.py;
- FAB 哈希截断常量
FAB_HASH_TRUNCATION = 8定义于 framework/py/flwr/common/constant.py。
以下各节逐一拆解。
二、SuperExec 日志流:flwr log实时监控远程运行
2.1 功能定位与用法
v1.12.0 引入了 SuperExec 日志流(log streaming)能力:当 Flower 应用在远端 SuperExec 上执行时,开发者可以通过flwr log命令实时查看日志。官方给出的两种调用形态:
# 仅指定 run-id,使用默认连接 flwr log <run-id> # 显式指定 app 目录与 federation(联邦配置) flwr log <run-id> <app-dir> <federation>2.2 源码级实现证据
当前仓库中flwr log的实现位于 framework/py/flwr/cli/log.py,其核心流程如下:
- 命令入口
log()接收run_id(必选参数)以及可选的--stream/--show开关,其中--stream为默认行为(实时流式输出),--show则一次性打印已有日志; - 底层通过 Control API 客户端
ControlHttpClient发起StreamLogsRequest(run_id=..., after_timestamp=...)(见stream_logs()),并将服务端返回的log_output逐行打印; start_stream()内部以after_timestamp游标推进,从指定时间点之后继续拉取日志,配合KeyboardInterrupt优雅退出,实现"实时跟随"效果;- 连接参数通过
read_superlink_connection()读取,并支持--federation-config覆盖(该选项当前被标记为隐藏并提示忽略)。
2.3 关联基础设施:SuperExec
日志流的另一端是 SuperExec 组件。当前仓库在 framework/docker/superexec/Dockerfile 中提供其容器镜像,分布式部署示例可见 framework/docker/distributed/server/compose.yml:其中superexec-serverapp服务以--runtime-api-address superlink:8000挂接 SuperLink,从而把运行中产生的日志回传给控制平面供flwr log拉取。可以推断,日志流链路为:SuperExec 运行应用 → 日志写入 SuperLink 控制平面 →flwr log通过 Control API 增量拉取。
三、标识符迁移:Node ID 与 Run ID 全面升级为 uint64
3.1 变更内容
v1.12.0 将 Node ID、Run ID 等字段从有符号 64 位整数(sint64)迁移为无符号 64 位整数(uint64),并在所有通信链路上完整支持uint64。对 Python 用户而言,这意味着:
- 你可以在 config 与 metric 字典中使用大于
sint64最大值、小于uint64最大值的int值; - 消息元数据(Message Metadata)中的
run_id、node_id、src_node_id、dst_node_id等均以uint64承载。
3.2 仓库中的落地证据
在协议定义层面,framework/proto/flwr/proto/message.proto 中Metadata消息的run_id(字段 1)、src_node_id(字段 3)、dst_node_id(字段 4)均为uint64;framework/proto/flwr/proto/transport.proto 中Scalar的uint64类型(字段 6)用于在配置与指标字典中传递无符号整数。在运行/控制层面,framework/proto/flwr/proto/control.proto 中的run_id、automation_id、series_id等字段同样全面采用uint64。
在状态层,framework/py/flwr/server/superlink/linkstate/utils.py 提供了int64_to_uint64及配套的字典值转换函数(见convert_int64_to_uint64),用于数据字典中部分键值的有符号/无符号互转,正是这次标识符迁移在持久化与内存状态层的兼容性适配。
四、消息 TTL:SuperLink 消息自动过期与清理
4.1 设计思路
v1.12.0 为 SuperLink 中的消息实现了完整的 Time-to-Live(TTL)支持:每条消息携带ttl字段(单位秒)与created_at时间戳,SuperLink 在消息存取时判断是否过期,过期消息自动清理。该机制可通过底层 API 配置,高层 API 默认启用。
4.2 源码细节
- 元数据定义:
Metadata消息在 framework/proto/flwr/proto/message.proto 中通过字段 7(double ttl)承载 TTL 值; - 默认值:高层 API 的默认 TTL 定义在 framework/py/flwr/app/constants.py,即
DEFAULT_TTL = 43200(12 小时);在 framework/py/flwr/app/message/message.py 创建 Message 时以ttl or DEFAULT_TTL生效; - 过期判定:framework/py/flwr/server/superlink/linkstate/utils.py 中
message_ttl_has_expired()的判定条件为ttl + created_at < current_time,即"创建时间 + 存活时长"小于当前时间则视为过期; - 内存状态层:framework/py/flwr/server/superlink/linkstate/in_memory_linkstate.py 在消息检索时按
created_at + ttl计算available_until,并对回复消息的 TTL 施加约束:回复 TTL 不得超过ins_metadata.created_at + ins_metadata.ttl - res_metadata.created_at(超出即拒绝,附容差MESSAGE_TTL_TOLERANCE),从而保证"回复不晚于原消息失效"的一致性; - 错误语义:当查询的消息已过期或不可用时,SuperLink 返回携带
ErrorCode.MESSAGE_UNAVAILABLE/REPLY_MESSAGE_UNAVAILABLE的错误消息(见create_message_error_unavailable_ins_message()与create_message_error_unavailable_res_message()),其中错误回复的 TTL 会按剩余存活时间重新计算(ttl = max(ins_metadata.ttl - (current_time - ins_metadata.created_at), 0))。
从源码结构看,TTL 机制的核心价值在于:避免因节点掉线、消息积压导致的状态无限膨胀,为 SuperLink 的长时间运行提供内存/数据库层面的自动回收能力。
五、FAB 处理优化:文件名哈希与扁平化安装
5.1 变更内容
v1.12.0 对 Flower App Bundle(FAB)做了两项优化:
- FAB 文件名追加 8 字符哈希;
flwr install安装后的目录结构从 3 层扁平化为 1 层。
5.2 仓库中的实现
- 哈希截断长度常量
FAB_HASH_TRUNCATION = 8定义于 framework/py/flwr/common/constant.py(同时APP_DIR = "apps"定义了应用安装根目录); - 构建侧,framework/py/flwr/cli/build.py 计算 FAB 的 SHA-256 哈希并截取前 8 字符附加到文件名;
- 安装侧,framework/py/flwr/cli/install.py 对 FAB 内容做哈希校验(
_verify_hashes()),并将应用安装到形如apps/<publisher>.<project_name>.<version>.<8位哈希>的目录(见install()中的路径拼接逻辑),同时在解析时校验传入的短哈希与真实哈希一致(len(fab_shorthash) != FAB_HASH_TRUNCATION直接拒绝)。
可以推断,追加哈希的动机是消除同名不同内容 FAB 的冲突,保证同一发布者、项目名、版本组合下不同内容的 FAB 可共存;扁平化安装则缩短路径深度、简化后续flwr run对应用目录的解析。
六、新基线:FedRep 个性化联邦学习
v1.12.0 引入了 FedRep 基线。FedRep(论文 "Exploiting Shared Representations for Personalized Federated Learning")的核心思想是:各客户端共享一个全局学习的特征表示(representation/body),同时在本地维护个性化分类头(head),在协作与个体适配之间取得平衡。
该基线在仓库中的实现位于 baselines/fedrep,关键文件与机制如下:
- client_app.py:
BaseClient实现标准 FedAvg 客户端;FedRepClient覆写get_parameters()只返回_body参数,set_parameters()在训练阶段只更新 body 与尚未训练的 head,本地仅保留个性化 head 状态;client_fn()通过context.run_config["algorithm"](取值fedrep或fedavg)选择算法,并将个性化 head 保存在context.state.parameters_records[FEDREP_HEAD_STATE]; - constants.py:定义默认超参
DEFAULT_LOCAL_TRAIN_EPOCHS = 10、DEFAULT_FINETUNE_EPOCHS = 5、DEFAULT_REPRESENTATION_EPOCHS = 1,以及 CIFAR-10/CIFAR-100 的归一化均值与标准差; - strategy.py:服务端
FedRep策略继承自FedAvg; - 配置文件位于 baselines/fedrep/conf,例如 cifar10_5.toml 展示了实验配置结构(
algorithm、dataset-name、dataset-split、dataset-split-num-classes、dataset-split-seed、dataset-split-fraction等)。
七、FlowerTune 模板与 LLM 评估管线优化
该版本对 FlowerTune 模板与 LLM 评估管线进行了系统打磨(涉及 16 个 PR),为即将上线的 FlowerTune LLM Leaderboard 做准备,覆盖 Finance、Medical、通用 NLP 等多个领域,并细化了评估指标与文档。
仓库中可参考的 FlowerTune 示例包括:
- examples/flowertune-llm:基于 OpenLLaMA + Alpaca-GPT4 的联邦指令微调,集成 Flower Datasets 下载/切分、PEFT 微调与 Flower 仿真引擎(可在单 GPU 上完成仿真训练);
- examples/flowertune-llm-code、examples/flowertune-llm-finance、examples/flowertune-llm-general-nlp、examples/flowertune-llm-medical:对应代码、金融、通用 NLP、医疗等垂直领域的联邦 LLM 微调应用;
- 仓库还提供 benchmarks/flowertune-llm 基准目录,包含评估脚本与结果整理逻辑。
这些示例可作为接入后续 FlowerTune Leaderboard 的起点。
八、Docker 支持增强与文档更新
v1.12.0 在容器化方面做了系统性升级:
- Ubuntu 基础镜像升级至 24.04;
- Docker 镜像新增 SBOM(软件物料清单)与 gcc;
- 补充了包含快速上手指南与分布式 Docker Compose 部署在内的完整 Docker 文档。
当前仓库的 Docker 资产包括:
- 基础镜像:framework/docker/base(alpine / ubuntu / ubuntu-cuda 三个变体);
- Python 运行时镜像:framework/docker/python/ubuntu;
- 各组件镜像:framework/docker/superlink、framework/docker/supernode、framework/docker/superexec;
- 完整编排示例:framework/docker/complete(
compose.yml、with-state.yml、with-tls.yml、certs.yml); - 分布式部署示例:framework/docker/distributed(client 与 server 两个 compose 文件,配合证书生成)。
以 framework/docker/distributed/server/compose.yml 为例,部署一个分布式服务端需要同时拉起superlink(监听 9092/8000 端口、挂载state/state.dbSQLite 数据库、启用 TLS 证书)与superexec-serverapp(基于flwr/superexec镜像构建,注入应用代码并以--plugin-type serverapp运行),二者通过superlink:8000通信。
九、其他更新与破坏性变更清单
9.1 常规更新
flwr new模板改进:MLX、NumPy、sklearn、JAX、PyTorch 模板统一了可用性与跨框架一致性;- 文档更新:PyTorch Lightning、TensorFlow、Hugging Face、Fastai 等快速上手教程全部迁移到新的
flwr run命令,FAQ 新增区块链示例; - 示例项目刷新:垂直联邦学习、高级 PyTorch、Pandas、Secure Aggregation、XGBoost 等示例被更新;Hugging Face 快速上手换用更小的语言模型,并移除遗留的仿真示例;
- Flower 术语表(glossary):新增 glossary 目录,为关键联邦学习概念提供清晰定义(如 aggregation、client、server、federated-learning、heterogeneity-in-federated-learning 等),并欢迎社区贡献扩充;
- Flower 架构讲解页:新增逐步介绍各 Flower 组件的架构 explainer 文档(收录在框架文档的 EXPLANATIONS 章节,源文件位于 framework/docs/source);
- 翻译更新:多个语言文件随版本同步更新。
9.2 破坏性变更(升级必读)
移除 Python 3.8 支持,最低版本提升至 Python 3.9。Python 3.8 自 1.9 起被弃用,本版本正式移除;当前支持范围覆盖 Python 3.9 至 3.12(推荐 3.11)。CI 与文档均以 Python 3.9 为最低支持版本。升级到 v1.12.0 及之后的版本时,请确保运行环境满足该要求。
十、升级与验证建议
- 环境检查:确认 Python 版本 ≥ 3.9(推荐 3.11),可通过
python --version验证; - 日志监控:升级后使用
flwr log <run-id>验证 SuperExec 日志流是否按预期工作,flwr log <run-id> --show可只打印已有日志; - uint64 兼容性:若在 config / metric 中传递大整数,注意其取值范围应在
[0, 2^64-1]内;协议层已全面支持uint64; - TTL 行为:高层 API 默认 TTL 为 12 小时(
DEFAULT_TTL = 43200),若你的训练轮次耗时较长或客户端响应缓慢,可通过底层 API 调整 TTL,避免消息提前过期; - FAB 安装:重新构建并
flwr install应用,确认新安装目录为apps/<publisher>.<project>.<version>.<8位hash>扁平结构; - 文档与示例:参照 framework/docs/source/changelog/index.md 中的完整变更索引,以及更新后的快速上手示例(如 examples/quickstart-pytorch)验证新命令流程。
结语
Flower v1.12.0 是一次面向运行体验与协议基础的双重升级:flwr log让远程运行可观测,uint64 迁移与消息 TTL 让底层协议更稳健,FAB 哈希与扁平化安装让应用分发更可靠,而 Python 3.8 的移除则为后续演进扫清了兼容负担。理解这些变更,不仅有助于平滑升级,也能更深入地把握 Flower 当前架构(SuperLink / SuperExec / SuperNode + Control API)的设计脉络。
【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考