This repo contains all the source code for CMPUT 675:
- The programming part of the homework assignment is under the /Assignment folder.
- The implementation of the course project is under the /Project folder.
Implementations are IPython notebooks (.ipynb) under the /Assignment folder.
Offline solvers use the knapsack solvers from Google OR-Tools.
- Python3
- Google OR-Tools for Python: Installation
This work is based on the Federated-Learning (PyTorch).
Implementations are under the /Project/src folder.
- The federated_main_budgeted.ipynb implements the online participant selection algorithm in the paper: Budgeted Online Selection of Candidate IoT Clients to Participate in Federated Learning
- The federated_main.ipynb implements the offline random participant selection algorithm.
Below is the README from the original repo.
Implementation of the vanilla federated learning paper: Communication-Efficient Learning of Deep Networks from Decentralized Data.
Experiments are produced on MNIST, Fashion MNIST and CIFAR10 (both IID and non-IID). In case of non-IID, the data amongst the users can be split equally or unequally.
Since the purpose of these experiments are to illustrate the effectiveness of the federated learning paradigm, only simple models such as MLP and CNN are used.
Install all the packages from requirments.txt
- Python3
- Pytorch
- Torchvision
- Download train and test datasets manually or they will be automatically downloaded from torchvision datasets.
- Experiments are run on Mnist, Fashion Mnist and Cifar.
- To use your own dataset: Move your dataset to data directory and write a wrapper on pytorch dataset class.
The baseline experiment trains the model in the conventional way.
- To run the baseline experiment with MNIST on MLP using CPU:
python src/baseline_main.py --model=mlp --dataset=mnist --epochs=10
- Or to run it on GPU (eg: if gpu:0 is available):
python src/baseline_main.py --model=mlp --dataset=mnist --gpu=0 --epochs=10
Federated experiment involves training a global model using many local models.
- To run the federated experiment with CIFAR on CNN (IID):
python src/federated_main.py --model=cnn --dataset=cifar --gpu=0 --iid=1 --epochs=10
- To run the same experiment under non-IID condition:
python src/federated_main.py --model=cnn --dataset=cifar --gpu=0 --iid=0 --epochs=10
You can change the default values of other parameters to simulate different conditions. Refer to the options section.
The default values for various paramters parsed to the experiment are given in options.py
. Details are given some of those parameters:
--dataset:
Default: 'mnist'. Options: 'mnist', 'fmnist', 'cifar'--model:
Default: 'mlp'. Options: 'mlp', 'cnn'--gpu:
Default: None (runs on CPU). Can also be set to the specific gpu id.--epochs:
Number of rounds of training.--lr:
Learning rate set to 0.01 by default.--verbose:
Detailed log outputs. Activated by default, set to 0 to deactivate.--seed:
Random Seed. Default set to 1.
--iid:
Distribution of data amongst users. Default set to IID. Set to 0 for non-IID.--num_users:
Number of users. Default is 100.--frac:
Fraction of users to be used for federated updates. Default is 0.1.--local_ep:
Number of local training epochs in each user. Default is 10.--local_bs:
Batch size of local updates in each user. Default is 10.--unequal:
Used in non-iid setting. Option to split the data amongst users equally or unequally. Default set to 0 for equal splits. Set to 1 for unequal splits.
The experiment involves training a single model in the conventional way.
Parameters:
Optimizer:
: SGDLearning Rate:
0.01
Table 1:
Test accuracy after training for 10 epochs:
Model | Test Acc |
---|---|
MLP | 92.71% |
CNN | 98.42% |
The experiment involves training a global model in the federated setting.
Federated parameters (default values):
Fraction of users (C)
: 0.1Local Batch size (B)
: 10Local Epochs (E)
: 10Optimizer
: SGDLearning Rate
: 0.01
Table 2:
Test accuracy after training for 10 global epochs with:
Model | IID | Non-IID (equal) |
---|---|---|
MLP | 88.38% | 73.49% |
CNN | 97.28% | 75.94% |