Flower v1.29.0 版本解析:SuperExec 运行时依赖安装、HMAC 认证与 LinkState 存储迁移
2026/9/17 21:12:53 网站建设 项目流程

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 runflwr newflwr app review展示 Flower Hub 返回的兼容性note字段CLI 透明度
安全性flwr-serverappflwr-simulationflwr-clientapp的 RPC 调用改用 token 机制认证进程间安全
示例更新各示例 README 改用本地 SuperLink,pyproject.toml 增加 FAB 元数据(fab-format-version = 1flwr-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-installationstore_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:

  1. 读取依赖_get_project_dependencies从应用目录的pyproject.toml读取[project].dependencies
  2. 排除 flwr 自身_exclude_flwr_dependencies按 PEP 508 规则解析包名并剔除flwr,避免用应用的要求覆盖正在运行的 Flower 安装(源码中会打印 WARNING 日志说明跳过原因);
  3. 创建隔离环境_create_runtime_env_dir$FLWR_HOME/runtime-envs下按运行生成目录名——有run_id时直接用运行 ID,否则由项目路径 SHA256 前缀 + launch 标识哈希前缀 + 随机 nonce 组成,保证并发运行互不冲突;
  4. 调用 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的注释说明);
  5. 激活环境_activate_runtime_env将新环境的site-packages插入sys.path头部,把bin/Scripts目录前置到PATH,并设置VIRTUAL_ENV
  6. 退出清理_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_aidstatusonline_until索引的Node表)位于 linkstate_models.py。

SuperExec 认证(实验性)

本版本引入基于共享密钥 HMAC 的 SuperExec 认证机制,包含核心原语、nonce 重放防护和拦截器基础,并集成进 ServerAppIo 与 ClientAppIo。从 superexec.py 的实现可以看到其设计要点:

  • 规范化签名输入canonicalize_superexec_auth_inputmethodtimestampnoncebody_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-serverappflwr-simulationflwr-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 runflwr newflwr app review的下载解析到“旧版但兼容”的版本而非最新版时,CLI 会读取 Flower Hub 返回的note字段并展示,让用户知道版本选择的实际原因;
  • 完整 FAB hashflwr list的 JSON 输出中原来被截断的 FAB hash 现显示完整值,便于脚本做精确比对;
  • FAB 元数据落地到示例:各示例的pyproject.toml增加fab-format-version = 1flwr-version-target字段,例如 examples/custom-mods/pyproject.toml、examples/federated-vae/pyproject.toml;示例 README 统一改用本地 SuperLink 演示,并补充 LICENSE、应用版本按 minor 升级。

不兼容变更:移除 Flower File Storage(FFS)

这是升级时必须处理的破坏性变更:FFS 被移除,状态存储迁移到基于LinkState的机制,LinkStateNodeState引入了替代方法,flower-superlink--storage-dir选项被删除。从当前源码看:

  • LinkState(linkstate.py)提供store_message_insfederation_manager等抽象接口,并由 linkstate_factory.py 结合 SQLite 数据库文件(支持:memory:)与ObjectStoreFactory创建具体实例;
  • NodeState(nodestate.py)提供store_messageset_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询