Project Icon

FL-bench

开源联邦学习基准测试平台

FL-bench是一个开源的联邦学习基准测试平台,实现了多种经典和前沿算法。平台支持个性化联邦学习和域泛化等研究方向,提供简单接口用于自定义数据集和模型。集成了可视化工具,方便研究人员快速实现和对比不同方法。FL-bench旨在促进联邦学习领域的创新与发展。

图片

对联邦学习方法进行基准测试。

实现你的卓越创意。

享受联邦学习的乐趣。

FL-bench欢迎各种能够改进这个项目的PR。

FL-bench 的简单介绍

方法 🧬

传统联邦学习方法 个性化联邦学习方法 联邦学习领域泛化方法

环境准备 🧩

PyPI 🐍

pip install -r .environment/requirements.txt

Poetry 🎶

对于中国大陆用户

poetry install --no-root -C .environment

对于其他用户

cd .environment && sed -i "10,14d" pyproject.toml && poetry lock --no-update && poetry install --no-root

Docker 🐳

对于中国大陆用户

docker pull registry.cn-hangzhou.aliyuncs.com/karhoutam/fl-bench:master

对于其他用户

docker pull ghcr.io/karhoutam/fl-bench:master

构建容器的示例

docker run -it --name fl-bench -v path/to/FL-bench:/root/FL-bench --privileged --gpus all ghcr.io/karhoutam/fl-bench:master

快速运行 🏃‍♂️

所有方法类都继承自FedAvgServerFedAvgClient。如果你想了解整个工作流程和变量设置的详细信息,请查看src/server/fedavg.pysrc/client/fedavg.py

步骤1. 生成联邦学习数据集

根据Dir(0.1)将MNIST数据集划分给100个客户端

python generate_data.py -d mnist -a 0.1 -cn 100

关于生成联邦数据集的方法,请查看data/README.md获取完整详情。

步骤2. 运行实验

python main.py [--config-path, --config-name] [method=<方法名> args...]
  • method: 算法名称,例如method=fedavg。❗ 方法名应与src/server中的.py文件名相同。
  • --config-path: 配置文件所在目录的相对路径。默认为config
  • --config-name: .yaml配置文件的名称(不包含.yaml扩展名)。默认为defaults,指向config/defaults.yaml

例如,使用所有默认设置运行FedAvg:

python main.py method=fedavg

默认值在config/defaults.yamlsrc/utils/constants.py中设置。

如何自定义联邦学习方法参数 🤖

  • 通过修改配置文件
  • 通过在命令行中显式设置,例如python main.py --config-name my_cfg.yaml method=fedprox fedprox.mu=0.01
  • 通过修改src/utils/constants.py/DEFAULT_COMMON_ARGS或方法的get_hyperparams()中的默认值

⚠ 对于相同的联邦学习方法参数,参数设置的优先级为命令行 > 配置文件 > 默认值

例如,fedprox.mu的默认值为1

# src/server/fedprox.py
class FedProxServer(FedAvgServer):

    @staticmethod
    def get_hyperparams(args_list=None) -> Namespace:
        parser = ArgumentParser()
        parser.add_argument("--mu", type=float, default=1.0)
        return parser.parse_args(args_list)

而你的.yaml配置文件有

# config/your_config.yaml
...
fedprox:
  mu: 0.01
python main.py method=fedprox                                  # fedprox.mu = 1
python main.py --config-name your_config method=fedprox        # fedprox.mu = 0.01

监控 📈

FL-bench支持visdomtensorboard

激活

👀 注意: 你需要自行启动visdom / tensorboard服务器。

# your_config.yaml
common:
  ...
  visible: tensorboard # 选项:[null, visdom, tensorboard]

启动visdom / tensorboard服务器

visdom
  1. 在终端运行python -m visdom.server
  2. 在浏览器中查看localhost:8097

tensorboard

  1. 在终端运行tensorboard --logdir=<your_log_dir>
  2. 在浏览器中查看localhost:6006

通过Ray进行并行训练 🚀

这个功能可以大大提高你的训练效率。同时,这个功能对用户友好且易于使用!!!

激活(你唯一需要做的)

# your_config.yaml
mode: parallel
parallel:
  num_workers: 2 # 任何大于1的正整数
  ...
...

手动创建Ray集群(可选)

每次以并行模式运行实验时,都会隐式创建一个Ray集群。 或者你可以通过下面显示的命令手动创建它,以避免每次运行实验时创建和销毁集群。

ray start --head [选项]

👀 注意: 要连接到现有的Ray集群,你需要在配置文件中保持num_cpus: nullnum_gpus: null

# your_config_file.yaml
# 连接到本地现有的Ray集群。
mode: parallel
parallel:
  ...
  num_gpus: null
  num_cpus: null
...

通用参数 🔧

所有通用参数都有默认值。查看src/utils/constants.py中的DEFAULT_COMMON_ARGS以获取通用参数的完整详情。

⚠ 通用参数不能通过命令行设置。

你也可以编写自己的.yaml配置文件。我在config中为你提供了一个模板,并建议你也将配置文件保存在那里。

一个例子:python main.py fedavg config/template.yaml [cli_method_args...]

关于特定联邦学习方法参数的默认值,请查看相应的FL-bench/src/server/<method>.py以获取完整详情。

参数类型描述
--config-pathstr配置文件所在目录。默认为config,表示./config
--config-namestr配置文件的名称(不包含.yaml扩展名)。默认为defaults,指向config/defaults.yaml
datasetstr实验运行的数据集名称。
modelstr实验使用的模型骨架。
seedint运行实验的随机种子。
join_ratiofloat(每轮参与的客户端数)/(总客户端数)的比率。
global_epochint全局轮次,也称为通信轮次。
local_epochint客户端本地训练的轮次。
finetune_epochint客户端在测试前微调模型的轮次。
buffersstr如何处理每个客户端模型的参数缓冲区(在model.buffers()中)。选项:[local, global, drop]。local(默认):客户端的缓冲区是隔离的;global:缓冲区将像其他模型参数一样被聚合;drop:客户端在训练完成后会丢弃它们的缓冲区。
test_intervalint对客户端执行测试的间隔轮次。
eval_testbool在本地训练前后对加入的客户端的测试集进行评估,设为true
eval_valbool在本地训练前后对加入的客户端的验证集进行评估,设为true
eval_trainbool在本地训练前后对加入的客户端的训练集进行评估,设为true
optimizerdict客户端优化器。参数要求与torch.optim中的优化器相同。
lr_schedulerdict客户端学习率调度器。参数要求与torch.optim.lr_scheduler中的调度器相同。
verbose_gapint在终端显示客户端训练性能的间隔轮次。
batch_sizeint客户端本地训练的数据批次大小。
use_cudabooltrue表示张量在GPU上。
visiblebool选项:[null, visdom, tensorboard]
straggler_ratiofloat落后者的比例(设置在[0, 1]范围内)。落后者不会像正常客户端那样执行完整轮次的本地训练。他们的本地轮次将随机从[straggler_min_local_epoch, local_epoch)范围内选择。
straggler_min_local_epochint落后者的最小本地轮次值。
external_model_params_filestr模型参数.pt文件相对于FL-bench根目录的路径。⚠ 此功能仅在unique_model=False时启用,这由每个联邦学习方法预定义。
save_logbool设为true以保存算法运行日志到out/<method>/<start_time>
save_modelbool设为true以保存输出模型参数到out/<method>/<start_time>.pt
save_figbool设为true以将Visdom上显示的准确率曲线保存为.pdf文件,保存在out/<method>/<start_time>
save_metricsbool设为true以将指标统计保存为.csv文件,保存在out/<method>/<start_time>
delete_useless_runbool设为true以在用户按下Ctrl + C后删除输出文件,表示该运行是可删除的。

并行训练参数 👯‍♂️

参数类型描述
num_workersint并行工作进程的数量。需要设置为大于1的整数。
ray_cluster_addrstr选定Ray集群的IP地址。默认为null,这意味着如果没有现有的Ray集群,ray将在每次运行实验时建立一个新集群,并在结束时销毁它。更多详情可以在官方文档中找到。
num_cpusnum_gpusint你为Ray集群分配的计算资源数量。默认全部为null

模型 🤖

这个基准支持许多常见的和集成在Torchvision中的模型(查看这里获取所有模型):

  • ResNet系列
  • EfficientNet系列
  • DenseNet系列
  • MobileNet系列
  • LeNet5
  • ...

🤗 你可以通过填写src/utils/models.py中的CustomModel类来定义自己的自定义模型,并通过在.yaml配置文件中定义model: custom来使用它。

数据集和分区策略 🎨

常规图像数据集

  • MNIST (1 x 28 x 28, 10类)

  • CIFAR-10/100 (3 x 32 x 32, 10/100类)

  • EMNIST (1 x 28 x 28, 62类)

  • FashionMNIST (1 x 28 x 28, 10类)

  • 合成数据集

  • FEMNIST (1 x 28 x 28, 62类)

  • CelebA (3 x 218 x 178, 2类)

  • SVHN (3 x 32 x 32, 10类)

  • USPS(1 x 16 x 16,10类)

  • Tiny-ImageNet-200(3 x 64 x 64,200类)

  • CINIC-10(3 x 32 x 32,10类)

领域泛化图像数据集

医学图像数据集

自定义技巧 💡

实现联邦学习方法

服务器端类中的package()用于组装服务器需要发送给客户端的所有参数。类似地,客户端类中的package()用于客户端需要发送回服务器的参数。在你的重写实现中,应始终包含super().package()

  • 考虑从FedAvgServerFedAvgClient继承你的方法类,以最大程度地利用FL-bench的工作流程。

  • 你也可以从高级方法继承你的方法类,例如FedBN、FedProx等。这将继承所有函数、变量和超参数设置。如果这样做,你需要谨慎设计你的方法,以避免潜在的超参数和工作流程冲突。

class YourServer(FedBNServer):
  ...

class YourClient(FedBNClient):
  ...
  • 要自定义服务器端处理,考虑重写package()aggregate()

  • 要自定义客户端训练,考虑重写fit()set_parameters()package()

你可以在FedAvgClientFedAvgServer中找到所有细节,它们是FL-bench中所有实现的基础。

集成数据集

  • data/utils/datasets.py中的BaseDataset继承你自己的数据集类,并将你的类添加到字典DATASETS中。

自定义模型

  • 我提供了src/utils/models.py中的CustomModel类,你只需定义你的模型架构即可。
  • 如果你想在FL-bench的工作流程中使用你的自定义模型,必须定义baseclassifier。(提示:你可以将其中一个定义为torch.nn.Identity()以绕过它。)

引用 🧐

@software{Tan_FL-bench,
  author = {Tan, Jiahao and Wang, Xinpeng},
  license = {MIT},
  title = {{FL-bench: A federated learning benchmark for solving image classification tasks}},
  url = {https://github.com/KarhouTam/FL-bench}
}

@misc{tan2023pfedsim,
  title={pFedSim: Similarity-Aware Model Aggregation Towards Personalized Federated Learning}, 
  author={Jiahao Tan and Yipeng Zhou and Gang Liu and Jessie Hui Wang and Shui Yu},
  year={2023},
  eprint={2305.15706},
  archivePrefix={arXiv},
  primaryClass={cs.LG}
}
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号