From 07d92a6228501deecd1c8f8afbd05f2adf6a8978 Mon Sep 17 00:00:00 2001 From: "JS.KIM" Date: Tue, 17 Oct 2023 00:02:18 +0900 Subject: [PATCH] Fedmeta (#2438) --------- Co-authored-by: Daniel J. Beutel Co-authored-by: jafermarq --- baselines/fedmeta/LICENSE | 202 ++++++++ baselines/fedmeta/README.md | 136 ++++++ .../fedmeta/_static/femnist_result_graph.png | Bin 0 -> 151054 bytes .../_static/shakespeare_result_graph.png | Bin 0 -> 123180 bytes baselines/fedmeta/fedmeta/__init__.py | 1 + baselines/fedmeta/fedmeta/client.py | 185 ++++++++ .../fedmeta/fedmeta/conf/algo/fedavg.yaml | 14 + .../fedmeta/conf/algo/fedavg_meta.yaml | 13 + .../fedmeta/conf/algo/fedmeta_maml.yaml | 13 + .../fedmeta/conf/algo/fedmeta_meta_sgd.yaml | 13 + baselines/fedmeta/fedmeta/conf/config.yaml | 21 + .../fedmeta/fedmeta/conf/data/femnist.yaml | 17 + .../fedmeta/conf/data/shakespeare.yaml | 17 + baselines/fedmeta/fedmeta/dataset.py | 234 +++++++++ .../fedmeta/fedmeta/dataset_preparation.py | 190 ++++++++ .../fedmeta/fedmeta/fedmeta_client_manager.py | 67 +++ baselines/fedmeta/fedmeta/main.py | 100 ++++ baselines/fedmeta/fedmeta/models.py | 445 ++++++++++++++++++ baselines/fedmeta/fedmeta/server.py | 1 + baselines/fedmeta/fedmeta/strategy.py | 333 +++++++++++++ baselines/fedmeta/fedmeta/utils.py | 160 +++++++ baselines/fedmeta/pyproject.toml | 143 ++++++ doc/source/ref-changelog.md | 2 + 23 files changed, 2307 insertions(+) create mode 100644 baselines/fedmeta/LICENSE create mode 100644 baselines/fedmeta/README.md create mode 100644 baselines/fedmeta/_static/femnist_result_graph.png create mode 100644 baselines/fedmeta/_static/shakespeare_result_graph.png create mode 100644 baselines/fedmeta/fedmeta/__init__.py create mode 100644 baselines/fedmeta/fedmeta/client.py create mode 100644 baselines/fedmeta/fedmeta/conf/algo/fedavg.yaml create mode 100644 baselines/fedmeta/fedmeta/conf/algo/fedavg_meta.yaml create mode 100644 baselines/fedmeta/fedmeta/conf/algo/fedmeta_maml.yaml create mode 100644 baselines/fedmeta/fedmeta/conf/algo/fedmeta_meta_sgd.yaml create mode 100644 baselines/fedmeta/fedmeta/conf/config.yaml create mode 100644 baselines/fedmeta/fedmeta/conf/data/femnist.yaml create mode 100644 baselines/fedmeta/fedmeta/conf/data/shakespeare.yaml create mode 100644 baselines/fedmeta/fedmeta/dataset.py create mode 100644 baselines/fedmeta/fedmeta/dataset_preparation.py create mode 100644 baselines/fedmeta/fedmeta/fedmeta_client_manager.py create mode 100644 baselines/fedmeta/fedmeta/main.py create mode 100644 baselines/fedmeta/fedmeta/models.py create mode 100644 baselines/fedmeta/fedmeta/server.py create mode 100644 baselines/fedmeta/fedmeta/strategy.py create mode 100644 baselines/fedmeta/fedmeta/utils.py create mode 100644 baselines/fedmeta/pyproject.toml diff --git a/baselines/fedmeta/LICENSE b/baselines/fedmeta/LICENSE new file mode 100644 index 000000000000..d64569567334 --- /dev/null +++ b/baselines/fedmeta/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/baselines/fedmeta/README.md b/baselines/fedmeta/README.md new file mode 100644 index 000000000000..a1ed982f8bf2 --- /dev/null +++ b/baselines/fedmeta/README.md @@ -0,0 +1,136 @@ +--- +title: Federated Meta-Learning with Fast Convergence and Efficient Communication +url: https://arxiv.org/abs/1802.07876 +labels: [meta learning, maml, meta-sgd, personalization] +dataset: [FEMNIST, SHAKESPEARE] +--- + +# FedMeta: Federated Meta-Learning with Fast Convergence and Efficient Communication + +**Paper:** [arxiv.org/abs/1802.07876](https://arxiv.org/abs/1802.07876) + +**Authors:** Fei Chen, Mi Luo, Zhenhua Dong, Zhenguo Li, Xiuqiang He + +**Abstract:** Statistical and systematic challenges in collaboratively training machine learning models across distributed networks of mobile devices have been the bottlenecks in the real-world application of federated learning. In this work, we show that meta-learning is a natural choice to handle these issues, and propose a federated meta-learning framework FedMeta, where a parameterized algorithm (or meta-learner) is shared, instead of a global model in previous approaches. We conduct an extensive empirical evaluation on LEAF datasets and a real-world production dataset, and demonstrate that FedMeta achieves a reduction in required communication cost by 2.82-4.33 times with faster convergence, and an increase in accuracy by 3.23%-14.84% as compared to Federated Averaging (FedAvg) which is a leading optimization algorithm in federated learning. Moreover, FedMeta preserves user privacy since only the parameterized algorithm is transmitted between mobile devices and central servers, and no raw data is collected onto the servers. + + +## About this baseline + +**What’s implemented:** We reimplemented the experiments from the paper 'FedMeta: Federated Meta-Learning with Fast Convergence and Efficient Communication' by Fei Chen (2018). which proposed the FedMeta(MAML & Meta-SGD) algorithm. Specifically, we replicate the results from Table 2 and Figure 2 of the paper. + +**Datasets:** FEMNIST and SHAKESPEARE from Leaf Federated Learning Dataset + +**Hardware Setup:** These experiments were run on a machine with 16 CPU threads and 1 GPU(GeForce RTX 2080 Ti). **FedMeta experiment using the Shakespeare dataset required more computing power.** Out of Memory errors may occur with some clients, but federated learning can continue to operate. On a GPU with more VRAM (A6000 with 48GB) no clients failed. + +**Contributors:** Jinsoo Kim and Kangyoon Lee + + +## Experimental Setup + +**Task:** A comparison task of four algorithms(FedAvg, FedAvg(Meta), FedMeta(MAML), FedMeta(Meta-SGD)) in the categories of Image Classification and next-word prediction. + +**Model:** This directory implements two models: +* A two-layer CNN network as used in the FedMeta paper for Femnist (see `models/CNN_Network`). +* A StackedLSTM model used in the FedMeta paper for Shakespeare (see `models/StackedLSTM`). + +**You can see more detail in Apendix.A of the paper** + +**Dataset:** This baseline includes the FEMNIST dataset and SHAKESPEARE. For data partitioning and sampling per client, we use the Leaf GitHub([LEAF: A Benchmark for Federated Settings](https://github.com/TalwalkarLab/leaf)). The data and client specifications used in this experiment are listed in the table below (Table 1 in the paper). + +**Shakespeare Dataset Issue:** In the FedMeta paper experiment, the Shakespeare dataset had 1126 users. However, due to a current bug, the number of users has decreased to 660 users. Therefore, we have only maintained the total number of data. + +| Dataset | #Clients | #Samples | #Classes | #Partition Clients | #Partition Dataset | +|:-----------:|:--------:|:--------:|:--------:|:---------------------------------------------------------------:|:----------------------:| +| FEMNIST | 1109 | 245,337 | 62 | Train Clients : 0.8
Valid Clients : 0.1, Test Clients : 0.1 | Sup : 0.2
Qry : 0.8 | +| SHAKESPEARE | 138 | 646,697 | 80 | Train Clients : 0.8
Valid Clients : 0.1, Test Clients : 0.1 | Sup : 0.2
Qry : 0.8 | + +**The original specifications of the Leaf dataset can be found in the Leaf paper(_"LEAF: A Benchmark for Federated Settings"_).** + +**Training Hyperparameters:** The following table shows the main hyperparameters for this baseline with their default value (i.e. the value used if you run `python main.py algo=? data=?` directly) + +| Algorithm | Dataset | Clients per Round | Number of Rounds | Batch Size | Optimizer | Learning Rate(α, β) | Client Resources | Gradient Step | +|:-----------------:|:--------------:|:-----------------:|:----------------:|:----------:|:---------:|:-------------------:|:---------------------------------------:|:-------------:| +| FedAvg | FEMNIST
SHAKESPEARE | 4 | 2000
400 | 10 | Adam | 0.0001
0.001 | {'num_cpus': 4.0,
'num_gpus': 0.25 } | - | +| FedAvg(Meta) | FEMNIST
SHAKESPEARE | 4 | 2000
400 | 10 | Adam | 0.0001
0.001 | {'num_cpus': 4.0,
'num_gpus': 0.25 } | - | +| FedMeta(MAML) | FEMNIST
SHAKESPEARE | 4 | 2000
400 | 10 | Adam | (0.001, 0.0001)
(0.1, 0.01) | {'num_cpus': 4.0,
'num_gpus': 1.0 } | 5
1 | +| FedMeta(Meta-SGD) | FEMNIST
SHAKESPEARE | 4 | 2000
400 | 10 | Adam | (0.001, 0.0001)
(0.1, 0.01) | {'num_cpus': 4.0,
'num_gpus': 1.0 } | 5
1 | + + +## Environment Setup +```bash +#Environment Setup +# Set python version +pyenv install 3.10.6 +pyenv local 3.10.6 + +# Tell poetry to use python 3.10 +poetry env use 3.10.6 + +# install the base Poetry environment +poetry install +poetry shell +``` + +## Running the Experiments + +**Download Dataset:** Go [LEAF: A Benchmark for Federated Settings](https://github.com/TalwalkarLab/leaf) and Use the command below! You can download dataset (FEMNIST and SHAKESPEARE). +```bash +# clone LEAF repo +git clone https://github.com/TalwalkarLab/leaf.git + +# navigate to data directory and then the dataset +cd leaf/data/femnist +#FEMNIST dataset Download command for these experiments +./preprocess.sh -s niid --sf 0.3 -k 0 -t sample + +# navigate to data directory and then the dataset +cd leaf/data/shakespeare +#SHAKESEPEARE dataset Download command for these experiments +./preprocess.sh -s niid --sf 0.16 -k 0 -t sample +``` + +*Run `./preprocess.sh` with a choice of the following tags* +* `-s` := 'iid' to sample in an i.i.d. manner, or 'niid' to sample in a non-i.i.d. manner; more information on i.i.d. versus non-i.i.d. is included in the 'Notes' section +* `--sf` := fraction of data to sample, written as a decimal; default is 0.1 +* `-k` := minimum number of samples per user +* `-t` := 'user' to partition users into train-test groups, or 'sample' to partition each user's samples into train-test groups + +More detailed tag information can be found on Leaf GitHub. + +****Start experiments**** +```bash +# FedAvg + Femnist Dataset +python -m fedmeta.main algo=fedavg data=femnist path=(your leaf dataset path)/leaf/data/femnist/data + +# FedAvg(Meta) + Femnist Dataset +python -m fedmeta.main algo=fedavg_meta data=femnist path=./leaf/data/femnist/data + +# FedMeta(MAML) + Femnist Dataset +python -m fedmeta.main algo=fedmeta_maml data=femnist path=./leaf/data/femnist/data + +# FedMeta(Meta-SGD) + Femnist Dataset +python -m fedmeta.main algo=fedmeta_meta_sgd data=femnist path=./leaf/data/femnist/data + + + +#FedAvg + Shakespeare Dataset +python -m fedmeta.main algo=fedavg data=shakespeare path=./leaf/data/shakespeare/data + +#FedAvg(Meta) + Shakespeare Dataset +python -m fedmeta.main algo=fedavg_meta data=shakespeare path=./leaf/data/shakespeare/data + +#FedMeta(MAML) + Shakespeare Dataset +python -m fedmeta.main algo=fedmeta_maml data=shakespeare path=./leaf/data/shakespeare/data + +#FedMeta(Meta-SGD) + Shakespeare Dataset +python -m fedmeta.main algo=fedmeta_meta_sgd data=shakespeare path=./leaf/data/shakespeare/data + +``` + + +## Expected Results +If you proceed with all of the above experiments, You can get a graph of your experiment results as shown below along that `./femnist or shakespeare/graph_params/result_graph.png`. + +| FEMNIST | SHAKESPEARE | +|:-------------------------------------------:|:----------------------------------------------------:| +| ![](_static/femnist_result_graph.png) | ![](_static/shakespeare_result_graph.png) | diff --git a/baselines/fedmeta/_static/femnist_result_graph.png b/baselines/fedmeta/_static/femnist_result_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..935643b46f900da9f451635e9a5b4fce5d13c8eb GIT binary patch literal 151054 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%0DE=hvB=#yA-vvRb_u5BfODtHS*=5^vj@w=c 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 Dwd5)`pI8LHZRf|HQ<0O{{Q>H?f*dR_peJF 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 literal 0 HcmV?d00001 diff --git a/baselines/fedmeta/_static/shakespeare_result_graph.png b/baselines/fedmeta/_static/shakespeare_result_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f23f529adf321eb44095fa155c3d6b3cf1678014 GIT binary patch literal 123180 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 NDArrays: + """Return the parameters of the current net.""" + return [val.cpu().numpy() for _, val in self.net.state_dict().items()] + + def set_parameters(self, parameters: NDArrays) -> None: + """Change the parameters of the model using the given ones.""" + params_dict = zip(self.net.state_dict().keys(), parameters) + state_dict = OrderedDict({k: torch.Tensor(v) for k, v in params_dict}) + self.net.load_state_dict(state_dict, strict=True) + + def fit( # type: ignore + self, parameters: NDArrays, config: Dict[str, Scalar] + ) -> Tuple[NDArrays, int, Dict]: + """Implement distributed fit function for a given client.""" + self.set_parameters(parameters) + algo = config["algo"] + + # Total number of data for Weighted Avg and Grad + total_len = len(self.trainloaders["qry"][self.cid].dataset) + len( + self.trainloaders["sup"][self.cid].dataset + ) + + # FedAvg & FedAvg(Meta) train basic Learning + if algo in ("fedavg", "fedavg_meta"): + loss = train( + self.net, + self.trainloaders["sup"][self.cid], + self.device, + epochs=self.num_epochs, + learning_rate=self.learning_rate, + ) + return self.get_parameters({}), total_len, {"loss": loss} + + # FedMeta(MAML) & FedMeta(Meta-SGD) train inner and outer loop + if algo in ("fedmeta_maml", "fedmeta_meta_sgd"): + alpha = config["alpha"] + loss, grads = train_meta( # type: ignore + self.net, + self.trainloaders["sup"][self.cid], + self.trainloaders["qry"][self.cid], + alpha, + self.device, + self.gradient_step, + ) + return self.get_parameters({}), total_len, {"loss": loss, "grads": grads} + raise ValueError("Unsupported algorithm") + + def evaluate( # type: ignore + self, parameters: NDArrays, config: Dict[str, Scalar] + ) -> Tuple[float, int, Dict]: + """Implement distributed evaluation for a given client.""" + self.set_parameters(parameters) + algo = config["algo"] + + # Total number of data for Weighted Avg and Grad + total_len = len(self.valloaders["qry"][self.cid].dataset) + len( + self.valloaders["sup"][self.cid].dataset + ) + + # FedAvg & FedAvg(Meta) train basic Learning + if algo in ("fedavg", "fedavg_meta"): + loss, accuracy = test( + self.net, + self.valloaders["sup"][self.cid], + self.valloaders["qry"][self.cid], + self.device, + algo=str(config["algo"]), + data=str(config["data"]), + learning_rate=self.learning_rate, + ) + return float(loss), total_len, {"correct": accuracy, "loss": loss} + + # FedMeta(MAML) & FedMeta(Meta-SGD) train inner and outer loop + if algo in ("fedmeta_maml", "fedmeta_meta_sgd"): + alpha = config["alpha"] + loss, accuracy = test_meta( + self.net, + self.valloaders["sup"][self.cid], + self.valloaders["qry"][self.cid], + alpha, + self.device, + self.gradient_step, + ) + return float(loss), total_len, {"correct": float(accuracy), "loss": loss} + raise ValueError("Unsupported algorithm") + + +# pylint: disable=too-many-arguments +def gen_client_fn( + num_epochs: int, + trainloaders: List[DataLoader], + valloaders: List[DataLoader], + learning_rate: float, + model: DictConfig, + gradient_step: int, +) -> Callable[[str], FlowerClient]: + """Generate the client function that creates the Flower Clients. + + Parameters + ---------- + num_epochs : int + The number of local epochs each client should run the training for before + sending it to the server. + trainloaders: List[DataLoader] + A list of DataLoaders, each pointing to the dataset training partition + belonging to a particular client. + valloaders: List[DataLoader] + A list of DataLoaders, each pointing to the dataset validation partition + belonging to a particular client. + model: DictConfig + The global Model for Federated Learning. + learning_rate : float + The learning rate for the SGD optimizer of clients. + gradient_step : int + The gradient step for Meta Learning of clients. + FedAvg and FedAvg(Meta) is None + + Returns + ------- + Tuple[Callable[[str], FlowerClient], DataLoader] + A tuple containing the client function that creates Flower Clients and + the DataLoader that will be used for testing + """ + + def client_fn(cid: str) -> FlowerClient: + """Create a Flower client representing a single organization.""" + # Load model + torch.manual_seed(42) + torch.cuda.manual_seed_all(42) + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + net = instantiate(model).to(device) + + return FlowerClient( + net, + trainloaders, + valloaders, + cid, + device, + num_epochs, + learning_rate, + gradient_step, + ) + + return client_fn diff --git a/baselines/fedmeta/fedmeta/conf/algo/fedavg.yaml b/baselines/fedmeta/fedmeta/conf/algo/fedavg.yaml new file mode 100644 index 000000000000..df5a5b4b6b65 --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/algo/fedavg.yaml @@ -0,0 +1,14 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +algo: fedavg +femnist: + alpha: 0.0001 + beta: 0 + +shakespeare: + alpha: 0.001 + beta: 0 + diff --git a/baselines/fedmeta/fedmeta/conf/algo/fedavg_meta.yaml b/baselines/fedmeta/fedmeta/conf/algo/fedavg_meta.yaml new file mode 100644 index 000000000000..928fd0a96cb9 --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/algo/fedavg_meta.yaml @@ -0,0 +1,13 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +algo: fedavg_meta +femnist: + alpha: 0.0001 + beta: None + +shakespeare: + alpha: 0.001 + beta: None diff --git a/baselines/fedmeta/fedmeta/conf/algo/fedmeta_maml.yaml b/baselines/fedmeta/fedmeta/conf/algo/fedmeta_maml.yaml new file mode 100644 index 000000000000..2c3c86df4edb --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/algo/fedmeta_maml.yaml @@ -0,0 +1,13 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +algo: fedmeta_maml +femnist: + alpha: 0.001 + beta: 0.0001 + +shakespeare: + alpha: 0.1 + beta: 0.01 diff --git a/baselines/fedmeta/fedmeta/conf/algo/fedmeta_meta_sgd.yaml b/baselines/fedmeta/fedmeta/conf/algo/fedmeta_meta_sgd.yaml new file mode 100644 index 000000000000..cb72f1fe6e2c --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/algo/fedmeta_meta_sgd.yaml @@ -0,0 +1,13 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +algo: fedmeta_meta_sgd +femnist: + alpha: 0.001 + beta: 0.0001 + +shakespeare: + alpha: 0.1 + beta: 0.01 diff --git a/baselines/fedmeta/fedmeta/conf/config.yaml b/baselines/fedmeta/fedmeta/conf/config.yaml new file mode 100644 index 000000000000..db1bfb11f169 --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/config.yaml @@ -0,0 +1,21 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +path: ??? +num_epochs: 1 +clients_per_round: 4 + +defaults: + - _self_ + - algo: ??? + - data: ??? + +strategy: + _target_: fedmeta.strategy.FedMeta + fraction_fit: 0.00001 + fraction_evaluate: 0.00001 + min_fit_clients : ${clients_per_round} + min_evaluate_clients : ${clients_per_round} + min_available_clients : ${clients_per_round} diff --git a/baselines/fedmeta/fedmeta/conf/data/femnist.yaml b/baselines/fedmeta/fedmeta/conf/data/femnist.yaml new file mode 100644 index 000000000000..7f24eed1a951 --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/data/femnist.yaml @@ -0,0 +1,17 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +model: + _target_: fedmeta.models.FemnistNetwork # model config + +client_resources: + num_cpus: 4 + num_gpus: 0.25 + +num_rounds: 2000 +data: femnist +support_ratio: 0.2 +batch_size: 10 +gradient_step: 5 diff --git a/baselines/fedmeta/fedmeta/conf/data/shakespeare.yaml b/baselines/fedmeta/fedmeta/conf/data/shakespeare.yaml new file mode 100644 index 000000000000..300e11da77f6 --- /dev/null +++ b/baselines/fedmeta/fedmeta/conf/data/shakespeare.yaml @@ -0,0 +1,17 @@ +--- +# this is the config that will be loaded as default by main.py +# Please follow the provided structure (this will ensuring all baseline follow +# a similar configuration structure and hence be easy to customise) + +model: + _target_: fedmeta.models.StackedLSTM + +client_resources: + num_cpus: 4 + num_gpus: 1.0 + +num_rounds: 400 +data: shakespeare +support_ratio: 0.2 +batch_size: 10 +gradient_step: 1 diff --git a/baselines/fedmeta/fedmeta/dataset.py b/baselines/fedmeta/fedmeta/dataset.py new file mode 100644 index 000000000000..25ff5201bfdb --- /dev/null +++ b/baselines/fedmeta/fedmeta/dataset.py @@ -0,0 +1,234 @@ +"""Handle basic dataset creation. + +In case of PyTorch it should return dataloaders for your dataset (for both the clients +and the server). If you are using a custom dataset class, this module is the place to +define it. If your dataset requires to be downloaded (and this is not done +automatically -- e.g. as it is the case for many dataset in TorchVision) and +partitioned, please include all those functions and logic in the +`dataset_preparation.py` module. You can use all those functions from functions/methods +defined here of course. +""" + +from typing import Dict, List, Tuple + +import numpy as np +import torch +import torchvision.transforms as transforms +from omegaconf import DictConfig +from torch.utils.data import DataLoader, Dataset + +from fedmeta.dataset_preparation import ( + _partition_data, + split_train_validation_test_clients, +) +from fedmeta.utils import letter_to_vec, word_to_indices + + +class ShakespeareDataset(Dataset): + """ + [LEAF: A Benchmark for Federated Settings](https://github.com/TalwalkarLab/leaf). + + We imported the preprocessing method for the Shakespeare dataset from GitHub. + + word_to_indices : returns a list of character indices + sentences_to_indices: converts an index to a one-hot vector of a given size. + letter_to_vec : returns one-hot representation of given letter + + """ + + def __init__(self, data): + sentence, label = data["x"], data["y"] + sentences_to_indices = [word_to_indices(word) for word in sentence] + sentences_to_indices = np.array(sentences_to_indices) + self.sentences_to_indices = np.array(sentences_to_indices, dtype=np.int64) + self.labels = np.array( + [letter_to_vec(letter) for letter in label], dtype=np.int64 + ) + + def __len__(self): + """Return the number of labels present in the dataset. + + Returns + ------- + int: The total number of labels. + """ + return len(self.labels) + + def __getitem__(self, index): + """Retrieve the data and its corresponding label at a given index. + + Args: + index (int): The index of the data item to fetch. + + Returns + ------- + tuple: (data tensor, label tensor) + """ + data, target = self.sentences_to_indices[index], self.labels[index] + return torch.tensor(data), torch.tensor(target) + + +class FemnistDataset(Dataset): + """ + [LEAF: A Benchmark for Federated Settings](https://github.com/TalwalkarLab/leaf). + + We imported the preprocessing method for the Femnist dataset from GitHub. + """ + + def __init__(self, dataset, transform): + self.x = dataset["x"] + self.y = dataset["y"] + self.transform = transform + + def __getitem__(self, index): + """Retrieve the input data and its corresponding label at a given index. + + Args: + index (int): The index of the data item to fetch. + + Returns + ------- + tuple: + - input_data (torch.Tensor): Reshaped and optionally transformed data. + - target_data (int or torch.Tensor): Label for the input data. + """ + input_data = np.array(self.x[index]).reshape(28, 28) + if self.transform: + input_data = self.transform(input_data) + target_data = self.y[index] + return input_data.to(torch.float32), target_data + + def __len__(self): + """Return the number of labels present in the dataset. + + Returns + ------- + int: The total number of labels. + """ + return len(self.y) + + +def load_datasets( + config: DictConfig, + path: str, +) -> Tuple[DataLoader, DataLoader, DataLoader]: + """Create the dataloaders to be fed into the model. + + Parameters + ---------- + config: DictConfig + data: float + Used data type + batch_size : int + The size of the batches to be fed into the model, + by default 10 + support_ratio : float + The ratio of Support set for each client.(between 0 and 1) + by default 0.2 + path : str + The path where the leaf dataset was downloaded + + Returns + ------- + Tuple[DataLoader, DataLoader, DataLoader] + """ + dataset = _partition_data( + data_type=config.data, dir_path=path, support_ratio=config.support_ratio + ) + + # Client list : 0.8, 0.1, 0.1 + clients_list = split_train_validation_test_clients(dataset[0]["users"]) + + trainloaders: Dict[str, List[DataLoader]] = {"sup": [], "qry": []} + valloaders: Dict[str, List[DataLoader]] = {"sup": [], "qry": []} + testloaders: Dict[str, List[DataLoader]] = {"sup": [], "qry": []} + + data_type = config.data + if data_type == "femnist": + transform = transforms.Compose([transforms.ToTensor()]) + for user in clients_list[0]: + trainloaders["sup"].append( + DataLoader( + FemnistDataset(dataset[0]["user_data"][user], transform), + batch_size=config.batch_size, + shuffle=True, + ) + ) + trainloaders["qry"].append( + DataLoader( + FemnistDataset(dataset[1]["user_data"][user], transform), + batch_size=config.batch_size, + ) + ) + for user in clients_list[1]: + valloaders["sup"].append( + DataLoader( + FemnistDataset(dataset[0]["user_data"][user], transform), + batch_size=config.batch_size, + ) + ) + valloaders["qry"].append( + DataLoader( + FemnistDataset(dataset[1]["user_data"][user], transform), + batch_size=config.batch_size, + ) + ) + for user in clients_list[2]: + testloaders["sup"].append( + DataLoader( + FemnistDataset(dataset[0]["user_data"][user], transform), + batch_size=config.batch_size, + ) + ) + testloaders["qry"].append( + DataLoader( + FemnistDataset(dataset[1]["user_data"][user], transform), + batch_size=config.batch_size, + ) + ) + + elif data_type == "shakespeare": + for user in clients_list[0]: + trainloaders["sup"].append( + DataLoader( + ShakespeareDataset(dataset[0]["user_data"][user]), + batch_size=config.batch_size, + shuffle=True, + ) + ) + trainloaders["qry"].append( + DataLoader( + ShakespeareDataset(dataset[1]["user_data"][user]), + batch_size=config.batch_size, + ) + ) + for user in clients_list[1]: + valloaders["sup"].append( + DataLoader( + ShakespeareDataset(dataset[0]["user_data"][user]), + batch_size=config.batch_size, + shuffle=True, + ) + ) + valloaders["qry"].append( + DataLoader( + ShakespeareDataset(dataset[1]["user_data"][user]), + batch_size=config.batch_size, + ) + ) + for user in clients_list[2]: + testloaders["sup"].append( + DataLoader( + ShakespeareDataset(dataset[0]["user_data"][user]), + batch_size=config.batch_size, + shuffle=True, + ) + ) + testloaders["qry"].append( + DataLoader( + ShakespeareDataset(dataset[1]["user_data"][user]), + batch_size=config.batch_size, + ) + ) + + return trainloaders, valloaders, testloaders diff --git a/baselines/fedmeta/fedmeta/dataset_preparation.py b/baselines/fedmeta/fedmeta/dataset_preparation.py new file mode 100644 index 000000000000..c139cdf86d69 --- /dev/null +++ b/baselines/fedmeta/fedmeta/dataset_preparation.py @@ -0,0 +1,190 @@ +"""Handle the dataset partitioning and (optionally) complex downloads. + +Please add here all the necessary logic to either download, uncompress, pre/post-process +your dataset (or all of the above). If the desired way of running your baseline is to +first download the dataset and partition it and then run the experiments, please +uncomment the lines below and tell us in the README.md (see the "Running the Experiment" +block) that this file should be executed first. +""" +import json +import os +from collections import defaultdict +from typing import Any, DefaultDict, Dict, List, Tuple + +import numpy as np +from sklearn.model_selection import train_test_split + + +def _read_dataset(path: str) -> Tuple[List, DefaultDict, List]: + """Read (if necessary) and returns the leaf dataset. + + Parameters + ---------- + path : str + The path where the leaf dataset was downloaded + + Returns + ------- + Tuple[user, data[x,y], num_total_data] + The dataset for training and the dataset for testing. + """ + users = [] + data: DefaultDict[str, Any] = defaultdict(lambda: None) + num_example = [] + + files = [f for f in os.listdir(path) if f.endswith(".json")] + + for file_name in files: + with open(f"{path}/{file_name}") as file: + dataset = json.load(file) + users.extend(dataset["users"]) + data.update(dataset["user_data"]) + num_example.extend(dataset["num_samples"]) + + users = sorted(data.keys()) + return users, data, num_example + + +def support_query_split( + data, + label, + support_ratio: float, +) -> Tuple[List, List, List, List]: + """Separate support set and query set. + + Parameters + ---------- + data: DefaultDict, + Raw all Datasets + label: List, + Raw all Labels + support_ratio : float + The ratio of Support set for each client.(between 0 and 1) + by default 0.2 + + Returns + ------- + Tuple[List, List, List, List] + Support set and query set classification of data and labels + """ + x_train, x_test, y_train, y_test = train_test_split( + data, label, train_size=support_ratio, stratify=label, random_state=42 + ) + + return x_train, x_test, y_train, y_test + + +def split_train_validation_test_clients( + clients: List, + train_rate: float = 0.8, + val_rate: float = 0.1, +) -> Tuple[List[str], List[str], List[str]]: + """Classification of all clients into train, valid, and test. + + Parameters + ---------- + clients: List, + Full list of clients for the sampled leaf dataset. + train_rate: float, optional + The ratio of training clients to total clients + by default 0.8 + val_rate: float, optional + The ratio of validation clients to total clients + by default 0.1 + + Returns + ------- + Tuple[List, List, List] + List of each train client, valid client, and test client + """ + np.random.seed(42) + train_rate = int(train_rate * len(clients)) + val_rate = int(val_rate * len(clients)) + + index = np.random.permutation(len(clients)) + trans_numpy = np.asarray(clients) + train_clients = trans_numpy[index[:train_rate]].tolist() + val_clients = trans_numpy[index[train_rate : train_rate + val_rate]].tolist() + test_clients = trans_numpy[index[train_rate + val_rate :]].tolist() + + return train_clients, val_clients, test_clients + + +# pylint: disable=too-many-locals +def _partition_data( + data_type: str, + dir_path: str, + support_ratio: float, +) -> Tuple[Dict, Dict]: + """Classification of support sets and query sets by client. + + Parameters + ---------- + data_type: str, + The type of femnist for classification or shakespeare for regression + dir_path: str, + The path where the leaf dataset was downloaded + support_ratio: float, + The ratio of Support set for each client.(between 0 and 1) + by default 0.2 + + Returns + ------- + Tuple[Dict, Dict] + Return support set and query set for total data + """ + train_path = f"{dir_path}/train" + test_path = f"{dir_path}/test" + + train_users, train_data, _ = _read_dataset(train_path) + _, test_data, _ = _read_dataset(test_path) + + all_dataset: Dict[str, Any] = {"users": [], "user_data": {}, "num_samples": []} + support_dataset: Dict[str, Any] = {"users": [], "user_data": {}, "num_samples": []} + query_dataset: Dict[str, Any] = {"users": [], "user_data": {}, "num_samples": []} + + for user in train_users: + all_x = np.asarray(train_data[user]["x"] + test_data[user]["x"]) + all_y = np.asarray(train_data[user]["y"] + test_data[user]["y"]) + + if data_type == "femnist": + unique, counts = np.unique(all_y, return_counts=True) + class_counts = dict(zip(unique, counts)) + + # Find classes with only one sample + classes_to_remove = [ + cls for cls, count in class_counts.items() if count == 1 + ] + + # Filter out the samples of those classes + mask = np.isin(all_y, classes_to_remove, invert=True) + + all_x = all_x[mask] + all_y = all_y[mask] + + # Client filtering for support set and query set classification + try: + sup_x, qry_x, sup_y, qry_y = support_query_split( + all_x, all_y, support_ratio + ) + except Exception: # pylint: disable=broad-except + continue + + elif data_type == "shakespeare": + sup_x, qry_x, sup_y, qry_y = train_test_split( + all_x, all_y, train_size=support_ratio, random_state=42 + ) + + all_dataset["users"].append(user) + all_dataset["user_data"][user] = {"x": all_x.tolist(), "y": all_y.tolist()} + all_dataset["num_samples"].append(len(all_y.tolist())) + + support_dataset["users"].append(user) + support_dataset["user_data"][user] = {"x": sup_x, "y": sup_y} + support_dataset["num_samples"].append(len(sup_y)) + + query_dataset["users"].append(user) + query_dataset["user_data"][user] = {"x": qry_x, "y": qry_y} + query_dataset["num_samples"].append(len(qry_y)) + + return support_dataset, query_dataset diff --git a/baselines/fedmeta/fedmeta/fedmeta_client_manager.py b/baselines/fedmeta/fedmeta/fedmeta_client_manager.py new file mode 100644 index 000000000000..098922b92215 --- /dev/null +++ b/baselines/fedmeta/fedmeta/fedmeta_client_manager.py @@ -0,0 +1,67 @@ +"""Handles clients that are sampled every round. + +In a FedMeta experiment, there is a train and a test client. So we modified the manager +to sample from each list each round. +""" + +import random +from logging import INFO +from typing import List, Optional + +from flwr.common.logger import log +from flwr.server.client_manager import SimpleClientManager +from flwr.server.client_proxy import ClientProxy +from flwr.server.criterion import Criterion + + +class FedmetaClientManager(SimpleClientManager): + """In the fit phase, clients must be sampled from the training client list. + + And in the evaluate stage, clients must be sampled from the validation client list. + So we modify 'fedmeta_client_manager' to sample clients from [cid: List] for each + list. + """ + + def __init__(self, valid_client, **kwargs): + super().__init__(**kwargs) + self.valid_client = valid_client + + # pylint: disable=too-many-arguments + def sample( # pylint: disable=arguments-differ + self, + num_clients: int, + min_num_clients: Optional[int] = None, + criterion: Optional[Criterion] = None, + server_round: Optional[int] = None, + step: Optional[str] = None, + ) -> List[ClientProxy]: + """Sample a number of Flower ClientProxy instances.""" + # Block until at least num_clients are connected. + if min_num_clients is None: + min_num_clients = num_clients + self.wait_for(min_num_clients) + + # Sample clients which meet the criterion + if step == "evaluate": + available_cids = [str(result) for result in range(0, self.valid_client)] + else: + available_cids = list(self.clients) + + if criterion is not None: + available_cids = [ + cid for cid in available_cids if criterion.select(self.clients[cid]) + ] + + if num_clients > len(available_cids): + log( + INFO, + "Sampling failed: number of available clients" + " (%s) is less than number of requested clients (%s).", + len(available_cids), + num_clients, + ) + return [] + if server_round is not None: + random.seed(server_round) + sampled_cids = random.sample(available_cids, num_clients) + return [self.clients[cid] for cid in sampled_cids] diff --git a/baselines/fedmeta/fedmeta/main.py b/baselines/fedmeta/fedmeta/main.py new file mode 100644 index 000000000000..e43ad94a3089 --- /dev/null +++ b/baselines/fedmeta/fedmeta/main.py @@ -0,0 +1,100 @@ +"""Create and connect the building blocks for your experiments; start the simulation. + +It includes processioning the dataset, instantiate strategy, specify how the global +model is going to be evaluated, etc. At the end, this script saves the results. +""" + + +import flwr as fl +import hydra +from hydra.core.hydra_config import HydraConfig +from hydra.utils import instantiate +from omegaconf import DictConfig, OmegaConf + +import fedmeta.client as client +from fedmeta.dataset import load_datasets +from fedmeta.fedmeta_client_manager import FedmetaClientManager +from fedmeta.strategy import weighted_average +from fedmeta.utils import plot_from_pkl, save_graph_params + + +@hydra.main(config_path="conf", config_name="config", version_base=None) +def main(cfg: DictConfig) -> None: + """Run the baseline. + + Parameters + ---------- + cfg : DictConfig + An omegaconf object that stores the hydra config. + + algo : FedAvg, FedAvg(Meta), FedMeta(MAML), FedMeta(Meta-SGD) + data : Femnist, Shakespeare + """ + # print config structured as YAML + print(OmegaConf.to_yaml(cfg)) + + # partition dataset and get dataloaders + trainloaders, valloaders, _ = load_datasets(config=cfg.data, path=cfg.path) + + # prepare function that will be used to spawn each client + client_fn = client.gen_client_fn( + num_epochs=cfg.num_epochs, + trainloaders=trainloaders, + valloaders=valloaders, + learning_rate=cfg.algo[cfg.data.data].alpha, + model=cfg.data.model, + gradient_step=cfg.data.gradient_step, + ) + + # prepare strategy function + strategy = instantiate( + cfg.strategy, + evaluate_metrics_aggregation_fn=weighted_average, + alpha=cfg.algo[cfg.data.data].alpha, + beta=cfg.algo[cfg.data.data].beta, + data=cfg.data.data, + algo=cfg.algo.algo, + ) + + # Start Simulation + history = fl.simulation.start_simulation( + client_fn=client_fn, + num_clients=len(trainloaders["sup"]), + config=fl.server.ServerConfig(num_rounds=cfg.data.num_rounds), + client_resources={ + "num_cpus": cfg.data.client_resources.num_cpus, + "num_gpus": cfg.data.client_resources.num_gpus, + }, + client_manager=FedmetaClientManager(valid_client=len(valloaders["qry"])), + strategy=strategy, + ) + + # 6. Save your results + # Here you can save the `history` returned by the simulation and include + # also other buffers, statistics, info needed to be saved in order to later + # on generate the plots you provide in the README.md. You can for instance + # access elements that belong to the strategy for example: + # data = strategy.get_my_custom_data() -- assuming you have such method defined. + # Hydra will generate for you a directory each time you run the code. You + # can retrieve the path to that directory with this: + # save_path = HydraConfig.get().runtime.output_dir + + print("................") + print(history) + output_path = HydraConfig.get().runtime.output_dir + + data_params = { + "algo": cfg.algo.algo, + "data": cfg.data.data, + "loss": history.losses_distributed, + "accuracy": history.metrics_distributed, + "path": output_path, + } + + save_graph_params(data_params) + plot_from_pkl(directory=output_path) + print("................") + + +if __name__ == "__main__": + main() diff --git a/baselines/fedmeta/fedmeta/models.py b/baselines/fedmeta/fedmeta/models.py new file mode 100644 index 000000000000..f065ae6c372b --- /dev/null +++ b/baselines/fedmeta/fedmeta/models.py @@ -0,0 +1,445 @@ +"""Define our models, and training and eval functions. + +If your model is 100% off-the-shelf (e.g. directly from torchvision without requiring +modifications) you might be better off instantiating your model directly from the Hydra +config. In this way, swapping your model for another one can be done without changing +the python code at all +""" + +from copy import deepcopy +from typing import List, Tuple + +import torch +import torch.nn as nn +from torch.utils.data import DataLoader + + +class StackedLSTM(nn.Module): + """StackedLSTM architecture. + + As described in Fei Chen 2018 paper : + + [FedMeta: Federated Meta-Learning with Fast Convergence and Efficient Communication] + (https://arxiv.org/abs/1802.07876) + """ + + def __init__(self): + super().__init__() + + self.embedding = nn.Embedding(80, 8) + self.lstm = nn.LSTM(8, 256, num_layers=2, dropout=0.5, batch_first=True) + self.fully_ = nn.Linear(256, 80) + + def forward(self, text): + """Forward pass of the StackedLSTM. + + Parameters + ---------- + text : torch.Tensor + Input Tensor that will pass through the network + + Returns + ------- + torch.Tensor + The resulting Tensor after it has passed through the network + """ + embedded = self.embedding(text) + self.lstm.flatten_parameters() + lstm_out, _ = self.lstm(embedded) + final_output = self.fully_(lstm_out[:, -1, :]) + return final_output + + +class FemnistNetwork(nn.Module): + """Convolutional Neural Network architecture. + + As described in Fei Chen 2018 paper : + + [FedMeta: Federated Meta-Learning with Fast Convergence and Efficient Communication] + (https://arxiv.org/abs/1802.07876) + """ + + def __init__(self) -> None: + super().__init__() + self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=5, padding=2) + self.maxpool1 = nn.MaxPool2d(kernel_size=(2, 2)) + self.conv2 = nn.Conv2d( + in_channels=32, out_channels=64, kernel_size=5, padding=2 + ) + self.maxpool2 = nn.MaxPool2d(kernel_size=(2, 2)) + self.linear1 = nn.Linear(7 * 7 * 64, 2048) + self.linear2 = nn.Linear(2048, 62) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + """Forward pass of the CNN. + + Parameters + ---------- + x : torch.Tensor + Input Tensor that will pass through the network + + Returns + ------- + torch.Tensor + The resulting Tensor after it has passed through the network + """ + x = torch.relu(self.conv1(x)) + x = self.maxpool1(x) + x = torch.relu(self.conv2(x)) + x = self.maxpool2(x) + x = torch.flatten(x, start_dim=1) + x = torch.relu((self.linear1(x))) + x = self.linear2(x) + return x + + +# pylint: disable=too-many-arguments +def train( + net: nn.Module, + trainloader: DataLoader, + device: torch.device, + epochs: int, + learning_rate: float, +) -> Tuple[float]: + """Train the network on the training set. + + Parameters + ---------- + net : nn.Module + The neural network to train. + trainloader : DataLoader + The DataLoader containing the data to train the network on. + testloader : DataLoader + The DataLoader containing the data to test the network on. + device : torch.device + The device on which the model should be trained, either 'cpu' or 'cuda'. + epochs : int + The number of epochs the model should be trained for. + learning_rate : float + The learning rate for the optimizer. + + Returns + ------- + nn.Module + The model that has been trained for one epoch. + loss + The Loss that bas been trained for one epoch + """ + criterion = torch.nn.CrossEntropyLoss() + optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate, weight_decay=0.001) + net.train() + for _ in range(epochs): + net, loss = _train_one_epoch(net, trainloader, device, criterion, optimizer) + return loss + + +def _train_one_epoch( + net: nn.Module, + trainloader: DataLoader, + device: torch.device, + criterion: torch.nn.CrossEntropyLoss, + optimizer: torch.optim.Adam, +) -> nn.Module: + """Train for one epoch. + + Parameters + ---------- + net : nn.Module + The neural network to train. + trainloader : DataLoader + The DataLoader containing the data to train the network on. + device : torch.device + The device on which the model should be trained, either 'cpu' or 'cuda'. + criterion : torch.nn.CrossEntropyLoss + The loss function to use for training + optimizer : torch.optim.Adam + The optimizer to use for training + + Returns + ------- + nn.Module + The model that has been trained for one epoch. + total_loss + The Loss that has been trained for one epoch. + """ + total_loss = 0.0 + + for images, labels in trainloader: + images, labels = images.to(device), labels.to(device) + optimizer.zero_grad() + loss = criterion(net(images), labels) + total_loss += loss.item() * labels.size(0) + loss.backward() + optimizer.step() + total_loss = total_loss / len(trainloader.dataset) + return net, total_loss + + +# pylint: disable=too-many-locals +def test( + net: nn.Module, + trainloader: DataLoader, + testloader: DataLoader, + device: torch.device, + algo: str, + data: str, + learning_rate: float, +) -> Tuple[float, float]: + """Evaluate the network on the entire test set. + + Parameters + ---------- + net : nn.Module + The neural network to test. + trainloader: DataLoader, + The DataLoader containing the data to train the network on. + testloader : DataLoader + The DataLoader containing the data to test the network on. + device : torch.device + The device on which the model should be tested, either 'cpu' or 'cuda'. + algo: str + The Algorithm of Federated Learning + data: str + The training data type of Federated Learning + learning_rate: float + The learning rate for the optimizer. + + Returns + ------- + Tuple[float, float] + The loss and the accuracy of the input model on the given data. + """ + criterion = torch.nn.CrossEntropyLoss() + total_loss = 0.0 + if algo == "fedavg_meta": + optimizer = torch.optim.Adam( + net.parameters(), lr=learning_rate, weight_decay=0.001 + ) + net.train() + optimizer.zero_grad() + if data == "femnist": + for images, labels in trainloader: + images, labels = images.to(device), labels.to(device) + loss = criterion(net(images), labels) + loss.backward() + total_loss += loss * labels.size(0) + total_loss = total_loss / len(trainloader.dataset) + optimizer.step() + + elif data == "shakespeare": + for images, labels in trainloader: + images, labels = images.to(device), labels.to(device) + loss = criterion(net(images), labels) + optimizer.zero_grad() + loss.backward() + optimizer.step() + + correct, total, loss = 0, 0, 0.0 + net.eval() + with torch.no_grad(): + for images, labels in testloader: + images, labels = images.to(device), labels.to(device) + outputs = net(images) + loss += criterion(outputs, labels).item() * labels.size(0) + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + if len(testloader.dataset) == 0: + raise ValueError("Testloader can't be 0, exiting...") + loss /= len(testloader.dataset) + accuracy = correct / total + return loss, accuracy + + +def train_meta( + net: nn.Module, + supportloader: DataLoader, + queryloader: DataLoader, + alpha: torch.nn.ParameterList, + device: torch.device, + gradient_step: int, +) -> Tuple[float, List]: + """Train the network on the training set. + + Parameters + ---------- + net : nn.Module + The neural network to train. + supportloader : DataLoader + The DataLoader containing the data to inner loop train the network on. + queryloader : DataLoader + The DataLoader containing the data to outer loop train the network on. + alpha : torch.nn.ParameterList + The learning rate for the optimizer. + device : torch.device + The device on which the model should be trained, either 'cpu' or 'cuda'. + gradient_step : int + The number of inner loop learning + + Returns + ------- + total_loss + The Loss that has been trained for one epoch. + grads + The gradients that has been trained for one epoch. + """ + criterion = torch.nn.CrossEntropyLoss() + for _ in range(1): + loss, grads = _train_meta_one_epoch( + net, supportloader, queryloader, alpha, criterion, device, gradient_step + ) + return loss, grads + + +# pylint: disable=too-many-locals +def _train_meta_one_epoch( + net: nn.Module, + supportloader: DataLoader, + queryloader: DataLoader, + alpha: torch.nn.ParameterList, + criterion: torch.nn.CrossEntropyLoss, + device: torch.device, + gradient_step: int, +) -> Tuple[float, List]: + """Train for one epoch. + + Parameters + ---------- + net : nn.Module + The neural network to train. + supportloader : DataLoader + The DataLoader containing the data to inner loop train the network on. + queryloader : DataLoader + The DataLoader containing the data to outer loop train the network on. + alpha : torch.nn.ParameterList + The learning rate for the optimizer. + criterion : torch.nn.CrossEntropyLoss + The loss function to use for training + device : torch.device + The device on which the model should be trained, either 'cpu' or 'cuda'. + gradient_step : int + The number of inner loop learning + + Returns + ------- + total_loss + The Loss that has been trained for one epoch. + grads + The gradients that has been trained for one epoch. + """ + num_adaptation_steps = gradient_step + train_net = deepcopy(net) + alpha = [alpha.to(device) for alpha in alpha] + train_net.train() + for _ in range(num_adaptation_steps): + loss_sum = 0.0 + sup_num_sample = [] + sup_total_loss = [] + for images, labels in supportloader: + images, labels = images.to(device), labels.to(device) + loss = criterion(train_net(images), labels) + loss_sum += loss * labels.size(0) + sup_num_sample.append(labels.size(0)) + sup_total_loss.append(loss * labels.size(0)) + grads = torch.autograd.grad( + loss, list(train_net.parameters()), create_graph=True, retain_graph=True + ) + + for param, grad_, alphas in zip(train_net.parameters(), grads, alpha): + param.data = param.data - alphas * grad_ + + for param in train_net.parameters(): + if param.grad is not None: + param.grad.zero_() + + qry_total_loss = [] + qry_num_sample = [] + loss_sum = 0.0 + for images, labels in queryloader: + images, labels = images.to(device), labels.to(device) + loss = criterion(train_net(images), labels) + loss_sum += loss * labels.size(0) + qry_num_sample.append(labels.size(0)) + qry_total_loss.append(loss.item()) + loss_sum = loss_sum / sum(qry_num_sample) + grads = torch.autograd.grad(loss_sum, list(train_net.parameters())) + + for param in train_net.parameters(): + if param.grad is not None: + param.grad.zero_() + + grads = [grad_.cpu().numpy() for grad_ in grads] + loss = sum(sup_total_loss) / sum(sup_num_sample) + return loss, grads + + +def test_meta( + net: nn.Module, + supportloader: DataLoader, + queryloader: DataLoader, + alpha: torch.nn.ParameterList, + device: torch.device, + gradient_step: int, +) -> Tuple[float, float]: + """Evaluate the network on the entire test set. + + Parameters + ---------- + net : nn.Module + The neural network to test. + supportloader : DataLoader + The DataLoader containing the data to test the network on. + queryloader : DataLoader + The DataLoader containing the data to test the network on. + alpha : torch.nn.ParameterList + The learning rate for the optimizer. + device : torch.device + The device on which the model should be tested, either 'cpu' or 'cuda'. + gradient_step : int + The number of inner loop learning + + Returns + ------- + Tuple[float, float] + The loss and the accuracy of the input model on the given data. + """ + criterion = torch.nn.CrossEntropyLoss() + test_net = deepcopy(net) + num_adaptation_steps = gradient_step + alpha = [alpha_tensor.to(device) for alpha_tensor in alpha] + test_net.train() + for _ in range(num_adaptation_steps): + loss_sum = 0.0 + sup_num_sample = [] + sup_total_loss = [] + for images, labels in supportloader: + images, labels = images.to(device), labels.to(device) + loss = criterion(test_net(images), labels) + loss_sum += loss * labels.size(0) + sup_num_sample.append(labels.size(0)) + sup_total_loss.append(loss) + grads = torch.autograd.grad( + loss, list(test_net.parameters()), create_graph=True, retain_graph=True + ) + + for param, grad_, alphas in zip(test_net.parameters(), grads, alpha): + param.data -= alphas * grad_ + + for param in test_net.parameters(): + if param.grad is not None: + param.grad.zero_() + + test_net.eval() + correct, total, loss = 0, 0, 0.0 + for images, labels in queryloader: + images, labels = images.to(device), labels.to(device) + outputs = test_net(images) + loss += criterion(outputs, labels).item() * labels.size(0) + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + if len(queryloader.dataset) == 0: + raise ValueError("Testloader can't be 0, exiting...") + loss = loss / total + accuracy = correct / total + return loss, accuracy diff --git a/baselines/fedmeta/fedmeta/server.py b/baselines/fedmeta/fedmeta/server.py new file mode 100644 index 000000000000..b24928de48b3 --- /dev/null +++ b/baselines/fedmeta/fedmeta/server.py @@ -0,0 +1 @@ +"""Flower Server.""" diff --git a/baselines/fedmeta/fedmeta/strategy.py b/baselines/fedmeta/fedmeta/strategy.py new file mode 100644 index 000000000000..7947938116e9 --- /dev/null +++ b/baselines/fedmeta/fedmeta/strategy.py @@ -0,0 +1,333 @@ +"""Optionally define a custom strategy. + +Needed only when the strategy is not yet implemented in Flower or because you want to +extend or modify the functionality of an existing strategy. +""" +from collections import OrderedDict +from logging import WARNING +from typing import Dict, List, Optional, Tuple, Union + +import torch +from flwr.common import ( + EvaluateIns, + EvaluateRes, + FitIns, + FitRes, + Metrics, + NDArrays, + Parameters, + Scalar, + ndarrays_to_parameters, + parameters_to_ndarrays, +) +from flwr.common.logger import log +from flwr.server.client_manager import ClientManager +from flwr.server.client_proxy import ClientProxy +from flwr.server.strategy import FedAvg +from flwr.server.strategy.aggregate import aggregate, weighted_loss_avg + +from fedmeta.models import FemnistNetwork, StackedLSTM +from fedmeta.utils import update_ema + + +# pylint: disable=too-many-arguments +def fedmeta_update_meta_sgd( + net: torch.nn.Module, + alpha: torch.nn.ParameterList, + beta: float, + weights_results: NDArrays, + gradients_aggregated: NDArrays, + weight_decay: float, +) -> Tuple[NDArrays, torch.nn.ParameterList]: + """Update model parameters for FedMeta(Meta-SGD). + + Parameters + ---------- + net : torch.nn.Module + The list of metrics to aggregate. + alpha : torch.nn.ParameterList + alpha is the learning rate. it is updated with parameters in FedMeta (Meta-SGD). + beta : float + beta is the learning rate for updating parameters and alpha on the server. + weights_results : List[Tuple[NDArrays, int]] + These are the global model parameters for the current round. + gradients_aggregated : List[Tuple[NDArrays, int]] + Weighted average of the gradient in the current round. + WD : float + The weight decay for Adam optimizer + + Returns + ------- + weights_prime : List[Tuple[NDArrays, int]] + These are updated parameters. + alpha : torch.nn.ParameterLis + These are updated alpha. + """ + params_dict = zip(net.state_dict().keys(), weights_results) + state_dict = OrderedDict({k: torch.tensor(v) for k, v in params_dict}) + net.load_state_dict(state_dict, strict=True) + optimizer = torch.optim.Adam( + list(net.parameters()) + list(alpha), lr=beta, weight_decay=weight_decay + ) + for params, grad_ins, alphas in zip(net.parameters(), gradients_aggregated, alpha): + params.grad = torch.tensor(grad_ins).to(params.dtype) + alphas.grad = torch.tensor(grad_ins).to(params.dtype) + optimizer.step() + optimizer.zero_grad() + weights_prime = [val.cpu().numpy() for _, val in net.state_dict().items()] + + return weights_prime, alpha + + +def fedmeta_update_maml( + net: torch.nn.Module, + beta: float, + weights_results: NDArrays, + gradients_aggregated: NDArrays, + weight_decay: float, +) -> NDArrays: + """Update model parameters for FedMeta(Meta-SGD). + + Parameters + ---------- + net : torch.nn.Module + The list of metrics to aggregate. + beta : float + beta is the learning rate for updating parameters on the server. + weights_results : List[Tuple[NDArrays, int]] + These are the global model parameters for the current round. + gradients_aggregated : List[Tuple[NDArrays, int]] + Weighted average of the gradient in the current round. + WD : float + The weight decay for Adam optimizer + + Returns + ------- + weights_prime : List[Tuple[NDArrays, int]] + These are updated parameters. + """ + params_dict = zip(net.state_dict().keys(), weights_results) + state_dict = OrderedDict({k: torch.tensor(v) for k, v in params_dict}) + net.load_state_dict(state_dict, strict=True) + optimizer = torch.optim.Adam( + list(net.parameters()), lr=beta, weight_decay=weight_decay + ) + for params, grad_ins in zip(net.parameters(), gradients_aggregated): + params.grad = torch.tensor(grad_ins).to(params.dtype) + optimizer.step() + optimizer.zero_grad() + weights_prime = [val.cpu().numpy() for _, val in net.state_dict().items()] + + return weights_prime + + +def weighted_average(metrics: List[Tuple[int, Metrics]]) -> Metrics: + """Aggregate using a weighted average during evaluation. + + Parameters + ---------- + metrics : List[Tuple[int, Metrics]] + The list of metrics to aggregate. + + Returns + ------- + Metrics + The weighted average metric. + """ + # Multiply accuracy of each client by number of examples used + correct = [num_examples * float(m["correct"]) for num_examples, m in metrics] + examples = [num_examples for num_examples, _ in metrics] + + # Aggregate and return custom metric (weighted average) + return {"accuracy": float(sum(correct)) / float(sum(examples))} + + +class FedMeta(FedAvg): + """FedMeta averages the gradient and server parameter update through it.""" + + def __init__(self, alpha, beta, data, algo, **kwargs): + super().__init__(**kwargs) + self.algo = algo + self.data = data + self.beta = beta + self.ema_loss = None + self.ema_acc = None + + if self.data == "femnist": + self.net = FemnistNetwork() + elif self.data == "shakespeare": + self.net = StackedLSTM() + + self.alpha = torch.nn.ParameterList( + [ + torch.nn.Parameter(torch.full_like(p, alpha)) + for p in self.net.parameters() + ] + ) + + def configure_fit( + self, server_round: int, parameters: Parameters, client_manager: ClientManager + ) -> List[Tuple[ClientProxy, FitIns]]: + """Configure the next round of training.""" + config = {"alpha": self.alpha, "algo": self.algo, "data": self.data} + if self.on_fit_config_fn is not None: + # Custom fit config function provided + config = self.on_fit_config_fn(server_round) + fit_ins = FitIns(parameters, config) + + # Sample clients + sample_size, min_num_clients = self.num_fit_clients( + client_manager.num_available() + ) + clients = client_manager.sample( # type: ignore + num_clients=sample_size, + min_num_clients=min_num_clients, + server_round=server_round, + step="fit", + ) + + # Return client/config pairs + return [(client, fit_ins) for client in clients] + + def configure_evaluate( + self, server_round: int, parameters: Parameters, client_manager: ClientManager + ) -> List[Tuple[ClientProxy, EvaluateIns]]: + """Configure the next round of evaluation.""" + # Do not configure federated evaluation if fraction eval is 0. + if self.fraction_evaluate == 0.0: + return [] + + # Parameters and config + config = {"alpha": self.alpha, "algo": self.algo, "data": self.data} + if self.on_evaluate_config_fn is not None: + # Custom evaluation config function provided + config = self.on_evaluate_config_fn(server_round) + evaluate_ins = EvaluateIns(parameters, config) + + # Sample clients + sample_size, min_num_clients = self.num_evaluation_clients( + client_manager.num_available() + ) + clients = client_manager.sample( # type: ignore + num_clients=sample_size, + min_num_clients=min_num_clients, + server_round=server_round, + step="evaluate", + ) + + # Return client/config pairs + return [(client, evaluate_ins) for client in clients] + + def aggregate_fit( + self, + server_round: int, + results: List[Tuple[ClientProxy, FitRes]], + failures: List[Union[Tuple[ClientProxy, FitRes], BaseException]], + ) -> Tuple[Optional[Parameters], Dict[str, Scalar]]: + """Aggregate fit results using weighted average.""" + if not results: + return None, {} + # Do not aggregate if there are failures and failures are not accepted + if not self.accept_failures and failures: + return None, {} + + # Convert results + weights_results: List[Tuple[NDArrays, int]] = [ + (parameters_to_ndarrays(fit_res.parameters), fit_res.num_examples) + for _, fit_res in results + ] + + parameters_aggregated = aggregate(weights_results) + if self.data == "femnist": + weight_decay_ = 0.001 + else: + weight_decay_ = 0.0001 + + # Gradient Average and Update Parameter for FedMeta(MAML) + if self.algo == "fedmeta_maml": + grads_results: List[Tuple[NDArrays, int]] = [ + (fit_res.metrics["grads"], fit_res.num_examples) # type: ignore + for _, fit_res in results + ] + gradients_aggregated = aggregate(grads_results) + weights_prime = fedmeta_update_maml( + self.net, + self.beta, + weights_results[0][0], + gradients_aggregated, + weight_decay_, + ) + parameters_aggregated = weights_prime + + # Gradient Average and Update Parameter for FedMeta(Meta-SGD) + elif self.algo == "fedmeta_meta_sgd": + grads_results: List[Tuple[NDArrays, int]] = [ # type: ignore + (fit_res.metrics["grads"], fit_res.num_examples) + for _, fit_res in results + ] + gradients_aggregated = aggregate(grads_results) + weights_prime, update_alpha = fedmeta_update_meta_sgd( + self.net, + self.alpha, + self.beta, + weights_results[0][0], + gradients_aggregated, + weight_decay_, + ) + self.alpha = update_alpha + parameters_aggregated = weights_prime + + # Aggregate custom metrics if aggregation fn was provided + metrics_aggregated = {} + if self.fit_metrics_aggregation_fn: + fit_metrics = [(res.num_examples, res.metrics) for _, res in results] + metrics_aggregated = self.fit_metrics_aggregation_fn(fit_metrics) + elif server_round == 1: # Only log this warning once + log(WARNING, "No fit_metrics_aggregation_fn provided") + + return ndarrays_to_parameters(parameters_aggregated), metrics_aggregated + + def aggregate_evaluate( + self, + server_round: int, + results: List[Tuple[ClientProxy, EvaluateRes]], + failures: List[Union[Tuple[ClientProxy, EvaluateRes], BaseException]], + ) -> Tuple[Optional[float], Dict[str, Scalar]]: + """Aggregate evaluation losses using weighted average.""" + if not results: + return None, {} + # Do not aggregate if there are failures and failures are not accepted + if not self.accept_failures and failures: + return None, {} + + # Aggregate loss + loss_aggregated = weighted_loss_avg( + [ + (evaluate_res.num_examples, evaluate_res.loss) + for _, evaluate_res in results + ] + ) + + if self.data == "femnist": + smoothing_weight = 0.95 + else: + smoothing_weight = 0.7 + self.ema_loss = update_ema(self.ema_loss, loss_aggregated, smoothing_weight) + loss_aggregated = self.ema_loss + + # Aggregate custom metrics if aggregation fn was provided + metrics_aggregated = {} + if self.evaluate_metrics_aggregation_fn: + eval_metrics = [(res.num_examples, res.metrics) for _, res in results] + metrics_aggregated = self.evaluate_metrics_aggregation_fn(eval_metrics) + self.ema_acc = update_ema( + self.ema_acc, + round(float(metrics_aggregated["accuracy"] * 100), 3), + smoothing_weight, + ) + metrics_aggregated["accuracy"] = self.ema_acc + + elif server_round == 1: # Only log this warning once + log(WARNING, "No evaluate_metrics_aggregation_fn provided") + + return loss_aggregated, metrics_aggregated diff --git a/baselines/fedmeta/fedmeta/utils.py b/baselines/fedmeta/fedmeta/utils.py new file mode 100644 index 000000000000..b8e1dd95acab --- /dev/null +++ b/baselines/fedmeta/fedmeta/utils.py @@ -0,0 +1,160 @@ +"""Define any utility function. + +They are not directly relevant to the other (more FL specific) python modules. For +example, you may define here things like: loading a model from a checkpoint, saving +results, plotting. +""" + +import os +import pickle +from typing import Dict, List + +import matplotlib.pyplot as plt + +# Encoding list for the Shakespeare dataset +ALL_LETTERS = ( + "\n !\"&'(),-.0123456789:;>?ABCDEFGHIJKLMNOPQRSTUVWXYZ[]abcdefghijklmnopqrstuvwxyz}" +) + + +def _one_hot( + index: int, + size: int, +) -> List: + """Return one-hot vector with given size and value 1 at given index.""" + vec = [0 for _ in range(size)] + vec[int(index)] = 1 + return vec + + +def letter_to_vec( + letter: str, +) -> int: + """Return one-hot representation of given letter.""" + index = ALL_LETTERS.find(letter) + return index + + +def word_to_indices( + word: str, +) -> List: + """Return a list of character indices. + + Parameters + ---------- + word: string. + + Returns + ------- + indices: int list with length len(word) + """ + indices = [] + for count in word: + indices.append(ALL_LETTERS.find(count)) + return indices + + +def update_ema( + prev_ema: float, + current_value: float, + smoothing_weight: float, +) -> float: + """We use EMA to visually enhance the learning trend for each round. + + Parameters + ---------- + prev_ema : float + The list of metrics to aggregate. + current_value : float + The list of metrics to aggregate. + smoothing_weight : float + The list of metrics to aggregate. + + + Returns + ------- + EMA_Loss or EMA_ACC + The weighted average metric. + """ + if prev_ema is None: + return current_value + return (1 - smoothing_weight) * current_value + smoothing_weight * prev_ema + + +def save_graph_params(data_info: Dict): + """Save parameters to visualize experiment results (Loss, ACC). + + Parameters + ---------- + data_info : Dict + This is a parameter dictionary of data from which the experiment was completed. + """ + if os.path.exists(f"{data_info['path']}/{data_info['algo']}.pkl"): + raise ValueError( + f"'{data_info['path']}/{data_info['algo']}.pkl' is already exists!" + ) + + with open(f"{data_info['path']}/{data_info['algo']}.pkl", "wb") as file: + pickle.dump(data_info, file) + + +def plot_from_pkl(directory="."): + """Visualization of algorithms like 4 Algorithm for data. + + Parameters + ---------- + directory : str + Graph params directory path for Femnist or Shakespeare + """ + color_mapping = { + "fedavg.pkl": "#66CC00", + "fedavg_meta.pkl": "#3333CC", + "fedmeta_maml.pkl": "#FFCC00", + "fedmeta_meta_sgd.pkl": "#CC0000", + } + + pkl_files = [f for f in os.listdir(directory) if f.endswith(".pkl")] + + all_data = {} + + for file in pkl_files: + with open(os.path.join(directory, file), "rb") as file_: + data = pickle.load(file_) + all_data[file] = data + + plt.figure(figsize=(7, 12)) + + # Acc graph + plt.subplot(2, 1, 1) + for file in sorted(all_data.keys()): + data = all_data[file] + accuracies = [acc for _, acc in data["accuracy"]["accuracy"]] + legend_ = file[:-4] if file.endswith(".pkl") else file + plt.plot( + accuracies, + label=legend_, + color=color_mapping.get(file, "black"), + linewidth=3, + ) + plt.title("Accuracy") + plt.grid(True) + plt.legend() + + plt.subplot(2, 1, 2) + for file in sorted(all_data.keys()): + data = all_data[file] + loss = [loss for _, loss in data["loss"]] + legend_ = file[:-4] if file.endswith(".pkl") else file + plt.plot( + loss, label=legend_, color=color_mapping.get(file, "black"), linewidth=3 + ) + plt.title("Loss") + plt.legend() + plt.grid(True) + + plt.tight_layout() + + save_path = f"{directory}/result_graph.png" + plt.savefig(save_path) + + plt.show() diff --git a/baselines/fedmeta/pyproject.toml b/baselines/fedmeta/pyproject.toml new file mode 100644 index 000000000000..cbaa9bb5d110 --- /dev/null +++ b/baselines/fedmeta/pyproject.toml @@ -0,0 +1,143 @@ +[build-system] +requires = ["poetry-core>=1.4.0"] +build-backend = "poetry.masonry.api" + +[tool.poetry] +name = "fedmeta" +version = "1.0.0" +description = "Implementation of FedMeta (Fei Chen et al. 2018)" +license = "Apache-2.0" +authors = ["Jinsoo Kim ", "Kangyoon Lee "] +readme = "README.md" +homepage = "https://flower.dev" +repository = "https://github.com/adap/flower" +documentation = "https://flower.dev" +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Operating System :: MacOS :: MacOS X", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: Implementation :: CPython", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Scientific/Engineering :: Mathematics", + "Topic :: Software Development", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Libraries :: Python Modules", + "Typing :: Typed", +] + +[tool.poetry.dependencies] +python = ">=3.10.0, <3.11.0" +flwr = { extras = ["simulation"], version = "1.5.0" } +hydra-core = "1.3.2" # don't change this +matplotlib = "3.7.1" +scikit-learn = "1.3.1" +torch = { url = "https://download.pytorch.org/whl/cu117/torch-2.0.1%2Bcu117-cp310-cp310-linux_x86_64.whl"} +torchvision = { url = "https://download.pytorch.org/whl/cu117/torchvision-0.15.2%2Bcu117-cp310-cp310-linux_x86_64.whl"} +pillow = "9.5.0" # needed <10.0.0 for LEAF repo scripts + + +[tool.poetry.dev-dependencies] +isort = "==5.11.5" +black = "==23.1.0" +docformatter = "==1.5.1" +mypy = "==1.4.1" +pylint = "==2.8.2" +flake8 = "==3.9.2" +pytest = "==6.2.4" +pytest-watch = "==4.2.0" +ruff = "==0.0.272" +types-requests = "==2.27.7" + +[tool.isort] +line_length = 88 +indent = " " +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +use_parentheses = true + +[tool.black] +line-length = 88 +target-version = ["py38", "py39", "py310", "py311"] + +[tool.pytest.ini_options] +minversion = "6.2" +addopts = "-qq" +testpaths = [ + "flwr_baselines", +] + +[tool.mypy] +ignore_missing_imports = true +strict = false +plugins = "numpy.typing.mypy_plugin" + +[tool.pylint."MESSAGES CONTROL"] +disable = "bad-continuation,duplicate-code,too-few-public-methods,useless-import-alias" +good-names = "i,j,k,_,x,y,X,Y" +signature-mutators="hydra.main.main" + +[tool.pylint.typecheck] +generated-members="numpy.*, torch.*, tensorflow.*" + +[[tool.mypy.overrides]] +module = [ + "importlib.metadata.*", + "importlib_metadata.*", +] +follow_imports = "skip" +follow_imports_for_stubs = true +disallow_untyped_calls = false + +[[tool.mypy.overrides]] +module = "torch.*" +follow_imports = "skip" +follow_imports_for_stubs = true + +[tool.docformatter] +wrap-summaries = 88 +wrap-descriptions = 88 + +[tool.ruff] +target-version = "py38" +line-length = 88 +select = ["D", "E", "F", "W", "B", "ISC", "C4"] +fixable = ["D", "E", "F", "W", "B", "ISC", "C4"] +ignore = ["B024", "B027"] +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".pytype", + ".ruff_cache", + ".svn", + ".tox", + ".venv", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + "venv", + "proto", +] + +[tool.ruff.pydocstyle] +convention = "numpy" diff --git a/doc/source/ref-changelog.md b/doc/source/ref-changelog.md index cf482521fa73..891632edaaf5 100644 --- a/doc/source/ref-changelog.md +++ b/doc/source/ref-changelog.md @@ -26,6 +26,8 @@ - TAMUNA ([#2254](https://github.com/adap/flower/pull/2254), [#2508](https://github.com/adap/flower/pull/2508)) + - FedMeta [#2438](https://github.com/adap/flower/pull/2438) + - **Update Flower Examples** ([#2384](https://github.com/adap/flower/pull/2384)), ([#2425](https://github.com/adap/flower/pull/2425)) - **General updates to baselines** ([#2301](https://github.com/adap/flower/pull/2301), [#2305](https://github.com/adap/flower/pull/2305), [#2307](https://github.com/adap/flower/pull/2307), [#2327](https://github.com/adap/flower/pull/2327), [#2435](https://github.com/adap/flower/pull/2435))