-
Notifications
You must be signed in to change notification settings - Fork 941
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into add-llm-code-eval
- Loading branch information
Showing
32 changed files
with
769 additions
and
488 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,63 @@ | ||
--- | ||
tags: [basic, vision, fds] | ||
tags: [DP, SecAgg, vision, fds] | ||
dataset: [MNIST] | ||
framework: [torch, torchvision] | ||
--- | ||
|
||
# Example of Flower App with DP and SA | ||
# Flower Example on MNIST with Differential Privacy and Secure Aggregation | ||
|
||
This is a simple example that utilizes central differential privacy with client-side fixed clipping and secure aggregation. | ||
Note: This example is designed for a small number of rounds and is intended for demonstration purposes. | ||
This example demonstrates a federated learning setup using the Flower, incorporating central differential privacy (DP) with client-side fixed clipping and secure aggregation (SA). It is intended for a small number of rounds for demonstration purposes. | ||
|
||
## Install dependencies | ||
This example is similar to the [quickstart-pytorch example](https://github.com/adap/flower/tree/main/examples/quickstart-pytorch) and extends it by integrating central differential privacy and secure aggregation. For more details on differential privacy and secure aggregation in Flower, please refer to the documentation [here](https://flower.ai/docs/framework/how-to-use-differential-privacy.html) and [here](https://flower.ai/docs/framework/contributor-ref-secure-aggregation-protocols.html). | ||
|
||
```bash | ||
# Using pip | ||
pip install . | ||
## Set up the project | ||
|
||
### Clone the project | ||
|
||
Start by cloning the example project: | ||
|
||
```shell | ||
git clone --depth=1 https://github.com/adap/flower.git && mv flower/examples/fl-dp-sa . && rm -rf flower && cd fl-dp-sa | ||
``` | ||
|
||
This will create a new directory called `fl-dp-sa` containing the following files: | ||
|
||
# Or using Poetry | ||
poetry install | ||
```shell | ||
fl-dp-sa | ||
├── fl_dp_sa | ||
│ ├── client_app.py # Defines your ClientApp | ||
│ ├── server_app.py # Defines your ServerApp | ||
│ └── task.py # Defines your model, training, and data loading | ||
├── pyproject.toml # Project metadata like dependencies and configs | ||
└── README.md | ||
``` | ||
|
||
## Run | ||
### Install dependencies and project | ||
|
||
The example uses the MNIST dataset with a total of 100 clients, with 20 clients sampled in each round. The hyperparameters for DP and SecAgg are specified in `server.py`. | ||
Install the dependencies defined in `pyproject.toml` as well as the `fl_dp_sa` package. | ||
|
||
```shell | ||
flower-simulation --server-app fl_dp_sa.server:app --client-app fl_dp_sa.client:app --num-supernodes 100 | ||
# From a new python environment, run: | ||
pip install -e . | ||
``` | ||
|
||
## Run the project | ||
|
||
You can run your Flower project in both _simulation_ and _deployment_ mode without making changes to the code. If you are starting with Flower, we recommend you using the _simulation_ mode as it requires fewer components to be launched manually. By default, `flwr run` will make use of the Simulation Engine. | ||
|
||
### Run with the Simulation Engine | ||
|
||
```bash | ||
flwr run . | ||
``` | ||
|
||
You can also override some of the settings for your `ClientApp` and `ServerApp` defined in `pyproject.toml`. For example: | ||
|
||
```bash | ||
flwr run . --run-config "noise-multiplier=0.1 clipping-norm=5" | ||
``` | ||
|
||
### Run with the Deployment Engine | ||
|
||
> \[!NOTE\] | ||
> An update to this example will show how to run this Flower project with the Deployment Engine and TLS certificates, or with Docker. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
"""fl_dp_sa: A Flower / PyTorch app.""" | ||
"""fl_dp_sa: Flower Example using Differential Privacy and Secure Aggregation.""" |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
"""fl_dp_sa: Flower Example using Differential Privacy and Secure Aggregation.""" | ||
|
||
import torch | ||
from flwr.client import ClientApp, NumPyClient | ||
from flwr.common import Context | ||
from flwr.client.mod import fixedclipping_mod, secaggplus_mod | ||
|
||
from fl_dp_sa.task import Net, get_weights, load_data, set_weights, test, train | ||
|
||
|
||
class FlowerClient(NumPyClient): | ||
def __init__(self, trainloader, testloader) -> None: | ||
self.net = Net() | ||
self.trainloader = trainloader | ||
self.testloader = testloader | ||
self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | ||
|
||
def fit(self, parameters, config): | ||
set_weights(self.net, parameters) | ||
results = train( | ||
self.net, | ||
self.trainloader, | ||
self.testloader, | ||
epochs=1, | ||
device=self.device, | ||
) | ||
return get_weights(self.net), len(self.trainloader.dataset), results | ||
|
||
def evaluate(self, parameters, config): | ||
set_weights(self.net, parameters) | ||
loss, accuracy = test(self.net, self.testloader, self.device) | ||
return loss, len(self.testloader.dataset), {"accuracy": accuracy} | ||
|
||
|
||
def client_fn(context: Context): | ||
partition_id = context.node_config["partition-id"] | ||
trainloader, testloader = load_data( | ||
partition_id=partition_id, num_partitions=context.node_config["num-partitions"] | ||
) | ||
return FlowerClient(trainloader, testloader).to_client() | ||
|
||
|
||
# Flower ClientApp | ||
app = ClientApp( | ||
client_fn=client_fn, | ||
mods=[ | ||
secaggplus_mod, | ||
fixedclipping_mod, | ||
], | ||
) |
Oops, something went wrong.