From 27c9e03431cbc091721702daeec409b8911f9867 Mon Sep 17 00:00:00 2001 From: Karthik Duddu Date: Sun, 17 Feb 2019 22:43:20 -0500 Subject: [PATCH] Added writeups, contact, links --- .gitignore | 1 - docs/source/_static/customheader.css | 3 + .../_static/images/femnist_75_thresh.png | Bin 0 -> 14220 bytes .../_static/images/leaf_rep_sent140.png | Bin 0 -> 7679 bytes .../images/shake_small_weighted_test_acc.png | Bin 0 -> 18231 bytes .../shake_small_weighted_training_loss.png | Bin 0 -> 26669 bytes docs/source/authors.rst | 9 --- docs/source/contact.rst | 14 ++++ docs/source/index.rst | 4 +- docs/source/tutorials/femnist-md.md | 72 ++++++++++++++++++ docs/source/tutorials/index.rst | 33 ++++++++ docs/source/tutorials/sent140-md.md | 72 ++++++++++++++++-- docs/source/tutorials/shakespeare-md.md | 71 +++++++++++++++++ 13 files changed, 259 insertions(+), 20 deletions(-) create mode 100644 docs/source/_static/customheader.css create mode 100644 docs/source/_static/images/femnist_75_thresh.png create mode 100644 docs/source/_static/images/leaf_rep_sent140.png create mode 100644 docs/source/_static/images/shake_small_weighted_test_acc.png create mode 100644 docs/source/_static/images/shake_small_weighted_training_loss.png delete mode 100644 docs/source/authors.rst create mode 100644 docs/source/contact.rst create mode 100644 docs/source/tutorials/femnist-md.md create mode 100644 docs/source/tutorials/shakespeare-md.md diff --git a/.gitignore b/.gitignore index 8bc59cf0..89d1a047 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,5 @@ models/checkpoints/ models/metrics/*.csv models/sent140/embs.json _build/ -_static/ _templates/ autodoc/ diff --git a/docs/source/_static/customheader.css b/docs/source/_static/customheader.css new file mode 100644 index 00000000..4918ca8d --- /dev/null +++ b/docs/source/_static/customheader.css @@ -0,0 +1,3 @@ +.wy-side-nav-search, .wy-nav-top { + background: #0b750a; +} diff --git a/docs/source/_static/images/femnist_75_thresh.png b/docs/source/_static/images/femnist_75_thresh.png new file mode 100644 index 0000000000000000000000000000000000000000..735358c794b9a15eabecb741bbd41f042f5a34bd GIT binary patch literal 14220 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 R@NqhbhN=#{?2gsT{{b-~7|{R# literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/leaf_rep_sent140.png b/docs/source/_static/images/leaf_rep_sent140.png new file mode 100644 index 0000000000000000000000000000000000000000..6a223e5ea5f7ab1d4144aa170b5b45a9a128e044 GIT binary patch literal 7679 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/shake_small_weighted_test_acc.png b/docs/source/_static/images/shake_small_weighted_test_acc.png new file mode 100644 index 0000000000000000000000000000000000000000..b959257703fc28675459de46dc4b2b7a25cbcd25 GIT binary patch literal 18231 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 CWmNV6 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/shake_small_weighted_training_loss.png b/docs/source/_static/images/shake_small_weighted_training_loss.png new file mode 100644 index 0000000000000000000000000000000000000000..0964accb9f2a59c0ea493f11b6ca729a57e4b4e2 GIT binary patch literal 26669 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 LRb?urO~d~m^uI9l literal 0 HcmV?d00001 diff --git a/docs/source/authors.rst b/docs/source/authors.rst deleted file mode 100644 index 72921f4e..00000000 --- a/docs/source/authors.rst +++ /dev/null @@ -1,9 +0,0 @@ -Authors -======= - -:: - - Sebastian Caldas - PhD student, Machine Learning Department - Carnegie Mellon University - Email: [first-letter-first-name][last-name]@cmu.edu diff --git a/docs/source/contact.rst b/docs/source/contact.rst new file mode 100644 index 00000000..ebd858d6 --- /dev/null +++ b/docs/source/contact.rst @@ -0,0 +1,14 @@ +Contact +======= + +:: + + Sebastian Caldas + PhD student, Machine Learning Department + Carnegie Mellon University + Email: [first-letter-first-name][last-name]@cmu.edu + + Virginia Smith + Assistant Professor, Electrical and Computer Engineering Department + Carnegie Mellon University + Email: [last-name][first-letter-first-name]@cmu.edu diff --git a/docs/source/index.rst b/docs/source/index.rst index 0bd4ae1a..01ef7adf 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -38,7 +38,7 @@ See the source code repository on GitHub: https://github.com/TalwalkarLab/leaf :hidden: :caption: Additional Information - authors + contact citations `Getting started `_ @@ -57,7 +57,7 @@ A set of examples illustrating the use of different models and datasets with LEA The exact API of all functions and classes, as given in the docstring. -`Authors `_ +`Contact `_ ------------------------- Contact information of LEAF authors diff --git a/docs/source/tutorials/femnist-md.md b/docs/source/tutorials/femnist-md.md new file mode 100644 index 00000000..b6b6cce2 --- /dev/null +++ b/docs/source/tutorials/femnist-md.md @@ -0,0 +1,72 @@ +# Systems Resource Requirement Analysis + +In this experiment, we reproduce the systems analysis experiment conducted in the [LEAF paper](https://arxiv.org/abs/1812.01097). + +Specifically, we identify the systems budget (in terms of compute [number of FLOPs] +and network bandwidth) required when training with minibatch SGD vs. `FedAvg`, using the LEAF framework. + +For this example, we shall use the FEMNIST dataset to perform an image classification task using a +2-layer convolutional neural network. + +# Experiment Setup and Execution + +For this experiment, we describe how to use the LEAF framework to execute minibatch SGD for 3 clients with a +10% batch-size. + +## Quickstart script + +In the interest of ease of use, we provide a script for execution of the experiment +for different settings for SGD and `FedAvg`, which may be executed as: + +```bash +leaf/ $> ./femnist.sh +``` + +This script will execute the instructions provided using both minibatch SGD and `FedAvg` for different configurations of clients per round, batch size and local epochs, reproducibly generating the data partitions and results observed by the authors during analysis. + +## Dataset fetching and pre-processing + +LEAF contains powerful scripts for fetching and conversion of data into JSON format for easy utilization. +Additionally, these scripts are also capable of subsampling from the dataset, and splitting the dataset +into training and testing sets. + +For our experiment, as a first step, we shall use 5% of the dataset in an 80-20 train/test split. The following command shows +how this can be accomplished (the `--spltseed` and `--smplseed` flags in this case is to enable reproducible generation of the dataset) + +```bash +leaf/data/femnist/ $> ./preprocess.sh -s iid --sf 0.05 -k 0 -t sample --smplseed 1549786595 --spltseed 1549786796 +``` + +After running this script, the `data/femnist/data` directory should contain `train/` and `test/` directories. + +## Model Execution + +Now that we have our data, we can execute our model! For this experiment, the model file is stored +at `models/femnist/cnn.py`. In order train this model using SGD with 3 clients per round +and 10% batch size, we execute the following command: + +```bash +leaf/models $> python main.py -dataset femnist -model cnn -lr 0.06 --minibatch 0.1 --clients-per-round 3 --num-rounds 2000 +``` + +## Metrics Collection + +Executing the above command will write out system and statistical metrics to `leaf/models/metrics/stat_metrics.csv` and `leaf/models/metrics/sys_metrics.csv` - since these are overwritten for every run, we __highly recommend__ storing the generated metrics files at a different location. + +To experiment with a different configuration, re-run the main model script with a different flags. The plots shown below can be generated using `plots.py` file in the repo root. + +# Results and Analysis + +For an accuracy threshold of 75%, we see an improved systems profile of FedAvg when it comes to the communication +vs. local computation trade-off, though we note that in general methods may vary across these two +dimensions, and it is thus important to consider both aspects depending on the problem at hand. + +

+ +![](../_static/images/femnist_75_thresh.png "Systems profile of different methods (75% accuracy threshold)") + +
+ +# More Information + +More information about the framework, challenges and experiments can be found in the [LEAF paper](https://arxiv.org/abs/1812.01097). diff --git a/docs/source/tutorials/index.rst b/docs/source/tutorials/index.rst index 2d71fdd0..4312e154 100644 --- a/docs/source/tutorials/index.rst +++ b/docs/source/tutorials/index.rst @@ -3,7 +3,40 @@ General Examples General-purpose and introductory examples to the LEAF framework. +`Twitter Sentiment Analysis `_ +----------------------------------------------- + +Investigate the effect of varying the minimum number of samples per user (for training) +on model accuracy when training using `FedAvg` algorithm. + .. toctree:: :maxdepth: 1 + :hidden: sent140-md + +`Convergence Properties of FedAvg `_ +--------------------------------------------------------- + +Investigate the effect of varying the minimum number of samples per user (for training) +on model accuracy when training using `FedAvg` algorithm. + +.. toctree:: + :maxdepth: 1 + :hidden: + + shakespeare-md + +`Systems Resource Requirement Analyses `_ +----------------------------------------------------------- + +Investigate the systems budget (in terms of compute [number of FLOPs] +and network bandwidth) required to achieve an accuracy of 75% on FEMNIST dataset +using both minibatch SGD and `FedAvg` + +.. toctree:: + :maxdepth: 0 + :hidden: + + femnist-md + diff --git a/docs/source/tutorials/sent140-md.md b/docs/source/tutorials/sent140-md.md index 7e3dae4e..ddc7a4d8 100644 --- a/docs/source/tutorials/sent140-md.md +++ b/docs/source/tutorials/sent140-md.md @@ -1,22 +1,78 @@ # Twitter Sentiment Analysis -## Significance of experiments +In this experiment, we reproduce the statistical analysis experiment conducted in the [LEAF paper](https://arxiv.org/abs/1812.01097). Specifically, we investigate the effect of varying the minimum number of +samples per user (for training) on model accuracy when training using `FedAvg` algorithm, +using the LEAF framework. -- Statistical test - vary number of users to see effect on accuracy/performance +For this example, we shall use Sentiment140 dataset (containing 1.6 million tweets), +and we shall train a 2-layer LSTM model with cross-entropy loss, and using pre-trained GloVe embeddings. + +# Experiment Setup and Execution + +## Quickstart script + +In the interest of ease of use, we provide a script for execution of the experiment +for different min-sample counts, which may be executed as: + +```bash +leaf/ $> ./sent140.sh +``` + +This script will execute the instructions provided below for min-sample counts of 3, 10, 30 and 100, reproducibly generating the data partitions and results observed by the authors during analysis. ## Pre-requisites -- **Dataset**: Generate data with `k` samples per user, run (`-t sample` required for running baseline impl). +Since this experiment requires pre-trained word embeddings, we recommend running the +`models/sent140/get_embs.sh` file, which fetches 300-dimensional pretrained GloVe vectors. +```bash +leaf/models/sent140/ $> ./get_embs.sh +``` +After extraction, this data is stored in `models/sent140/embs.json`. + +## Dataset fetching and pre-processing + +LEAF contains powerful scripts for fetching and conversion of data into JSON format for easy utilization. +Additionally, these scripts are also capable of subsampling from the dataset, and splitting the dataset +into training and testing sets. + +For our experiment, as a first step, we shall use 50% of the dataset in an 80-20 train/test split, +and we shall discard all users with less than 10 tweets. The following command shows +how this can be accomplished (the `--spltseed` flag in this case is to enable reproducible generation of the dataset) + +```bash +leaf/data/sent140/ $> ./preprocess.sh --sf 0.5 -t sample --tf 0.8 -k 3 --spltseed 1549775860 +``` -- **GloVe Embeddings**: Setup glove embeddings as a json file (required even for BoW logistic regression since defines vocab dict) - VOCAB_DIR variable in bag_log_reg, sent140/get_embs.sh fetches and extracts embeddings to correct location +After running this script, the `data/sent140/data` directory should contain `train/` and `test/` directories. ## Model Execution -- Run (2 clients for 10 rounds, converges to accuracy: 0.609676, 10th percentile: 0.25, 90th percentile 1 for k=100). Uses FedAvg for distributed learning (since --minibatch isn’t specified) +Now that we have our data, we can execute our model! For this experiment, the model file is stored +at `models/sent140/stacked_lstm.py`. In order train this model using `FedAvg` with 2 clients every round for 10 rounds, +we execute the following command: + +```bash +leaf/models $> python3 main.py -dataset sent140 -model stacked_lstm -lr 0.0003 --clients-per-round 2 --num-rounds 10 +``` + +Alternatively, passing `-t small` in place of the latter 2 flags provides the same functionality (as defined in `models/baseline_constants.py` file). + +## Metrics Collection + +Executing the above command will write out system and statistical metrics to `leaf/models/metrics/stat_metrics.csv` and `leaf/models/metrics/sys_metrics.csv` - since these are overwritten for every run, we __highly recommend__ storing the generated metrics files at a different location. + +To experiment with a different min-sample setting, re-run the preprocessing script with a different `-k` flag. The plots shown below can be generated using `plots.py` file in the repo root. + +# Results and Analysis + +Upon performing this experiment, we see that, while median performance degrades only slightly with data-deficient users (i.e., k = 3), the 25th percentile (bottom of box) degrades dramatically. + +
-- Metrics written out to metrics/stat_metrics.csv and metrics/sys_metrics.csv (configurable via main.py:L20,21) +![](../_static/images/leaf_rep_sent140.png "Sentiment140 Results") -### Quickstart script +
-In the root of the LEAF directory, execute `./sent140.sh` +# More Information +More information about the framework, challenges and experiments can be found in the [LEAF paper](https://arxiv.org/abs/1812.01097). diff --git a/docs/source/tutorials/shakespeare-md.md b/docs/source/tutorials/shakespeare-md.md new file mode 100644 index 00000000..5fe551b1 --- /dev/null +++ b/docs/source/tutorials/shakespeare-md.md @@ -0,0 +1,71 @@ +# Convergence Behaviour of FederatedAveraging + +In this experiment, we reproduce the convergence analysis experiment conducted in the [LEAF paper](https://arxiv.org/abs/1812.01097). Specifically, we investigate the convergence behaviour of `FedAvg` algorithm +when varying the number of local epochs, using the LEAF framework. + +For this example, we shall use the Shakespeare dataset to perform a character-prediction task; +that is, given a statement by a character in a play, we shall try to predict the next character in the sentence. +For this experiment, we shall train a 2-layer LSTM model with cross-entropy loss, using randomly initialized word embeddings. + +# Experiment Setup and Execution + +## Quickstart script + +In the interest of ease of use, we provide a script for execution of the experiment +for different number of local epochs, which may be executed as: + +```bash +leaf/ $> ./shakespeare.sh +``` + +This script will execute the instructions provided below for local epoch values of 1 and 20, +reproducibly generating the data partitions and results observed by the authors during analysis. + +## Dataset fetching and pre-processing + +LEAF contains powerful scripts for fetching and conversion of data into JSON format for easy utilization. +Additionally, these scripts are also capable of subsampling from the dataset, and splitting the dataset +into training and testing sets. + +For our experiment, as a first step, we shall use 5% of the dataset in an 90-10 train/test split, +and we shall discard all users with less than 64 samples. The following command shows +how this can be accomplished (the `--spltseed` and `--smplseed` flags in this case is to enable reproducible generation of the dataset) + +```bash +leaf/data/shakespeare/ $> ./preprocess.sh --sf 0.05 -t sample --tf 0.9 -k 64 --smplseed 1550262838 --spltseed 1550262839 +``` + +After running this script, the `data/shakespeare/data` directory should contain `train/` and `test/` directories. + +## Model Execution + +Now that we have our data, we can execute our model! For this experiment, the model file is stored +at `models/shakespeare/stacked_lstm.py`. In order train this model using `FedAvg` with 10 clients per round +and 1 local epoch per round, we execute the following command: + +```bash +leaf/models $> python main.py -dataset shakespeare -model stacked_lstm --num-rounds 81 --clients-per-round 10 --num_epochs 1 -lr 0.8 +``` + +## Metrics Collection + +Executing the above command will write out system and statistical metrics to `leaf/models/metrics/stat_metrics.csv` and `leaf/models/metrics/sys_metrics.csv` - since these are overwritten for every run, we __highly recommend__ storing the generated metrics files at a different location. + +To experiment with a different number of local epochs, re-run the main model script with a different `--num_epochs` flag. The plots shown below can be generated using `plots.py` file in the repo root. + +# Results and Analysis + +From the generated data, we computed the aggregate weighted training loss and training accuracy +(note that weighting is important to correct for label imbalance). Also, we note that `FedAvg` +method diverges as the number of local epochs increases. + +
+ +![](../_static/images/shake_small_weighted_test_acc.png "Weighted Test Accuracy on Shakespeare dataset using FedAvg") +![](../_static/images/shake_small_weighted_training_loss.png "Weighted Training Loss on Shakespeare dataset using FedAvg") + +
+ +# More Information + +More information about the framework, challenges and experiments can be found in the [LEAF paper](https://arxiv.org/abs/1812.01097).