From 280c718f53998fac52d3150461d7da1d538d5e00 Mon Sep 17 00:00:00 2001 From: hning86 Date: Thu, 14 Feb 2019 16:59:08 -0500 Subject: [PATCH] keras sample --- .../training-with-deep-learning/README.md | 15 +- .../keras_mnist.py | 121 ++ .../nn.png | Bin 0 -> 121768 bytes ...yperparameter-tune-deploy-with-keras.ipynb | 1141 +++++++++++++++++ .../utils.py | 27 + 5 files changed, 1297 insertions(+), 7 deletions(-) create mode 100644 how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/keras_mnist.py create mode 100644 how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/nn.png create mode 100644 how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb create mode 100644 how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/utils.py diff --git a/how-to-use-azureml/training-with-deep-learning/README.md b/how-to-use-azureml/training-with-deep-learning/README.md index da774b76..979450f6 100644 --- a/how-to-use-azureml/training-with-deep-learning/README.md +++ b/how-to-use-azureml/training-with-deep-learning/README.md @@ -4,12 +4,13 @@ These examples show you: 1. [How to use the Estimator pattern in Azure ML](how-to-use-estimator) 2. [Train using TensorFlow Estimator and tune hyperparameters using Hyperdrive](train-hyperparameter-tune-deploy-with-tensorflow) -3. [Train using Pytorch Estimator and tune hyperparameters using Hyperdrive](train-hyperparameter-tune-deploy-with-pytorch) -4. [Distributed training using TensorFlow and Parameter Server](distributed-tensorflow-with-parameter-server) -5. [Distributed training using TensorFlow and Horovod](distributed-tensorflow-with-horovod) -6. [Distributed training using Pytorch and Horovod](distributed-pytorch-with-horovod) -7. [Distributed training using CNTK and custom Docker image](distributed-cntk-with-custom-docker) -8. [Export run history records to Tensorboard](export-run-history-to-tensorboard) -9. [Use TensorBoard to monitor training execution](tensorboard) +3. [Train using Keras and tune hyperparameters using Hyperdrive](train-hyperparameter-tune-deploy-with-keras) +4. [Train using Pytorch Estimator and tune hyperparameters using Hyperdrive](train-hyperparameter-tune-deploy-with-pytorch) +5. [Distributed training using TensorFlow and Parameter Server](distributed-tensorflow-with-parameter-server) +6. [Distributed training using TensorFlow and Horovod](distributed-tensorflow-with-horovod) +7. [Distributed training using Pytorch and Horovod](distributed-pytorch-with-horovod) +8. [Distributed training using CNTK and custom Docker image](distributed-cntk-with-custom-docker) +9. [Export run history records to Tensorboard](export-run-history-to-tensorboard) +10. [Use TensorBoard to monitor training execution](tensorboard) Learn more about how to use `Estimator` class to [train deep neural networks with Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/service/how-to-train-ml-models). diff --git a/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/keras_mnist.py b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/keras_mnist.py new file mode 100644 index 00000000..0ca63a2b --- /dev/null +++ b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/keras_mnist.py @@ -0,0 +1,121 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import numpy as np +import argparse +import os + +import matplotlib.pyplot as plt + +import keras +from keras.models import Sequential, model_from_json +from keras.layers import Dense +from keras.optimizers import RMSprop +from keras.callbacks import Callback + +import tensorflow as tf + +from azureml.core import Run +from utils import load_data, one_hot_encode + +print("Keras version:", keras.__version__) +print("Tensorflow version:", tf.__version__) + +parser = argparse.ArgumentParser() +parser.add_argument('--data-folder', type=str, dest='data_folder', help='data folder mounting point') +parser.add_argument('--batch-size', type=int, dest='batch_size', default=50, help='mini batch size for training') +parser.add_argument('--first-layer-neurons', type=int, dest='n_hidden_1', default=100, + help='# of neurons in the first layer') +parser.add_argument('--second-layer-neurons', type=int, dest='n_hidden_2', default=100, + help='# of neurons in the second layer') +args = parser.parse_args() + +data_folder = args.data_folder + +print('training dataset is stored here:', data_folder) + +X_train = load_data(os.path.join(data_folder, 'train-images.gz'), False) / 255.0 +X_test = load_data(os.path.join(data_folder, 'test-images.gz'), False) / 255.0 + +y_train = load_data(os.path.join(data_folder, 'train-labels.gz'), True).reshape(-1) +y_test = load_data(os.path.join(data_folder, 'test-labels.gz'), True).reshape(-1) + +training_set_size = X_train.shape[0] + +n_inputs = 28 * 28 +n_h1 = args.n_hidden_1 +n_h2 = args.n_hidden_2 +n_outputs = 10 + +n_epochs = 20 +batch_size = args.batch_size + +y_train = one_hot_encode(y_train, n_outputs) +y_test = one_hot_encode(y_test, n_outputs) +print(X_train.shape, y_train.shape, X_test.shape, y_test.shape, sep='\n') + +# Build a simple MLP model +model = Sequential() +# input layer +model.add(Dense(n_h1, activation='relu', input_shape=(n_inputs,))) +# hidden layer +model.add(Dense(n_h2, activation='relu')) +# output layer +model.add(Dense(n_outputs, activation='softmax')) + +model.summary() + +model.compile(loss='categorical_crossentropy', + optimizer=RMSprop(), + metrics=['accuracy']) + +# start an Azure ML run +run = Run.get_context() + + +class LogRunMetrics(Callback): + # callback at the end of every epoch + def on_epoch_end(self, epoch, log): + # log a value repeated which creates a list + run.log('Loss', log['loss']) + run.log('Accuracy', log['acc']) + + +history = model.fit(X_train, y_train, + batch_size=batch_size, + epochs=n_epochs, + verbose=2, + validation_data=(X_test, y_test), + callbacks=[LogRunMetrics()]) + +score = model.evaluate(X_test, y_test, verbose=0) + +# log a single value +run.log("Final test loss", score[0]) +print('Test loss:', score[0]) + +run.log('Final test accuracy', score[1]) +print('Test accuracy:', score[1]) + +plt.figure(figsize=(6, 3)) +plt.title('MNIST with Keras MLP ({} epochs)'.format(n_epochs), fontsize=14) +plt.plot(history.history['acc'], 'b-', label='Accuracy', lw=4, alpha=0.5) +plt.plot(history.history['loss'], 'r--', label='Loss', lw=4, alpha=0.5) +plt.legend(fontsize=12) +plt.grid(True) + +# log an image +run.log_image('Accuracy vs Loss', plot=plt) + +# create a ./outputs/model folder in the compute target +# files saved in the "./outputs" folder are automatically uploaded into run history +os.makedirs('./outputs/model', exist_ok=True) + +# serialize NN architecture to JSON +model_json = model.to_json() +# save model JSON +with open('./outputs/model/model.json', 'w') as f: + f.write(model_json) +# save model weights +model.save_weights('./outputs/model/model.h5') +print("model saved in ./outputs/model folder") diff --git a/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/nn.png b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/nn.png new file mode 100644 index 0000000000000000000000000000000000000000..8910281eafd45cecfac2a5708abbffa82717a70b GIT binary patch literal 121768 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 IyL%FDJxN8SMf+-FEbHCHyqKasLB^ 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�qmh&cP>Q$zWVL(hSx~vQEge;E99~LTvxSIV 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

rKk(8jHnrD@os5(rLYO%Sz6@Ebg1vxO&@}Kv$fl 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 literal 0 HcmV?d00001 diff --git a/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb new file mode 100644 index 00000000..4248dfca --- /dev/null +++ b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb @@ -0,0 +1,1141 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation. All rights reserved.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbpresent": { + "id": "bf74d2e9-2708-49b1-934b-e0ede342f475" + } + }, + "source": [ + "# Training, hyperparameter tune, and deploy with Keras\n", + "\n", + "## Introduction\n", + "This tutorial shows how to train a simple deep neural network using the MNIST dataset and Keras on Azure Machine Learning. MNIST is a popular dataset consisting of 70,000 grayscale images. Each image is a handwritten digit of `28x28` pixels, representing number from 0 to 9. The goal is to create a multi-class classifier to identify the digit each image represents, and deploy it as a web service in Azure.\n", + "\n", + "For more information about the MNIST dataset, please visit [Yan LeCun's website](http://yann.lecun.com/exdb/mnist/).\n", + "\n", + "## Prerequisite:\n", + "* Understand the [architecture and terms](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture) introduced by Azure Machine Learning\n", + "* Go through the [configuration notebook](../../../configuration.ipynb) to:\n", + " * install the AML SDK\n", + " * create a workspace and its configuration file (`config.json`)\n", + "* For local scoring test, you will also need to have `tensorflow` and `keras` installed in the current Jupyter kernel." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's get started. First let's import some Python libraries." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "nbpresent": { + "id": "c377ea0c-0cd9-4345-9be2-e20fb29c94c3" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import os\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "nbpresent": { + "id": "edaa7f2f-2439-4148-b57a-8c794c0945ec" + } + }, + "outputs": [], + "source": [ + "import azureml\n", + "from azureml.core import Workspace\n", + "\n", + "# check core SDK version number\n", + "print(\"Azure ML SDK Version: \", azureml.core.VERSION)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Initialize workspace\n", + "Initialize a [Workspace](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#workspace) object from the existing workspace you created in the Prerequisites step. `Workspace.from_config()` creates a workspace object from the details stored in `config.json`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ws = Workspace.from_config()\n", + "print('Workspace name: ' + ws.name, \n", + " 'Azure region: ' + ws.location, \n", + " 'Subscription id: ' + ws.subscription_id, \n", + " 'Resource group: ' + ws.resource_group, sep = '\\n')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbpresent": { + "id": "59f52294-4a25-4c92-bab8-3b07f0f44d15" + } + }, + "source": [ + "## Create an Azure ML experiment\n", + "Let's create an experiment named \"keras-mnist\" and a folder to hold the training scripts. The script runs will be recorded under the experiment in Azure." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "nbpresent": { + "id": "bc70f780-c240-4779-96f3-bc5ef9a37d59" + } + }, + "outputs": [], + "source": [ + "from azureml.core import Experiment\n", + "\n", + "script_folder = './keras-mnist'\n", + "os.makedirs(script_folder, exist_ok=True)\n", + "\n", + "exp = Experiment(workspace=ws, name='keras-mnist')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbpresent": { + "id": "defe921f-8097-44c3-8336-8af6700804a7" + } + }, + "source": [ + "## Download MNIST dataset\n", + "In order to train on the MNIST dataset we will first need to download it from Yan LeCun's web site directly and save them in a `data` folder locally." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import urllib\n", + "\n", + "os.makedirs('./data/mnist', exist_ok=True)\n", + "\n", + "urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz', filename='./data/mnist/train-images.gz')\n", + "urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz', filename='./data/mnist/train-labels.gz')\n", + "urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz', filename='./data/mnist/test-images.gz')\n", + "urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz', filename='./data/mnist/test-labels.gz')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbpresent": { + "id": "c3f2f57c-7454-4d3e-b38d-b0946cf066ea" + } + }, + "source": [ + "## Show some sample images\n", + "Let's load the downloaded compressed file into numpy arrays using some utility functions included in the `utils.py` library file from the current folder. Then we use `matplotlib` to plot 30 random images from the dataset along with their labels." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "nbpresent": { + "id": "396d478b-34aa-4afa-9898-cdce8222a516" + } + }, + "outputs": [], + "source": [ + "from utils import load_data, one_hot_encode\n", + "\n", + "# note we also shrink the intensity values (X) from 0-255 to 0-1. This helps the neural network converge faster.\n", + "X_train = load_data('./data/mnist/train-images.gz', False) / 255.0\n", + "y_train = load_data('./data/mnist/train-labels.gz', True).reshape(-1)\n", + "\n", + "X_test = load_data('./data/mnist/test-images.gz', False) / 255.0\n", + "y_test = load_data('./data/mnist/test-labels.gz', True).reshape(-1)\n", + "\n", + "count = 0\n", + "sample_size = 30\n", + "plt.figure(figsize = (16, 6))\n", + "for i in np.random.permutation(X_train.shape[0])[:sample_size]:\n", + " count = count + 1\n", + " plt.subplot(1, sample_size, count)\n", + " plt.axhline('')\n", + " plt.axvline('')\n", + " plt.text(x = 10, y = -10, s = y_train[i], fontsize = 18)\n", + " plt.imshow(X_train[i].reshape(28, 28), cmap = plt.cm.Greys)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Upload MNIST dataset to default datastore \n", + "A [datastore](https://docs.microsoft.com/azure/machine-learning/service/how-to-access-data) is a place where data can be stored that is then made accessible to a Run either by means of mounting or copying the data to the compute target. A datastore can either be backed by an Azure Blob Storage or and Azure File Share (ADLS will be supported in the future). For simple data handling, each workspace provides a default datastore that can be used, in case the data is not already in Blob Storage or File Share." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = ws.get_default_datastore()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this next step, we will upload the training and test set into the workspace's default datastore, which we will then later be mount on an `AmlCompute` cluster for training." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.upload(src_dir='./data/mnist', target_path='mnist', overwrite=True, show_progress=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create or Attach existing AmlCompute\n", + "You will need to create a [compute target](https://docs.microsoft.com/azure/machine-learning/service/concept-azure-machine-learning-architecture#compute-target) for training your model. In this tutorial, you create `AmlCompute` as your training compute resource." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we could not find the cluster with the given name, then we will create a new cluster here. We will create an `AmlCompute` cluster of `STANDARD_NC6` GPU VMs. This process is broken down into 3 steps:\n", + "1. create the configuration (this step is local and only takes a second)\n", + "2. create the cluster (this step will take about **20 seconds**)\n", + "3. provision the VMs to bring the cluster to the initial size (of 1 in this case). This step will take about **3-5 minutes** and is providing only sparse output in the process. Please make sure to wait until the call returns before moving to the next cell" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.compute import ComputeTarget, AmlCompute\n", + "from azureml.core.compute_target import ComputeTargetException\n", + "\n", + "# choose a name for your cluster\n", + "cluster_name = \"gpucluster\"\n", + "\n", + "try:\n", + " compute_target = ComputeTarget(workspace=ws, name=cluster_name)\n", + " print('Found existing compute target')\n", + "except ComputeTargetException:\n", + " print('Creating a new compute target...')\n", + " compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6', \n", + " max_nodes=4)\n", + "\n", + " # create the cluster\n", + " compute_target = ComputeTarget.create(ws, cluster_name, compute_config)\n", + "\n", + " # can poll for a minimum number of nodes and for a specific timeout. \n", + " # if no min node count is provided it uses the scale settings for the cluster\n", + " compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)\n", + "\n", + "# use get_status() to get a detailed status for the current cluster. \n", + "print(compute_target.get_status().serialize())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that you have created the compute target, let's see what the workspace's `compute_targets` property returns. You should now see one entry named 'gpucluster' of type `AmlCompute`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "compute_targets = ws.compute_targets\n", + "for name, ct in compute_targets.items():\n", + " print(name, ct.type, ct.provisioning_state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Copy the training files into the script folder\n", + "The TensorFlow training script is already created for you. You can simply copy it into the script folder, together with the utility library used to load compressed data file into numpy array." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import shutil\n", + "\n", + "# the training logic is in the keras_mnist.py file.\n", + "shutil.copy('./keras_mnist.py', script_folder)\n", + "\n", + "# the utils.py just helps loading data from the downloaded MNIST dataset into numpy arrays.\n", + "shutil.copy('./utils.py', script_folder)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nbpresent": { + "id": "2039d2d5-aca6-4f25-a12f-df9ae6529cae" + } + }, + "source": [ + "## Construct neural network in TensorFlow\n", + "In the training script `keras_mnist.py`, it creates a very simple DNN (deep neural network), with just 2 hidden layers. The input layer has 28 * 28 = 784 neurons, each representing a pixel in an image. The first hidden layer has 300 neurons, and the second hidden layer has 100 neurons. The output layer has 10 neurons, each representing a targeted label from 0 to 9.\n", + "\n", + "![DNN](nn.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Azure ML concepts \n", + "Please note the following three things in the code below:\n", + "1. The script accepts arguments using the argparse package. In this case there is one argument `--data_folder` which specifies the file system folder in which the script can find the MNIST data\n", + "```\n", + " parser = argparse.ArgumentParser()\n", + " parser.add_argument('--data_folder')\n", + "```\n", + "2. The script is accessing the Azure ML `Run` object by executing `run = Run.get_context()`. Further down the script is using the `run` to report the loss and accuracy at the end of each epoch via callback.\n", + "```\n", + " run.log('Loss', log['loss'])\n", + " run.log('Accuracy', log['acc'])\n", + "```\n", + "3. When running the script on Azure ML, you can write files out to a folder `./outputs` that is relative to the root directory. This folder is specially tracked by Azure ML in the sense that any files written to that folder during script execution on the remote target will be picked up by Run History; these files (known as artifacts) will be available as part of the run history record." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell will print out the training code for you to inspect it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(os.path.join(script_folder, './keras_mnist.py'), 'r') as f:\n", + " print(f.read())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create TensorFlow estimator & add Keras\n", + "Next, we construct an `azureml.train.dnn.TensorFlow` estimator object, use the `gpucluster` as compute target, and pass the mount-point of the datastore to the training code as a parameter.\n", + "The TensorFlow estimator is providing a simple way of launching a TensorFlow training job on a compute target. It will automatically provide a docker image that has TensorFlow installed. In this case, we add `keras` package (for the Keras framework obviously), and `matplotlib` package for plotting a \"Loss vs. Accuracy\" chart and record it in run history." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.train.dnn import TensorFlow\n", + "\n", + "script_params = {\n", + " '--data-folder': ds.path('mnist').as_mount(),\n", + " '--batch-size': 50,\n", + " '--first-layer-neurons': 300,\n", + " '--second-layer-neurons': 100 \n", + "}\n", + "\n", + "est = TensorFlow(source_directory=script_folder,\n", + " script_params=script_params,\n", + " compute_target=compute_target, \n", + " conda_packages=['keras', 'matplotlib'],\n", + " entry_script='keras_mnist.py', \n", + " use_gpu=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And if you are curious, this is what the mounting point looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(ds.path('mnist').as_mount())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Submit job to run\n", + "Submit the estimator to an Azure ML experiment to kick off the execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run = exp.submit(est)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Monitor the Run\n", + "As the Run is executed, it will go through the following stages:\n", + "1. Preparing: A docker image is created matching the Python environment specified by the TensorFlow estimator and it will be uploaded to the workspace's Azure Container Registry. This step will only happen once for each Python environment -- the container will then be cached for subsequent runs. Creating and uploading the image takes about **5 minutes**. While the job is preparing, logs are streamed to the run history and can be viewed to monitor the progress of the image creation.\n", + "\n", + "2. Scaling: If the compute needs to be scaled up (i.e. the AmlCompute cluster requires more nodes to execute the run than currently available), the cluster will attempt to scale up in order to make the required amount of nodes available. Scaling typically takes about **5 minutes**.\n", + "\n", + "3. Running: All scripts in the script folder are uploaded to the compute target, data stores are mounted/copied and the `entry_script` is executed. While the job is running, stdout and the `./logs` folder are streamed to the run history and can be viewed to monitor the progress of the run.\n", + "\n", + "4. Post-Processing: The `./outputs` folder of the run is copied over to the run history\n", + "\n", + "There are multiple ways to check the progress of a running job. We can use a Jupyter notebook widget. \n", + "\n", + "**Note: The widget will automatically update ever 10-15 seconds, always showing you the most up-to-date information about the run**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.widgets import RunDetails\n", + "RunDetails(run).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also periodically check the status of the run object, and navigate to Azure portal to monitor the run." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run.wait_for_completion(show_output=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The Run object\n", + "The Run object provides the interface to the run history -- both to the job and to the control plane (this notebook), and both while the job is running and after it has completed. It provides a number of interesting features for instance:\n", + "* `run.get_details()`: Provides a rich set of properties of the run\n", + "* `run.get_metrics()`: Provides a dictionary with all the metrics that were reported for the Run\n", + "* `run.get_file_names()`: List all the files that were uploaded to the run history for this Run. This will include the `outputs` and `logs` folder, azureml-logs and other logs, as well as files that were explicitly uploaded to the run using `run.upload_file()`\n", + "\n", + "Below are some examples -- please run through them and inspect their output. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run.get_details()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run.get_metrics()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run.get_file_names()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Download the saved model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the training script, the Keras model is saved into two files, `model.json` and `model.h5`, in the `outputs/models` folder on the gpucluster AmlCompute node. Azure ML automatically uploaded anything written in the `./outputs` folder into run history file store. Subsequently, we can use the `run` object to download the model files. They are under the the `outputs/model` folder in the run history file store, and are downloaded into a local folder named `model`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create a model folder in the current directory\n", + "os.makedirs('./model', exist_ok=True)\n", + "\n", + "for f in run.get_file_names():\n", + " if f.startswith('outputs/model'):\n", + " output_file_path = os.path.join('./model', f.split('/')[-1])\n", + " print('Downloading from {} to {} ...'.format(f, output_file_path))\n", + " run.download_file(name=f, output_file_path=output_file_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Predict on the test set\n", + "Now load the saved Kears model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from keras.models import model_from_json\n", + "\n", + "# load json and create model\n", + "json_file = open('model/model.json', 'r')\n", + "loaded_model_json = json_file.read()\n", + "json_file.close()\n", + "loaded_model = model_from_json(loaded_model_json)\n", + "# load weights into new model\n", + "loaded_model.load_weights(\"model/model.h5\")\n", + "print(\"Model loaded from disk.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Feed test dataset to the persisted model to get predictions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# evaluate loaded model on test data\n", + "loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])\n", + "y_test_ohe = one_hot_encode(y_test, 10)\n", + "y_hat = np.argmax(loaded_model.predict(X_test), axis=1)\n", + "\n", + "# print the first 30 labels and predictions\n", + "print('labels: \\t', y_test[:30])\n", + "print('predictions:\\t', y_hat[:30])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Calculate the overall accuracy by comparing the predicted value against the test set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Accuracy on the test set:\", np.average(y_hat == y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Intelligent hyperparameter tuning\n", + "We have trained the model with one set of hyperparameters, now let's how we can do hyperparameter tuning by launching multiple runs on the cluster. First let's define the parameter space using random sampling." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.train.hyperdrive import RandomParameterSampling, BanditPolicy, HyperDriveRunConfig, PrimaryMetricGoal\n", + "from azureml.train.hyperdrive import choice, loguniform\n", + "\n", + "ps = RandomParameterSampling(\n", + " {\n", + " '--batch-size': choice(25, 50, 100),\n", + " '--first-layer-neurons': choice(10, 50, 200, 300, 500),\n", + " '--second-layer-neurons': choice(10, 50, 200, 500) \n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will create a new estimator without the above parameters since they will be passed in later by Hyperdrive configuration. Note we still need to keep the `data-folder` parameter since that's not a hyperparamter we will sweep." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "est = TensorFlow(source_directory=script_folder,\n", + " script_params={'--data-folder': ds.path('mnist').as_mount()},\n", + " compute_target=compute_target,\n", + " conda_packages=['keras', 'matplotlib'],\n", + " entry_script='keras_mnist.py', \n", + " use_gpu=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will define an early termnination policy. The `BanditPolicy` basically states to check the job every 2 iterations. If the primary metric (defined later) falls outside of the top 10% range, Azure ML terminate the job. This saves us from continuing to explore hyperparameters that don't show promise of helping reach our target metric." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "policy = BanditPolicy(evaluation_interval=2, slack_factor=0.1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to configure a run configuration object, and specify the primary metric `Accuracy` that's recorded in your training runs. If you go back to visit the training script, you will notice that this value is being logged after every epoch (a full batch set). We also want to tell the service that we are looking to maximizing this value. We also set the number of samples to 20, and maximal concurrent job to 4, which is the same as the number of nodes in our computer cluster." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "htc = HyperDriveRunConfig(estimator=est, \n", + " hyperparameter_sampling=ps, \n", + " policy=policy, \n", + " primary_metric_name='Accuracy', \n", + " primary_metric_goal=PrimaryMetricGoal.MAXIMIZE, \n", + " max_total_runs=20,\n", + " max_concurrent_runs=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, let's launch the hyperparameter tuning job." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "htr = exp.submit(config=htc)\n", + "htr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use a run history widget to show the progress. Be patient as this might take a while to complete." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "RunDetails(htr).show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "htr.wait_for_completion(show_output=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Find and register best model\n", + "When all the jobs finish, we can find out the one that has the highest accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "best_run = htr.get_best_run_by_primary_metric()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's list the model files uploaded during the run." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(best_run.get_file_names())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can then register the folder (and all files in it) as a model named `keras-dnn-mnist` under the workspace for deployment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "model = best_run.register_model(model_name='keras-mlp-mnist', model_path='outputs/model')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deploy the model in ACI\n", + "Now we are ready to deploy the model as a web service running in Azure Container Instance [ACI](https://azure.microsoft.com/en-us/services/container-instances/). Azure Machine Learning accomplishes this by constructing a Docker image with the scoring logic and model baked in.\n", + "### Create score.py\n", + "First, we will create a scoring script that will be invoked by the web service call. \n", + "\n", + "* Note that the scoring script must have two required functions, `init()` and `run(input_data)`. \n", + " * In `init()` function, you typically load the model into a global object. This function is executed only once when the Docker container is started. \n", + " * In `run(input_data)` function, the model is used to predict a value based on the input data. The input and output to `run` typically use JSON as serialization and de-serialization format but you are not limited to that." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile score.py\n", + "import json\n", + "import numpy as np\n", + "import os\n", + "from keras.models import model_from_json\n", + "\n", + "from azureml.core.model import Model\n", + "\n", + "def init():\n", + " global model\n", + " \n", + " model_root = Model.get_model_path('keras-mlp-mnist')\n", + " # load json and create model\n", + " json_file = open(os.path.join(model_root, 'model.json'), 'r')\n", + " model_json = json_file.read()\n", + " json_file.close()\n", + " model = model_from_json(model_json)\n", + " # load weights into new model\n", + " model.load_weights(os.path.join(model_root, \"model.h5\")) \n", + " model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])\n", + " \n", + "def run(raw_data):\n", + " data = np.array(json.loads(raw_data)['data'])\n", + " # make prediction\n", + " y_hat = np.argmax(model.predict(data), axis=1)\n", + " return y_hat.tolist()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create myenv.yml\n", + "We also need to create an environment file so that Azure Machine Learning can install the necessary packages in the Docker image which are required by your scoring script. In this case, we need to specify packages `numpy`, `tensorflow`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.runconfig import CondaDependencies\n", + "\n", + "cd = CondaDependencies.create()\n", + "cd.add_tensorflow_conda_package()\n", + "cd.add_conda_package('keras')\n", + "cd.save_to_file(base_directory='./', conda_file_path='myenv.yml')\n", + "\n", + "print(cd.serialize_to_string())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Deploy to ACI\n", + "We are almost ready to deploy. Create a deployment configuration and specify the number of CPUs and gigbyte of RAM needed for your ACI container. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.webservice import AciWebservice\n", + "\n", + "aciconfig = AciWebservice.deploy_configuration(cpu_cores=1, \n", + " auth_enabled=True, # this flag generates API keys to secure access\n", + " memory_gb=1, \n", + " tags={'name':'mnist', 'framework': 'Keras MLP'},\n", + " description='Keras MLP on MNIST')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Deployment Process\n", + "Now we can deploy. **This cell will run for about 7-8 minutes**. Behind the scene, it will do the following:\n", + "1. **Build Docker image** \n", + "Build a Docker image using the scoring file (`score.py`), the environment file (`myenv.yml`), and the `model` object. \n", + "2. **Register image** \n", + "Register that image under the workspace. \n", + "3. **Ship to ACI** \n", + "And finally ship the image to the ACI infrastructure, start up a container in ACI using that image, and expose an HTTP endpoint to accept REST client calls." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.image import ContainerImage\n", + "\n", + "imgconfig = ContainerImage.image_configuration(execution_script=\"score.py\", \n", + " runtime=\"python\", \n", + " conda_file=\"myenv.yml\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "from azureml.core.webservice import Webservice\n", + "\n", + "service = Webservice.deploy_from_model(workspace=ws,\n", + " name='keras-mnist-svc',\n", + " deployment_config=aciconfig,\n", + " models=[model],\n", + " image_config=imgconfig)\n", + "\n", + "service.wait_for_deployment(show_output=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Tip: If something goes wrong with the deployment, the first thing to look at is the logs from the service by running the following command:**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(service.get_logs())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is the scoring web service endpoint:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(service.scoring_uri)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test the deployed model\n", + "Let's test the deployed model. Pick 30 random samples from the test set, and send it to the web service hosted in ACI. Note here we are using the `run` API in the SDK to invoke the service. You can also make raw HTTP calls using any HTTP tool such as curl.\n", + "\n", + "After the invocation, we print the returned predictions and plot them along with the input images. Use red font color and inversed image (white on black) to highlight the misclassified samples. Note since the model accuracy is pretty high, you might have to run the below cell a few times before you can see a misclassified sample." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "\n", + "# find 30 random samples from test set\n", + "n = 30\n", + "sample_indices = np.random.permutation(X_test.shape[0])[0:n]\n", + "\n", + "test_samples = json.dumps({\"data\": X_test[sample_indices].tolist()})\n", + "test_samples = bytes(test_samples, encoding='utf8')\n", + "\n", + "# predict using the deployed model\n", + "result = service.run(input_data=test_samples)\n", + "\n", + "# compare actual value vs. the predicted values:\n", + "i = 0\n", + "plt.figure(figsize = (20, 1))\n", + "\n", + "for s in sample_indices:\n", + " plt.subplot(1, n, i + 1)\n", + " plt.axhline('')\n", + " plt.axvline('')\n", + " \n", + " # use different color for misclassified sample\n", + " font_color = 'red' if y_test[s] != result[i] else 'black'\n", + " clr_map = plt.cm.gray if y_test[s] != result[i] else plt.cm.Greys\n", + " \n", + " plt.text(x=10, y=-10, s=y_hat[s], fontsize=18, color=font_color)\n", + " plt.imshow(X_test[s].reshape(28, 28), cmap=clr_map)\n", + " \n", + " i = i + 1\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can retreive the API keys used for accessing the HTTP endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# retreive the API keys. two keys were generated.\n", + "key1, Key2 = service.get_keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now send construct raw HTTP request and send to the service. Don't forget to add key to the HTTP header." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "\n", + "# send a random row from the test set to score\n", + "random_index = np.random.randint(0, len(X_test)-1)\n", + "input_data = \"{\\\"data\\\": [\" + str(list(X_test[random_index])) + \"]}\"\n", + "\n", + "headers = {'Content-Type':'application/json', 'Authorization': 'Bearer ' + key1}\n", + "\n", + "resp = requests.post(service.scoring_uri, input_data, headers=headers)\n", + "\n", + "print(\"POST to url\", service.scoring_uri)\n", + "#print(\"input data:\", input_data)\n", + "print(\"label:\", y_test[random_index])\n", + "print(\"prediction:\", resp.text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's look at the workspace after the web service was deployed. You should see \n", + "* a registered model named 'keras-mlp-mnist' and with the id 'model:1'\n", + "* an image called 'keras-mnist-svc' and with a docker image location pointing to your workspace's Azure Container Registry (ACR) \n", + "* a webservice called 'keras-mnist-svc' with some scoring URL" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "models = ws.models\n", + "for name, model in models.items():\n", + " print(\"Model: {}, ID: {}\".format(name, model.id))\n", + " \n", + "images = ws.images\n", + "for name, image in images.items():\n", + " print(\"Image: {}, location: {}\".format(name, image.image_location))\n", + " \n", + "webservices = ws.webservices\n", + "for name, webservice in webservices.items():\n", + " print(\"Webservice: {}, scoring URI: {}\".format(name, webservice.scoring_uri))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Clean up\n", + "You can delete the ACI deployment with a simple delete API call." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "service.delete()" + ] + } + ], + "metadata": { + "authors": [ + { + "name": "haining" + } + ], + "kernelspec": { + "display_name": "Python 3.6", + "language": "python", + "name": "python36" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + }, + "msauthor": "haining" + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/utils.py b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/utils.py new file mode 100644 index 00000000..98170ada --- /dev/null +++ b/how-to-use-azureml/training-with-deep-learning/train-hyperparameter-tune-deploy-with-keras/utils.py @@ -0,0 +1,27 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import gzip +import numpy as np +import struct + + +# load compressed MNIST gz files and return numpy arrays +def load_data(filename, label=False): + with gzip.open(filename) as gz: + struct.unpack('I', gz.read(4)) + n_items = struct.unpack('>I', gz.read(4)) + if not label: + n_rows = struct.unpack('>I', gz.read(4))[0] + n_cols = struct.unpack('>I', gz.read(4))[0] + res = np.frombuffer(gz.read(n_items[0] * n_rows * n_cols), dtype=np.uint8) + res = res.reshape(n_items[0], n_rows * n_cols) + else: + res = np.frombuffer(gz.read(n_items[0]), dtype=np.uint8) + res = res.reshape(n_items[0], 1) + return res + + +# one-hot encode a 1-D array +def one_hot_encode(array, num_of_classes): + return np.eye(num_of_classes)[array.reshape(-1)]