easyFL
厦门大学开源的联邦学习实验框架,支持50+算法、50+数据集、灵活Non-IID数据分区,三行代码完成联邦学习实验
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
厦门大学开源的联邦学习实验框架,支持50+算法、50+数据集、灵活Non-IID数据分区,三行代码完成联邦学习实验
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下这样的场景:一家三甲医院的放射科主任想要训练一个肺部 CT 影像诊断 AI,但医院数据出于隐私法规无法直接共享给外部机构;与此同时,跨省的多家银行也想联合训练反欺诈模型,但各自的用户交易记录同样是高度敏感数据。传统的机器学习需要把所有数据汇聚到一台服务器,而隐私法规让这条路越来越难走。FLGo(Federated Learning Go) 正是为解决这个矛盾而生的——它让你在不搬动原始数据的前提下,让分布在各地的"节点"协同训练一个共享的 AI 模型。
FLGo 由厦门大学(XMU)的研究团队开发,项目名虽叫"easyFL",但代码库名为 FLGo——两个名字指向同一个项目。它的诞生背景是联邦学习(Federated Learning)领域的两大痛点:实验复现困难和工具链割裂。联邦学习自 2016 年被 Google 提出以来,学术界和工业界涌现了大量算法改进论文,但这些算法往往散落在不同代码仓库里,使用不同的数据预处理方式,缺乏统一的实验框架,导致研究者在复现他人工作时付出大量重复劳动。FLGo 的核心目标就是做一个高度模块化、可复现、覆盖主流算法的联邦学习实验平台,降低研究人员的入门门槛。
作者团队来自厦门大学软件工程系,项目获得了国家自然科学基金等支持。仓库于 2020 年左右建立至今保持活跃更新(最新版本 v0.4.4,发布于 2024 年),作者还维护了配套的 FLGo-Bench benchmark 画廊和详细的中文知乎专栏。
FLGo 的设计哲学可以概括为**"四个独立 + 灵活组合"**。它将联邦学习实验拆解为四个正交的模块:
Benchmark(数据集与切分策略):FLGo 提供了超过 50 个 benchmark,覆盖图像分类(MNIST、CIFAR-10/100)、自然语言处理(AG_NEWS、Sentiment140)、图数据(Cora、PubMed)、推荐系统(MovieLens)等多个领域。每个 benchmark 内置了多种数据切分策略:IID(独立同分布)、Dirichlet 非同分布、标签多样性切分(Label Diversity)、数据量不均衡切分等。研究者在论文中看到的"Non-IID 数据"就是通过这些 partitioner 实现的。例如,DirichletPartitioner(alpha=0.1) 产生高度 Non-IID 的数据分布,alpha=10 则接近 IID。这种灵活的切分方式让研究者可以精确控制实验条件,便于对比不同算法在各类数据异质性下的表现。

Algorithm(联邦学习算法):FLGo 实现了 50+ 种主流联邦学习算法,覆盖经典算法(FedAvg、FedProx、SCAFFOLD)、个性化联邦学习(Ditto、pFedMe、FedPer)、公平性感知算法(FedFv、QFedAvg)、异步联邦(FedAsync、FedBuff)以及应对系统异构性的方法(HeteroFL、FedRolex、LotteryFL)。每个算法的实现都遵循统一的 Server-Client 架构:Server 负责聚合客户端更新,Client 负责本地训练,通信原语由底层 Simulator 管理。这种设计让添加新算法变得极为简单——只需继承 BasicServer 和 BasicClient,重写 iterate() 或 train() 方法即可。

Simulator(系统异质性模拟):这是 FLGo 区别于大多数联邦学习框架的独特能力。在真实环境中,不同节点的计算能力、网络带宽、在线状态各不相同——有的节点可能宕机、有的可能延迟很高、有的可能只上传部分梯度。FLGo 的 Simulator 模块可以模拟这些真实系统的异质性行为,比如设置节点的可用性比例、响应延迟、数据传输速率等参数。通过在虚拟环境中复现这些条件,研究者可以在单机上评估算法对系统异质性的鲁棒性,而无需真实部署分布式系统。

Experiment(实验管理与可视化):FLGo 提供了完整的实验流水线:命令行参数解析、超参数配置、实验调度、结果记录与可视化。内置的 Logger 可以将每轮训练指标(loss、accuracy)写入 record 目录,配合 Analyzer 模块可以自动绘制对比曲线。
FLGo 最大的卖点之一是极低的使用门槛。对于一个标准的横向联邦学习实验,用户只需要三行代码:
import flgo
import flgo.benchmark.mnist_classification as mnist
import flgo.benchmark.partition as fbp
import flgo.algorithm.fedavg as fedavg
# 第一行:生成联邦学习任务(MNIST 切分为 100 个节点,IID 分布)
flgo.gen_task_by_(mnist, fbp.IIDPartitioner(num_clients=100), './my_task')
# 第二行:初始化 FedAvg 运行器
fedavg_runner = flgo.init('./my_task', fedavg, {'gpu': [0,], 'num_rounds':20, 'num_epochs': 1})
# 第三行:开始训练
fedavg_runner.run()
第一行 gen_task_by_() 会自动下载 MNIST 数据集,按照指定的切分策略生成分布式数据集,并保存到 ./my_task 目录——整个过程对用户透明。生成的目录结构会自动包含每个节点的本地数据集划分,以及可视化结果图。

训练过程会自动输出每轮的验证准确率:
--------------Round 1--------------
test_accuracy 0.6534
test_loss 1.5835
训练完成后,所有历史指标会保存到 ./my_task/record/,可通过 Analyzer 模块加载并绘制学习曲线。

从代码结构来看,FLGo 采用了清晰的五层架构:
算法层(algorithm/):所有算法都继承自 fedbase.BasicServer 和 fedbase.BasicClient。Server 的核心方法是 iterate(),它循环执行 select(选客户端)→ communicate(交换参数)→ aggregate(聚合更新)三个步骤。Client 的核心方法是 train(),接收全局模型参数后用本地数据训练,然后将模型更新(梯度或参数差分)返回给 Server。这种"Server 主导 + Client 响应"的模式与标准横向联邦学习的通信流程完全一致。
数据层(benchmark/):每个 benchmark 是一个 Python 包,包含 TaskGen(生成联邦任务)、TaskReader(读取数据)、TaskCalculator(计算指标)三个核心类。数据分区策略(IIDPartitioner、DirichletPartitioner 等)作为独立模块与 benchmark 解耦,可以自由组合。例如,在 CIFAR-100 上使用 DirichletPartitioner(alpha=0.1) 生成 Non-IID 数据分布,再用 FedProx 算法训练——只需在 gen_task_by_() 中切换参数即可,无需修改任何代码。
模拟器层(simulator/):默认的 Simulator 以多进程(multiprocessing)方式运行各客户端,每个客户端进程独立持有数据子集。Simulator 可以扩展为自定义类,实现节点延迟、断线重连、上传截断梯度等行为,对上层的算法代码完全透明。
工具层(utils/):包含 fmodule.py(将 PyTorch 模型参数转换为 dict 格式,支持模型级别的加减乘除运算)和 fflow.py(参数解析、初始化、训练流程控制)。
实验管理层(experiment/):支持超参数 YAML 配置、批量实验调度(run_in_parallel)、日志记录与分析可视化。
虽然 FLGo 默认在单机上通过多进程模拟分布式环境,但它也支持真实分布式部署。仓库中提供了一个 realworld_case 示例,展示了如何将 FLGo 扩展到多台真实机器上运行。这需要配置各节点的 IP 地址和端口,通过网络通信替代 Simulator 内的进程通信。虽然这不如专门的分布式框架(如 Flower、PySyft)成熟,但对于需要快速验证算法的研究者来说已经足够。

FLGo 的定位是研究实验框架,而非生产级联邦学习系统。这意味着它存在一些固有限制:
不支持真实隐私保护计算:FLGo 的 Simulator 在多进程中模拟各节点,本质上所有数据仍然存在于同一台机器的内存中。它模拟的是"数据分布"而非真正的隐私隔离。如果需要端到端的差分隐私、安全多方计算(MPC)或同态加密支持,需要结合 PySyft、FATE 等专门框架。
无 Web UI 或 API 服务:FLGo 没有任何 Web 界面或 REST API,只能通过 Python 代码调用。对于需要非技术用户参与联邦建模的场景(如医院间的模型协作训练),需要自行开发上层的通信和调度层。
GPU 利用率取决于算法实现:虽然 FLGo 支持 GPU 加速,但大多数内置算法的实现并未针对多 GPU 做优化。在大规模实验中(数百个客户端节点),单卡可能成为瓶颈。用户需要自行实现数据并行或模型并行策略。
文档以英文为主:尽管作者维护了中文知乎专栏,但框架本身的类名、注释和文档仍以英文为主,对中文用户的友好度稍逊。
FLGo 在 GitHub 上获得 630+ stars(截至分析时),吸引了来自多所高校和研究机构的研究者使用。从引用和 Issues 来看,它已被用于发表多篇联邦学习相关论文的实验基础。与 Google 的 TensorFlow Federated(TFF)、OpenMined 的 PySyft、Pysyft 等框架相比,FLGo 的优势在于算法覆盖广度和实验可复现性——它收录了 50+ 种算法并提供了统一的评估基准,这对于需要做算法对比研究的学者尤为有价值。
作者还发布了 FLGo-Bench 画廊,将各种 benchmark 组合(算法 × 数据集 × 分区策略)的参考结果整理成可查阅的 gallery,进一步降低了实验复现的成本。这种"框架 + 基准画廊"的组合模式,在机器学习开源社区中属于较为成熟的做法。
总结来看,FLGo 是一个面向联邦学习研究的高质量 Python 实验框架,适合需要快速验证算法想法、对比不同算法在各种数据分布下的表现、以及复现他人工作的研究者和学生。它以极简的 API 和全面的算法库降低了联邦学习研究的门槛,但在生产部署、隐私保护和分布式通信方面仍有较大差距——这恰恰反映了当前联邦学习领域"学术工具成熟度 > 工程落地成熟度"的整体现状。