A comprehensive library and learning resource for Federated Learning (FL) with Differential Privacy (DP). Built on top of Flower, PyTorch, and Opacus.
- Reusable FL Components: Models, data partitioners, strategies, and privacy tools
- Multiple FL Strategies: FedAvg, FedProx, SCAFFOLD with variance reduction
- Differential Privacy: RDP accounting, noise mechanisms, Opacus integration
- Non-IID Data Simulation: Dirichlet, pathological, and shard-based partitioning
- Experiment Tracking: Metrics, checkpointing, and reproducibility utilities
- Comprehensive Documentation: Learning guides, algorithm notes, framework comparisons
- 105 Unit Tests: Extensive test coverage with CI/CD pipeline
# Clone the repository
git clone https://github.com/sdodlapati3/federated-learning.git
cd federated-learning
# Create virtual environment
python -m venv venv
source venv/bin/activate # Linux/Mac
# Install the library in development mode
pip install -e .
# Or install dependencies only
pip install -r requirements.txtfrom fl_research.models import ModelRegistry, CIFAR10CNN
from fl_research.data import load_cifar10, DirichletPartitioner
from fl_research.privacy import PrivacyAccountant
from fl_research.strategies import SCAFFOLDServer, StandaloneSCAFFOLDClient
from fl_research.utils import set_seed, get_device, MetricsTracker
# Set up reproducibility
set_seed(42)
device = get_device()
# Load data with non-IID partitioning
train_data, test_data = load_cifar10()
partitioner = DirichletPartitioner(num_clients=10, alpha=0.5)
partitions = partitioner.partition(train_data)
# Create model from registry
model = ModelRegistry.create('cifar10cnn').to(device)
# Track metrics
tracker = MetricsTracker()
tracker.log_round({'round': 1, 'accuracy': 0.85, 'loss': 0.45})from fl_research.models import ModelRegistry
# List all available models
print(ModelRegistry.list())
# ['simplecnn', 'cifar10cnn', 'cifar10cnn_opacus', 'resnet_small', 'mlp', 'twolayer_mlp']
# Create models
cnn = ModelRegistry.create('cifar10cnn')
dp_cnn = ModelRegistry.create('cifar10cnn_opacus') # DP-compatible (GroupNorm)
mlp = ModelRegistry.create('mlp', input_dim=784, hidden_dims=[256, 128], num_classes=10)from fl_research.data import IIDPartitioner, DirichletPartitioner, ShardPartitioner
# IID partitioning (uniform distribution)
iid = IIDPartitioner(num_clients=10)
# Non-IID with Dirichlet distribution (alpha controls heterogeneity)
dirichlet = DirichletPartitioner(num_clients=10, alpha=0.1) # Very heterogeneous
dirichlet = DirichletPartitioner(num_clients=10, alpha=1.0) # Moderate
# Shard-based partitioning
shard = ShardPartitioner(num_clients=10, shards_per_client=2)
# Apply to dataset
partitions = dirichlet.partition(train_dataset) # Returns list of index listsfrom fl_research.privacy import PrivacyAccountant, get_privacy_spent
# Create accountant with budget
accountant = PrivacyAccountant(target_epsilon=10.0, target_delta=1e-5)
# Track privacy consumption
for round in range(100):
accountant.step(noise_multiplier=1.0, sample_rate=0.01, num_steps=10)
if accountant.is_budget_exceeded():
print(f"Budget exceeded at round {round}")
break
# Get current epsilon
epsilon = accountant.get_epsilon()from fl_research.strategies import SCAFFOLDServer, StandaloneSCAFFOLDClient
# SCAFFOLD for variance reduction
server = SCAFFOLDServer(model, device)
client = StandaloneSCAFFOLDClient(client_id=0, dataloader=loader, device=device)
client.initialize_control_variate(model)
# Train with gradient correction
delta_w, delta_c, count = client.train(model, server.global_control, epochs=5, lr=0.1)
server.aggregate([delta_w], [delta_c], [count], total_clients=10)flower-federated-learning/
βββ src/fl_research/ # Main library
β βββ models/ # CNN, MLP, ResNet models
β β βββ cnn.py # SimpleCNN, CIFAR10CNN, CIFAR10CNNOpacus
β β βββ mlp.py # MLP, TwoLayerMLP
β β βββ registry.py # ModelRegistry factory
β βββ data/ # Data loading and partitioning
β β βββ loaders.py # CIFAR-10, MNIST, Fashion-MNIST
β β βββ partitioners.py # IID, Dirichlet, Shard partitioners
β βββ privacy/ # Differential privacy
β β βββ accountant.py # RDP-based privacy accounting
β β βββ mechanisms.py # Gaussian, Laplace noise
β β βββ opacus_utils.py # Opacus integration helpers
β βββ strategies/ # FL algorithms
β β βββ fedavg.py # Federated Averaging
β β βββ fedprox.py # FedProx with proximal term
β β βββ scaffold.py # SCAFFOLD with control variates
β βββ utils/ # Utilities
β βββ config.py # YAML/JSON configuration
β βββ metrics.py # MetricsTracker
β βββ checkpointing.py # Model checkpoints
β βββ reproducibility.py # Seeds, device detection
βββ tests/ # Test suite (105 tests)
β βββ test_data.py # Data loading tests
β βββ test_models.py # Model registry tests
β βββ test_privacy.py # Privacy accounting tests
β βββ test_utils.py # Utility tests
β βββ test_strategies.py # FedAvg, FedProx, SCAFFOLD tests
β βββ test_integration.py # End-to-end workflow tests
βββ examples/ # Example experiments
β βββ dp/ # Differential privacy experiments
β βββ scaffold/ # SCAFFOLD vs FedAvg comparison
β βββ fedprox/ # FedProx experiments
β βββ minimal_example.py # Quick runnable demo
β βββ ... # Additional examples
βββ docs/ # π Documentation
β βββ FEDERATED_LEARNING_GUIDE.md # Comprehensive FL learning guide
β βββ DP_VARIANTS_NOTES.md # DP variants explained
β βββ DISTRIBUTED_OPTIMIZATION_NOTES.md # Optimization theory
β βββ HPC_SCALING_REPORT.md # HPC scaling patterns
β βββ FEDML_COMPARISON.md # Framework comparison
β βββ COMPLETION_REPORT.md # Project summary
βββ .github/workflows/ci.yml # CI/CD pipeline
βββ README.md
βββ pyproject.toml
βββ requirements.txt
cd examples/dp
python run_standalone_experiments_refactored.pyCompares IID vs Non-IID data with varying privacy levels (Ξ΅ = 2, 4, 8).
cd examples/scaffold
python scaffold_implementation_refactored.pyDemonstrates variance reduction with control variates on heterogeneous data.
cd examples/fedprox
python fedprox_implementation_refactored.pyShows proximal term benefits for client drift mitigation.
# Run all tests (105 tests)
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=fl_research --cov-report=html
# Run specific test files
pytest tests/test_strategies.py -v # Strategy tests
pytest tests/test_integration.py -v # End-to-end testsThis repository follows a structured learning journey:
| Week | Topic | Key Concepts |
|---|---|---|
| 1-2 | Flower Basics | Client/Server, FedAvg, Simulation |
| 3 | Differential Privacy | Ξ΅-Ξ΄ DP, RDP, Opacus integration |
| 4 | DP + FL | Privacy-utility tradeoffs, composition |
| 5-6 | Advanced Strategies | FedProx, SCAFFOLD, Non-IID handling |
from fl_research.utils import Config, save_config, load_config
# Create experiment config
config = Config(
num_rounds=100,
num_clients=10,
batch_size=32,
learning_rate=0.01,
strategy='scaffold',
privacy={'epsilon': 10.0, 'delta': 1e-5}
)
# Save and load
save_config(config, 'experiment.yaml')
loaded = load_config('experiment.yaml')See the docs/ folder for comprehensive learning resources:
| Document | Description |
|---|---|
| FEDERATED_LEARNING_GUIDE.md | π Complete FL+DP learning guide with citations |
| DP_VARIANTS_NOTES.md | Approximate, RΓ©nyi, Local DP explained |
| DISTRIBUTED_OPTIMIZATION_NOTES.md | Optimization theory for FL |
| HPC_SCALING_REPORT.md | HPC scaling patterns |
| FEDML_COMPARISON.md | Framework comparison guide |
- FedAvg - Communication-Efficient Learning
- FedProx - Heterogeneous Federated Optimization
- SCAFFOLD - Stochastic Controlled Averaging
- DP-SGD - Deep Learning with Differential Privacy
- Awesome Federated Learning - 500+ papers
Contributions are welcome! Please feel free to submit issues and pull requests.
MIT License - See LICENSE for details.
Built with β€οΈ for the Federated Learning research community