{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deploy a Trained TensorFlow V2 Model\n",
"\n",
"In this notebook, we walk through the process of deploying a trained model to a SageMaker endpoint. If you recently ran [the notebook for training](get_started_mnist_deploy.ipynb) with %store% magic, the `model_data` can be restored. Otherwise, we retrieve the \n",
"model artifact from a public S3 bucket."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# setups\n",
"\n",
"import os\n",
"import json\n",
"\n",
"import sagemaker\n",
"from sagemaker.tensorflow import TensorFlowModel\n",
"from sagemaker import get_execution_role, Session\n",
"import boto3\n",
"\n",
"# Get global config\n",
"with open(\"code/config.json\", \"r\") as f:\n",
" CONFIG = json.load(f)\n",
"\n",
"sess = Session()\n",
"role = get_execution_role()\n",
"\n",
"%store -r tf_mnist_model_data\n",
"\n",
"\n",
"try:\n",
" tf_mnist_model_data\n",
"except NameError:\n",
" import json\n",
"\n",
" # copy a pretrained model from a public bucket to your default bucket\n",
" s3 = boto3.client(\"s3\")\n",
" bucket = CONFIG[\"public_bucket\"]\n",
" key = \"datasets/image/MNIST/model/tensorflow-training-2020-11-20-23-57-13-077/model.tar.gz\"\n",
" s3.download_file(bucket, key, \"model.tar.gz\")\n",
" tf_mnist_model_data = sess.upload_data(\n",
" path=\"model.tar.gz\", bucket=sess.default_bucket(), key_prefix=\"model/tensorflow\"\n",
" )\n",
" os.remove(\"model.tar.gz\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"s3://sagemaker-ap-southeast-2-431579215499/tensorflow/mnist/tensorflow-training-2022-06-06-03-53-29-103/output/model.tar.gz\n"
]
}
],
"source": [
"print(tf_mnist_model_data)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## TensorFlow Model Object\n",
"\n",
"The `TensorFlowModel` class allows you to define an environment for making inference using your\n",
"model artifact. Like `TensorFlow` estimator class we discussed \n",
"[in this notebook for training an Tensorflow model](\n",
"get_started_mnist_train.ipynb), it is high level API used to set up a docker image for your model hosting service.\n",
"\n",
"Once it is properly configured, it can be used to create a SageMaker\n",
"endpoint on an EC2 instance. The SageMaker endpoint is a containerized environment that uses your trained model \n",
"to make inference on incoming data via RESTful API calls. \n",
"\n",
"Some common parameters used to initiate the `TensorFlowModel` class are:\n",
"- role: An IAM role to make AWS service requests\n",
"- model_data: the S3 bucket URI of the compressed model artifact. It can be a path to a local file if the endpoint \n",
"is to be deployed on the SageMaker instance you are using to run this notebook (local mode)\n",
"- framework_version: version of the MXNet package to be used\n",
"- py_version: python version to be used"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"model = TensorFlowModel(\n",
" role=role,\n",
" model_data=tf_mnist_model_data,\n",
" framework_version=\"2.3.1\",\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Execute the Inference Container\n",
"Once the `TensorFlowModel` class is initiated, we can call its `deploy` method to run the container for the hosting\n",
"service. Some common parameters needed to call `deploy` methods are:\n",
"\n",
"- initial_instance_count: the number of SageMaker instances to be used to run the hosting service.\n",
"- instance_type: the type of SageMaker instance to run the hosting service. Set it to `local` if you want run the hosting service on the local SageMaker instance. Local mode are typically used for debugging. \n",
"\n",
" Note: local mode is not supported in SageMaker Studio "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"update_endpoint is a no-op in sagemaker>=2.\n",
"See: https://sagemaker.readthedocs.io/en/stable/v2.html for details.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"----!"
]
}
],
"source": [
"from sagemaker.serializers import JSONSerializer\n",
"from sagemaker.deserializers import JSONDeserializer\n",
"\n",
"# set local_mode to False if you want to deploy on a remote\n",
"# SageMaker instance\n",
"\n",
"local_mode = False\n",
"\n",
"if local_mode:\n",
" instance_type = \"local\"\n",
"else:\n",
" instance_type = \"ml.c4.xlarge\"\n",
"\n",
"predictor = model.deploy(\n",
" initial_instance_count=1,\n",
" instance_type=instance_type,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Making Predictions Against a SageMaker endpoint\n",
"\n",
"Once you have the `Predictor` instance returned by `model.deploy(...)`, you can send prediction requests to your endpoints. In this case, the model accepts normalized \n",
"batch images in depth-minor convention. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'predictions': [[-3.07496858, -1.92263961, 0.40784055, 2.68889284, -4.51269293, 1.26628399, -0.371436179, -1.60043943, -1.73814678, -1.44925392], [-2.78310299, -2.50181174, 0.196516275, 2.38543034, -4.89259768, 1.30999255, -0.287920415, -1.23828626, -1.47772789, -2.17345548], [-2.62833285, -2.2909236, 0.589692771, 2.63945913, -4.41077375, 0.810409307, -0.695943296, -1.64216757, -1.58362, -1.63197041], [-2.6050365, -2.26944327, 0.382466316, 2.50133753, -4.92548084, 1.26441634, 0.0326526649, -1.47540545, -1.75987828, -1.9871254]]}\n"
]
}
],
"source": [
"# use some dummy inputs\n",
"import numpy as np\n",
"\n",
"dummy_inputs = {\"instances\": np.random.rand(4, 28, 28, 1)}\n",
"\n",
"res = predictor.predict(dummy_inputs)\n",
"print(res)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The formats of the input and output data correspond directly to the request and response\n",
"format of the `Predict` method in [TensorFlow Serving REST API](https://www.tensorflow.org/tfx/serving/api_rest), for example, the key of the array to be \n",
"parsed to the model in the `dummy_inputs` needs to be called `instances`. Moreover, the input data needs to have a batch dimension. "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Uncomment the following lines to see an example that cannot be processed by the endpoint\n",
"\n",
"# dummy_data = {\n",
"# 'instances': np.random.rand(28, 28, 1).tolist()\n",
"# }\n",
"# print(predictor.predict(inputs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's use real MNIST test to test the endpoint. We use helper functions defined in `code.utils` to \n",
"download MNIST data set and normalize the input data."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from utils.mnist import mnist_to_numpy, normalize\n",
"import random\n",
"import matplotlib.pyplot as plt\n",
"\n",
"%matplotlib inline\n",
"\n",
"data_dir = \"/tmp/data\"\n",
"X, _ = mnist_to_numpy(data_dir, train=False)\n",
"\n",
"# randomly sample 16 images to inspect\n",
"mask = random.sample(range(X.shape[0]), 16)\n",
"samples = X[mask]\n",
"\n",
"# plot the images\n",
"fig, axs = plt.subplots(nrows=1, ncols=16, figsize=(16, 1))\n",
"\n",
"for i, splt in enumerate(axs):\n",
" splt.imshow(samples[i])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since the model accepts normalized input, you will need to normalize the samples before \n",
"sending it to the endpoint. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"samples = normalize(samples, axis=(1, 2))\n",
"predictions = predictor.predict(np.expand_dims(samples, 3))[\"predictions\"] # add channel dim\n",
"\n",
"# softmax to logit\n",
"predictions = np.array(predictions, dtype=np.float32)\n",
"predictions = np.argmax(predictions, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Predictions: [8, 2, 2, 3, 3, 8, 4, 8, 9, 0, 1, 8, 3, 6, 1, 9]\n"
]
}
],
"source": [
"print(\"Predictions: \", predictions.tolist())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## (Optional) Clean up \n",
"\n",
"If you do not plan to use the endpoint, you should delete it to free up some computation \n",
"resource. If you use local, you will need to manually delete the docker container bounded\n",
"at port 8080 (the port that listens to the incoming request).\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"\n",
"if not local_mode:\n",
" predictor.delete_endpoint()\n",
"else:\n",
" os.system(\"docker container ls | grep 8080 | awk '{print $1}' | xargs docker container rm -f\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"instance_type": "ml.t3.medium",
"kernelspec": {
"display_name": "conda_python3",
"language": "python",
"name": "conda_python3"
},
"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.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 4
}