Flower v1.29.0 版本解析:SuperExec 运行时依赖安装、HMAC 认证与 LinkState 存储迁移
【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower
Flower(Flower: A Friendly Federated AI Framework)在 v1.29.0(2026-04-12)中围绕其多进程运行时体系做了一次系统性升级:SuperExec 支持通过uv在运行时为每个应用安装独立依赖环境,联邦(Federation)获得了运行查看/日志流/停止等管理能力,SuperExec 引入了基于共享密钥 HMAC 的实验性认证,同时移除了 Flower File Storage(FFS)并将状态存储统一到LinkState/NodeState。读完本文,你能掌握这些新特性的实际启用方式、底层实现机制与源码位置,并了解从旧版本升级时需要处理的不兼容变更。
版本概览
本版本官方变更日志见 v1.29.0 changelog,主要条目包括:
| 类别 | 变更 | 影响面 |
|---|---|---|
| 新功能 | SuperExec 运行时依赖安装(--allow-runtime-dependency-installation) | 依赖隔离、多应用共存 |
| 新功能 | 联邦运行管理:查看运行详情、流式日志、停止运行;联邦名称创建时校验;归档后隐藏 SuperNode 状态列 | SuperGrid/联邦运维 |
| 新功能(实验性) | SuperExec 认证:共享密钥 HMAC、nonce 重放防护、拦截器基础,集成到 ServerAppIo 与 ClientAppIo | 安全性 |
| 易用性 | flwr run、flwr new、flwr app review展示 Flower Hub 返回的兼容性note字段 | CLI 透明度 |
| 安全性 | flwr-serverapp、flwr-simulation、flwr-clientapp的 RPC 调用改用 token 机制认证 | 进程间安全 |
| 示例更新 | 各示例 README 改用本地 SuperLink,pyproject.toml 增加 FAB 元数据(fab-format-version = 1、flwr-version-target),应用版本按 minor 升级 | 示例与已发布 App |
| 修复/易用性 | flwr list的 JSON 输出显示完整 FAB hash(此前被截断) | 脚本化集成 |
| 不兼容变更 | 移除 Flower File Storage(FFS),迁移到LinkState基础存储;flower-superlink移除--storage-dir选项 | 升级迁移 |
运行时依赖安装:让不同依赖的应用独立运行
这是本版本的核心特性。Flower App 在pyproject.toml中声明依赖,Flower 可以在执行应用前用uv自动安装这些依赖。官方使用文档为 Install Flower App dependencies at runtime,其中给出了关键行为约定:
- 默认值不对称:SuperLink 默认启用自动依赖安装;SuperNode 默认不启用。在 SuperLink 上可通过
--disable-runtime-dependency-installation或环境变量FLWR_DISABLE_RUNTIME_DEPENDENCY_INSTALLATION=1关闭;在 SuperNode 上通过--allow-runtime-dependency-installation显式开启。 - process 隔离模式下的传递规则:当以
--isolation=process运行 SuperLink/SuperNode 时,依赖安装标志不会作用于应用进程本身,而需要加在独立启动的flower-superexec上。
文档中给出的两条典型命令如下:
# SuperNode 侧启用(连接本地 SuperLink 用于原型验证) $ flower-supernode \ --superlink 127.0.0.1:9092 \ --insecure \ --allow-runtime-dependency-installation # process 隔离模式下,启用 SuperExec 自身的依赖安装 $ flower-superexec \ --runtime-api-address <runtime-api-address> \ --plugin-type <choice-of-plugin> \ --allow-runtime-dependency-installation参数定义与默认值
命令行参数的统一注册逻辑在 add_args_runtime_dependency_install 中:--allow-runtime-dependency-installation以store_true方式写入runtime_dependency_install字段;对 SuperLink,还会额外注册一个互斥组内的--disable-runtime-dependency-installation开关。flower_superlink.py 中还保留了兼容逻辑:旧版传入--allow-runtime-dependency-installation时会打印弃用警告,提示该行为已成为 SuperLink 默认能力,并指向--disable-runtime-dependency-installation。默认值由_runtime_dependency_install_default()计算:只有环境变量FLWR_DISABLE_RUNTIME_DEPENDENCY_INSTALLATION=1时才返回关闭。
每次运行独立的 venv
变更日志强调“每次运行自动创建独立 venv,即使运行是并发的也不会互相干扰”。源码印证了这一机制,核心实现在 dependency_installer.py:
- 读取依赖:
_get_project_dependencies从应用目录的pyproject.toml读取[project].dependencies; - 排除 flwr 自身:
_exclude_flwr_dependencies按 PEP 508 规则解析包名并剔除flwr,避免用应用的要求覆盖正在运行的 Flower 安装(源码中会打印 WARNING 日志说明跳过原因); - 创建隔离环境:
_create_runtime_env_dir在$FLWR_HOME/runtime-envs下按运行生成目录名——有run_id时直接用运行 ID,否则由项目路径 SHA256 前缀 + launch 标识哈希前缀 + 随机 nonce 组成,保证并发运行互不冲突; - 调用 uv sync:命令形如
python -m uv sync --python <当前解释器> --no-install-project --no-install-package flwr --inexact,并通过环境变量UV_PROJECT_ENVIRONMENT指定隔离环境路径;支持通过 EE 解析器注入--index-url(当前开源版本中该解析器返回 None,见 dependency_installer.py 中_resolve_index_url_from_ee的注释说明); - 激活环境:
_activate_runtime_env将新环境的site-packages插入sys.path头部,把bin/Scripts目录前置到PATH,并设置VIRTUAL_ENV; - 退出清理:
_register_runtime_env_cleanup通过add_exit_handler注册退出钩子,cleanup_app_runtime_environment在应用执行完成后删除环境目录。
单元测试 dependency_installer_test.py 验证了上述行为,包括:并发两次安装落到同一runtime-envs/<run_id>目录、index 解析器错误会向上传播、清理函数确实删除目录等。
需要留意的适用前提:当前环境必须可用uv(_ensure_uv_available会以python -m uv --version探测,缺失时抛出带安装提示的RuntimeError);主机需要能访问包索引。若主机无包索引访问权限或需要严格控制可安装包,文档建议改为在 SuperNode 环境中预装依赖并关闭运行时安装。
标志如何传播到应用进程
在 subprocess 隔离模式下,SuperLink 自动启动的 SuperExec 会携带该标志:flower_superlink.py 中runtime_dependency_install为真时向 SuperExec 命令追加--allow-runtime-dependency-installation,注释说明“SuperLink 子进程隔离拥有该 SuperExec,因此安装依赖”。SuperNode 侧对应逻辑在 start_client_internal.py。SuperExec 再将该标志透传给实际执行应用子进程的命令行,相关渲染逻辑与测试可见于:
- subprocess_executor.py 与 subprocess_executor_test.py 中的 test_launch_renders_runtime_dependency_install_flag;
- kubernetes_executor.py:Kubernetes 模式会把该参数写进 TaskExecutor 容器的 args;
- base_ephemeral_exec_plugin.py:临时执行插件在拉起应用进程时同样透传。
联邦运行管理与 SuperExec HMAC 认证
联邦运行管理
本版本让联邦成员可以直接在联邦内部检查运行详情、流式读取日志并停止运行,同时在创建联邦时对联邦名称进行校验,归档(archived)联邦会隐藏 SuperNode 状态列。这些能力由 SuperLink 的FederationManager承载,抽象基类 linkstate.py 暴露了federation_manager属性及消息存取等接口;联邦相关持久化模型(如带owner_aid、status、online_until索引的Node表)位于 linkstate_models.py。
SuperExec 认证(实验性)
本版本引入基于共享密钥 HMAC 的 SuperExec 认证机制,包含核心原语、nonce 重放防护和拦截器基础,并集成进 ServerAppIo 与 ClientAppIo。从 superexec.py 的实现可以看到其设计要点:
- 规范化签名输入:
canonicalize_superexec_auth_input将method、timestamp、nonce、body_sha256四个字段序列化为规范字节串,作为 HMAC 输入; - 确定性的请求体摘要:
compute_request_body_sha256对 protobuf 请求体做SerializeToString(deterministic=True)后取 SHA256,保证两端计算一致; - 密钥派生:
derive_auth_secret用 master secret 加固定上下文(SUPEREXEC_AUTH_SECRET_CONTEXT)通过 HMAC-SHA256 派生出 auth 作用域密钥; - 重放防护:定义
_NonceStore协议,reserve_nonce(namespace, nonce, expires_at)原子性地预留 nonce 直至过期;时间戳合法性由MAX_TIMESTAMP_DIFF_SECONDS/MIN_TIMESTAMP_DIFF_SECONDS常量约束; - 传输载体:签名、时间戳、nonce、body 摘要分别通过
SUPEREXEC_AUTH_SIGNATURE_HEADER等 HTTP 头传递,拦截器实现在 interceptors/http/superexec_auth.py,密钥管理辅助类在 superexec_secret.py。
flwr-* 进程的 token 认证增强
另一条安全性改进是:flwr-serverapp、flwr-simulation、flwr-clientapp发起的 RPC 调用改用 token 机制认证。从测试代码可看到 token 已成为应用进程 CLI 的必填项,例如 flwr_serverapp_test.py 中--token与--allow-runtime-dependency-installation、--parent-pid一同传入,common/args_test.py 亦验证了“App 进程 CLI 必须携带 token”。父进程 PID 参数(--parent-pid)则用于应用进程感知其宿主,防止宿主退出后残留。
CLI 透明度与示例工程化
- Flower Hub 兼容性提示:当
flwr run、flwr new、flwr app review的下载解析到“旧版但兼容”的版本而非最新版时,CLI 会读取 Flower Hub 返回的note字段并展示,让用户知道版本选择的实际原因; - 完整 FAB hash:
flwr list的 JSON 输出中原来被截断的 FAB hash 现显示完整值,便于脚本做精确比对; - FAB 元数据落地到示例:各示例的
pyproject.toml增加fab-format-version = 1与flwr-version-target字段,例如 examples/custom-mods/pyproject.toml、examples/federated-vae/pyproject.toml;示例 README 统一改用本地 SuperLink 演示,并补充 LICENSE、应用版本按 minor 升级。
不兼容变更:移除 Flower File Storage(FFS)
这是升级时必须处理的破坏性变更:FFS 被移除,状态存储迁移到基于LinkState的机制,LinkState与NodeState引入了替代方法,flower-superlink的--storage-dir选项被删除。从当前源码看:
LinkState(linkstate.py)提供store_message_ins、federation_manager等抽象接口,并由 linkstate_factory.py 结合 SQLite 数据库文件(支持:memory:)与ObjectStoreFactory创建具体实例;NodeState(nodestate.py)提供store_message、set_node_id等抽象接口,nodestate_factory.py 用InMemoryNodeState+ ObjectStore 构建实例;- 在 SuperLink CLI 源码中已搜索不到
storage-dir相关参数,印证了该选项的移除。
升级建议:如果你此前依赖 FFS 或--storage-dir配置 SuperLink,需要迁移到默认的 LinkState/NodeState 存储路径管理方式,并核对启动参数中是否有已失效的--storage-dir。
小结
v1.29.0 的主线是“运行时更安全、更隔离、更可控”:运行时依赖安装让不同依赖的 Flower App 在同一主机上互不污染;HMAC 认证与 token 机制收紧了进程间通信的信任边界;FFS 移除则简化了存储模型,统一收敛到LinkState/NodeState。对于使用 SuperLink/SuperNode/SuperExec 的部署方,升级时优先检查三项:--storage-dir相关配置是否需要清理、依赖安装默认行为(SuperLink 默认开、SuperNode 默认关)是否符合预期、以及 SuperExec 认证是否纳入你的安全方案。变更细节可继续对照 v1.29.0 changelog 与上文列出的源码路径逐项核实。
【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考