├── README.md ├── hyperparameters ├── README.md ├── hyperparameters.ipynb ├── pickle_utils.py └── requirements.txt ├── modelserver ├── README.md ├── app.py └── requirements.txt ├── pywren ├── README.md ├── adding.ipynb ├── counting.ipynb ├── pywren_utils.py └── requirements.txt └── zappa ├── README.md ├── app.py └── app2.py /README.md: -------------------------------------------------------------------------------- 1 | # Serverless for data scientists 2 | 3 | Code and notebooks for a talk given at PyBay, 2018-08-19. 4 | 5 | - [Slides and words](https://mike.place/talks/serverless/) 6 | - [Video](https://www.youtube.com/watch?v=9PR2-ogB5qM) 7 | 8 | ## Contents 9 | 10 | 1. [Deployment of a basic flask application with zappa](zappa/) 11 | 2. [Pywren demo](pywren/) 12 | 3. [Hyperparameter optimization with pywren](hyperparameters/) 13 | 4. [Model deployment on AWS Lambda with zappa](modelserver/) 14 | 15 | ## Projects and resources mentioned in the talk 16 | 17 | - [zappa](https://github.com/Miserlou/zappa) -- tool for AWS Lambda deployment 18 | of Python applications 19 | - [dwx](http://github.com/williamsmj/dwx) -- Twitter bot that runs on AWS 20 | Labmda. 21 | - [Serving 39 Million Requests for 22 | $370/Month](https://trackchanges.postlight.com/serving-39-million-requests-for-370-month-or-how-we-reduced-our-hosting-costs-by-two-orders-of-edc30a9a88cd) 23 | -- AWS Lambda migration example 24 | - [Occupy the Cloud: Distributed Computing for the 25 | 99%](https://arxiv.org/abs/1702.04024) -- the pywren paper 26 | - [pywren](https://github.com/pywren/pywren) -- tool for embarrassingly 27 | parallel computation using AWS Lambda as the backend 28 | - [riscamp 2017 pywren 29 | tutorial](https://github.com/ucbrise/risecamp/tree/risecamp2017/pywren) -- 30 | more detailed look at pywren than my talk 31 | - [pywren web 32 | scraping](https://blog.seanssmith.com/posts/pywren-web-scraping.html) -- 33 | blog post that inspired the webscraping example in the talk 34 | - [305 Million Solutions to The Black-Scholes Equation in 16 Minutes with AWS 35 | Lambda](http://www.bradfordlynch.com/blog/2017/05/28/ComputeOnLambda.html) 36 | -- large scale embarrassingly parallel numerical computation example 37 | - [nips.json](https://github.com/williamsmj/nips.json) -- code to scrape the 38 | NIPS website using pywren (and the data scraped) 39 | - [Encoding, Fast and Slow: Low-Latency Video Processing Using Thousands of 40 | Tiny 41 | Threads](https://www.usenix.org/conference/nsdi17/technical-sessions/presentation/fouladi) 42 | -- an example of AWS Lambda as part of a long-lived data processing pipeline 43 | (doesn't use pywren) 44 | -------------------------------------------------------------------------------- /hyperparameters/README.md: -------------------------------------------------------------------------------- 1 | # Hyperparameter optimization with pywren 2 | 3 | 1. Install matplotlib, notebook, numpy, pywren, scikit-learn and scipy, e.g. 4 | `pip install -r requirements.txt` 5 | 6 | 2. Run the notebook! 7 | -------------------------------------------------------------------------------- /hyperparameters/hyperparameters.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Training a model locally" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "%matplotlib inline\n", 17 | "import matplotlib.pyplot as plt\n", 18 | "\n", 19 | "import sklearn.datasets\n", 20 | "from sklearn.model_selection import train_test_split\n", 21 | "from sklearn.neighbors import KNeighborsClassifier" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 2, 27 | "metadata": {}, 28 | "outputs": [], 29 | "source": [ 30 | "X, y = sklearn.datasets.make_blobs(n_samples=1000,\n", 31 | " centers=2,\n", 32 | " center_box=(4,8),\n", 33 | " random_state=42)" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 3, 39 | "metadata": {}, 40 | "outputs": [ 41 | { 42 | "data": { 43 | "image/png": "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\n", 44 | "text/plain": [ 45 | "
" 46 | ] 47 | }, 48 | "metadata": {}, 49 | "output_type": "display_data" 50 | } 51 | ], 52 | "source": [ 53 | "fig, ax = plt.subplots()\n", 54 | "\n", 55 | "plt.scatter(X[:,0], X[:,1], c=y, alpha=0.5);\n", 56 | "\n", 57 | "fig.savefig(\"/Users/mike/Desktop/fig.pdf\")" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": 4, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [ 66 | "Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, test_size=0.5, random_state=0)" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": 5, 72 | "metadata": {}, 73 | "outputs": [ 74 | { 75 | "data": { 76 | "text/plain": [ 77 | "0.838" 78 | ] 79 | }, 80 | "execution_count": 5, 81 | "metadata": {}, 82 | "output_type": "execute_result" 83 | } 84 | ], 85 | "source": [ 86 | "from sklearn.neighbors import KNeighborsClassifier\n", 87 | "\n", 88 | "classifier = KNeighborsClassifier(n_neighbors=5)\n", 89 | "classifier.fit(Xtrain, ytrain)\n", 90 | "classifier.score(Xtest, ytest)" 91 | ] 92 | }, 93 | { 94 | "cell_type": "markdown", 95 | "metadata": {}, 96 | "source": [ 97 | "# Hyperparameter optimization with pywren" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": 6, 103 | "metadata": {}, 104 | "outputs": [], 105 | "source": [ 106 | "all_hyperparams = [{'n_neighbors': k} for k in range(1, 9)]" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 7, 112 | "metadata": {}, 113 | "outputs": [ 114 | { 115 | "data": { 116 | "text/plain": [ 117 | "[{'n_neighbors': 1},\n", 118 | " {'n_neighbors': 2},\n", 119 | " {'n_neighbors': 3},\n", 120 | " {'n_neighbors': 4},\n", 121 | " {'n_neighbors': 5},\n", 122 | " {'n_neighbors': 6},\n", 123 | " {'n_neighbors': 7},\n", 124 | " {'n_neighbors': 8}]" 125 | ] 126 | }, 127 | "execution_count": 7, 128 | "metadata": {}, 129 | "output_type": "execute_result" 130 | } 131 | ], 132 | "source": [ 133 | "all_hyperparams" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 8, 139 | "metadata": {}, 140 | "outputs": [], 141 | "source": [ 142 | "def train_model(hyperparams):\n", 143 | " classifier = KNeighborsClassifier(**hyperparams)\n", 144 | " classifier.fit(Xtrain, ytrain)\n", 145 | " return classifier" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 9, 151 | "metadata": {}, 152 | "outputs": [], 153 | "source": [ 154 | "import pywren\n", 155 | "pwex = pywren.default_executor()" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 10, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "name": "stderr", 165 | "output_type": "stream", 166 | "text": [ 167 | "/Users/mike/p/talks/pybay-serverless-datascientists/hyperparameters/.direnv/python-3.6.3/lib/python3.6/site-packages/sklearn/base.py:311: UserWarning: Trying to unpickle estimator KNeighborsClassifier from version 0.19.0 when using version 0.19.2. This might lead to breaking code or invalid results. Use at your own risk.\n", 168 | " UserWarning)\n" 169 | ] 170 | } 171 | ], 172 | "source": [ 173 | "classifiers = pywren.get_all_results(pwex.map(train_model, all_hyperparams))" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 11, 179 | "metadata": {}, 180 | "outputs": [ 181 | { 182 | "name": "stdout", 183 | "output_type": "stream", 184 | "text": [ 185 | "{'n_neighbors': 1} 0.758\n", 186 | "{'n_neighbors': 2} 0.782\n", 187 | "{'n_neighbors': 3} 0.814\n", 188 | "{'n_neighbors': 4} 0.82\n", 189 | "{'n_neighbors': 5} 0.838\n", 190 | "{'n_neighbors': 6} 0.838\n", 191 | "{'n_neighbors': 7} 0.842\n", 192 | "{'n_neighbors': 8} 0.828\n" 193 | ] 194 | } 195 | ], 196 | "source": [ 197 | "for hyperparams, classifier in zip(all_hyperparams, classifiers):\n", 198 | " print(hyperparams, classifier.score(Xtest, ytest))" 199 | ] 200 | }, 201 | { 202 | "cell_type": "markdown", 203 | "metadata": {}, 204 | "source": [ 205 | "# Deployment and serving" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 12, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [ 214 | "import pickle_utils\n", 215 | "\n", 216 | "pickle_utils.pickle_to_s3(bucket_name=\"modelservingdemo\",\n", 217 | " key=\"classifier.pkl\",\n", 218 | " obj=classifiers[6])" 219 | ] 220 | } 221 | ], 222 | "metadata": { 223 | "kernelspec": { 224 | "display_name": "Python 3", 225 | "language": "python", 226 | "name": "python3" 227 | }, 228 | "language_info": { 229 | "codemirror_mode": { 230 | "name": "ipython", 231 | "version": 3 232 | }, 233 | "file_extension": ".py", 234 | "mimetype": "text/x-python", 235 | "name": "python", 236 | "nbconvert_exporter": "python", 237 | "pygments_lexer": "ipython3", 238 | "version": "3.6.3" 239 | } 240 | }, 241 | "nbformat": 4, 242 | "nbformat_minor": 2 243 | } 244 | -------------------------------------------------------------------------------- /hyperparameters/pickle_utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | import pickle 3 | from io import BytesIO 4 | 5 | import boto3 6 | from botocore.config import Config 7 | 8 | s3client = boto3.client('s3', config=Config(signature_version='s3v4')) 9 | 10 | 11 | def congfigure_bucket_as_website(bucket_name): 12 | s3client.create_bucket(Bucket=bucket_name) 13 | website_configuration = { 14 | "ErrorDocument": {"Key": "error.html"}, 15 | "IndexDocument": {"Suffix": "index.html"}, 16 | } 17 | s3client.put_bucket_website(Bucket=bucket_name, 18 | WebsiteConfiguration=website_configuration) 19 | bucket_policy = json.dumps( 20 | { 21 | "Version": "2012-10-17", 22 | "Statement": [ 23 | { 24 | "Sid": "PublicReadGetObject", 25 | "Effect": "Allow", 26 | "Principal": "*", 27 | "Action": ["s3:GetObject"], 28 | "Resource": ["arn:aws:s3:::{}/*".format(bucket_name)], 29 | } 30 | ], 31 | } 32 | ) 33 | s3client.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy) 34 | 35 | 36 | def pickle_to_s3(obj, bucket_name, key): 37 | congfigure_bucket_as_website(bucket_name) 38 | with BytesIO() as data: 39 | pickle.dump(obj, data) 40 | data.seek(0) 41 | s3client.create_bucket(Bucket=bucket_name) 42 | s3client.put_object(Body=data, Bucket=bucket_name, Key=key) 43 | 44 | 45 | def pickle_from_s3(bucket_name, key): 46 | with BytesIO() as data: 47 | s3client.download_fileobj(Bucket=bucket_name, Key=key, Fileobj=data) 48 | data.seek(0) 49 | return pickle.load(data) 50 | -------------------------------------------------------------------------------- /hyperparameters/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==2.2.3 2 | notebook==5.7.8 3 | numpy==1.15.0 4 | pywren==0.3.0 5 | scikit-learn==0.19.2 6 | scipy==1.1.0 7 | -------------------------------------------------------------------------------- /modelserver/README.md: -------------------------------------------------------------------------------- 1 | # Model deployment on AWS Lambda with zappa 2 | 3 | 1. Follow the instructions in [../hyperparameters/](../hyperparameters/) to 4 | train and upload and model to S3. 5 | 6 | 2. Create and activate a virtual environment (note you must create a fresh 7 | virtual environment to use zappa), e.g. 8 | 9 | python -m virtualenv venv && source venv/bin/activate 10 | 11 | 2. Install the requirements: 12 | 13 | pip install -r requirements.txt 14 | 15 | 4. Run `zappa init` and accept all the defaults 16 | 17 | 5. Run `zappa deploy`. The output of this command (or `zappa status`) includes 18 | the public `amazonaws.com` URL of your deployed flask application. It will 19 | look something like 20 | `https://abcdef123.execute-api.us-east-1.amazonaws.com/dev/` 21 | 22 | 6. Visit `your_amazonaws_url/predict?feature_1=3&feature_2=6` to get a 23 | prediction. 24 | -------------------------------------------------------------------------------- /modelserver/app.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | 3 | import requests 4 | from flask import Flask, request 5 | 6 | app = Flask(__name__) 7 | 8 | url = "https://s3.amazonaws.com/modelservingdemo/classifier.pkl" 9 | r = requests.get(url) 10 | classifier = pickle.loads(r.content) 11 | 12 | 13 | @app.route("/predict") 14 | def predict(): 15 | X = [[float(request.args['feature_1']), 16 | float(request.args['feature_2'])]] 17 | label = classifier.predict(X) 18 | if label == 0: 19 | return 'purple blob' 20 | else: 21 | return 'yellow blob' 22 | 23 | 24 | if __name__ == "__main__": 25 | app.run() 26 | -------------------------------------------------------------------------------- /modelserver/requirements.txt: -------------------------------------------------------------------------------- 1 | numpy==1.15.0 2 | scikit-learn==0.19.2 3 | scipy==1.1.0 4 | requests==2.20.0 5 | -------------------------------------------------------------------------------- /pywren/README.md: -------------------------------------------------------------------------------- 1 | # Pywren demo 2 | 3 | 1. Install pywren (e.g. `pip install pywren`). If you want to make the plot, 4 | install the rest of the requirements in requirements.txt (`e.g. pip install 5 | -r requirements.txt`) 6 | 7 | 2. Configure AWS credentials, e.g. set the appropriate environment variables or 8 | put them in `~/.aws/credentials` 9 | 10 | 3. Run `pywren-setup` and accept the defaults. 11 | 12 | 4. Launch the notebooks. 13 | 14 | 5. For a more complete demo, see the [pywren tutorial at the 2017 15 | risecamp](https://github.com/ucbrise/risecamp/tree/risecamp2017/pywren). 16 | -------------------------------------------------------------------------------- /pywren/adding.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Local application of functions to lists" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "def square(x):\n", 17 | " return x * x" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "parameters = [0, 1, 2, 3, 4, 5]" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 3, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "data": { 36 | "text/plain": [ 37 | "[0, 1, 4, 9, 16, 25]" 38 | ] 39 | }, 40 | "execution_count": 3, 41 | "metadata": {}, 42 | "output_type": "execute_result" 43 | } 44 | ], 45 | "source": [ 46 | "[square(x) for x in parameters]" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 4, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "mapped = map(square, parameters)" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 5, 61 | "metadata": {}, 62 | "outputs": [ 63 | { 64 | "data": { 65 | "text/plain": [ 66 | "" 67 | ] 68 | }, 69 | "execution_count": 5, 70 | "metadata": {}, 71 | "output_type": "execute_result" 72 | } 73 | ], 74 | "source": [ 75 | "mapped" 76 | ] 77 | }, 78 | { 79 | "cell_type": "code", 80 | "execution_count": 6, 81 | "metadata": {}, 82 | "outputs": [ 83 | { 84 | "data": { 85 | "text/plain": [ 86 | "[0, 1, 4, 9, 16, 25]" 87 | ] 88 | }, 89 | "execution_count": 6, 90 | "metadata": {}, 91 | "output_type": "execute_result" 92 | } 93 | ], 94 | "source": [ 95 | "list(mapped)" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": {}, 101 | "source": [ 102 | "# Remote application of functions to lists with pywren" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 7, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [ 111 | "import pywren\n", 112 | "\n", 113 | "pwex = pywren.default_executor()" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 8, 119 | "metadata": {}, 120 | "outputs": [], 121 | "source": [ 122 | "futures = pwex.map(square, parameters)" 123 | ] 124 | }, 125 | { 126 | "cell_type": "code", 127 | "execution_count": 9, 128 | "metadata": {}, 129 | "outputs": [ 130 | { 131 | "data": { 132 | "text/plain": [ 133 | "[,\n", 134 | " ,\n", 135 | " ,\n", 136 | " ,\n", 137 | " ,\n", 138 | " ]" 139 | ] 140 | }, 141 | "execution_count": 9, 142 | "metadata": {}, 143 | "output_type": "execute_result" 144 | } 145 | ], 146 | "source": [ 147 | "futures" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 10, 153 | "metadata": {}, 154 | "outputs": [ 155 | { 156 | "data": { 157 | "text/plain": [ 158 | "[0, 1, 4, 9, 16, 25]" 159 | ] 160 | }, 161 | "execution_count": 10, 162 | "metadata": {}, 163 | "output_type": "execute_result" 164 | } 165 | ], 166 | "source": [ 167 | "[f.result() for f in futures]" 168 | ] 169 | }, 170 | { 171 | "cell_type": "markdown", 172 | "metadata": {}, 173 | "source": [ 174 | "# Visualizing remote application\n", 175 | "\n", 176 | "Plotting code taken from the [pywren tutorial at the 2017 risecamp](https://github.com/ucbrise/risecamp/tree/risecamp2017/pywren)" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 11, 182 | "metadata": {}, 183 | "outputs": [], 184 | "source": [ 185 | "%matplotlib inline\n", 186 | "\n", 187 | "from pywren_utils import plot_pywren_execution" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 12, 193 | "metadata": {}, 194 | "outputs": [ 195 | { 196 | "name": "stdout", 197 | "output_type": "stream", 198 | "text": [ 199 | "Populating the interactive namespace from numpy and matplotlib\n" 200 | ] 201 | }, 202 | { 203 | "data": { 204 | "image/png": "iVBORw0KGgoAAAANSUhEUgAABFoAAAIaCAYAAAAQtinFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xtcz/f///FbZ3KKHKeG9eONTyElM6fJabPFnPIhh9icPttscxgmvpsMa4bNDrZhh2aLMIfZpigjH0qEIeY4QtQaSql4v39/uPT+aBXhrWzu13928Xw9X8/X4/V6e+9yed89n8+XlclkMiEiIiIiIiIiIvfMurQLEBERERERERH5p1DQIiIiIiIiIiJiIQpaREREREREREQsREGLiIiIiIiIiIiFKGgREREREREREbEQBS0iIiIiIiIiIhaioEVERERERERExEIUtIiIiIiIiIiIWIiCFhERERERERERC1HQIiIiIiIiIiJiIX+LoGXVqlUYDAbi4+MLPX7ixAnGjh1L+/btadq0KX5+foSGhmI0Gku4UhERERERERF5mD3wQUtCQgLBwcFFHj906BB9+vRh/fr1PPLII7Rt25bk5GRmzJjB66+/XoKVioiIiIiIiMjDzra0C7iVDRs2MHnyZDIzMws9bjKZeP3118nIyCAkJIQePXoAkJaWRmBgIOvWraNz58507dq1JMsWERERERERkYfUAzmjJTk5mddff50xY8ZgNBqpWrVqof22bdvG4cOH8fHxMYcsAFWqVOHNN98EIDQ0tCRKFhERERERERF5MIOW+fPns2bNGtzd3Vm2bBmPPfZYof22bt0KQKdOnQoca968Oc7OzuzatYuMjIz7Wq+IiIiIiIiICDygQctjjz3GO++8Q3h4OAaDoch+R48eBaBBgwaFHq9Xrx5Go5Fjx47dlzpFRERERERERG72QO7RMmLEiGL1u3DhAgDVqlUr9Hhee2pqqmUKExERERERERG5hQcyaCmurKwsAMqUKVPo8bz2ojbTLa6DBw+SnZ2NjY0NDg4O9zSWiIiIiIiIiDw4srOzuX79Og4ODjRu3Piex/tbBy02NjYAWFlZ3bKf0Wi8p+tkZ2djNBoxGo3k5ube01giIiIiIiIi8uDJzs62yDh/66ClbNmyAFy9erXQ43nt5cqVu6fr2NjYYDQasba2xtHR8Z7GEhEREREREZEHR2ZmJkaj0TyZ4179rYOW6tWrk5iYSGpqKm5ubgWOp6SkAEXv4VJcDg4O5Obm4ujoeMvNeUVERERERETk7+Xw4cNkZGRYbKuQB/KtQ8VVv3594H9vH7qZyWTi+PHj2NjYFBrCiIiIiIiIiIhY2t86aGnbti0AmzZtKnBs9+7dpKWl4eXlRfny5Uu6NBERERERERF5CP2tgxYfHx/q16/Ptm3bWL58ubk9LS2Nt956C4ChQ4eWVnkiIiIiIiIi8pD5W+/RYm1tzcyZMxkyZAhTp05lxYoVVK9enbi4OC5duoS/vz++vr6lXaaIiIiIiIiIPCT+1kELQJMmTQgPD+eDDz4gNjaWI0eOUKdOHcaOHUvfvn1LuzwREREREREReYhYmUwmU2kX8aDL24G4fPnyeuuQiIiIiIiIyD+IpX/z/633aBEREREREREReZD87ZcOPYiMRiNpaWmkp6eTnZ2NJg2JlB4rKyscHByoUKECVapUwdpa+bKIiIiIiNw/CloszGg0cvr0aTIzM0u7FBEBTCYTV69e5erVq1y5cgVXV1eFLSIiIiIict8oaLGwtLQ0MjMzsbW1pWbNmpQrV04/6kRKkdFo5MqVKyQnJ5OZmUlaWhpVq1Yt7bJEREREROQfSgmAhaWnpwNQs2ZNKlSooJBFpJRZW1tToUIFatasCfzvOyoiIiIiInI/KAWwsOzsbADKlStXypWIyM3yvpN531EREREREZH7QUGLheVtfKuZLCIPFisrKwBtTi0iIiIiIveV0gAReSjkBS0iIiIiIiL3k4IWERERERERERELUdAiIiIiIiIiImIher1zKfAbt6a0S7gr697rUdol3Dcmk0lLS4qgZyMiIiIiIlJ8mtEiJWrBggUYDAY+/vjj0i4FuPGq3xkzZrB27drSLoVVq1ZhMBiYMmVKiV970KBBGAwG4uPjzW3Z2dl8+OGHLFq0qMTrERERERER+btS0CIPtZCQEEJDQ7l+/Xppl/LA+eKLL1iwYAFXr14t7VJERERERET+NrR0SB5qRqOxtEt4ILzzzjtkZWVRu3Ztc5uejYiIiIiIyJ1T0CIiPPLII6VdgoiIiIiIyD+Clg5JqYmOjqZ///40a9aMFi1a8Pzzz7N3795C+x45coQJEybQpk0b3N3dadu2La+//jrHjh0r0Ddvb5HnnnsOT09Pmjdvjr+/P6GhoVy7ds3cz2AwsGLFCgAmT56MwWAgNjb2tnWvXr2agIAAHn/8cZo0acLTTz/Nu+++y59//pmvX2H7nuT5+OOPMRgMLFiwoNBrbNu2DX9/f5o0aUKbNm0ICgoiOTk5X5+kpCQMBgOvvfYaSUlJjB07lpYtW+Lp6cngwYPZv38/AHFxcQwaNAhPT0/at2/P5MmTb1urr68v77//PgAffvghBoOBVatW3fbZiIiIiIiIPOwUtEipWLduHaNGjeLixYu0adMGJycnYmJiCAgI4NChQ/n6bty4kV69erF27VqcnZ3p2LEjlStXZs2aNfTu3ZstW7aY+5pMJsaPH8+CBQu4ePEiTzzxBN7e3vz222/MmDGDoKAgc18/Pz8effRRADw9PfHz86Nq1aq3rPvrr79m4sSJJCYm4uHhQbt27cjIyGDRokUMGDCA7Ozse3428fHxDB8+nLS0NJ588knKlStHeHg4ffr04fTp0wX6JyUl0bt3b+Li4vD29qZGjRrExsYyePBgli1bRmBgIBcvXqR169ZcvXqVVatWMWLEiFvW0KlTJxo2bAhAgwYN8j0rERERERERKZqWDkmpOH78OJMmTWLo0KEAXLt2jZdffpmoqCi++eYbZsyYAcCFCxcYP348165dIyQkhB49/veK6RUrVhAUFMTYsWP5+eefqVq1Krt27SIiIgIfHx+++OILbG1v/BU/c+YMvXv35vvvv+fFF1/E1dWVOXPmMGXKFE6dOoW/vz+9evW6Zc05OTnMnTsXJycnfvjhB6pVq2ZuHzp0KPHx8axfv/6249zOyZMn6dWrF8HBwdja2mI0GpkxYwZLly7lzTffZPHixfn679u3jzZt2vDRRx9RpkwZcnNzCQgIYO/evUybNo1x48aZg5XU1FS6devGvn37SExMpFGjRoXW8MYbb/Dxxx9z6NAhunTpwssvv3xP9yQiIiIiIvKw0IwWKRVNmzY1hywAtra2DBkyBIDDhw+b25cvX05WVhZ9+/bNF7IA9OnTh549e5Kens6yZcuAG8EMQLVq1cwhC0Dt2rWZOXMmISEhlCtX7q5qTk9PJysri7Jly+Lk5GRut7e3Z8qUKQQHB9O0adO7GvtmTk5OTJkyxVy/tbU1kyZNonr16sTExBQ6q2XSpEmUKVMGADs7O7p06QLAo48+ygsvvGDuV7VqVby8vAD4/fff77lWERERERERyU9Bi5QKT0/PAm21atUC4PLly+a2nTt3AvD0008XOk63bt3y9fP09MTOzo7169czcuRIVq5caQ5ffH196dGjB1WqVLmrmp2dnXnsscc4d+4cffv2ZfHixRw9ehSAxo0b4+/vj5ub212NfbMnn3yS8uXL52uzt7enTZs2AAX2fClXrhz169fP11a5cmXgxrIfa+v8X/OKFSsCWGSZk4iIiIiIiOSnoEVKRYUKFQq02djYAPlfK5wXktz82uGbubi4ADeWxMCNsGbWrFk4OjqyefNm3njjDdq2bctzzz3HwoULuXjx4j3VPW/ePFxcXEhMTCQkJIRnnnmGDh06MGPGDI4fP35PY+cp6l5r1KgB/O+Z5KlUqVKBvlZWVgD5Zt789ZiIiIiIiIhYnoIWKRV/nWVRFJPJdMvjeaGMvb29uc3Pz4/Nmzczc+ZMunbtipOTE4mJicybN49nnnmm0KU3xdWwYUN+/vlnPvnkE/z9/XF1deXs2bOEhobSvXt3Nm7cWKxxbg6T/ipvCVBRbl4SVdifRUREREREpPQoaJEHWvXq1YEbb9YpTF5o4uzsnK+9UqVK9O7dmw8++IAdO3YQFhZGs2bNSE1N5fPPP7+nmuzs7PD19SU4OJiNGzcSERFBr169yM3NZc6cOeZ+eTNHrl+/XmCMm5dH/dVfZ6zkOXPmDAA1a9a8l/JFRERERETkPlLQIg+0Fi1aAPDzzz8Xevynn34CwMfHB4CvvvqKDh06sGbNGnMfKysrPD09GT16NADnzp3Ld6y44uPjefrpp5k2bVq+9jp16jB16tQCYzs6OgL/W9Z0s7179xZ5ne3btxeYyZOVlcWWLVuwtrbG29u72DXfCy0xEhERERERuXMKWuSB5u/vj6OjI+Hh4axduzbfsZUrV7JmzRoqVKhA9+7dgRtv2Tl79iyffPIJf/zxh7nv9evXzaGMh4eHud3BwQG48Uah26lfvz6nT59mzZo17NmzJ9+x9evXFxjbYDAA8N1335Gbm2tuX7p0aYHzb3b06FHmz59v/nNOTg5Tp07l4sWLPPXUU+a9Wu63O3k2IiIiIiIicoM2d5AHWo0aNXjnnXcYO3YsEyZMYMmSJdSpU4eTJ09y6NAhHB0deffdd83hw5NPPkmXLl2IiIigU6dONG/enLJly5KYmEhSUhKPPfaY+TXScGM2CsBHH33Erl27GDJkiPn1x39VqVIlXn/9dd5++2369+9Ps2bNqFatGklJSRw4cABHR0cmTpxo7t+3b1+++eYbdu7cSdeuXXF3d+f48eMcPXoUPz8/1q1bV+h1mjZtysKFC9m4cSNubm7s37+fM2fO4ObmZp45UxLyns2yZcs4e/YsPXr0oHPnziV2fRERERERkb8jzWiRB16XLl1YsWIFzz77LCkpKWzatIn09HT69u3LqlWr6NChg7mvlZUV7733HmPHjsXV1ZX4+Hi2bNmCnZ0dI0eOZPny5fne0uPv70/37t25du0aW7du5ciRI7esZfDgwcydOxdvb2+OHDlCVFQUqamp9OzZk9WrV+eb0eLi4kJYWBidO3cmPT2dLVu2ULFiRT7//HPzDJzCdOrUiQULFmBra0t0dDTXr18nMDCQsLCwu3419d3o0KEDgwcPpkyZMmzZsoX9+/eX2LVFRERERET+rqxMt3uti3D48GEyMjIoX768eTlIURITEwFo1KhRSZQmIndA308REREREfmrO/nNXxya0SIiIiIiIiIiYiEKWkRERERERERELERBi4iIiIiIiIiIhShoERERERERERGxEAUtIiIiIiIiIiIWoqBFRERERERERMRCFLSIiIiIiIiIiFiIghYREREREREREQtR0CIiIiIiIiIiYiEKWkRERERERERELERBi4iIiIiIiIiIhShoERERERERERGxEAUtIiIiIiIiIiIWYlvaBTyMjr/du7RLuCuPTVlpsbFMJhNWVlYWG+9BVRL3+bA8SxERERERkb8DzWiRErd+/XrGjx9fYteLjY3FYDAQGBhYYte8cOEC48aNY+fOnff1Otu2beOFF164r9cQERERERGR4lPQIiVq9+7djB07lgsXLpR2KffVpEmT+OGHHzCZTPftGufPn2fYsGGcOHHivl1DRERERERE7oyCFilRRqOxtEsoESVxn/czxBEREREREZG7o6BFRERERERERMRCtBmulJhJkybx/fffAxAXF4fBYKBnz57Mnj0bgKysLJYuXUpERAQnTpwgKyuLSpUq4enpyYgRI2jSpEm+8Y4dO8aHH37Ivn37OH/+PJUqVaJ58+YMGzYMT0/P29azb98+AgMDuXr1KnPmzKFbt2637H/58mU++ugjYmJiSEpKwt7e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WiZPnsyWLVvYsGEDmzZtomPHjkX29ff3Z926dezcuRNfX1+aNm2KjY0Nv/76KykpKXh7e+d7+1CdOnUAeOutt1i7di3jxo3jueeeY8mSJURHR9O1a1caN27MxYsX2b17N0ajkXr16nHixIlizbCBGwGVk5MTFy9epH///nh4eDBlypRinSsiIiIiIiL3h2a0SIlycnIiODiY2rVrExcXx3//+18AXn31Vd544w3q1avH7t27iYmJoVy5crz66qusWrWKBg0acO7cOQ4dOgSAq6srYWFh9OjRg9zcXKKjo9m7dy8eHh7MmzeP8ePH37aW6tWr88orrwAwffp0MjIyiuxrb2/PokWLGD58OJUrV2b79u1s374dZ2dnxo0bxxdffGGeYQIwcuRInnzySdLT09m2bRsnT56kRo0afPvtt3Tu3JmrV6+yadMmjh8/zpNPPsm3337LuHHjAIiOji7Ws7SysiIkJIR69eqxf//+Yp8nIiIiIiIi94+VSWsObuvw4cNkZGRQvnx5DAbDLfsmJiYC0KhRo5IoTUTugL6fIiIiIiLyV3fym784NKNFRERERERERMRCFLSIiIiIiIiIiFiIghYREREREREREQtR0CIiIiIiIiIiYiEKWkRERERERERELERBi4iIiIiIiIiIhShoERERERERERGxEAUtIiIiIiIiIiIWoqBFRERERERERMRCFLSIiIiIiIiIiFiIghYREREREREREQtR0CIiIiIiIiIiYiEKWkRERERERERELMS2tAt4GPkvG13aJdyV5f0+Ke0SisVkMmFlZVXaZYiIiIiIiMhDSDNa5B9l27ZtvPDCC6VdRrF8/PHHGAwGFixYUNqliIiIiIiIiIVoRov8Y5w/f55hw4ZRu3bt0i5FREREREREHlKa0SL/GCaTqbRLEBERERERkYecghYREREREREREQtR0CIl7pdffmHYsGG0adMGDw8POnXqxJtvvsm5c+cK7b9u3ToGDBhA8+bNadasGX369CE8PDzfDJYFCxbQvn17AM6cOYPBYGDQoEEArFq1CoPBwJQpUwqMnZycjMFgwNfXN1+7wWCgR48epKWlMX78eHx8fPD29mbQoEFs3br1ju730qVLvPPOO/j6+tKkSRN69OjBjz/+eNtn9Pzzz9OiRQs8PDzo2rUrc+bM4dKlS/n6JSUlYTAYGDNmDOfOnWPChAm0atWKJk2a8NxzzxEeHl5kTe+++y5dunTBw8ODxx9/nDFjxnDo0KE7ujcRERERERHJT0GLlKjIyEhGjRrFzp07qV+/Ph06dADgu+++o0+fPqSkpOTrP2XKFMaPH09iYqI5EDhx4gRBQUFMmDDBHLYYDAY6d+4MgKOjI35+fjzxxBP3VGtmZiYDBw4kIiICT09PGjduTHx8PMOHDycsLKxYY/z5558EBASwZMkSTCYTTz75JCaTiddee43169cXes6cOXMYMWIE27dvp2HDhnTo0IGsrCw+//xzevXqRVJSUoFzkpOT6du3L1u2bKFJkya4u7tz6NAhgoKC+OKLL/L1PXv2LL1792bRokVcu3aNdu3aUbduXSIiIujbty/R0dF3/rBEREREREQE0Ga4UsLeeecdrK2tWb16NW5ubgBcv36dCRMmsH79esLCwnj55ZcBCA8PZ8WKFTRq1IhPPvmEWrVqAZCWlsaoUaNYt24dLVq0oF+/fnTp0oUmTZoQGRlJ5cqVmTNnzj3XeurUKapXr87q1at57LHHgBtvNRo5ciSzZs2iffv25pqKsmDBAo4cOcLTTz9NSEgI9vb2AHz22We89957Bfpv2rSJzz//HGdnZxYvXkyjRo0AyMnJYfr06YSHhzNu3DiWLVuW77y9e/fStm1b5s6dS8WKFYEbzy8oKIjFixczdOhQc9/x48dz+vRphg8fzmuvvYaNjY353kaPHs2ECRPYsGEDzs7Od/nkREREREREHl6a0SIlKiUlBVtbW6pVq2Zus7Gx4bXXXuP//u//zDNcABYvXgzA7Nmz8wUaVapU4e233wZgyZIl97XeKVOmmEMWgNatWzNgwACuXr3K999/f8tzc3Jy+P777ylTpgzTp083hywAI0aMoGnTpgXO+fLLLwF44403zCELgL29PW+++SZ169Zlz549xMfHFzh36tSp5pAFoFevXpQtW5aUlBT+/PNPAPbs2cOuXbv417/+xbhx48whS969BQQEkJ6ezooVK27zZERERERERKQwClqkRHl7e3P16lX69OnDRx99xP79+zGZTLi6ujJgwADc3d0BuHDhAidOnMDJyYmGDRsWGKd+/frUqFGDkydPFlhuZCkODg507NixQHte286dO295/q+//kpmZibNmjXLF4D8dZw8165dIyEhAVtbW/MyqJvZ2trSpUsXAOLi4vIdc3Jyok6dOvnabGxsqFKlCgBZWVkAxMbGAuDj44OVlVWBa7Rt27bQ8UVERERERKR4tHRISlRwcDD/+c9/SExM5IMPPuCDDz7A2dmZDh060K9fP5o0aQLc2HME4OLFixgMhluOee7cuXwzZCzlkUcewc7OrkB73uyaCxcu3PL8vOM1atQo9Hjt2rXz/fnixYvk5uZSs2ZNHBwcCj3HxcUFgNTU1HztFSpUKLR/3owVo9EIYN5w+Isvviiwd8vN8p6/iIiIiIiI3BkFLVKiHnnkEVatWkVsbCybNm1i+/btHD16lBUrVrBGTlxiAAAgAElEQVRy5UqmTp1KQEAA169fB8DZ2fm2m9qWK1furuvJu05hbl5Wc7O8DXitrW89IaywGSO3Gv/mtygVJa/em5chFedaefICl2bNmuHq6lpkv7yZMCIiIiIiInJnFLRIibO2tqZVq1a0atUKgPPnzxMaGsrnn3/OnDlz8Pf3N89QKVeu3D1vbJsXiBQWqqSnpxd5XlEzVs6ePQtw241w82ay5PX/q78ueXJycsLOzo7U1FSys7MLndVy+vRpgLveqDbvubZv357//Oc/dzWGiIiIiIiIFE17tEiJOXnyJH5+fgwfPjxfe40aNRg/fjyVK1cmMzOTy5cv4+LiQq1atUhKSuLYsWMFxvrjjz/o2rUrgYGBXLlyBSh6VoejoyNQMNiAG5vDFuXy5cvs3r27QPumTZuAG5vH3oq7uzsVK1Zkz549BZb6APzyyy/5/mxnZ4enpyfXrl0jMjKyQP9r166xceNGAFq2bHnLaxfF29sbgC1bthQ6gyYsLIxnn32Wjz766K7GFxERERERedgpaJES4+rqSlpaGjExMebAIM+2bdv4888/qV27tnm2xpAhQzAajUyYMCHfrJCsrCwmT57MyZMnKVeunHnpUN5ymitXruQLERo0aADc2Aj28OHD5vbjx4/z8ccf37Lmt956i7S0NPOff/nlF8LCwnBycqJ79+63PNfOzo4BAwaQm5vLxIkTyczMNB9bvnw5MTExBc4ZMmQIADNnziQxMdHcnpuby1tvvcWpU6fw8PAw72Vzpx5//HEaNmxIQkIC8+bN49q1a+ZjBw8eZN68eRw5cuS2++KIiIiIiIhI4bR0SEqMjY0Nb731Fi+99BIvvvgi7u7u1K5dm5SUFBISErCxsWHq1Knm/kOGDCEhIYENGzbQrVs3PDw8KF++PHv27CEtLY26devy1ltvmfs7OTnh5OTExYsX6d+/Px4eHkyZMoW6devSoUMHoqOj6du3L0888QQ5OTnExcXx+OOPk5OTU2i9VlZWpKWl0bVrV1q2bMnFixeJj4/H3t6e2bNnU7ly5dve8+jRo4mPjycmJobOnTvj5eXFmTNn2L9/P82aNSswo6ZTp04MGzaMJUuW0Lt3b7y9vXFycmLv3r0kJyfj6urK3Llz7/ITuHFPc+fOZciQIXz66aesWbOGxo0bk5GRQXx8PEajkUGDBtGpU6e7voaIiIiIiMjDTDNapER16tSJRYsW0bZtW5KSkti0aROnTp2iS5cuLF++nA4dOpj7WltbM3/+fGbOnEmjRo04cOAAO3bsoGrVqowePZrly5dTtWpVc38rKytCQkKoV68e+/fvJzo62nxs3rx5jBo1imrVqhETE8Pvv//OqFGj+Pjjj4vc9Nba2pqwsDBatWrFf//7X44cOUKnTp1YtmxZvjpvpUyZMixZsoRXXnmF8uXLEx0dTUZGBm+++SYDBgwo9JyJEyfy0Ucf4ePjw8GDB/nll18oX748L774IqtWreLRRx8t1rWL4ubmxurVqwkMDMTBwYGYmBiOHTuGt7c3H3zwAVOmTLmn8UVERERERB5mVqbivOrkIXf48GEyMjIoX778bZdU5C33aNSoUZF9/JeNtmh9JWV5v09Ku4QSYzAYsLGx4eDBg6VdilhQcb6fIiIiIiLycLmT3/zFoaVDpeBhCixEREREREREHiZaOiQiIiIiIiIiYiEKWkRERERERERELERLh0QKcfNroEVERERERESKSzNaREREREREREQsREGLiIiIiIiIiIiFKGgREREREREREbEQBS0iIiIiIiIiIhaioEVERERERERExEIUtIiIiIiIiIiIWIiCFhERERERERERC1HQIiIiIiIiIiJiIQpaREREREREREQsxLa0C3gYbevRu7RLuCut16y02FgmkwkrKyuLjSciIiIiIiLyINCMFilx69evZ/z48SV2vdjYWAwGA4GBgfftGp07d8ZgMJCUlHTfriEiIiIiIiIPPgUtUqJ2797N2LFjuXDhQmmXIiIiIiIiImJxClqkRBmNxtIuQUREREREROS+UdAiIiIiIiIiImIhClqkxEyaNImAgAAA4uLiMBgMTJo0yXw8KyuLRYsW4e/vT4sWLXB3d6d169a89NJL7Nu3r8B4x44d47XXXqNjx47mvi+//DIJCQnFqmffvn00b96cxo0b8+OPPxbrnL179zJy5EhatmyJl5cXL730EqdPny6yf1ZWFh9//DF+fn40adKE5s2bExAQwA8//FCg74IFCzAYDERHR7Nx40b+/e9/4+npSYsWLfjPf/7DoUOHiqzpxRdf5PHHH8fDw4OuXbsyb948MjIyinVPIiIiIiIiYjl665CUGE9PT1JSUoiJicHZ2ZknnngCT09PAK5evUpAQAAHDhygZs2aeHt7YzQaOXDgAJGRkWzevJnvvvsODw8PAE6dOsXAgQNJS0ujadOm/Otf/+Ls2bNEREQQFRXFZ599RuvWrYus5ciRIwwfPpysrCxCQkLo1q3bbeuPiopizJgx5Obm4uXlRZUqVdi5cyf//ve/uXbtWoH+aWlpDB48mCNHjlC5cmXatm3L1atXiYuLIz4+nm3btjFr1qwC54WHh7Np0yb+3//7f7Rp04YDBw6wadMmYmNjWbNmDS4uLua+q1atIigoCJPJhLu7O7Vq1WLfvn0sXLiQqKgoQkNDcXJyuu29iYiIiIiIiGUoaJES069fP9zc3IiJicHNzY05c+aYj33zzTccOHCArl27MnfuXGxtb/zVzMnJYfz48WzYsIFly5aZg5aFCxeSlpbGjBkz6Nu3r3mcpUuXMn36dBYuXFhk0HLq1CmGDh3KpUuXmDVrFn5+fret/cqVK0ydOpXr16+zYMECunTpAsDly5cZMWJEobNopk2bxpEjR+jcuTMhISE4OjoC8Pvvv/P888+zatUqmjRpQv/+/fOdt2nTJt58801ze05ODsOHD2fHjh2EhYWZ39h07Ngxpk2bhqOjI59++ileXl4A5ObmEhwczLJlywgODua999677f2JiIiIiIiIZWjpkDwQypQpQ/v27Rk3bpw5ZAGwt7enV69eAJw7d87cnpKSAkDNmjXzjdOvXz8mT57MCy+8UOh1zp8/z9ChQ0lNTSU4OJiePXsWq76NGzeSmppKt27dzCELQMWKFXn77bcL9E9KSiIyMhInJyfeeecdc8gCUKdOHWbOnAnA4sWLC5zbvHnzfOGLvb09/v7+ABw9etTc/tVXX5Gbm8uYMWPMIQuAnZ0dQUFB1KhRgx9//JHz588X6x5FRERERETk3ilokQfCwIED+eyzz6hTp4657fLly8THx7NlyxbgxsyOPC1atADgtddeY8aMGWzbto2cnBxsbW0JDAykffv2Ba5x6dIlhg0bRlJSEs8880y+mTC3s3PnTgDatm1b4Jibmxt169bN1xYfHw9Au3btKFeuXIFzfHx8qFatGqdPnyY5OTnfsaZNmxboX7VqVQAyMzPNbbGxsQC0bNmyQH97e3t8fHwwGo3mWkREREREROT+09IheWBcuHCBpUuXEhsby4kTJ7h48SIAVlZWBfoGBgaSmJjIjz/+SGhoKKGhoZQtW5ZWrVrRs2fPfLNO8hw8eBAAGxsbIiMjOXHiBPXq1St2bQA1atQo9LiLiwsnT54s0L927dpFjuni4kJKSgopKSn5ZuZUqFChQF8bGxsATCaTuS0voOnevfsta795JpCIiIiIiIjcXwpa5IGwY8cORo0aRVZWFo888gg+Pj489thjuLu7Y2try6hRo/L1t7e3Z968eYwePZqIiAi2bdvGr7/+SlRUFFFRUTz11FO8//77Ba4zduxYcnNzWbBgAdOmTePrr78uNMj5q9v1yQtC7sT169fN93In1/rr+c8+++wtz7l5lpCIiIiIiIjcXwpapNSZTCaCgoLIysoqsLkt3HjbT1EaNGhAgwYNeOmll8jIyCAiIoLp06fz888/s2fPHpo1a2bu6+XlxciRI8nJyWHdunXExcURHh5u3v/kVvJmspw9e7bQ43l7xuSpXr06cGOvlqLkHctbFnSnqlevzpkzZ5gwYUKBvWpERERERESkdGiPFilRhc28SEtL4/Tp01SrVq3QfVO2bdsGgNFoBG4EM4GBgbRp04bs7Gxzv/Lly9OrVy/atWsHFAxF8maO2NvbM23aNADefffdAiFJYVq1agXc2BT3r5KTkzl8+HC+Ni8vL6ysrNi6dStXrlwpcM6OHTtIS0vDzc0NZ2fn216/MN7e3gD88ssvhR5//vnn6devH/v27bur8UVEREREROTOKWiREuXg4ABAenq6uc3JyYkyZcqQmprK3r17ze0mk4mVK1fy3XffAZhDFSsrKypWrEhKSgrz5883BzBwI/TYtWsX1tbWuLu7F1lH69at6datG5cvXyY4OPi2dfv6+uLq6kpUVBTh4eHm9szMTN544w3zMp48rq6udOzYkYsXLzJx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\n", 205 | "text/plain": [ 206 | "
" 207 | ] 208 | }, 209 | "metadata": {}, 210 | "output_type": "display_data" 211 | } 212 | ], 213 | "source": [ 214 | "plot_pywren_execution(futures)" 215 | ] 216 | } 217 | ], 218 | "metadata": { 219 | "kernelspec": { 220 | "display_name": "Python 3", 221 | "language": "python", 222 | "name": "python3" 223 | }, 224 | "language_info": { 225 | "codemirror_mode": { 226 | "name": "ipython", 227 | "version": 3 228 | }, 229 | "file_extension": ".py", 230 | "mimetype": "text/x-python", 231 | "name": "python", 232 | "nbconvert_exporter": "python", 233 | "pygments_lexer": "ipython3", 234 | "version": "3.6.3" 235 | } 236 | }, 237 | "nbformat": 4, 238 | "nbformat_minor": 2 239 | } 240 | -------------------------------------------------------------------------------- /pywren/counting.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Counting words with pywren" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pywren\n", 17 | "\n", 18 | "pwex = pywren.default_executor()" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 2, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "docs = [\"hello world\",\n", 28 | " \"hello pybay\",\n", 29 | " \"hello yourself\"]" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 3, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "from collections import Counter\n", 39 | "\n", 40 | "def wordcount(doc):\n", 41 | " return Counter(doc.split())" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 4, 47 | "metadata": {}, 48 | "outputs": [], 49 | "source": [ 50 | "futures = pwex.map(wordcount, docs)" 51 | ] 52 | }, 53 | { 54 | "cell_type": "code", 55 | "execution_count": 5, 56 | "metadata": {}, 57 | "outputs": [], 58 | "source": [ 59 | "per_doc_counts = pywren.get_all_results(futures)" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 6, 65 | "metadata": {}, 66 | "outputs": [ 67 | { 68 | "data": { 69 | "text/plain": [ 70 | "Counter({'hello': 3, 'world': 1, 'pybay': 1, 'yourself': 1})" 71 | ] 72 | }, 73 | "execution_count": 6, 74 | "metadata": {}, 75 | "output_type": "execute_result" 76 | } 77 | ], 78 | "source": [ 79 | "sum(per_doc_counts, Counter())" 80 | ] 81 | } 82 | ], 83 | "metadata": { 84 | "kernelspec": { 85 | "display_name": "Python 3", 86 | "language": "python", 87 | "name": "python3" 88 | }, 89 | "language_info": { 90 | "codemirror_mode": { 91 | "name": "ipython", 92 | "version": 3 93 | }, 94 | "file_extension": ".py", 95 | "mimetype": "text/x-python", 96 | "name": "python", 97 | "nbconvert_exporter": "python", 98 | "pygments_lexer": "ipython3", 99 | "version": "3.6.3" 100 | } 101 | }, 102 | "nbformat": 4, 103 | "nbformat_minor": 2 104 | } 105 | -------------------------------------------------------------------------------- /pywren/pywren_utils.py: -------------------------------------------------------------------------------- 1 | # From https://github.com/ucbrise/risecamp/tree/risecamp2017/pywren 2 | 3 | def plot_pywren_execution(futures): 4 | import warnings 5 | warnings.filterwarnings("ignore") 6 | from IPython import get_ipython 7 | get_ipython().run_line_magic('pylab', 'inline') 8 | import pylab 9 | import seaborn as sns 10 | import pandas as pd 11 | sns.set_style('whitegrid') 12 | sns.set_context("poster") 13 | import os 14 | import matplotlib.patches as mpatches 15 | import numpy as np 16 | 17 | def collect_execution_info(futures): 18 | results = [f.result() for f in futures] 19 | run_statuses = [f.run_status for f in futures] 20 | invoke_statuses = [f.invoke_status for f in futures] 21 | return {'results' : results,'run_statuses' : run_statuses, 'invoke_statuses' : invoke_statuses} 22 | 23 | info = collect_execution_info(futures) 24 | 25 | # visualization 26 | def visualize_execution(info): 27 | # preparing data 28 | run_df = pd.DataFrame(info['run_statuses']) 29 | invoke_df = pd.DataFrame(info['invoke_statuses']) 30 | info_df = pd.concat([run_df, invoke_df], axis=1) 31 | 32 | def remove_duplicate_columns(df): 33 | Cols = list(df.columns) 34 | for i,item in enumerate(df.columns): 35 | if item in df.columns[:i]: Cols[i] = "toDROP" 36 | df.columns = Cols 37 | return df.drop("toDROP",1) 38 | 39 | info_df = remove_duplicate_columns(info_df) 40 | 41 | total_tasks = len(info_df) 42 | y = np.arange(total_tasks) 43 | 44 | time_offset = np.min(info_df.host_submit_time) 45 | fields = [('host submit', info_df.host_submit_time - time_offset), 46 | ('task start', info_df.start_time - time_offset ), 47 | ('setup done', info_df.start_time + info_df.setup_time - time_offset), 48 | ('task done', info_df.end_time - time_offset), 49 | ('results returned', info_df.download_output_timestamp - time_offset) 50 | ] 51 | 52 | # create plotting env 53 | fig = pylab.figure(figsize=(16, 8)) 54 | ax = fig.add_subplot(1, 1, 1) 55 | 56 | # plotting 57 | patches = [] 58 | palette = sns.color_palette("deep", 6) 59 | point_size = 100 60 | for f_i, (field_name, val) in enumerate(fields): 61 | ax.scatter(val, y, c=palette[f_i], edgecolor='none', s=point_size, alpha=1) 62 | patches.append(mpatches.Patch(color=palette[f_i], label=field_name)) 63 | ax.set_xlabel('wallclock time (sec)') 64 | ax.set_ylabel('task') 65 | 66 | # legend 67 | legend = pylab.legend(handles=patches, 68 | loc='upper left', frameon=True) 69 | legend.get_frame().set_facecolor('#FFFFFF') 70 | 71 | # y ticks 72 | plot_step = 5 73 | y_ticks = np.arange(total_tasks//plot_step + 2) * plot_step 74 | ax.set_yticks(y_ticks) 75 | for y in y_ticks: 76 | ax.axhline(y, c='k', alpha=0.1, linewidth=1) 77 | 78 | # formatting 79 | ax.grid(False) 80 | fig.tight_layout() 81 | 82 | visualize_execution(info) 83 | -------------------------------------------------------------------------------- /pywren/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib==2.2.3 2 | notebook==5.7.8 3 | pywren==0.3.0 4 | seaborn==0.9.0 5 | -------------------------------------------------------------------------------- /zappa/README.md: -------------------------------------------------------------------------------- 1 | # Deployment of a basic flask application with zappa 2 | 3 | ## Setup and local deployment 4 | 5 | 1. Create and activate a virtual environment (note you must create a fresh 6 | virtual environment to use zappa), e.g. 7 | 8 | python -m virtualenv venv && source venv/bin/activate 9 | 10 | 2. Install flask and zappa 11 | 12 | pip install flask zappa 13 | 14 | 3. `app.py` contains a toy flask application that serves the time. Deploy it 15 | locally by running 16 | 17 | python app.py 18 | 19 | 4. Check it works by visiting `127.0.0.1:5000/time`. You should get the local 20 | time on your computer. 21 | 22 | ## Deployment to AWS Lambda with zappa 23 | 24 | 1. Configure AWS credentials, e.g. set the appropriate environment variables or 25 | put them in `~/.aws/credentials` 26 | 27 | 2. Run `zappa init` and accept all the defaults 28 | 29 | 3. Run `zappa deploy`. The output of this command (or `zappa status`) 30 | includes the public `amazonaws.com` URL of your deployed flask application. 31 | It will look something like 32 | `https://abcdef123.execute-api.us-east-1.amazonaws.com/dev/` 33 | 34 | 4. Visit `your_amazonaws_url/time` to check your app works. You should get 35 | the current time in the UT timezone. 36 | 37 | ## Update a running Lambda deployment and tail the logs 38 | 39 | 1. Now let's switch over to serving `app2.py`, which a version of our time app 40 | that supports timezones. Edit `zappa_settings.json` so that the line 41 | 42 | "app_function": "app.app", 43 | 44 | reads 45 | 46 | "app_function": "app2.app", 47 | 48 | 2. Run `zappa update` 49 | 50 | 3. Visit `your_amazonaws_url/servertime` to get the server time (i.e. UT) 51 | 52 | 4. Visit `your_amazonaws_url/localtime?tz=US/Pacific` to get the time in 53 | the US/Pacific timezone. 54 | 55 | 5. Visit a URL with a deliberate mistake, e.g. 56 | `your_amazonaws_url/localtime?tz=US/Atlantic` (this timezone does not 57 | exist). Run `zappa tail` to tail the logs of your application and observe 58 | the Python exception generated by your URL. 59 | -------------------------------------------------------------------------------- /zappa/app.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | from flask import Flask 4 | 5 | app = Flask(__name__) 6 | 7 | 8 | @app.route("/time") 9 | def time(): 10 | return str(datetime.datetime.now()) 11 | 12 | 13 | if __name__ == "__main__": 14 | app.run() 15 | -------------------------------------------------------------------------------- /zappa/app2.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import pytz 3 | 4 | from flask import Flask, request 5 | 6 | app = Flask(__name__) 7 | 8 | 9 | @app.route("/servertime") 10 | def servertime(): 11 | return str(datetime.datetime.now()) 12 | 13 | 14 | @app.route("/localtime") 15 | def localtime(): 16 | tz = pytz.timezone(request.args['tz']) 17 | servertime = datetime.datetime.now().astimezone() 18 | localtime = servertime.astimezone(tz) 19 | return str(localtime) 20 | 21 | 22 | if __name__ == "__main__": 23 | app.run() 24 | --------------------------------------------------------------------------------