From bdcf537d8dafb59ce92eb993bb8aff2b2a16df45 Mon Sep 17 00:00:00 2001 From: jafermarq Date: Sat, 16 Dec 2023 13:50:39 +0100 Subject: [PATCH 1/7] to_client --- examples/advanced-pytorch/client.py | 4 ++-- examples/advanced-tensorflow/client.py | 4 ++-- examples/embedded-devices/client_pytorch.py | 4 ++-- examples/embedded-devices/client_tf.py | 4 ++-- examples/flower-in-30-minutes/tutorial.ipynb | 2 +- examples/mt-pytorch/client.py | 4 ++-- examples/quickstart-fastai/client.py | 4 ++-- examples/quickstart-huggingface/client.py | 2 +- examples/quickstart-jax/client.py | 2 +- examples/quickstart-mlcube/client.py | 4 ++-- examples/quickstart-pandas/client.py | 4 ++-- examples/quickstart-pytorch-lightning/client.py | 4 ++-- examples/quickstart-pytorch/client.py | 4 ++-- examples/quickstart-tabnet/client.py | 2 +- examples/quickstart-tensorflow/client.py | 2 +- examples/simulation-pytorch/sim.ipynb | 2 +- examples/simulation-pytorch/sim.py | 2 +- examples/simulation-tensorflow/sim.ipynb | 2 +- examples/simulation-tensorflow/sim.py | 2 +- examples/sklearn-logreg-mnist/client.py | 2 +- examples/whisper-federated-finetuning/client.py | 4 ++-- examples/xgboost-comprehensive/client.py | 2 +- examples/xgboost-quickstart/client.py | 2 +- 23 files changed, 34 insertions(+), 34 deletions(-) diff --git a/examples/advanced-pytorch/client.py b/examples/advanced-pytorch/client.py index f9ffb6181fd8..12d2cf934533 100644 --- a/examples/advanced-pytorch/client.py +++ b/examples/advanced-pytorch/client.py @@ -143,9 +143,9 @@ def main() -> None: testset = torch.utils.data.Subset(testset, range(10)) # Start Flower client - client = CifarClient(trainset, testset, device) + client = CifarClient(trainset, testset, device).to_client*() - fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=client) + fl.client.start_client(server_address="127.0.0.1:8080", client=client) if __name__ == "__main__": diff --git a/examples/advanced-tensorflow/client.py b/examples/advanced-tensorflow/client.py index 1c0b61575635..273015a6b42b 100644 --- a/examples/advanced-tensorflow/client.py +++ b/examples/advanced-tensorflow/client.py @@ -106,9 +106,9 @@ def main() -> None: x_test, y_test = x_test[:10], y_test[:10] # Start Flower client - client = CifarClient(model, x_train, y_train, x_test, y_test) + client = CifarClient(model, x_train, y_train, x_test, y_test).to_client() - fl.client.start_numpy_client( + fl.client.start_client( server_address="127.0.0.1:8080", client=client, root_certificates=Path(".cache/certificates/ca.crt").read_bytes(), diff --git a/examples/embedded-devices/client_pytorch.py b/examples/embedded-devices/client_pytorch.py index 5d236c9e9389..8e72d668531a 100644 --- a/examples/embedded-devices/client_pytorch.py +++ b/examples/embedded-devices/client_pytorch.py @@ -204,11 +204,11 @@ def main(): trainsets, valsets, _ = prepare_dataset(use_mnist) # Start Flower client setting its associated data partition - fl.client.start_numpy_client( + fl.client.start_client( server_address=args.server_address, client=FlowerClient( trainset=trainsets[args.cid], valset=valsets[args.cid], use_mnist=use_mnist - ), + ).to_client(), ) diff --git a/examples/embedded-devices/client_tf.py b/examples/embedded-devices/client_tf.py index 3457af1c7a66..5ea34e44a98b 100644 --- a/examples/embedded-devices/client_tf.py +++ b/examples/embedded-devices/client_tf.py @@ -123,9 +123,9 @@ def main(): trainset, valset = partitions[args.cid] # Start Flower client setting its associated data partition - fl.client.start_numpy_client( + fl.client.start_client( server_address=args.server_address, - client=FlowerClient(trainset=trainset, valset=valset, use_mnist=use_mnist), + client=FlowerClient(trainset=trainset, valset=valset, use_mnist=use_mnist).to_client(), ) diff --git a/examples/flower-in-30-minutes/tutorial.ipynb b/examples/flower-in-30-minutes/tutorial.ipynb index 336ec4c19644..8f9eccf65b74 100644 --- a/examples/flower-in-30-minutes/tutorial.ipynb +++ b/examples/flower-in-30-minutes/tutorial.ipynb @@ -776,7 +776,7 @@ "\n", " return FlowerClient(\n", " trainloader=trainloaders[int(cid)], vallodaer=valloaders[int(cid)]\n", - " )\n", + " ).to_client()\n", "\n", " return client_fn\n", "\n", diff --git a/examples/mt-pytorch/client.py b/examples/mt-pytorch/client.py index 23cc736fd62b..295770a802bd 100644 --- a/examples/mt-pytorch/client.py +++ b/examples/mt-pytorch/client.py @@ -35,8 +35,8 @@ def evaluate(self, parameters, config): # Start Flower client -fl.client.start_numpy_client( +fl.client.start_client( server_address="0.0.0.0:9092", # "0.0.0.0:9093" for REST - client=FlowerClient(), + client=FlowerClient().to_client(), transport="grpc-rere", # "rest" for REST ) diff --git a/examples/quickstart-fastai/client.py b/examples/quickstart-fastai/client.py index a88abbe525dc..6bb2a751d544 100644 --- a/examples/quickstart-fastai/client.py +++ b/examples/quickstart-fastai/client.py @@ -43,7 +43,7 @@ def evaluate(self, parameters, config): # Start Flower client -fl.client.start_numpy_client( +fl.client.start_client( server_address="127.0.0.1:8080", - client=FlowerClient(), + client=FlowerClient().to_client(), ) diff --git a/examples/quickstart-huggingface/client.py b/examples/quickstart-huggingface/client.py index 8717d710ad9c..2f3248c49d7e 100644 --- a/examples/quickstart-huggingface/client.py +++ b/examples/quickstart-huggingface/client.py @@ -118,7 +118,7 @@ def evaluate(self, parameters, config): return float(loss), len(testloader), {"accuracy": float(accuracy)} # Start client - fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=IMDBClient()) + fl.client.start_client(server_address="127.0.0.1:8080", client=IMDBClient().to_client()) if __name__ == "__main__": diff --git a/examples/quickstart-jax/client.py b/examples/quickstart-jax/client.py index f9b056276deb..0cf74e2d2c05 100644 --- a/examples/quickstart-jax/client.py +++ b/examples/quickstart-jax/client.py @@ -52,4 +52,4 @@ def evaluate( # Start Flower client -fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=FlowerClient()) +fl.client.start_client(server_address="127.0.0.1:8080", client=FlowerClient().to_client()) diff --git a/examples/quickstart-mlcube/client.py b/examples/quickstart-mlcube/client.py index 0a1962d8da8a..0470720bc296 100644 --- a/examples/quickstart-mlcube/client.py +++ b/examples/quickstart-mlcube/client.py @@ -43,8 +43,8 @@ def main(): os.path.dirname(os.path.abspath(__file__)), "workspaces", workspace_name ) - fl.client.start_numpy_client( - server_address="0.0.0.0:8080", client=MLCubeClient(workspace=workspace) + fl.client.start_client( + server_address="0.0.0.0:8080", client=MLCubeClient(workspace=workspace).to_client() ) diff --git a/examples/quickstart-pandas/client.py b/examples/quickstart-pandas/client.py index 3feab3f6a0f4..417733aa80fc 100644 --- a/examples/quickstart-pandas/client.py +++ b/examples/quickstart-pandas/client.py @@ -35,7 +35,7 @@ def fit( # Start Flower client -fl.client.start_numpy_client( +fl.client.start_client( server_address="127.0.0.1:8080", - client=FlowerClient(), + client=FlowerClient().to_client(), ) diff --git a/examples/quickstart-pytorch-lightning/client.py b/examples/quickstart-pytorch-lightning/client.py index e810d639974d..390ce9d7e685 100644 --- a/examples/quickstart-pytorch-lightning/client.py +++ b/examples/quickstart-pytorch-lightning/client.py @@ -55,8 +55,8 @@ def main() -> None: train_loader, val_loader, test_loader = mnist.load_data() # Flower client - client = FlowerClient(model, train_loader, val_loader, test_loader) - fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=client) + client = FlowerClient(model, train_loader, val_loader, test_loader).to_client() + fl.client.start_client(server_address="127.0.0.1:8080", client=client) if __name__ == "__main__": diff --git a/examples/quickstart-pytorch/client.py b/examples/quickstart-pytorch/client.py index ad57645002f8..e4dc2328bd6e 100644 --- a/examples/quickstart-pytorch/client.py +++ b/examples/quickstart-pytorch/client.py @@ -131,7 +131,7 @@ def evaluate(self, parameters, config): # Start Flower client -fl.client.start_numpy_client( +fl.client.start_client( server_address="127.0.0.1:8080", - client=FlowerClient(), + client=FlowerClient().to_client(), ) diff --git a/examples/quickstart-tabnet/client.py b/examples/quickstart-tabnet/client.py index da391a95710a..53913b2a2a09 100644 --- a/examples/quickstart-tabnet/client.py +++ b/examples/quickstart-tabnet/client.py @@ -79,4 +79,4 @@ def evaluate(self, parameters, config): # Start Flower client -fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=TabNetClient()) +fl.client.start_client(server_address="127.0.0.1:8080", client=TabNetClient().to_client()) diff --git a/examples/quickstart-tensorflow/client.py b/examples/quickstart-tensorflow/client.py index fc367e2c3053..66f184d21652 100644 --- a/examples/quickstart-tensorflow/client.py +++ b/examples/quickstart-tensorflow/client.py @@ -30,4 +30,4 @@ def evaluate(self, parameters, config): # Start Flower client -fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=CifarClient()) +fl.client.start_client(server_address="127.0.0.1:8080", client=CifarClient().to_client()) diff --git a/examples/simulation-pytorch/sim.ipynb b/examples/simulation-pytorch/sim.ipynb index 508630cf9422..d1e7358566cc 100644 --- a/examples/simulation-pytorch/sim.ipynb +++ b/examples/simulation-pytorch/sim.ipynb @@ -509,7 +509,7 @@ " valloader = DataLoader(valset.with_transform(apply_transforms), batch_size=32)\n", "\n", " # Create and return client\n", - " return FlowerClient(trainloader, valloader)\n", + " return FlowerClient(trainloader, valloader).to_client()\n", "\n", " return client_fn\n", "\n", diff --git a/examples/simulation-pytorch/sim.py b/examples/simulation-pytorch/sim.py index 68d9426e83ab..0a6ed8ebb9b8 100644 --- a/examples/simulation-pytorch/sim.py +++ b/examples/simulation-pytorch/sim.py @@ -104,7 +104,7 @@ def client_fn(cid: str) -> fl.client.Client: valset = valset.with_transform(apply_transforms) # Create and return client - return FlowerClient(trainset, valset) + return FlowerClient(trainset, valset).to_client() return client_fn diff --git a/examples/simulation-tensorflow/sim.ipynb b/examples/simulation-tensorflow/sim.ipynb index 575b437018f3..5ef1992bcc7e 100644 --- a/examples/simulation-tensorflow/sim.ipynb +++ b/examples/simulation-tensorflow/sim.ipynb @@ -189,7 +189,7 @@ " )\n", "\n", " # Create and return client\n", - " return FlowerClient(trainset, valset)\n", + " return FlowerClient(trainset, valset).to_client()\n", "\n", " return client_fn\n", "\n", diff --git a/examples/simulation-tensorflow/sim.py b/examples/simulation-tensorflow/sim.py index 490e25fe8c8d..043c624a40a9 100644 --- a/examples/simulation-tensorflow/sim.py +++ b/examples/simulation-tensorflow/sim.py @@ -94,7 +94,7 @@ def client_fn(cid: str) -> fl.client.Client: ) # Create and return client - return FlowerClient(trainset, valset) + return FlowerClient(trainset, valset).to_client() return client_fn diff --git a/examples/sklearn-logreg-mnist/client.py b/examples/sklearn-logreg-mnist/client.py index dbf0f2f462a7..d13dd6b40a8f 100644 --- a/examples/sklearn-logreg-mnist/client.py +++ b/examples/sklearn-logreg-mnist/client.py @@ -46,4 +46,4 @@ def evaluate(self, parameters, config): # type: ignore return loss, len(X_test), {"accuracy": accuracy} # Start Flower client - fl.client.start_numpy_client(server_address="0.0.0.0:8080", client=MnistClient()) + fl.client.start_client(server_address="0.0.0.0:8080", client=MnistClient().to_client()) diff --git a/examples/whisper-federated-finetuning/client.py b/examples/whisper-federated-finetuning/client.py index 2bfeadfbdae6..07abc641f8fe 100644 --- a/examples/whisper-federated-finetuning/client.py +++ b/examples/whisper-federated-finetuning/client.py @@ -146,7 +146,7 @@ def client_fn(cid: str): return WhisperFlowerClient( full_train_dataset, num_classes, disable_tqdm, compile - ) + ).to_client() return client_fn @@ -174,7 +174,7 @@ def run_client(): client_data_path=CLIENT_DATA, ) - fl.client.start_numpy_client( + fl.client.start_client( server_address=f"{args.server_address}:8080", client=client_fn(args.cid) ) diff --git a/examples/xgboost-comprehensive/client.py b/examples/xgboost-comprehensive/client.py index ff7a4adf7977..0ffb48e1465e 100644 --- a/examples/xgboost-comprehensive/client.py +++ b/examples/xgboost-comprehensive/client.py @@ -171,4 +171,4 @@ def evaluate(self, ins: EvaluateIns) -> EvaluateRes: # Start Flower client -fl.client.start_client(server_address="127.0.0.1:8080", client=XgbClient()) +fl.client.start_client(server_address="127.0.0.1:8080", client=XgbClient().to_client()) diff --git a/examples/xgboost-quickstart/client.py b/examples/xgboost-quickstart/client.py index b5eab59ba14d..62e8a441bae1 100644 --- a/examples/xgboost-quickstart/client.py +++ b/examples/xgboost-quickstart/client.py @@ -173,4 +173,4 @@ def evaluate(self, ins: EvaluateIns) -> EvaluateRes: # Start Flower client -fl.client.start_client(server_address="127.0.0.1:8080", client=XgbClient()) +fl.client.start_client(server_address="127.0.0.1:8080", client=XgbClient().to_client()) From 519b442468e58a0a518219b217ada65f899a7b6b Mon Sep 17 00:00:00 2001 From: jafermarq Date: Mon, 18 Dec 2023 13:49:08 +0100 Subject: [PATCH 2/7] more --- examples/advanced-pytorch/client.py | 2 +- examples/pytorch-federated-variational-autoencoder/client.py | 2 +- examples/pytorch-from-centralized-to-federated/client.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/advanced-pytorch/client.py b/examples/advanced-pytorch/client.py index 12d2cf934533..6682ec1037c7 100644 --- a/examples/advanced-pytorch/client.py +++ b/examples/advanced-pytorch/client.py @@ -143,7 +143,7 @@ def main() -> None: testset = torch.utils.data.Subset(testset, range(10)) # Start Flower client - client = CifarClient(trainset, testset, device).to_client*() + client = CifarClient(trainset, testset, device).to_client() fl.client.start_client(server_address="127.0.0.1:8080", client=client) diff --git a/examples/pytorch-federated-variational-autoencoder/client.py b/examples/pytorch-federated-variational-autoencoder/client.py index ceb55c79f564..65a86bcc2184 100644 --- a/examples/pytorch-federated-variational-autoencoder/client.py +++ b/examples/pytorch-federated-variational-autoencoder/client.py @@ -93,7 +93,7 @@ def evaluate(self, parameters, config): loss = test(net, testloader) return float(loss), len(testloader), {} - fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=CifarClient()) + fl.client.start_client(server_address="127.0.0.1:8080", client=CifarClient().to_client()) if __name__ == "__main__": diff --git a/examples/pytorch-from-centralized-to-federated/client.py b/examples/pytorch-from-centralized-to-federated/client.py index 88678e0569b7..1c6ee2578dbd 100644 --- a/examples/pytorch-from-centralized-to-federated/client.py +++ b/examples/pytorch-from-centralized-to-federated/client.py @@ -93,8 +93,8 @@ def main() -> None: _ = model(next(iter(trainloader))[0].to(DEVICE)) # Start client - client = CifarClient(model, trainloader, testloader, num_examples) - fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=client) + client = CifarClient(model, trainloader, testloader, num_examples).to_client() + fl.client.start_client(server_address="127.0.0.1:8080", client=client) if __name__ == "__main__": From 3d27e8059ff96c7770a298c5fdd4092f29dc5687 Mon Sep 17 00:00:00 2001 From: jafermarq Date: Tue, 19 Dec 2023 14:52:59 +0100 Subject: [PATCH 3/7] to changelog --- doc/source/ref-changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/ref-changelog.md b/doc/source/ref-changelog.md index 603e6c602274..0d7ec5fcde57 100644 --- a/doc/source/ref-changelog.md +++ b/doc/source/ref-changelog.md @@ -2,7 +2,7 @@ ## Unreleased -- **General updates to Flower Examples** ([#2381](https://github.com/adap/flower/pull/2381)) +- **General updates to Flower Examples** ([#2381](https://github.com/adap/flower/pull/2381), [#2718](https://github.com/adap/flower/pull/2718)) - **Update Flower Baselines** From c7df72ac4bdd327e88e391fd7ee926023d73aa14 Mon Sep 17 00:00:00 2001 From: jafermarq Date: Tue, 19 Dec 2023 15:00:24 +0100 Subject: [PATCH 4/7] opacus --- examples/opacus/dp_cifar_client.py | 4 ++-- examples/opacus/dp_cifar_simulation.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/opacus/dp_cifar_client.py b/examples/opacus/dp_cifar_client.py index bab1451ba707..cc30e7728222 100644 --- a/examples/opacus/dp_cifar_client.py +++ b/examples/opacus/dp_cifar_client.py @@ -28,7 +28,7 @@ def load_data(): model = Net() trainloader, testloader, sample_rate = load_data() -fl.client.start_numpy_client( +fl.client.start_client( server_address="127.0.0.1:8080", - client=DPCifarClient(model, trainloader, testloader), + client=DPCifarClient(model, trainloader, testloader).to_client(), ) diff --git a/examples/opacus/dp_cifar_simulation.py b/examples/opacus/dp_cifar_simulation.py index 14a9d037685b..faddeaa68ed7 100644 --- a/examples/opacus/dp_cifar_simulation.py +++ b/examples/opacus/dp_cifar_simulation.py @@ -45,7 +45,7 @@ def client_fn(cid: str) -> fl.client.Client: client_trainloader = DataLoader(client_trainset, PARAMS["batch_size"]) client_testloader = DataLoader(client_testset, PARAMS["batch_size"]) - return DPCifarClient(model, client_trainloader, client_testloader) + return DPCifarClient(model, client_trainloader, client_testloader).to_client() # Define an evaluation function for centralized evaluation (using whole CIFAR10 testset). From b65f52454701b9356e2674f2264c9bd9a4585f1a Mon Sep 17 00:00:00 2001 From: jafermarq Date: Tue, 19 Dec 2023 19:57:26 +0100 Subject: [PATCH 5/7] minimal fix opacus sim --- examples/opacus/dp_cifar_simulation.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/opacus/dp_cifar_simulation.py b/examples/opacus/dp_cifar_simulation.py index faddeaa68ed7..d957caf8785c 100644 --- a/examples/opacus/dp_cifar_simulation.py +++ b/examples/opacus/dp_cifar_simulation.py @@ -1,14 +1,14 @@ import math from collections import OrderedDict -from typing import Callable, Optional, Tuple +from typing import Callable, Dict, Optional, Tuple import flwr as fl import numpy as np import torch import torchvision.transforms as transforms -from opacus.dp_model_inspector import DPModelInspector from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 +from flwr.common.typing import Scalar from dp_cifar_main import DEVICE, PARAMS, DPCifarClient, Net, test @@ -23,8 +23,6 @@ def client_fn(cid: str) -> fl.client.Client: # Load model. model = Net() # Check model is compatible with Opacus. - # inspector = DPModelInspector() - # print(f"Is the model valid? {inspector.validate(model)}") # Load data partition (divide CIFAR10 into NUM_CLIENTS distinct partitions, using 30% for validation). transform = transforms.Compose( @@ -50,7 +48,9 @@ def client_fn(cid: str) -> fl.client.Client: # Define an evaluation function for centralized evaluation (using whole CIFAR10 testset). def get_evaluate_fn() -> Callable[[fl.common.NDArrays], Optional[Tuple[float, float]]]: - def evaluate(weights: fl.common.NDArrays) -> Optional[Tuple[float, float]]: + def evaluate( + server_round: int, parameters: fl.common.NDArrays, config: Dict[str, Scalar] + ): transform = transforms.Compose( [ transforms.ToTensor(), @@ -63,7 +63,7 @@ def evaluate(weights: fl.common.NDArrays) -> Optional[Tuple[float, float]]: state_dict = OrderedDict( { k: torch.tensor(np.atleast_1d(v)) - for k, v in zip(model.state_dict().keys(), weights) + for k, v in zip(model.state_dict().keys(), parameters) } ) model.load_state_dict(state_dict, strict=True) @@ -82,7 +82,7 @@ def main() -> None: client_fn=client_fn, num_clients=NUM_CLIENTS, client_resources={"num_cpus": 1}, - num_rounds=3, + config=fl.server.ServerConfig(num_rounds=3), strategy=fl.server.strategy.FedAvg( fraction_fit=0.1, fraction_evaluate=0.1, evaluate_fn=get_evaluate_fn() ), From 4624db72ab51c8df518229b51c48eabec75986c6 Mon Sep 17 00:00:00 2001 From: jafermarq Date: Tue, 23 Jan 2024 14:03:07 +0000 Subject: [PATCH 6/7] using `start_client.py` --- examples/quickstart-pandas/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/quickstart-pandas/client.py b/examples/quickstart-pandas/client.py index 9ef27124ca68..8585922e4572 100644 --- a/examples/quickstart-pandas/client.py +++ b/examples/quickstart-pandas/client.py @@ -59,7 +59,7 @@ def fit( X = dataset[column_names] # Start Flower client - fl.client.start_numpy_client( + fl.client.start_client( server_address="127.0.0.1:8080", client=FlowerClient(X).to_client(), ) From 279e1f55122dbe57d25879bc7d249d66b8aec23d Mon Sep 17 00:00:00 2001 From: jafermarq Date: Tue, 23 Jan 2024 15:18:30 +0000 Subject: [PATCH 7/7] update --- examples/custom-metrics/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/custom-metrics/client.py b/examples/custom-metrics/client.py index b2206118ed44..09e786a0cfac 100644 --- a/examples/custom-metrics/client.py +++ b/examples/custom-metrics/client.py @@ -68,4 +68,4 @@ def evaluate(self, parameters, config): # Start Flower client -fl.client.start_numpy_client(server_address="127.0.0.1:8080", client=FlowerClient()) +fl.client.start_client(server_address="127.0.0.1:8080", client=FlowerClient().to_client())