拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Flower 联合学习入门:使用 fastai 与 SqueezeNet 在 MNIST 上运行联邦训练(Quickstart Example)

Flower 联合学习入门使用 fastai 与 SqueezeNet 在 MNIST 上运行联邦训练Quickstart Example【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower本指南基于 Flower 官方 quickstart 示例examples/quickstart-fastai/README.md展开演示如何用 fastai——一个构建在 PyTorch 之上的高级深度学习库——在 MNIST 数据集上联邦训练 SqueezeNet v1.1 图像分类模型。读者将掌握 Flower 应用的完整生命周期使用flwr new拉取项目模板、理解ClientApp/ServerApp的职责划分、用 Flower Datasets 完成数据分区与预处理并分别以 Simulation Engine模拟引擎和 Deployment Engine部署引擎两种模式一键运行同一份代码。示例概述fastai Flower 能做什么fastai 为深度学习实践者提供了大量开箱即用的高层组件数据加载器、Learner、指标与回调等而 Flower 是一个友好的联邦 AI 框架负责协调多客户端的数据不共享训练。本示例把两者结合服务端维护一个全局 SqueezeNet v1.1 模型多个模拟客户端各自持有 MNIST 的 IID 数据分片通过 FedAvg 策略完成多轮参数聚合。示例的技术要点模型SqueezeNet v1.1fastai.vision.all.squeezenet1_1数据集MNISTylecun/mnist由 Flower Datasetsflwr_datasets下载并按 IID 方式切分框架fastai 2.8.7 PyTorch客户端训练采用 fastaiLearner聚合策略服务端使用 Flower 内置FedAvg。运行示例并不要求深度掌握 fastai重点是理解如何把 Flower 适配到你自己的使用场景。项目结构通过flwr new拉取应用后会生成一个名为quickstart-fastai的目录其结构与当前仓库中的示例保持一致quickstart-fastai ├── fastai_example │ ├── client_app.py # 定义 ClientApp训练 / 评估回调 │ ├── server_app.py # 定义 ServerApp聚合策略与入口 │ └── task.py # 定义模型、训练与数据加载 ├── pyproject.toml # 项目元数据、依赖与应用配置 └── README.md对应到当前仓库源码位于 examples/quickstart-fastai/fastai_example/ 目录下包含__init__.py、client_app.py、server_app.py与task.py四个模块应用配置定义在 examples/quickstart-fastai/pyproject.toml 中。环境搭建与项目初始化安装 Flower 并拉取应用先安装 Flower 框架本体pip install flwr然后使用 Flower CLI 拉取官方发布的 quickstart 应用flwr new flwrlabs/quickstart-fastai该命令会以flwrlabs/quickstart-fastai为模板生成上节所示的目录结构。如果你希望直接阅读当前仓库内的示例代码也可以在examples/quickstart-fastai/目录下原地查看或拷贝使用。安装依赖与本地包进入项目目录后安装pyproject.toml中声明的全部依赖同时以可编辑模式安装fastai_example包pip install -e .从 examples/quickstart-fastai/pyproject.toml 可以看到本示例锁定的依赖版本示例快照以仓库为准dependencies [ flwr[simulation]1.36.0, flwr-datasets[vision]0.6.1, fastai2.8.7, torch2.10.0, torchvision0.25.0, ]其中flwr[simulation]额外带入了模拟运行所需的依赖flwr-datasets[vision]提供带视觉能力的数据集工具fastai与torch/torchvision则是模型训练与图像变换的运行时基础。运行联邦训练Flower 支持在同一份代码上以两种模式运行无需修改任何业务逻辑模拟模式Simulation Engine与部署模式Deployment Engine。对于刚接触 Flower 的用户推荐先使用模拟模式因为它需要手动启动的组件更少。默认情况下flwr run使用的就是 Simulation Engine。模式一使用 Simulation Engine推荐入门在项目根目录执行flwr run . --stream.表示以当前目录作为 Flower App--stream开启运行日志的流式输出便于实时观察每个客户端与服务端的事件。运行期间可以看到服务端启动、每个 SuperNode模拟客户端完成本地训练并上传模型更新、服务端按 FedAvg 聚合并下发新一轮全局模型等完整流程。覆盖运行配置pyproject.toml中定义的默认配置可以在命令行直接覆盖例如把联邦轮数从默认值改为 5flwr run . --run-config num-server-rounds5 --stream--run-config接受keyvalue形式可覆盖[tool.flwr.app.config]中声明的任意参数具体可覆盖项见下文“运行配置解析”一节。模式二使用 Deployment Engine模拟模式之外同一应用也可以跑在真实的多进程/多机部署场景下。Deployment Engine 需要分别启动 SuperLink服务端与若干 SuperNode客户端再以flwr run连接。本示例文档建议参考 Flower 官方 how-to 指南了解部署引擎的启动方式并进一步为你的联邦配置启用TLS 加密通信为 SuperLink 与 SuperNode 之间的 gRPC 通道启用证书SuperNode 认证通过密钥机制认证加入联邦的节点身份。如果你已经熟悉 Deployment Engine还可以借助 Docker 容器化部署用官方镜像分别承载 SuperLink、SuperNode 与 ServerApp从而把联邦的各个组件以独立服务的形式编排起来。当前仓库的 framework/docker/ 目录下提供了superlink、supernode、superexec等组件的 Dockerfile 示例可作为容器化部署的参考起点。源码级解析数据、客户端与服务端task.py数据加载与分区examples/quickstart-fastai/fastai_example/task.py 是数据层的核心它通过 Flower Datasets 完成「下载—分区—变换—切分」全流程def load_data(partition_id, num_partitions): # Only initialize FederatedDataset once global fds if fds is None: partitioner IidPartitioner(num_partitionsnum_partitions) fds FederatedDataset( datasetylecun/mnist, partitioners{train: partitioner}, trust_remote_codeTrue, ) partition fds.load_partition(partition_id, train) # Resize and repeat channels to use MNIST, which have grayscale images, # with squeezenet, which expects 3 channels. pytorch_transforms Compose( [Resize(224), ToTensor(), Lambda(lambda x: x.expand(3, -1, -1))] ) ...几个值得注意的实现细节模块级缓存fds作为模块级全局变量缓存FederatedDataset实例避免每个回调重复初始化数据集IID 分区使用IidPartitioner(num_partitionsnum_partitions)把 MNIST 训练集均匀切成num_partitions份客户端partition_id决定取哪一份这也意味着本示例模拟的是数据独立同分布IID场景通道适配MNIST 是单通道灰度图而 SqueezeNet 期望 3 通道输入因此变换管线为Resize(224)对齐 SqueezeNet 输入尺寸→ToTensor()→Lambda(lambda x: x.expand(3, -1, -1))把单通道复制扩展为 3 通道内部数据切分每个客户端拿到自己的分区后再做两级切分先train_test_split(test_size0.2, seed42)留出 20% 用作联邦评估testloader剩余 80% 再按train_size0.75切分得到 60% 训练集trainloader与 20% 验证集valloader两者都用于客户端的fit流程DataLoader 定制collate_fn把 Flower Datasets 返回的字典批次{image: ..., label: ...}转换为(images_tensor, labels_tensor)元组以保持 fastai DataLoaders 期望的标准行为三个 DataLoader 的batch_size均为 32。client_app.py训练与评估回调examples/quickstart-fastai/fastai_example/client_app.py 定义了ClientApp通过装饰器注册train与evaluate两个回调app ClientApp() app.train() def train(msg: Message, context: Context): # Load the model and initialize it with the received weights model squeezenet1_1() model.load_state_dict(msg.content[arrays].to_torch_state_dict()) ... learn Learner( dls, model, loss_funcCrossEntropyLossFlat(), metricserror_rate, ) with learn.no_bar(), learn.no_logging(): learn.fit(1) ...核心流程为从入站Message的ArrayRecord中恢复全局模型权重 → 依据context.node_config中的partition-id与num-partitions加载本客户端数据 → 构造 fastaiLearner损失函数CrossEntropyLossFlat、指标error_rate→learn.fit(1)本地训练 1 个 epoch → 把更新后的model.state_dict()与num-examples指标封装进回复Message。evaluate回调结构与train对称同样恢复权重并构建Learner但改用learn.validate()在验证集上求损失与错误率随后上报三项指标metrics { eval_loss: loss, eval_acc: 1 - e_rate, # 由 error_rate 换算为准确率 num-examples: len(valloader.dataset), }整个示例的通信内容统一基于 Flower 的记录原语ArrayRecord承载模型权重与 PyTorchstate_dict互相转换、MetricRecord承载标量指标、RecordDict作为外层容器。server_app.py服务端与 FedAvg 聚合examples/quickstart-fastai/fastai_example/server_app.py 定义了ServerApp其main入口读取运行配置、初始化全局模型并启动 FedAvg 策略app ServerApp() app.main() def main(grid: Grid, context: Context) - None: fraction_train: float context.run_config[fraction-train] num_rounds: int context.run_config[num-server-rounds] global_model squeezenet1_1() arrays ArrayRecord(global_model.state_dict()) strategy FedAvg(fraction_trainfraction_train) result strategy.start( gridgrid, initial_arraysarrays, num_roundsnum_rounds, ) if context.run_config[save-model]: state_dict result.arrays.to_torch_state_dict() torch.save(state_dict, final_model.pt)要点说明服务端模型同样通过ArrayRecord序列化后作为 FedAvg 的初始权重下发strategy.start()接受gridFlower 的节点编排抽象、初始权重与轮数内部负责「下发全局模型 → 收集客户端更新 → 按样本数加权平均 → 更新全局模型」的循环当运行配置save-model为true时训练结束会把最终聚合权重保存为本地文件final_model.pt。运行配置解析示例的全部可调参数集中在 examples/quickstart-fastai/pyproject.toml 的[tool.flwr.app.config]段[tool.flwr.app.config] num-server-rounds 3 fraction-train 1.0 save-model false配置项默认值作用命令行覆盖示例num-server-rounds3联邦学习的全局通信轮数即 FedAvg 迭代次数--run-config num-server-rounds5fraction-train1.0每轮参与训练的客户端比例1.0表示全部客户端参与--run-config fraction-train0.5save-modelfalse训练结束后是否把最终全局模型保存为final_model.pt--run-config save-modeltrue从源码看num-server-rounds与fraction-train分别被 server_app.py 中的context.run_config读取并直接作用于 FedAvg 的聚合过程fraction_train决定每轮采样客户端比例num_rounds决定聚合循环次数save-model仅在训练收尾阶段影响是否落盘权重。同时[tool.flwr.app.components]段把应用入口绑定到具体模块[tool.flwr.app.components] serverapp fastai_example.server_app:app clientapp fastai_example.client_app:appflwr run正是依据这两行配置找到ServerApp与ClientApp实例并启动相应运行模式的。端到端测试佐证当前仓库的框架测试体系中提供了与本文示例同源的端到端验证framework/e2e/e2e-fastai/。该测试同样使用 fastai MNIST 手写数字识别任务配合FedAvg策略验证 Flower 框架与 fastai 的集成链路其pyproject.toml将serverapp/clientapp指向e2e_fastai包并默认使用local-simulation联邦配置、num-supernodes 10。这从侧面印证了本文示例所采用的技术栈fastai、MNIST、FedAvg正是 Flower 官方验证过的组合。小结与延伸本文完整复现了 fastai Flower 联邦学习示例的搭建与运行路径pip install flwr安装框架flwr new flwrlabs/quickstart-fastai拉取应用pip install -e .安装依赖用flwr run . --stream以 Simulation Engine 一键运行用--run-config覆盖轮数等参数从源码层面理解task.pyIID 分区 通道适配 三级数据切分、client_app.pyfastaiLearner训练与评估回调与server_app.pyFedAvg 聚合与模型落盘的协作关系。在此基础上可以继续探索的进阶方向包括切换到 Deployment Engine 进行多进程/多机部署、为联邦启用 TLS 与 SuperNode 认证、通过 Docker 容器化编排各组件以及把同样的ClientApp/ServerApp结构迁移到你自己的数据集与模型上——这正是 Flower 所倡导的「一套代码两种运行模式」的开发体验。【免费下载链接】flowerFlower: A Friendly Federated AI Framework项目地址: https://gitcode.com/GitHub_Trending/flo/flower创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门