NOTE: Current version is unstable, and we will release the first stable version very soon.
OpenFed is a foundational library for federated learning research and supports many research projects as below:
- benchmark-lightly: FederalLab's simulation benchmark.
- openfed-cv: FederalLab's toolkit and benchmark for computer vision in federated learning. This toolkit is based on mmcv, and provides the federated learning for following tasks:
- MMClassification: OpenMMLab image classification toolbox and benchmark.
- MMDetection: OpenMMLab detection toolbox and benchmark.
- MMDetection3D: OpenMMLab's next-generation platform for general 3D object detection.
- MMSegmentation: OpenMMLab semantic segmentation toolbox and benchmark.
- MMAction2: OpenMMLab's next-generation action understanding toolbox and benchmark.
- MMTracking: OpenMMLab video perception toolbox and benchmark.
- MMPose: OpenMMLab pose estimation toolbox and benchmark.
- MMEditing: OpenMMLab image and video editing toolbox.
- MMOCR: OpenMMLab text detection, recognition and understanding toolbox.
- MMGeneration: OpenMMLab image and video generative models toolbox.
- openfed-finance: FederalLab's toolbox and benchmark for finance data analysis in federated learning.
- openfed-medical: FederalLab's toolbox and benchmark for medical data analysis in federated learning. It is based on MONAI.
- openfed-nlp: FederalLab's toolbox and benchmark for natural language processing in federated learning. It is based on transformers.
- openfed-rl: FederalLab's toolbox and benchmark for reinforcement learning in federated learning. It is based on stable-baselines3
In addition, we also provide a toolkit for better compatibility with following libraries, so that you can use OpenFed with those libraries without obstacles and more easily:
- pytorch-lightning: The lightweight PyTorch wrapper for high-performance AI research. Scale your models, not the boilerplate.
- mmcv: MMCV is a foundational library for computer vision research and supports many research projects.
PyTorch >= 1.5.1, python>=3.6
Stable version: pip install openfed
Latest version: pip install -e git+https://github.com/FederalLab/OpenFed.git
import argparse
import random
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision.datasets import MNIST
from torchvision.transforms import ToTensor
# >>> Import OpenFed
import openfed
# <<<
# >>> Define arguments
parser = argparse.ArgumentParser(description='Simulator')
parser.add_argument('--props', type=str, default='/tmp/aggregator.json')
args = parser.parse_args()
# <<<
# >>> Load Federated Group Properties
props = openfed.federated.FederatedProperties.load(args.props)[0]
# <<<
network = nn.Linear(784, 10)
loss_fn = nn.CrossEntropyLoss()
sgd = torch.optim.SGD(
network.parameters(), lr=1.0 if props.aggregator else 0.1)
# >>> Convert torch optimizer to federated optimizer
fed_sgd = openfed.optim.FederatedOptimizer(sgd, props.role)
# <<<
# >>> Define maintainer to maintain communication among each nodes
maintainer = openfed.core.Maintainer(props, network.state_dict(keep_vars=True))
# <<<
# >>> Auto register the hook function to maintainer
with maintainer:
openfed.functional.device_alignment()
if props.aggregator:
openfed.functional.count_step(props.address.world_size - 1)
# <<<
# total rounds to simulation
rounds = 10
if maintainer.aggregator:
# >>> API Loop as aggregator
api = openfed.API(maintainer, fed_sgd, rounds,
openfed.functional.average_aggregation)
api.run()
# <<<
else:
mnist = MNIST(r'/tmp/', True, ToTensor(), download=True)
# >>> Convert to federated dataset
fed_mnist = openfed.data.PartitionerDataset(
mnist, total_parts=100, partitioner=openfed.data.IIDPartitioner())
# <<<
dataloader = DataLoader(
fed_mnist, batch_size=10, shuffle=True, num_workers=0, drop_last=False)
for outter in range(rounds):
# >>> Download latest model from aggregator
maintainer.step(upload=False)
# <<<
# Pick up a random federated dataset part
part_id = random.randint(0, 9)
fed_mnist.set_part_id(part_id)
network.train()
losses = []
for data in dataloader:
x, y = data
output = network(x.view(-1, 784))
loss = loss_fn(output, y)
fed_sgd.zero_grad()
loss.backward()
fed_sgd.step()
losses.append(loss.item())
loss = sum(losses) / len(losses)
# >>> Finish a round
fed_sgd.round()
# <<<
# >>> Upload trained model and optimizer state
maintainer.update_version()
maintainer.package(fed_sgd)
maintainer.step(download=False)
# <<<
# Clear state dict
fed_sgd.clear_state_dict()
Now, save the piece of code as run.py
, and you can use the provided script to start a simulator by:
(openfed) python -m openfed.tools.simulator --nproc 6 run.py
100%|█████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:01<00:00, 7.21it/s]
This command will launch 6 processes (1 for aggregator, 5 for collaborators).
If you find this project useful in your research, please consider cite:
@misc{OpenFed,
Author = {Chen Dengsheng},
Title = {OpenFed: An Open-Source Security and Privacy Guaranteed Federated Learning Framework},
Year = {2021},
Eprint = {arXiv:2109.07852},
}
We appreciate all contributions to improve OpenFed. Please refer to CONTRIBUTUNG.md for the contributing guideline.
OpenFed is released under the MIT License.