├── energy-landscape ├── run.sh ├── create-notebook.py └── workspace.json ├── xgboost-mortgage ├── run.sh ├── create-notebook.py ├── workspace.json └── xgboost-mortgage.ipynb ├── hyperparameter-tuning ├── run.sh ├── create-notebook.py ├── workspace.json └── hyperparameter-tuning.ipynb ├── .github └── workflows │ └── ci-build.yml ├── LICENSE ├── README.md └── .gitignore /energy-landscape/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | start.sh jupyter lab workspaces import workspace.json 4 | start.sh jupyter lab -------------------------------------------------------------------------------- /xgboost-mortgage/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | start.sh jupyter lab workspaces import workspace.json 4 | start.sh jupyter lab -------------------------------------------------------------------------------- /hyperparameter-tuning/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | start.sh jupyter lab workspaces import workspace.json 4 | start.sh jupyter lab -------------------------------------------------------------------------------- /.github/workflows/ci-build.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Build notebooks 3 | 4 | on: 5 | push: 6 | branches: master 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | strategy: 12 | fail-fast: false 13 | matrix: 14 | example: ["xgboost-mortgage", "hyperparameter-tuning", "energy-landscape"] 15 | env: 16 | DASK_COILED__SERVER: https://cloud.coiled.io 17 | DASK_COILED__TOKEN: ${{ secrets.DASK_COILED__TOKEN }} 18 | 19 | steps: 20 | - name: Checkout source 21 | uses: actions/checkout@v2 22 | 23 | - name: Set up Python 24 | uses: actions/setup-python@v1 25 | 26 | - name: Install Coiled 27 | run: python -m pip install coiled 28 | 29 | - name: Build ${{ matrix.example }} notebook 30 | run: python create-notebook.py 31 | working-directory: ${{ matrix.example }} -------------------------------------------------------------------------------- /energy-landscape/create-notebook.py: -------------------------------------------------------------------------------- 1 | import coiled 2 | 3 | software_name = "blog-notebooks/energy-landscape" 4 | coiled.create_software_environment( 5 | name=software_name, 6 | container="coiled/notebook:latest", 7 | conda={ 8 | "channels": ["conda-forge"], 9 | "dependencies": [ 10 | "coiled", 11 | "dask-ml", 12 | "dask>=2.23.0", 13 | "fastparquet", 14 | "matplotlib", 15 | "pandas>=1.1.0", 16 | "python-snappy", 17 | "seaborn", 18 | "s3fs", 19 | "scikit-learn", 20 | "xgboost>=1.3.0", 21 | "optuna<2.4.0", 22 | ], 23 | }, 24 | pip=["dask-optuna", "fastdtw"], 25 | ) 26 | 27 | coiled.create_job_configuration( 28 | name="blog-notebooks/energy-landscape", 29 | software=software_name, 30 | command=[ 31 | "/bin/bash", 32 | "run.sh", 33 | ], 34 | files=["energy-landscape.ipynb", "workspace.json", "run.sh"], 35 | ports=[8888], 36 | description="Explore residential electricity usage and Dynamic Time Warping", 37 | ) 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Coiled 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://mk0coiled27knr0w73eb.kinstacdn.com/wp-content/uploads/horizontal-black.svg) 2 | 3 | # [Coiled Blog](https://coiled.io/blog) accompanying notebooks 4 | 5 | Example notebooks letting you reproduce results from the Coiled Blog. You can launch these notebooks at https://cloud.coiled.io/blog-notebooks/notebooks. 6 | 7 | * **[Blog](https://coiled.io/blog/xgboost-frictionless-training/) | [Notebook](xgboost-mortgage/xgboost-mortgage.ipynb) | [Launch](https://cloud.coiled.io/blog-notebooks/jobs/xgboost-on-coiled)** - XGBoost – frictionless training on datasets too big for the memory 8 | * **[Blog](https://coiled.io/blog/changing-energy-landscape-distributed-python/) | [Notebook](energy-landscape/energy-landscape.ipynb) | [Launch](https://cloud.coiled.io/blog-notebooks/jobs/energy-landscape)** - A Changing Energy Landscape – Analyzing 8 Million Homes with Distributed Python 9 | * **[Blog](https://coiled.io/blog/faster-hyperparameter-tuning-cloud/) | [Notebook](hyperparameter-tuning/hyperparameter-tuning.ipynb) | [Launch](https://cloud.coiled.io/blog-notebooks/jobs/optuna-xgboost)** - No More Coffee Breaks - Faster Hyperparameter Tuning in the Cloud -------------------------------------------------------------------------------- /xgboost-mortgage/create-notebook.py: -------------------------------------------------------------------------------- 1 | import coiled 2 | 3 | software_name = "blog-notebooks/xgboost-on-coiled" 4 | coiled.create_software_environment( 5 | name=software_name, 6 | container="coiled/notebook:latest", 7 | conda={ 8 | "channels": ["conda-forge"], 9 | "dependencies": [ 10 | "coiled", 11 | "dask", 12 | "dask-ml", 13 | "dask>=2.23.0", 14 | "fastparquet", 15 | "matplotlib", 16 | "pandas>=1.1.0", 17 | "python-snappy", 18 | "s3fs", 19 | "scikit-learn", 20 | "xgboost>=1.3.0", 21 | "optuna<2.4.0", 22 | "numpy", 23 | "xgboost", 24 | "joblib", 25 | ], 26 | }, 27 | pip=["dask-optuna"], 28 | ) 29 | 30 | coiled.create_job_configuration( 31 | name="blog-notebooks/xgboost-on-coiled", 32 | software=software_name, 33 | command=[ 34 | "/bin/bash", 35 | "run.sh", 36 | ], 37 | files=["xgboost-mortgage.ipynb", "workspace.json", "run.sh"], 38 | ports=[8888], 39 | description="Train XGBoost on a large dataset with Dask on Coiled", 40 | ) 41 | -------------------------------------------------------------------------------- /hyperparameter-tuning/create-notebook.py: -------------------------------------------------------------------------------- 1 | import coiled 2 | 3 | software_name = "blog-notebooks/xgboost-on-coiled" 4 | coiled.create_software_environment( 5 | name=software_name, 6 | container="coiled/notebook:latest", 7 | conda={ 8 | "channels": ["conda-forge"], 9 | "dependencies": [ 10 | "coiled", 11 | "dask", 12 | "dask-ml", 13 | "dask>=2.23.0", 14 | "fastparquet", 15 | "matplotlib", 16 | "pandas>=1.1.0", 17 | "python-snappy", 18 | "s3fs", 19 | "scikit-learn", 20 | "xgboost>=1.3.0", 21 | "optuna<2.4.0", 22 | "numpy", 23 | "xgboost", 24 | "joblib", 25 | ], 26 | }, 27 | pip=["dask-optuna"], 28 | ) 29 | 30 | coiled.create_job_configuration( 31 | name="blog-notebooks/optuna-xgboost", 32 | software=software_name, 33 | command=[ 34 | "/bin/bash", 35 | "run.sh", 36 | ], 37 | files=["hyperparameter-tuning.ipynb", "workspace.json", "run.sh"], 38 | ports=[8888], 39 | description="XGBoost hyperparameter tuning with Optuna and Dask on Coiled", 40 | ) 41 | -------------------------------------------------------------------------------- /energy-landscape/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "file-browser-filebrowser:cwd": { 4 | "path": "" 5 | }, 6 | "layout-restorer:data": { 7 | "main": { 8 | "dock": { 9 | "type": "tab-area", 10 | "currentIndex": 0, 11 | "widgets": [ 12 | "notebook:energy-landscape.ipynb" 13 | ] 14 | }, 15 | "mode": "multiple-document", 16 | "current": "notebook:energy-landscape.ipynb" 17 | }, 18 | "left": { 19 | "collapsed": true, 20 | "widgets": [ 21 | "filebrowser", 22 | "running-sessions", 23 | "command-palette", 24 | "jp-property-inspector", 25 | "tab-manager", 26 | "extensionmanager.main-view" 27 | ] 28 | }, 29 | "right": { 30 | "collapsed": true, 31 | "widgets": [] 32 | } 33 | }, 34 | "notebook:quickstart.ipynb": { 35 | "data": { 36 | "path": "energy-landscape.ipynb", 37 | "factory": "Notebook" 38 | } 39 | } 40 | }, 41 | "metadata": { 42 | "id": "/lab" 43 | } 44 | } -------------------------------------------------------------------------------- /xgboost-mortgage/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "file-browser-filebrowser:cwd": { 4 | "path": "" 5 | }, 6 | "layout-restorer:data": { 7 | "main": { 8 | "dock": { 9 | "type": "tab-area", 10 | "currentIndex": 0, 11 | "widgets": [ 12 | "notebook:xgboost-mortgage.ipynb" 13 | ] 14 | }, 15 | "mode": "multiple-document", 16 | "current": "notebook:xgboost-mortgage.ipynb" 17 | }, 18 | "left": { 19 | "collapsed": true, 20 | "widgets": [ 21 | "filebrowser", 22 | "running-sessions", 23 | "command-palette", 24 | "jp-property-inspector", 25 | "tab-manager", 26 | "extensionmanager.main-view" 27 | ] 28 | }, 29 | "right": { 30 | "collapsed": true, 31 | "widgets": [] 32 | } 33 | }, 34 | "notebook:quickstart.ipynb": { 35 | "data": { 36 | "path": "xgboost-mortgage.ipynb", 37 | "factory": "Notebook" 38 | } 39 | } 40 | }, 41 | "metadata": { 42 | "id": "/lab" 43 | } 44 | } -------------------------------------------------------------------------------- /hyperparameter-tuning/workspace.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "file-browser-filebrowser:cwd": { 4 | "path": "" 5 | }, 6 | "layout-restorer:data": { 7 | "main": { 8 | "dock": { 9 | "type": "tab-area", 10 | "currentIndex": 0, 11 | "widgets": [ 12 | "notebook:hyperparameter-tuning.ipynb" 13 | ] 14 | }, 15 | "mode": "multiple-document", 16 | "current": "notebook:hyperparameter-tuning.ipynb" 17 | }, 18 | "left": { 19 | "collapsed": true, 20 | "widgets": [ 21 | "filebrowser", 22 | "running-sessions", 23 | "command-palette", 24 | "jp-property-inspector", 25 | "tab-manager", 26 | "extensionmanager.main-view" 27 | ] 28 | }, 29 | "right": { 30 | "collapsed": true, 31 | "widgets": [] 32 | } 33 | }, 34 | "notebook:quickstart.ipynb": { 35 | "data": { 36 | "path": "hyperparameter-tuning.ipynb", 37 | "factory": "Notebook" 38 | } 39 | } 40 | }, 41 | "metadata": { 42 | "id": "/lab" 43 | } 44 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /xgboost-mortgage/xgboost-mortgage.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Distributed XGBoost on Dask in the cloud\n", 8 | "\n", 9 | "This is the accompanying notebook to the blog post [XGBoost – frictionless training on datasets too big for the memory](https://coiled.io/blog/xgboost-frictionless-training/).\n", 10 | "\n", 11 | "Swap in your dataset, spin up a cluster in 2 minutes and train at any scale!" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "### Cluster setup " 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": null, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "from dask import dataframe as dd\n", 28 | "import coiled" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "Order the cluster and look at it coming up in your [Coiled dashboard](https://cloud.coiled.io/):" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": null, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "%%time\n", 45 | "cluster = coiled.Cluster(n_workers=12, software=\"xgboost-on-coiled\")" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "Connect to the cluster:" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": null, 58 | "metadata": {}, 59 | "outputs": [], 60 | "source": [ 61 | "from dask.distributed import Client, progress\n", 62 | "client = Client(cluster)\n", 63 | "client" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "### Load the dataset sample" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": {}, 77 | "outputs": [], 78 | "source": [ 79 | "mortgage_data = dd.read_parquet(\n", 80 | " \"s3://coiled-data/mortgage-2000.parq/*\", \n", 81 | " compression=\"gzip\", \n", 82 | " columns=columns, \n", 83 | " storage_options={\"anon\":True}\n", 84 | ")\n", 85 | "\n", 86 | "mortgage_data" 87 | ] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": {}, 92 | "source": [ 93 | "Pin the downloaded dataset to memory:\n", 94 | "\n", 95 | "_This step reduces waiting times in subsequent steps that trigger computation._" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": null, 101 | "metadata": {}, 102 | "outputs": [], 103 | "source": [ 104 | "mortgage_data = mortgage_data.persist()" 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "### Data preprocessing" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "The dataset needs a little work - we need to prepare categorical columns to a format that is supported by XGBoost.\n", 119 | "\n", 120 | "The columns we'll be working with:" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": null, 126 | "metadata": {}, 127 | "outputs": [], 128 | "source": [ 129 | "columns = [\n", 130 | " \"delinquency_12\",\n", 131 | " \"interest_rate\",\n", 132 | " \"loan_age\",\n", 133 | " \"adj_remaining_months_to_maturity\",\n", 134 | " \"longest_ever_deliquent\",\n", 135 | " \"orig_channel\",\n", 136 | " \"num_borrowers\",\n", 137 | " \"borrower_credit_score\",\n", 138 | " \"first_home_buyer\",\n", 139 | " \"loan_purpose\",\n", 140 | " \"property_type\",\n", 141 | " \"num_units\",\n", 142 | " \"occupancy_status\",\n", 143 | " \"property_state\",\n", 144 | " \"zip\",\n", 145 | " \"mortgage_insurance_percent\",\n", 146 | " \"coborrow_credit_score\",\n", 147 | " \"relocation_mortgage_indicator\",\n", 148 | "]\n", 149 | "categorical = [\n", 150 | " \"orig_channel\",\n", 151 | " \"occupancy_status\",\n", 152 | " \"property_state\",\n", 153 | " \"first_home_buyer\",\n", 154 | " \"loan_purpose\",\n", 155 | " \"property_type\",\n", 156 | " \"zip\",\n", 157 | " \"relocation_mortgage_indicator\",\n", 158 | " \"delinquency_12\",\n", 159 | "]" 160 | ] 161 | }, 162 | { 163 | "cell_type": "markdown", 164 | "metadata": {}, 165 | "source": [ 166 | "Create a column categorizer:" 167 | ] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": null, 172 | "metadata": {}, 173 | "outputs": [], 174 | "source": [ 175 | "from dask_ml.preprocessing import Categorizer\n", 176 | "\n", 177 | "ce = Categorizer(columns=categorical)" 178 | ] 179 | }, 180 | { 181 | "cell_type": "markdown", 182 | "metadata": {}, 183 | "source": [ 184 | "Apply column categorizer:" 185 | ] 186 | }, 187 | { 188 | "cell_type": "code", 189 | "execution_count": null, 190 | "metadata": {}, 191 | "outputs": [], 192 | "source": [ 193 | "mortgage_data = ce.fit_transform(mortgage_data)\n", 194 | "\n", 195 | "mortgage_data.dtypes" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "metadata": {}, 202 | "outputs": [], 203 | "source": [ 204 | "# https://github.com/dmlc/xgboost/blame/9a0399e8981b2279d921fe2312f7ab1b880fd3c3/python-package/xgboost/dask.py#L227\n", 205 | "# Dask categorical columns are not yet available\n", 206 | "\n", 207 | "# the commit is already in master, can be expected in release 1.4.0\n", 208 | "\n", 209 | "# Because this is not possible yet, I will cast to ints\n", 210 | "for col in categorical:\n", 211 | " mortgage_data[col] = mortgage_data[col].cat.codes" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": {}, 217 | "source": [ 218 | "### Split the dataset before training" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": null, 224 | "metadata": {}, 225 | "outputs": [], 226 | "source": [ 227 | "dependent_vars = mortgage_data.columns.difference([\"delinquency_12\"])\n", 228 | "X, y = mortgage_data.iloc[:, dependent_vars], mortgage_data[\"delinquency_12\"]" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": null, 234 | "metadata": {}, 235 | "outputs": [], 236 | "source": [ 237 | "from dask_ml.model_selection import train_test_split\n", 238 | "\n", 239 | "X_train, X_test, y_train, y_test = train_test_split(\n", 240 | " X, y, test_size=0.2, shuffle=True, random_state=2\n", 241 | ")" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": {}, 247 | "source": [ 248 | "### Train XGBoost" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": null, 254 | "metadata": {}, 255 | "outputs": [], 256 | "source": [ 257 | "import xgboost as xgb" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "Prepare distributed DMatrix structures: " 265 | ] 266 | }, 267 | { 268 | "cell_type": "code", 269 | "execution_count": null, 270 | "metadata": {}, 271 | "outputs": [], 272 | "source": [ 273 | "dtrain = xgb.dask.DaskDMatrix(client, X_train, y_train) \n", 274 | "dtest = xgb.dask.DaskDMatrix(client, X_test, y_test) " 275 | ] 276 | }, 277 | { 278 | "cell_type": "markdown", 279 | "metadata": {}, 280 | "source": [ 281 | "Training params:" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": null, 287 | "metadata": {}, 288 | "outputs": [], 289 | "source": [ 290 | "params = {\n", 291 | " \"max_depth\": 8,\n", 292 | " \"max_leaves\": 2 ** 8,\n", 293 | " \"alpha\": 0.9,\n", 294 | " \"eta\": 0.1,\n", 295 | " \"gamma\": 0.1,\n", 296 | " \"learning_rate\": 0.1,\n", 297 | " \"subsample\": 1,\n", 298 | " \"reg_lambda\": 1,\n", 299 | " \"scale_pos_weight\": 2,\n", 300 | " \"min_child_weight\": 30,\n", 301 | " \"objective\": \"binary:logistic\",\n", 302 | " \"grow_policy\": \"lossguide\",\n", 303 | "}" 304 | ] 305 | }, 306 | { 307 | "cell_type": "markdown", 308 | "metadata": {}, 309 | "source": [ 310 | "Run training" 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": null, 316 | "metadata": {}, 317 | "outputs": [], 318 | "source": [ 319 | "%%time\n", 320 | "output = xgb.dask.train(\n", 321 | " client,\n", 322 | " params,\n", 323 | " dtrain,\n", 324 | " num_boost_round=20,\n", 325 | " evals=[\n", 326 | " (dtrain, 'train'), \n", 327 | " (dtest, 'test')\n", 328 | " ]\n", 329 | ")" 330 | ] 331 | }, 332 | { 333 | "cell_type": "markdown", 334 | "metadata": {}, 335 | "source": [ 336 | "Access results" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": null, 342 | "metadata": {}, 343 | "outputs": [], 344 | "source": [ 345 | "booster = output['booster'] # booster is the trained model\n", 346 | "history = output['history'] # A dictionary containing evaluation " 347 | ] 348 | }, 349 | { 350 | "cell_type": "code", 351 | "execution_count": null, 352 | "metadata": {}, 353 | "outputs": [], 354 | "source": [ 355 | "booster" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "execution_count": null, 361 | "metadata": {}, 362 | "outputs": [], 363 | "source": [ 364 | "history" 365 | ] 366 | }, 367 | { 368 | "cell_type": "markdown", 369 | "metadata": {}, 370 | "source": [ 371 | "### Close session and set down the cluster" 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": null, 377 | "metadata": {}, 378 | "outputs": [], 379 | "source": [ 380 | "cluster.close()" 381 | ] 382 | }, 383 | { 384 | "cell_type": "markdown", 385 | "metadata": {}, 386 | "source": [ 387 | "### Join our Slack community and share your success!\n", 388 | "\n", 389 | "Follow this link to join: \n", 390 | "https://join.slack.com/t/coiled-users/shared_invite/zt-hx1fnr7k-In~Q8ui3XkQfvQon0yN5WQ" 391 | ] 392 | }, 393 | { 394 | "cell_type": "markdown", 395 | "metadata": {}, 396 | "source": [ 397 | "### Next steps\n", 398 | "\n", 399 | "* Train on your own dataset\n", 400 | "* Scale up the cluster to use more resources with `cluster.scale(24)`\n", 401 | "* [GPU-accelerated XGBoost on Dask (NVidia RAPIDS team)](https://github.com/rapidsai-community/notebooks-contrib/blob/branch-0.14/intermediate_notebooks/E2E/mortgage/mortgage_e2e.ipynb)" 402 | ] 403 | }, 404 | { 405 | "cell_type": "code", 406 | "execution_count": null, 407 | "metadata": {}, 408 | "outputs": [], 409 | "source": [] 410 | } 411 | ], 412 | "metadata": { 413 | "kernelspec": { 414 | "display_name": "Python 3", 415 | "language": "python", 416 | "name": "python3" 417 | }, 418 | "language_info": { 419 | "codemirror_mode": { 420 | "name": "ipython", 421 | "version": 3 422 | }, 423 | "file_extension": ".py", 424 | "mimetype": "text/x-python", 425 | "name": "python", 426 | "nbconvert_exporter": "python", 427 | "pygments_lexer": "ipython3", 428 | "version": "3.8.5" 429 | } 430 | }, 431 | "nbformat": 4, 432 | "nbformat_minor": 4 433 | } 434 | -------------------------------------------------------------------------------- /hyperparameter-tuning/hyperparameter-tuning.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Distirbuted Hyperparameter Optimization with Dask\n", 8 | "\n", 9 | "This is the accompanying notebook to the blog post [No More Coffee Breaks - Faster Hyperparameter Tuning in the Cloud](https://coiled.io/blog/faster-hyperparameter-tuning-cloud)." 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "### Load data " 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": null, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import numpy as np\n", 26 | "import pandas as pd\n", 27 | "\n", 28 | "wine = pd.read_csv(\"https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv\", delimiter=\";\")\n", 29 | "\n", 30 | "X, y = wine.iloc[:, :-1], wine[\"quality\"]" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": null, 36 | "metadata": {}, 37 | "outputs": [], 38 | "source": [ 39 | "wine.shape" 40 | ] 41 | }, 42 | { 43 | "cell_type": "markdown", 44 | "metadata": {}, 45 | "source": [ 46 | "### 5-fold cross-validated XGBoost model" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "from xgboost.sklearn import XGBRegressor\n", 56 | "from sklearn.model_selection import cross_val_score, GridSearchCV\n", 57 | "\n", 58 | "estimator = XGBRegressor(objective=\"reg:squarederror\")\n", 59 | "-cross_val_score(estimator, X, y, cv=5, scoring=\"neg_mean_absolute_error\").mean()" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "### Local GridSearchCV (client machine)" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": null, 72 | "metadata": {}, 73 | "outputs": [], 74 | "source": [ 75 | "params = {\n", 76 | " \"max_depth\": [3, 16],\n", 77 | " \"min_child_weight\": [10, 30],\n", 78 | " \"eta\": [0.1, 0.05],\n", 79 | " \"grow_policy\": [\"depthwise\", \"lossguide\"],\n", 80 | "}" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": null, 86 | "metadata": {}, 87 | "outputs": [], 88 | "source": [ 89 | "estimator = XGBRegressor(objective=\"reg:squarederror\")\n", 90 | "\n", 91 | "grid_search = GridSearchCV(\n", 92 | " estimator=estimator,\n", 93 | " param_grid=params,\n", 94 | " scoring=\"neg_mean_absolute_error\",\n", 95 | " n_jobs=-1,\n", 96 | " cv=5,\n", 97 | " verbose=True,\n", 98 | ")" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": {}, 105 | "outputs": [], 106 | "source": [ 107 | "%%time\n", 108 | "grid_search.fit(X, y)" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": null, 114 | "metadata": {}, 115 | "outputs": [], 116 | "source": [ 117 | "grid_search.best_score_" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": null, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "grid_search.best_params_" 127 | ] 128 | }, 129 | { 130 | "cell_type": "markdown", 131 | "metadata": {}, 132 | "source": [ 133 | "### GridSearchCV on a Dask `LocalCluster` (client machine)\n" 134 | ] 135 | }, 136 | { 137 | "cell_type": "markdown", 138 | "metadata": {}, 139 | "source": [ 140 | "This is equivalen to running local `GridSearchCV` with `sklearn`, except it can be useful to prototype the flow before running it on another cluster with more resources.\n", 141 | "\n", 142 | "Feel free to skip this step and scale out to a bigger cluster!" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": null, 148 | "metadata": {}, 149 | "outputs": [], 150 | "source": [ 151 | "# from dask_ml.model_selection import GridSearchCV\n", 152 | "\n", 153 | "# params = {\n", 154 | "# \"max_depth\": [3, 6, 8, 16],\n", 155 | "# \"min_child_weight\": [3, 5, 10, 20, 30],\n", 156 | "# \"eta\": [0.3, 0.2, 0.1, 0.05, 0.01],\n", 157 | "# \"colsample_bytree\": np.arange(0.7, 1.0, 0.1),\n", 158 | "# \"sampling_method \": [\"uniform\", \"gradient_based\"],\n", 159 | "# \"booster\": [\"gbtree\", \"dart\"],\n", 160 | "# \"grow_policy\": [\"depthwise\", \"lossguide\"],\n", 161 | "# }\n", 162 | "\n", 163 | "# estimator = XGBRegressor(objective=\"reg:squarederror\")\n", 164 | "\n", 165 | "# grid_search = GridSearchCV(\n", 166 | "# estimator=estimator,\n", 167 | "# param_grid=params,\n", 168 | "# scoring=\"neg_mean_absolute_error\",\n", 169 | "# n_jobs=-1,\n", 170 | "# cv=5,\n", 171 | "# )" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": null, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "# %%time\n", 181 | "# grid_search.fit(X, y)" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": null, 187 | "metadata": {}, 188 | "outputs": [], 189 | "source": [ 190 | "# grid_search.best_score_" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": null, 196 | "metadata": {}, 197 | "outputs": [], 198 | "source": [ 199 | "# grid_search.best_params_" 200 | ] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": {}, 205 | "source": [ 206 | "### GridSearchCV on a Dask cluster in the cloud - Coiled\n" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 2, 212 | "metadata": {}, 213 | "outputs": [], 214 | "source": [ 215 | "import coiled\n", 216 | "import joblib\n", 217 | "from dask.distributed import Client" 218 | ] 219 | }, 220 | { 221 | "cell_type": "markdown", 222 | "metadata": {}, 223 | "source": [ 224 | "Set up a cluster of any size in 2 minutes. \n", 225 | "\n", 226 | "Go ahead and explore the configuration arguments for `coiled.Cluster()`!" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": null, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [ 235 | "coiled.Cluster??" 236 | ] 237 | }, 238 | { 239 | "cell_type": "markdown", 240 | "metadata": {}, 241 | "source": [ 242 | "Get a cluster in the cloud" 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": null, 248 | "metadata": {}, 249 | "outputs": [], 250 | "source": [ 251 | "%%time\n", 252 | "cluster = coiled.Cluster(n_workers=24, software=\"optuna-xgboost\")\n", 253 | "client = Client(cluster)\n", 254 | "\n", 255 | "client" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": null, 261 | "metadata": {}, 262 | "outputs": [], 263 | "source": [ 264 | "params = {\n", 265 | " \"max_depth\": [3, 6, 8, 16],\n", 266 | " \"min_child_weight\": [3, 5, 10, 20, 30],\n", 267 | " \"eta\": [0.3, 0.2, 0.1, 0.05, 0.01],\n", 268 | " \"colsample_bytree\": np.arange(0.7, 1.0, 0.1),\n", 269 | " \"sampling_method \": [\"uniform\", \"gradient_based\"],\n", 270 | " \"booster\": [\"gbtree\", \"dart\"],\n", 271 | " \"grow_policy\": [\"depthwise\", \"lossguide\"],\n", 272 | "}" 273 | ] 274 | }, 275 | { 276 | "cell_type": "markdown", 277 | "metadata": {}, 278 | "source": [ 279 | "#### 5 folds for each of 3200 candidates, totalling 16000 fits" 280 | ] 281 | }, 282 | { 283 | "cell_type": "code", 284 | "execution_count": null, 285 | "metadata": {}, 286 | "outputs": [], 287 | "source": [ 288 | "estimator = XGBRegressor(objective=\"reg:squarederror\")\n", 289 | "\n", 290 | "grid_search = GridSearchCV(\n", 291 | " estimator=estimator,\n", 292 | " param_grid=params,\n", 293 | " scoring=\"neg_mean_absolute_error\",\n", 294 | " n_jobs=-1,\n", 295 | " cv=5,\n", 296 | " verbose=2,\n", 297 | ")" 298 | ] 299 | }, 300 | { 301 | "cell_type": "markdown", 302 | "metadata": {}, 303 | "source": [ 304 | "`joblib`, the scikit-learn parallelization backend, will use our open cluster client connected to Coiled." 305 | ] 306 | }, 307 | { 308 | "source": [ 309 | "Make sure to launch the Dask Cluster dashboard, to see the tasks being worked on in real time!" 310 | ], 311 | "cell_type": "markdown", 312 | "metadata": {} 313 | }, 314 | { 315 | "cell_type": "code", 316 | "execution_count": null, 317 | "metadata": {}, 318 | "outputs": [], 319 | "source": [ 320 | "cluster.dashboard_link" 321 | ] 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": null, 326 | "metadata": {}, 327 | "outputs": [], 328 | "source": [ 329 | "%%time\n", 330 | "with joblib.parallel_backend(\"dask\", scatter=[X, y]):\n", 331 | " grid_search.fit(X, y)" 332 | ] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "execution_count": null, 337 | "metadata": {}, 338 | "outputs": [], 339 | "source": [ 340 | "grid_search.best_score_" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": null, 346 | "metadata": {}, 347 | "outputs": [], 348 | "source": [ 349 | "grid_search.best_estimator_" 350 | ] 351 | }, 352 | { 353 | "cell_type": "markdown", 354 | "metadata": {}, 355 | "source": [ 356 | "### Scale the cluster down\n", 357 | "\n", 358 | "For next steps, the required resources will be much lower.\n", 359 | "\n", 360 | "We can cut costs by scaling the cluster down right from this notebook:" 361 | ] 362 | }, 363 | { 364 | "cell_type": "code", 365 | "execution_count": null, 366 | "metadata": {}, 367 | "outputs": [], 368 | "source": [ 369 | "cluster.scale(4) # target = 4 workers" 370 | ] 371 | }, 372 | { 373 | "source": [ 374 | "We can view the Cluster Dashboard to see workers disappearing and hourly cost coming down." 375 | ], 376 | "cell_type": "markdown", 377 | "metadata": {} 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": null, 382 | "metadata": {}, 383 | "outputs": [], 384 | "source": [ 385 | "cluster.dashboard_link" 386 | ] 387 | }, 388 | { 389 | "cell_type": "markdown", 390 | "metadata": {}, 391 | "source": [ 392 | "## Optuna\n", 393 | "\n", 394 | "Bayesian optimization - accelerated search.\n", 395 | "\n", 396 | "Let's configure the objective function to suggest parameter values from the ranges we want to explore." 397 | ] 398 | }, 399 | { 400 | "cell_type": "code", 401 | "execution_count": null, 402 | "metadata": {}, 403 | "outputs": [], 404 | "source": [ 405 | "def objective(trial):\n", 406 | " params = {\n", 407 | " \"max_depth\": trial.suggest_int(\"max_depth\", 3, 16),\n", 408 | " \"min_child_weight\": trial.suggest_int(\"min_child_weight\", 3, 30),\n", 409 | " \"eta\": trial.suggest_float(\"eta\", 1e-8, 1.0, log=True),\n", 410 | " \"colsample_bytree\": trial.suggest_float(\"colsample_bytree\", 0.7, 1.0),\n", 411 | " \"sampling_method \": trial.suggest_categorical(\n", 412 | " \"sampling_method\", [\"uniform\", \"gradient_based\"]\n", 413 | " ),\n", 414 | " \"booster\": trial.suggest_categorical(\"booster\", [\"gbtree\", \"dart\"]),\n", 415 | " \"grow_policy\": trial.suggest_categorical(\n", 416 | " \"grow_policy\", [\"depthwise\", \"lossguide\"]\n", 417 | " ),\n", 418 | " }\n", 419 | "\n", 420 | " wine = pd.read_csv(\"https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv\", delimiter=\";\")\n", 421 | " X, y = wine.iloc[:, :-1], wine[\"quality\"]\n", 422 | "\n", 423 | " estimator = XGBRegressor(objective=\"reg:squarederror\", **params)\n", 424 | " \n", 425 | " score = cross_val_score(\n", 426 | " estimator, X, y, cv=5, scoring=\"neg_mean_absolute_error\"\n", 427 | " ).mean()\n", 428 | " \n", 429 | " return score" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": null, 435 | "metadata": {}, 436 | "outputs": [], 437 | "source": [ 438 | "%%time\n", 439 | "\n", 440 | "import dask_optuna\n", 441 | "import joblib\n", 442 | "import optuna\n", 443 | "\n", 444 | "storage = dask_optuna.DaskStorage()\n", 445 | "\n", 446 | "study = optuna.create_study(direction=\"maximize\", storage=storage)\n", 447 | "with joblib.parallel_backend(\"dask\"):\n", 448 | " study.optimize(objective, n_trials=100, n_jobs=-1)" 449 | ] 450 | }, 451 | { 452 | "cell_type": "code", 453 | "execution_count": null, 454 | "metadata": {}, 455 | "outputs": [], 456 | "source": [ 457 | "study.best_value" 458 | ] 459 | }, 460 | { 461 | "cell_type": "code", 462 | "execution_count": null, 463 | "metadata": {}, 464 | "outputs": [], 465 | "source": [ 466 | "study.best_trial" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": null, 472 | "metadata": {}, 473 | "outputs": [], 474 | "source": [ 475 | "study.best_params" 476 | ] 477 | }, 478 | { 479 | "cell_type": "code", 480 | "execution_count": null, 481 | "metadata": {}, 482 | "outputs": [], 483 | "source": [ 484 | "results = study.trials_dataframe()" 485 | ] 486 | }, 487 | { 488 | "cell_type": "markdown", 489 | "metadata": {}, 490 | "source": [ 491 | "### Plot trial outcomes" 492 | ] 493 | }, 494 | { 495 | "cell_type": "code", 496 | "execution_count": null, 497 | "metadata": {}, 498 | "outputs": [], 499 | "source": [ 500 | "import matplotlib.pyplot as plt" 501 | ] 502 | }, 503 | { 504 | "cell_type": "code", 505 | "execution_count": 42, 506 | "metadata": {}, 507 | "outputs": [ 508 | { 509 | "data": { 510 | "text/plain": [ 511 | "Text(0.5, 1.0, 'Mean Absolute Error over 100 Optimization Trials')" 512 | ] 513 | }, 514 | "execution_count": 42, 515 | "metadata": {}, 516 | "output_type": "execute_result" 517 | }, 518 | { 519 | "data": { 520 | "image/png": "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\n", 521 | "text/plain": [ 522 | "
" 523 | ] 524 | }, 525 | "metadata": { 526 | "needs_background": "light" 527 | }, 528 | "output_type": "display_data" 529 | } 530 | ], 531 | "source": [ 532 | "fig, ax = plt.subplots(figsize=(12, 8))\n", 533 | "results.value.clip(lower=-1).plot.line()\n", 534 | "best_trial = results.value.idxmax()\n", 535 | "plt.scatter(best_trial, results.loc[best_trial].value, color='r', s=100)\n", 536 | "plt.ylabel('5-fold CV Mean Absolute Error')\n", 537 | "plt.xlabel('Optuna Trials')\n", 538 | "plt.title('Mean Absolute Error over 100 Optimization Trials')" 539 | ] 540 | }, 541 | { 542 | "cell_type": "markdown", 543 | "metadata": {}, 544 | "source": [ 545 | "### Set down the cluster" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": null, 551 | "metadata": {}, 552 | "outputs": [], 553 | "source": [ 554 | "cluster.close()" 555 | ] 556 | }, 557 | { 558 | "cell_type": "markdown", 559 | "metadata": {}, 560 | "source": [ 561 | "### Dataset citation:\n", 562 | "\n", 563 | "> P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis. \n", 564 | "> Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009." 565 | ] 566 | } 567 | ], 568 | "metadata": { 569 | "kernelspec": { 570 | "display_name": "Python 3", 571 | "language": "python", 572 | "name": "python3" 573 | }, 574 | "language_info": { 575 | "codemirror_mode": { 576 | "name": "ipython", 577 | "version": 3 578 | }, 579 | "file_extension": ".py", 580 | "mimetype": "text/x-python", 581 | "name": "python", 582 | "nbconvert_exporter": "python", 583 | "pygments_lexer": "ipython3", 584 | "version": "3.8.5" 585 | } 586 | }, 587 | "nbformat": 4, 588 | "nbformat_minor": 4 589 | } --------------------------------------------------------------------------------