Home

Awesome

<p align="center"> <img src=".github/images/logo.svg" alt="Image"/> </p> <!-- <p align="center"> <a href="https://github.com/KarhouTam/FL-bench/blob/master/LICENSE"> <img alt="GitHub License" src="https://img.shields.io/github/license/KarhouTam/FL-bench?style=for-the-badge&logo=github&color=8386e0"/> </a> <a href="https://github.com/KarhouTam/FL-bench/issues?q=is%3Aissue+is%3Aclosed"> <img alt="GitHub closed issues" src="https://img.shields.io/github/issues-closed-raw/KarhouTam/FL-bench?style=for-the-badge&logo=github&color=8386e0"> </a> <a href="https://github.com/KarhouTam/FL-bench/stargazers"> <img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/KarhouTam/FL-bench?style=for-the-badge&logo=github&color=8386e0"> </a> <a href="https://github.com/KarhouTam/FL-bench/forks"> <img alt="GitHub Repo forks" src="https://img.shields.io/github/forks/KarhouTam/FL-bench?style=for-the-badge&logo=github&color=8386e0"> </a> </p> --> <h4 align="center"><i>

Benchmarking Federated Learning Methods.

Realizing Your Brilliant Ideas.

Having Fun with Federated Learning.

FL-bench welcomes PR on everything that can make this project better.

</i></h4>

<p align="center"> <a href=https://zhuanlan.zhihu.com/p/703576051>FL-bench 的简单介绍</a> </p>

Methods 🧬

<!-- <details> --> <summary><b>Traditional FL Methods</b></summary> <!-- </details> --> <!-- <details> --> <summary><b>Personalized FL Methods</b></summary> <!-- </details> --> <!-- <details> --> <summary><b>FL Domain Generalization Methods</b></summary> <!-- </details> -->

Environment Preparation 🧩

PyPI 🐍

pip install -r .env/requirements.txt

Poetry 🎶

For those China mainland users

poetry install --no-root -C .env

For others

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

Docker 🐳

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

An example of building container

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

Easy Run 🏃‍♂️

ALL classes of methods are inherited from FedAvgServer and FedAvgClient. If you wanna figure out the entire workflow and detail of variable settings, go check src/server/fedavg.py and src/client/fedavg.py.

Step 1. Generate FL Dataset

Partition the MNIST according to Dir(0.1) for 100 clients

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

About methods of generating federated dastaset, go check data/README.md for full details.

Step 2. Run Experiment

python main.py [--config-path, --config-name] [method=<METHOD_NAME> args...]

[!NOTE] method should be identical to the .py file name in src/server.

Such as running FedAvg with all defaults.

python main.py method=fedavg

Defaults are set in both config/defaults.yaml and src/utils/constants.py.

How To Customize FL method Arguments 🤖

[!NOTE] For the same FL method argument, the priority of argument setting is CLI > Config file > Default value.

For example, the default value of fedprox.mu is 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)

and your .yaml config file has

# 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
python main.py --config-name your_config method=fedprox fedprox.mu=0.001 # fedprox.mu = 0.001

Monitor 📈

FL-bench supports visdom and tensorboard.

Activate

# your_config.yaml
common:
  ...
  monitor: tensorboard # options: [null, visdom, tensorboard]

[!NOTE] You needs to launch visdom / tensorboard server by yourself.

Launch visdom / tensorboard Server

visdom
  1. Run python -m visdom.server on terminal.
  2. Go check localhost:8097 on your browser.

tensorboard

  1. Run tensorboard --logdir=<your_log_dir> on terminal.
  2. Go check localhost:6006 on your browser.

Parallel Training via Ray 🚀

This feature can vastly improve your training efficiency. At the same time, this feature is user-friendly and easy to use!!!

Activate (What You ONLY Need To Do)

# your_config.yaml
mode: parallel
parallel:
  num_workers: 2 # any positive integer that larger than 1
  ...
...

Manually Create Ray Cluster (Optional)

A Ray cluster would be created implicitly everytime you run experiment in parallel mode.

[!TIP] You can create it manually by the command shown below to avoid creating and destroying cluster every time you run experiment.

ray start --head [OPTIONS]

[!NOTE] You need to keep num_cpus: null and num_gpus: null in your config file for connecting to a existing Ray cluster.

# your_config_file.yaml
# Connect to an existing Ray cluster in localhost.
mode: parallel
parallel:
  ...
  num_gpus: null
  num_cpus: null
...

Arguments 🔧

FL-bench highly recommend through config file to customize your FL method and experiment settings.

FL-bench offers a default config file config/defaults.yaml that contains all required arguments and corresponding comments.

All common arguments have their default value. Go check config/defaults.yaml or DEFAULTS in src/utils/constants.py for all argument defaults.

[!NOTE] If your custom config file does not contain all required arguments, FL-bench will fill those missing arguments with their defaults that loaded from DEFAULTS.

About the default values of specific FL method arguments, go check corresponding src/server/<method>.py for the full details.

[!TIP] FL-bench also supports CLI arguments for quick changings. Here are some examples:

# Using config/defaults.yaml but change the method to FedProx and set its mu to 0.1.
python main.py method=fedprox fedprox.mu=0.1

# Change learning rate to 0.1.
python main.py optimizer.lr=0.1

# Change batch size to 128.
python main.py common.batch_size=128

Models 🤖

This benchmark supports bunch of models that common and integrated in Torchvision (check here for all):

[!TIP] You can define your own custom model by filling the CustomModel class in src/utils/models.py and use it by defining model: custom in your .yaml config file.

Datasets and Partition Strategies 🎨

Regular Image Datasets

Domain Generalization Image Datasets

Medical Image Datasets

Customization Tips 💡

Implementing FL Method

The package() at server-side class is used for assembling all parameters server need to send to clients. Similarly, package() at client-side class is for parameters clients need to send back to server. You should always has super().package() in your override implementation.

class YourServer(FedBNServer):
  ...

class YourClient(FedBNClient):
  ...

You can find all details in FedAvgClient and FedAvgServer, which are the bases of all implementations in FL-bench.

Integrating Dataset

Customizing Model

Citation 🧐

@software{Tan_FL-bench,
  author = {Tan, Jiahao and Wang, Xinpeng},
  license = {GPL-3.0},
  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}
}