Skip to content

Latest commit

Β 

History

25 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

FL Research: Federated Learning with Differential Privacy

CI Python 3.8+ PyTorch 2.0+ Flower 1.24+ Opacus 1.5+ License: MIT

A comprehensive library and learning resource for Federated Learning (FL) with Differential Privacy (DP). Built on top of Flower, PyTorch, and Opacus.

🎯 Features

  • 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

πŸ“¦ Installation

# 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.txt

πŸš€ Quick Start

Using the Library

from 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})

Available Models

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)

Data Partitioning

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 lists

Privacy Accounting

from 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()

FL Strategies

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)

πŸ“ Project Structure

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

πŸ“Š Experiments

Differential Privacy Experiments

cd examples/dp
python run_standalone_experiments_refactored.py

Compares IID vs Non-IID data with varying privacy levels (Ξ΅ = 2, 4, 8).

SCAFFOLD vs FedAvg

cd examples/scaffold
python scaffold_implementation_refactored.py

Demonstrates variance reduction with control variates on heterogeneous data.

FedProx Comparison

cd examples/fedprox
python fedprox_implementation_refactored.py

Shows proximal term benefits for client drift mitigation.

πŸ§ͺ Testing

# 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 tests

πŸ“š Learning Path

This 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

πŸ”§ Configuration

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')

πŸ“š Documentation

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

πŸ“– References

Papers

Documentation

🀝 Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

πŸ“ License

MIT License - See LICENSE for details.


Built with ❀️ for the Federated Learning research community

About

Federated Learning tutorial and experiments using Flower framework with PyTorch

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages