{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# How to run time series forecasting at scale with the GluonTS toolkit on Amazon SageMaker\n",
"\n",
"This notebook contains the notebook and training scripts for the blogpost **How to run time series forecasting at scale with GluonTS toolkit on Amazon SageMaker**\n",
"\n",
"In this notebook we take the example of forecasting energy usage and show you how to train and tune multiple time series models across algorithms and hyper-parameter combinations using the GluonTS toolkit on Amazon SageMaker. We will first show you how to setup GlounTS on SageMaker using the MXNet estimator, then train multiple models using SageMaker Experiments, and finally use SageMaker Debugger to monitor suboptimal training and improve training efficiencies. We will walk you through the following steps:\n",
"\n",
"1.\t[Prepare the time series dataset](#section1)\n",
"2.\t[Create the algorithm and hyper-parameters combinatorial matrix](#section2)\n",
"3.\t[Setup the GluonTS training script](#section3)\n",
"4. [Setup Amazon SageMaker Experiment and Trials](#section4)\n",
"5.\t[Setup the MXNet Estimator](#section5)\n",
"6.\t[Train and validate models](#section6)\n",
"7.\t[Evaluate metrics and select a winning candidate](#section7)\n",
"8.\t[Run time series forecasts](#section8)\n",
"9. [Run experiment with SageMaker Debugger enabled to auto-terminate sub-optimal training jobs](#section9)\n",
"\n",
"\n",
"Before getting started we need to first install a few packages:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"! pip install gluonts\n",
"! pip install --upgrade sagemaker\n",
"! pip install sagemaker-experiments\n",
"! pip install --upgrade smdebug-rulesconfig"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. Prepare the time series dataset \n",
"For this exercise, we use the individual household electric power consumption dataset. (Dua, D. and Karra Taniskidou, E. (2017). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.) We aggregate the usage data hourly.\n",
"\n",
"https://raw.githubusercontent.com/aws-samples/amazon-forecast-samples/master/notebooks/common/data/item-demand-time.csv\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"url = \"https://raw.githubusercontent.com/aws-samples/amazon-forecast-samples/master/notebooks/common/data/item-demand-time.csv\"\n",
"raw_df = pd.read_csv(url, header=None, names=[\"date\", \"usage\", \"client\"])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look on the data:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" date \n",
" usage \n",
" client \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 2014-01-01 01:00:00 \n",
" 38.349917 \n",
" client_12 \n",
" \n",
" \n",
" 1 \n",
" 2014-01-01 02:00:00 \n",
" 33.582090 \n",
" client_12 \n",
" \n",
" \n",
" 2 \n",
" 2014-01-01 03:00:00 \n",
" 34.411277 \n",
" client_12 \n",
" \n",
" \n",
" 3 \n",
" 2014-01-01 04:00:00 \n",
" 39.800995 \n",
" client_12 \n",
" \n",
" \n",
" 4 \n",
" 2014-01-01 05:00:00 \n",
" 41.044776 \n",
" client_12 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" date usage client\n",
"0 2014-01-01 01:00:00 38.349917 client_12\n",
"1 2014-01-01 02:00:00 33.582090 client_12\n",
"2 2014-01-01 03:00:00 34.411277 client_12\n",
"3 2014-01-01 04:00:00 39.800995 client_12\n",
"4 2014-01-01 05:00:00 41.044776 client_12"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Define the S3 bucket and folder locations to store the test and training data. This should be within the same region as the Notebook Instance, training, and hosting. We will use the default SageMaker S3 bucket."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import boto3\n",
"import sagemaker \n",
"\n",
"s3_client = boto3.client('s3')\n",
"s3res = boto3.resource('s3')\n",
"\n",
"sess = sagemaker.Session()\n",
"bucket = sess.default_bucket()\n",
"\n",
"pref = 'electricity-forecast-experiment/gluonts'\n",
"s3_train_channel = \"s3://\" + bucket + \"/\" + pref + \"/train.csv\"\n",
"s3_test_channel = \"s3://\" + bucket + \"/\" + pref + \"/test.csv\"\n",
"print(s3_train_channel)\n",
"print(s3_test_channel)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let’s divide the raw data into train and test samples and save them in their respective s3 folder locations. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"df_train = raw_df.query('date <= \"2014-31-10 11:00:00\"').copy()\n",
"df_train.to_csv(\"train.csv\")\n",
"s3_client.upload_file(\"train.csv\", bucket, pref+\"/train.csv\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"df_test = raw_df.query('date >= \"2014-1-11 12:00:00\"').copy()\n",
"df_test.to_csv(\"test.csv\")\n",
"s3_client.upload_file(\"test.csv\", bucket, pref+\"/test.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. Create the algorithm and hyper-parameters combinatorial matrix \n",
"\n",
"GluonTS comes with few pre-built models probabilistic forecasting models. Instead of simply predicting a single point estimate, probabilistic forecasting assigns a probability to every outcome. Once you select a model, you have the flexibility to configure the hyper-parameters to control the learning process. \n",
"\n",
"SageMaker supports bring your own model using Script mode. This allows you to leverage Amazon SageMaker prebuilt containers to train your models with the same kind of training script you would use outside of SageMaker. In this example, we use SageMaker's Apache MXNet containers to wrap \n",
"\n",
"In this example, we'll be training using four different models. \n",
"- **DeepAR** is a supervised learning algorithm for forecasting scalar time series using recurrent neural networks (RNN). \n",
"- **SFeedFwd** (Simple Feedforward) is a supervised learning algorithm where information moves in only one direction—forward—from the input nodes, through the hidden nodes (if any) and to the output nodes in the forward direction. \n",
"- **LSTNet** (Long- and Short-term Time-series network) is a multivariate time series forecasting model that uses the combination of Convolution Neural Network (CNN) and the Recurrent Neural Network (RNN) to find short-term local dependency patterns among variables and them find long-term patterns for time series trends. \n",
"- **Seq2Seq** (Sequence-to-sequence learning) is a method to train models to convert sequences from one domain to sequences in another domain. All these algorithms are already part of GluonTS, and we simply leverage it to quickly iterate and experiment over different models\n",
"\n",
"\n",
"A trainer defines how a network is going to be trained. Let’s define a trainer object using pandas dataframe that has the base list of algorithms, different epochs, learning rate, and hyper-parameter combinations that we want to define for our training runs. \n",
"**Note:** If you want to add more alogrithm/hyper-parameter combinations, please add them to the dataframe defined as variable `d` "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" epochs \n",
" algo \n",
" num_batches_per_epoch \n",
" learning_rate \n",
" hybridize \n",
" prediction_length \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 50 \n",
" DeepAR \n",
" 25 \n",
" 0.001 \n",
" True \n",
" 30 \n",
" \n",
" \n",
" 1 \n",
" 50 \n",
" seq2seq \n",
" 50 \n",
" 0.001 \n",
" True \n",
" 60 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" epochs algo num_batches_per_epoch learning_rate hybridize \\\n",
"0 50 DeepAR 25 0.001 True \n",
"1 50 seq2seq 50 0.001 True \n",
"\n",
" prediction_length \n",
"0 30 \n",
"1 60 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"d = {'epochs': [50,50], 'algo': [\"DeepAR\", \"seq2seq\"], 'num_batches_per_epoch': [25, 50], 'learning_rate':[1e-3,1e-3], 'hybridize':[True, True]}\n",
"df_hps = pd.DataFrame(data=d)\n",
"df_hps['prediction_length'] = [30, 60]\n",
"df_hps.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We will use the 'product' function to derive combinations of these parameters from the base set into separate rows in the dataframe. Each row corresponds to a training job configuration that we will subsequently pass to the MXNet Estimator to run the training job.\n",
"\n",
"**Note** Please check your AWS account limits before you setup the product function below. The training process in the sections below will run one training job per row from this dataframe. Based on your account limit for the maximum number of concurrent training jobs, you may get an error that the limit has been exceeded. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from itertools import product\n",
"\n",
"prod = product(df_hps['epochs'].unique(), df_hps['algo'].unique(), df_hps['num_batches_per_epoch'].unique(), df_hps['learning_rate'].unique(), df_hps['hybridize'].unique(), df_hps['prediction_length'].unique())\n",
"\n",
"df_hps_combo = pd.DataFrame([list(p) for p in prod],\n",
" columns=list(['epochs', 'algo', 'num_batches_per_epoch', 'learning_rate', 'hybridize', 'prediction_length']))\n",
"\n",
"df_hps_combo['jobnumber'] = df_hps_combo.index"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look on the different combinations. "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" epochs \n",
" algo \n",
" num_batches_per_epoch \n",
" learning_rate \n",
" hybridize \n",
" prediction_length \n",
" jobnumber \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" 50 \n",
" DeepAR \n",
" 25 \n",
" 0.001 \n",
" True \n",
" 30 \n",
" 0 \n",
" \n",
" \n",
" 1 \n",
" 50 \n",
" DeepAR \n",
" 25 \n",
" 0.001 \n",
" True \n",
" 60 \n",
" 1 \n",
" \n",
" \n",
" 2 \n",
" 50 \n",
" DeepAR \n",
" 50 \n",
" 0.001 \n",
" True \n",
" 30 \n",
" 2 \n",
" \n",
" \n",
" 3 \n",
" 50 \n",
" DeepAR \n",
" 50 \n",
" 0.001 \n",
" True \n",
" 60 \n",
" 3 \n",
" \n",
" \n",
" 4 \n",
" 50 \n",
" seq2seq \n",
" 25 \n",
" 0.001 \n",
" True \n",
" 30 \n",
" 4 \n",
" \n",
" \n",
" 5 \n",
" 50 \n",
" seq2seq \n",
" 25 \n",
" 0.001 \n",
" True \n",
" 60 \n",
" 5 \n",
" \n",
" \n",
" 6 \n",
" 50 \n",
" seq2seq \n",
" 50 \n",
" 0.001 \n",
" True \n",
" 30 \n",
" 6 \n",
" \n",
" \n",
" 7 \n",
" 50 \n",
" seq2seq \n",
" 50 \n",
" 0.001 \n",
" True \n",
" 60 \n",
" 7 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" epochs algo num_batches_per_epoch learning_rate hybridize \\\n",
"0 50 DeepAR 25 0.001 True \n",
"1 50 DeepAR 25 0.001 True \n",
"2 50 DeepAR 50 0.001 True \n",
"3 50 DeepAR 50 0.001 True \n",
"4 50 seq2seq 25 0.001 True \n",
"5 50 seq2seq 25 0.001 True \n",
"6 50 seq2seq 50 0.001 True \n",
"7 50 seq2seq 50 0.001 True \n",
"\n",
" prediction_length jobnumber \n",
"0 30 0 \n",
"1 60 1 \n",
"2 30 2 \n",
"3 60 3 \n",
"4 30 4 \n",
"5 60 5 \n",
"6 30 6 \n",
"7 60 7 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_hps_combo"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. Setup the GluonTS training script \n",
"\n",
"We will use a python entry script to import the necessary gluonts libraries, setup the gluonts estimators using the model packages for algorithms of interest, and pass in our algorithm and hyper-parameter preferences from the MXNet estimator we setup in the notebook. The script uses the train and test data files we uploaded to S3 to create the corresponding gluonts datasets for training and evaluation. After the completion of training, the script runs an evaluation to generate metrics, store them using the SageMaker Debugger Hook function, that we will later use to choose a winning model. For further analysis the metrics are also available via the SageMaker Trial Component analytics (please refer to Section 7 for more details). The model is then serialized for storage and future retrieval. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Let's take a look at the training script\n",
"!pygmentize blog_train_algos.py"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4. Setup a SageMaker Experiment \n",
"\n",
"Before create the training job, we first create a SageMaker Experiment that will allow us to track the different training jobs. We use the `smexperiments` libraray to create the experiment:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from datetime import datetime\n",
"from smexperiments.experiment import Experiment\n",
"\n",
"sagemaker_boto_client = boto3.client(\"sagemaker\")\n",
"\n",
"#name of experiment\n",
"timestep = datetime.now()\n",
"timestep = timestep.strftime(\"%d-%m-%Y-%H-%M-%S\")\n",
"experiment_name = timestep + \"-timeseries-models\"\n",
"\n",
"#create experiment\n",
"Experiment.create(\n",
" experiment_name=experiment_name, \n",
" description=\"Timeseries models\", \n",
" sagemaker_boto_client=sagemaker_boto_client)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For each job we define a new Trial component within that experiment:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from smexperiments.trial import Trial\n",
"\n",
"trial = Trial.create(\n",
" experiment_name=experiment_name,\n",
" sagemaker_boto_client=sagemaker_boto_client\n",
")\n",
"print(trial)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we define an experiment config which is a dictionary that we pass into the `fit()` method later on. This ensures that the training job that is going to be started is associate with that experiment and trial."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"experiment_config = { \"ExperimentName\": experiment_name, \n",
" \"TrialName\": trial.trial_name,\n",
" \"TrialComponentDisplayName\": \"Training\"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 5. Create the MXNet Estimator \n",
"\n",
"MXNet training scripts could be run on Amazon SageMaker by creating an [MXNet estimator](https://sagemaker.readthedocs.io/en/stable/frameworks/mxnet/using_mxnet.html). The training job will start when the fit function on an MXNet estimator is called. We pass in a hyperparameter dictionary that takes the inputs from the algorithm and hyper-parameters combinatorial matrix."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sagemaker\n",
"from sagemaker.mxnet import MXNet\n",
"\n",
"mxnet_estimator = MXNet(entry_point='blog_train_algos.py',\n",
" role=sagemaker.get_execution_role(),\n",
" instance_type='ml.m5.large',\n",
" instance_count=1,\n",
" framework_version='1.7.0', \n",
" py_version='py3',\n",
" hyperparameters={'bucket': bucket,\n",
" 'seq': trial.trial_name,\n",
" 'algo': \"DeepAR\", \n",
" 'freq': \"D\", \n",
" 'prediction_length': 30, \n",
" 'epochs': 10,\n",
" 'learning_rate': 1e-3,\n",
" 'hybridize': False,\n",
" 'num_batches_per_epoch': 10,\n",
" })"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After specifying our estimator with all the necessary hyperparameters we can train it using our training dataset. Train by invoking the train method of the estimator. We pass the location of train and test-data as well as the experiment configuration.\n",
"\n",
"The training algorithm returns a fitted model (or a Predictor in GluonTS parlance) that can be used to construct forecasts."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mxnet_estimator.fit({\"train\": s3_train_channel, \"test\": s3_test_channel}, \n",
" experiment_config=experiment_config,\n",
" wait=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 6. Setup experiment with Debugger enabled to auto-terminate sub-optimal training jobs \n",
"\n",
"We ran a parameter sweep and created lots of different configurations. Doing so may produce parameter combinations that lead to sub-optimal models. We can use SageMaker Debugger to tune our experiment at training time. Debugger automatically captures data from the model training and provides builtin rules that check for conditions such as overfitting, vanishing gradients etc. We can then specify actions to auto-terminate training jobs ahead of time that would otherwise produce low-quality models.\n",
"\n",
"Some of the models in our experiment use Recurrent Neural Networks that can suffer from the vanishing gradient problem. So we select Debugger's tensor variance thats allows to specify and upper and lower bound on the gradient values. We also specify the action `StopTraining` that will stop a training job once the rule triggers.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"from sagemaker.debugger import Rule, CollectionConfig, rule_configs\n",
"\n",
"actions = rule_configs.ActionList(\n",
" rule_configs.StopTraining(), \n",
")\n",
"\n",
"rule = Rule.sagemaker(base_config=rule_configs.tensor_variance(),\n",
" rule_parameters={\"min_threshold\": '0.00001',\n",
" \"max_threshold\": '100000.0',\n",
" \"collection_names\": 'custom_collection'},\n",
" actions=actions )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Per default Debugger collects data with an interval of 500 steps. In our case, training dataset is small and our models only train for few minutes, so we can decrease the save interval. Here we create a custom collection, where we collect gradients at an interval of 5."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"from sagemaker.debugger import DebuggerHookConfig, CollectionConfig\n",
"\n",
"debugger_hook_config = DebuggerHookConfig(\n",
" collection_configs=[ \n",
" CollectionConfig(\n",
" name=\"custom_collection\",\n",
" parameters={ \"include_regex\": \"(.*gradient)(?!.*featureembedder)(.*weight)\",\n",
" \"start_step\": \"10\",\n",
" \"save_interval\": \"5\"})])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we create a new experiment:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from datetime import datetime\n",
"from smexperiments.experiment import Experiment\n",
"from smexperiments.trial import Trial\n",
"\n",
"sagemaker_boto_client = boto3.client(\"sagemaker\")\n",
"\n",
"#name of experiment\n",
"timestep = datetime.now()\n",
"timestep = timestep.strftime(\"%d-%m-%Y-%H-%M-%S\")\n",
"experiment_name = timestep + \"-timeseries-models\"\n",
"\n",
"#create experiment\n",
"Experiment.create(\n",
" experiment_name=experiment_name, \n",
" description=\"Timeseries models\", \n",
" sagemaker_boto_client=sagemaker_boto_client)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 7. Train and validate models \n",
"\n",
"In section 5 we trained one model. Now we iterate over all possible combinations of hyperparameters and algorithms with the SageMaker Debugger rules enabled to detect problems such as vanishing gradients and terminate these training jobs.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import sagemaker\n",
"from sagemaker.mxnet import MXNet\n",
"\n",
"for idx, row in df_hps_combo.iterrows():\n",
"\n",
" trial = Trial.create(\n",
" experiment_name=experiment_name,\n",
" sagemaker_boto_client=sagemaker_boto_client\n",
" )\n",
"\n",
" experiment_config = { \"ExperimentName\": experiment_name, \n",
" \"TrialName\": trial.trial_name,\n",
" \"TrialComponentDisplayName\": \"Training\"}\n",
" \n",
" mxnet_estimator = MXNet(entry_point='blog_train_algos.py',\n",
" role=sagemaker.get_execution_role(),\n",
" instance_type='ml.m5.large',\n",
" instance_count=1,\n",
" framework_version='1.7.0', py_version='py3',\n",
" debugger_hook_config=debugger_hook_config,\n",
" rules=[rule],\n",
" hyperparameters={'bucket': bucket, 'seq': trial.trial_name,\n",
" 'algo': row['algo'], \n",
" 'freq': \"D\", \n",
" 'prediction_length': row['prediction_length'], \n",
" 'epochs': row['epochs'],\n",
" 'learning_rate': row['learning_rate'],\n",
" 'hybridize': row['hybridize'],\n",
" 'num_batches_per_epoch': row['num_batches_per_epoch']\n",
" })\n",
"\n",
" mxnet_estimator.fit({\"train\": s3_train_channel, \"test\": s3_test_channel}, \n",
" experiment_config=experiment_config,\n",
" wait=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once the experiment is finished we can determine how many seconds it ran. First we define a helper function to compute the billabale seconds and how many training jobs were auto-terminated."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"import time\n",
"\n",
"def compute_job_statistics(df):\n",
" total_cost = 0\n",
" stopped = 0\n",
" for name in df['sagemaker_job_name']:\n",
" while sagemaker_boto_client.describe_training_job(TrainingJobName=name[1:-1])['TrainingJobStatus'] == 'InProgress':\n",
" print('Experiment is still in progress')\n",
" time.sleep(30)\n",
" continue\n",
" total_cost += sagemaker_boto_client.describe_training_job(TrainingJobName=name[1:-1])['BillableTimeInSeconds']\n",
" if sagemaker_boto_client.describe_training_job(TrainingJobName=name[1:-1])['TrainingJobStatus'] == \"Stopped\":\n",
" stopped += 1\n",
" return stopped, total_cost"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Billable seconds for overall experiment with Debugger: 3708 seconds. Number of training jobs auto-terminated: 2\n"
]
}
],
"source": [
"from sagemaker.analytics import ExperimentAnalytics\n",
"trial_component_analytics = ExperimentAnalytics(experiment_name=experiment_name)\n",
"\n",
"stopped, total_cost = compute_job_statistics(trial_component_analytics.dataframe())\n",
"print(\"Billable seconds for overall experiment with Debugger:\", total_cost, \"seconds. Number of training jobs auto-terminated:\", stopped)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This setup is especially useful if you run a parameter sweep with training jobs that train for hours. In our case each job only trained for less than 10 minutes. Until the Debugger data is uploaded, fetched and downloaded into the processing job, a few minutes may pass, so the potential cost reduction will be less for smaller training jobs."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 8. Evaluate metrics and select a winning candidate \n",
"\n",
"Amazon SageMaker Studio provides an experiments browser that you can use to view lists of experiments, trials, and trial components. You can choose one of these entities to view detailed information about the entity or choose multiple entities for comparison. For more details please refer to [the documentation](https://docs.aws.amazon.com/sagemaker/latest/dg/experiments-view-compare.html#experiments-view). Once the training jobs are running we can use the experiment view in Studio (see screenshot below) or the `ExperimentAnalytics` module to track the status of our training jobs and their metrics. \n",
"\n",
"\n",
"\n",
"In the training script we used SageMaker Debugger's function `save_scalar` to store metrics such as MAPE, MSE, RMSE in the experiment. We can access the recorded metrics via the ExperimentAnalytics function and convert it to a Pandas dataframe.\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" TrialComponentName \n",
" DisplayName \n",
" SourceArn \n",
" SageMaker.ImageUri \n",
" SageMaker.InstanceCount \n",
" SageMaker.InstanceType \n",
" SageMaker.VolumeSizeInGB \n",
" algo \n",
" bucket \n",
" epochs \n",
" ... \n",
" scalar/MAPE_GLOBAL - Avg \n",
" scalar/MAPE_GLOBAL - StdDev \n",
" scalar/MAPE_GLOBAL - Last \n",
" scalar/MAPE_GLOBAL - Count \n",
" scalar/MSE_GLOBAL - Min \n",
" scalar/MSE_GLOBAL - Max \n",
" scalar/MSE_GLOBAL - Avg \n",
" scalar/MSE_GLOBAL - StdDev \n",
" scalar/MSE_GLOBAL - Last \n",
" scalar/MSE_GLOBAL - Count \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" mxnet-training-2021-02-12-02-45-53-493-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"seq2seq\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 1 \n",
" mxnet-training-2021-02-12-02-45-58-635-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"seq2seq\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2 \n",
" mxnet-training-2021-02-12-02-45-54-132-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"seq2seq\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" 0.174017 \n",
" 0.0 \n",
" 0.174017 \n",
" 1.0 \n",
" 133.882625 \n",
" 133.882625 \n",
" 133.882625 \n",
" 0.0 \n",
" 133.882625 \n",
" 1.0 \n",
" \n",
" \n",
" 3 \n",
" mxnet-training-2021-02-12-02-45-44-916-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"DeepAR\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" 0.196716 \n",
" 0.0 \n",
" 0.196716 \n",
" 1.0 \n",
" 186.979704 \n",
" 186.979704 \n",
" 186.979704 \n",
" 0.0 \n",
" 186.979704 \n",
" 1.0 \n",
" \n",
" \n",
" 4 \n",
" mxnet-training-2021-02-12-02-45-50-439-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"DeepAR\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" 0.235205 \n",
" 0.0 \n",
" 0.235205 \n",
" 1.0 \n",
" 281.982975 \n",
" 281.982975 \n",
" 281.982975 \n",
" 0.0 \n",
" 281.982975 \n",
" 1.0 \n",
" \n",
" \n",
" 5 \n",
" mxnet-training-2021-02-12-02-45-44-334-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"DeepAR\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" 0.414463 \n",
" 0.0 \n",
" 0.414463 \n",
" 1.0 \n",
" 614.407812 \n",
" 614.407812 \n",
" 614.407812 \n",
" 0.0 \n",
" 614.407812 \n",
" 1.0 \n",
" \n",
" \n",
" 6 \n",
" mxnet-training-2021-02-12-02-45-51-083-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"seq2seq\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" 0.140608 \n",
" 0.0 \n",
" 0.140608 \n",
" 1.0 \n",
" 88.191292 \n",
" 88.191292 \n",
" 88.191292 \n",
" 0.0 \n",
" 88.191292 \n",
" 1.0 \n",
" \n",
" \n",
" 7 \n",
" mxnet-training-2021-02-12-02-45-43-580-aws-tra... \n",
" Training \n",
" arn:aws:sagemaker:us-east-1:841408598787:train... \n",
" 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... \n",
" 1.0 \n",
" ml.m5.large \n",
" 30.0 \n",
" \"DeepAR\" \n",
" \"sagemaker-us-east-1-841408598787\" \n",
" 50.0 \n",
" ... \n",
" 0.184922 \n",
" 0.0 \n",
" 0.184922 \n",
" 1.0 \n",
" 170.474154 \n",
" 170.474154 \n",
" 170.474154 \n",
" 0.0 \n",
" 170.474154 \n",
" 1.0 \n",
" \n",
" \n",
"
\n",
"
8 rows × 55 columns
\n",
"
"
],
"text/plain": [
" TrialComponentName DisplayName \\\n",
"0 mxnet-training-2021-02-12-02-45-53-493-aws-tra... Training \n",
"1 mxnet-training-2021-02-12-02-45-58-635-aws-tra... Training \n",
"2 mxnet-training-2021-02-12-02-45-54-132-aws-tra... Training \n",
"3 mxnet-training-2021-02-12-02-45-44-916-aws-tra... Training \n",
"4 mxnet-training-2021-02-12-02-45-50-439-aws-tra... Training \n",
"5 mxnet-training-2021-02-12-02-45-44-334-aws-tra... Training \n",
"6 mxnet-training-2021-02-12-02-45-51-083-aws-tra... Training \n",
"7 mxnet-training-2021-02-12-02-45-43-580-aws-tra... Training \n",
"\n",
" SourceArn \\\n",
"0 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"1 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"2 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"3 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"4 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"5 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"6 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"7 arn:aws:sagemaker:us-east-1:841408598787:train... \n",
"\n",
" SageMaker.ImageUri SageMaker.InstanceCount \\\n",
"0 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"1 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"2 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"3 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"4 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"5 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"6 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"7 763104351884.dkr.ecr.us-east-1.amazonaws.com/m... 1.0 \n",
"\n",
" SageMaker.InstanceType SageMaker.VolumeSizeInGB algo \\\n",
"0 ml.m5.large 30.0 \"seq2seq\" \n",
"1 ml.m5.large 30.0 \"seq2seq\" \n",
"2 ml.m5.large 30.0 \"seq2seq\" \n",
"3 ml.m5.large 30.0 \"DeepAR\" \n",
"4 ml.m5.large 30.0 \"DeepAR\" \n",
"5 ml.m5.large 30.0 \"DeepAR\" \n",
"6 ml.m5.large 30.0 \"seq2seq\" \n",
"7 ml.m5.large 30.0 \"DeepAR\" \n",
"\n",
" bucket epochs ... scalar/MAPE_GLOBAL - Avg \\\n",
"0 \"sagemaker-us-east-1-841408598787\" 50.0 ... NaN \n",
"1 \"sagemaker-us-east-1-841408598787\" 50.0 ... NaN \n",
"2 \"sagemaker-us-east-1-841408598787\" 50.0 ... 0.174017 \n",
"3 \"sagemaker-us-east-1-841408598787\" 50.0 ... 0.196716 \n",
"4 \"sagemaker-us-east-1-841408598787\" 50.0 ... 0.235205 \n",
"5 \"sagemaker-us-east-1-841408598787\" 50.0 ... 0.414463 \n",
"6 \"sagemaker-us-east-1-841408598787\" 50.0 ... 0.140608 \n",
"7 \"sagemaker-us-east-1-841408598787\" 50.0 ... 0.184922 \n",
"\n",
" scalar/MAPE_GLOBAL - StdDev scalar/MAPE_GLOBAL - Last \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 0.0 0.174017 \n",
"3 0.0 0.196716 \n",
"4 0.0 0.235205 \n",
"5 0.0 0.414463 \n",
"6 0.0 0.140608 \n",
"7 0.0 0.184922 \n",
"\n",
" scalar/MAPE_GLOBAL - Count scalar/MSE_GLOBAL - Min \\\n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 1.0 133.882625 \n",
"3 1.0 186.979704 \n",
"4 1.0 281.982975 \n",
"5 1.0 614.407812 \n",
"6 1.0 88.191292 \n",
"7 1.0 170.474154 \n",
"\n",
" scalar/MSE_GLOBAL - Max scalar/MSE_GLOBAL - Avg scalar/MSE_GLOBAL - StdDev \\\n",
"0 NaN NaN NaN \n",
"1 NaN NaN NaN \n",
"2 133.882625 133.882625 0.0 \n",
"3 186.979704 186.979704 0.0 \n",
"4 281.982975 281.982975 0.0 \n",
"5 614.407812 614.407812 0.0 \n",
"6 88.191292 88.191292 0.0 \n",
"7 170.474154 170.474154 0.0 \n",
"\n",
" scalar/MSE_GLOBAL - Last scalar/MSE_GLOBAL - Count \n",
"0 NaN NaN \n",
"1 NaN NaN \n",
"2 133.882625 1.0 \n",
"3 186.979704 1.0 \n",
"4 281.982975 1.0 \n",
"5 614.407812 1.0 \n",
"6 88.191292 1.0 \n",
"7 170.474154 1.0 \n",
"\n",
"[8 rows x 55 columns]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sagemaker.analytics import ExperimentAnalytics\n",
"\n",
"trial_component_analytics = ExperimentAnalytics(experiment_name=experiment_name)\n",
"tc_df = trial_component_analytics.dataframe()\n",
"tc_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's take a look on the metrics and hyperparameter combinations:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Trials \n",
" epochs \n",
" learning_rate \n",
" hybridize \n",
" num_batches_per_epoch \n",
" prediction_length \n",
" scalar/MASE_GLOBAL - Min \n",
" scalar/MSE_GLOBAL - Min \n",
" scalar/RMSE_GLOBAL - Min \n",
" scalar/MAPE_GLOBAL - Min \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" [Trial-2021-02-12-024553-wfkq] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 25.0 \n",
" 60.0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 1 \n",
" [Trial-2021-02-12-024558-iujn] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 50.0 \n",
" 60.0 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" \n",
" \n",
" 2 \n",
" [Trial-2021-02-12-024553-dsam] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 50.0 \n",
" 30.0 \n",
" 1.339320 \n",
" 133.882625 \n",
" 11.570766 \n",
" 0.174017 \n",
" \n",
" \n",
" 3 \n",
" [Trial-2021-02-12-024544-rwcv] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 50.0 \n",
" 30.0 \n",
" 1.453763 \n",
" 186.979704 \n",
" 13.674052 \n",
" 0.196716 \n",
" \n",
" \n",
" 4 \n",
" [Trial-2021-02-12-024550-vfjm] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 50.0 \n",
" 60.0 \n",
" 2.010920 \n",
" 281.982975 \n",
" 16.792349 \n",
" 0.235205 \n",
" \n",
" \n",
" 5 \n",
" [Trial-2021-02-12-024544-pfow] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 25.0 \n",
" 60.0 \n",
" 3.382988 \n",
" 614.407812 \n",
" 24.787251 \n",
" 0.414463 \n",
" \n",
" \n",
" 6 \n",
" [Trial-2021-02-12-024550-rigj] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 25.0 \n",
" 30.0 \n",
" 1.087685 \n",
" 88.191292 \n",
" 9.391022 \n",
" 0.140608 \n",
" \n",
" \n",
" 7 \n",
" [Trial-2021-02-12-024543-envu] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 25.0 \n",
" 30.0 \n",
" 1.409506 \n",
" 170.474154 \n",
" 13.056575 \n",
" 0.184922 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Trials epochs learning_rate hybridize \\\n",
"0 [Trial-2021-02-12-024553-wfkq] 50.0 0.001 true \n",
"1 [Trial-2021-02-12-024558-iujn] 50.0 0.001 true \n",
"2 [Trial-2021-02-12-024553-dsam] 50.0 0.001 true \n",
"3 [Trial-2021-02-12-024544-rwcv] 50.0 0.001 true \n",
"4 [Trial-2021-02-12-024550-vfjm] 50.0 0.001 true \n",
"5 [Trial-2021-02-12-024544-pfow] 50.0 0.001 true \n",
"6 [Trial-2021-02-12-024550-rigj] 50.0 0.001 true \n",
"7 [Trial-2021-02-12-024543-envu] 50.0 0.001 true \n",
"\n",
" num_batches_per_epoch prediction_length scalar/MASE_GLOBAL - Min \\\n",
"0 25.0 60.0 NaN \n",
"1 50.0 60.0 NaN \n",
"2 50.0 30.0 1.339320 \n",
"3 50.0 30.0 1.453763 \n",
"4 50.0 60.0 2.010920 \n",
"5 25.0 60.0 3.382988 \n",
"6 25.0 30.0 1.087685 \n",
"7 25.0 30.0 1.409506 \n",
"\n",
" scalar/MSE_GLOBAL - Min scalar/RMSE_GLOBAL - Min scalar/MAPE_GLOBAL - Min \n",
"0 NaN NaN NaN \n",
"1 NaN NaN NaN \n",
"2 133.882625 11.570766 0.174017 \n",
"3 186.979704 13.674052 0.196716 \n",
"4 281.982975 16.792349 0.235205 \n",
"5 614.407812 24.787251 0.414463 \n",
"6 88.191292 9.391022 0.140608 \n",
"7 170.474154 13.056575 0.184922 "
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"new_df = tc_df[['Trials','epochs', 'learning_rate', 'hybridize', 'num_batches_per_epoch','prediction_length','scalar/MASE_GLOBAL - Min', 'scalar/MSE_GLOBAL - Min', 'scalar/RMSE_GLOBAL - Min', 'scalar/MAPE_GLOBAL - Min']]\n",
"new_df "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The smallest MAPE achieved is:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.1406077684247318"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mape_min = new_df['scalar/MAPE_GLOBAL - Min'].min()\n",
"mape_min"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's select the winner model:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Trials \n",
" epochs \n",
" learning_rate \n",
" hybridize \n",
" num_batches_per_epoch \n",
" prediction_length \n",
" scalar/MASE_GLOBAL - Min \n",
" scalar/MSE_GLOBAL - Min \n",
" scalar/RMSE_GLOBAL - Min \n",
" scalar/MAPE_GLOBAL - Min \n",
" \n",
" \n",
" \n",
" \n",
" 6 \n",
" [Trial-2021-02-12-024550-rigj] \n",
" 50.0 \n",
" 0.001 \n",
" true \n",
" 25.0 \n",
" 30.0 \n",
" 1.087685 \n",
" 88.191292 \n",
" 9.391022 \n",
" 0.140608 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Trials epochs learning_rate hybridize \\\n",
"6 [Trial-2021-02-12-024550-rigj] 50.0 0.001 true \n",
"\n",
" num_batches_per_epoch prediction_length scalar/MASE_GLOBAL - Min \\\n",
"6 25.0 30.0 1.087685 \n",
"\n",
" scalar/MSE_GLOBAL - Min scalar/RMSE_GLOBAL - Min scalar/MAPE_GLOBAL - Min \n",
"6 88.191292 9.391022 0.140608 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_winner = new_df[new_df['scalar/MAPE_GLOBAL - Min'] == mape_min]\n",
"if len(df_winner)!=1: #the df_winner should only content 1 model",
" df_winner=df_winner.head(1)",
"df_winner"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we download the winner model:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#download the champion from S3 and store it in the winner folder\n",
"import os\n",
"s3 = boto3.client(\"s3\")\n",
"windir = \"gluonts/blog-models/\"+str(df_winner['Trials'].item()).replace(\"['\",\"\").replace(\"']\",\"\")+\"/\"\n",
"\n",
"def downloadDirectoryFroms3(bucket, windir):\n",
" s3_resource = boto3.resource('s3')\n",
" bucket = s3_resource.Bucket(bucket) \n",
" for obj in bucket.objects.filter(Prefix = windir):\n",
" print(obj.key)\n",
" if not os.path.exists(os.path.dirname(windir)):\n",
" os.makedirs(os.path.dirname(windir))\n",
" bucket.download_file(obj.key, obj.key) # save to same path\n",
"\n",
"\n",
"downloadDirectoryFroms3(bucket, windir) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 9. Run time series forecasts \n",
"After we have downloaded the model, we can run prediction on it. Therefore we use the predictor API from GluonTS, that takes the path to the model files:"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:gluonts.mx.context:Using CPU\n"
]
}
],
"source": [
"# restore the predictor\n",
"import pathlib\n",
"from gluonts.model.predictor import Predictor\n",
"\n",
"path = pathlib.Path(windir) \n",
"winning_predictor = Predictor.deserialize(path)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we run predictions on the test dataset and visualize them:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2014-11-30 00:00:00\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABH4AAAGBCAYAAAAQSXZyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeXxU9b3/8deZyb6TELKQkAUICYskrAFFVBaXFne7L7bWWr22t4ve+ui1ta3tr/d67217294u3m5qa622tii3IAkiIMg+IQkkkIQlISFk39eZOb8/DkEQJAEmmUnyfj4eeRzMnDnnEx6GTN7z/X4+hmmaiIiIiIiIiIjI2GPzdgEiIiIiIiIiIjI8FPyIiIiIiIiIiIxRCn5ERERERERERMYoBT8iIiIiIiIiImOUgh8RERERERERkTFKwY+IiIiIiIiIyBjlN5I3mzhxopmamjqStxQRERERERERGdP27dvXYJpm7MUeG1LwYxjGPwMPAgbwv6Zp/tgwjGjgz0AqcBz4kGmazZe6TmpqKnv37r2M0kVERERERERE5FIMwzjxfo8NutXLMIzZWKHPImAu8EHDMKYDTwCbTNOcDmw6898iIiIiIiIiIuIjhtLjJwvYaZpml2maTmALcBdwB/DcmXOeA+4cnhJFRERERERERORKDCX4KQauNwwjxjCMEOA2IBmIM03zFMCZ46ThK1NERERERERERC7XoD1+TNMsMQzj34E8oAM4ADiHegPDMD4PfB5gypQpV1imiIiIiIiIiIhcriGNczdN8zemac4zTfN6oAkoA04bhpEAcOZY9z7PfdY0zQWmaS6Ijb1og2kRERERERERERkGQwp+DMOYdOY4Bbgb+BPwGvDpM6d8Glg7HAWKiIiIiIiIiMiVGdI4d+CvhmHEAP3AP5mm2WwYxr8BLxuG8QBQCdw3XEWKiIiIiIiIiMjlG1LwY5rmsot8rhFY4fGKRERERERERETEI4a01UtEREREREREREYfBT8iIiIiIiIiImOUgh8RERERERERkTFKwY+IiIiIiIiIyBil4EdERERERpWKigpmzZpFZWWlt0sRERHxeQp+RERERGRU2bhxI4cOHWLLli3eLkVERMTnKfgRERERkVGloKAAgL0Fe71ciYiIiO9T8CMiIiIio4rD4QBg/4H9Xq5E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EREREZEaKCoqinnz5h3+2e12k5aWRkpKCqmpqYe/Hvn9oa9JSUmsWrWKlJQUcnJy6NOnD7169fLdyYhPVanCj6/Url2btLS0o5alpqbSrFkzZsyYwfz585k2bRpPPfUUa9eu5bHHHmPAgAFMnTqV7du3c8455wBgrT3u8a21DB48mA8//LCiT0VERERERERqIJfLRd26dalbt26Z9isoKCAgIECDOjtYlSr8nKpnTkUJDw+nQYMGfPPNNwwaNIjU1FRmzpzJqFGj2LVrFwMGDKB///5MnjyZ7OxsMjIyaNSoEQDvv//+4eP079+fKVOmMGDAANatW8fq1asBz6Bcd911F1u2bKFly5bk5uaSlJRE69atfXG6IiIiIiIi4hBBQUG+DkF8TLN6eU2cOJGnn36arl27MnDgQJ544gkaN27MiBEj6NSpE926deO+++4jKiqKBx98kL/97W/069eP4uLiw8e48847SU5OpnPnzjz//PN07tyZWrVqERsby/vvv88111xD586dSUhIYMOGDT48WxERERERERFxAnOi25MqQs+ePe3SpUuPWrZ+/XratWtXaTFUpOLiYtxuN8HBwWzdupVBgwaxadMmAgMDS7V/TfpdiIiIiIiIiEjlMMYss9b2PN66KnWrV3WXm5vLgAEDcLvdWGt54403Sl30EREREREREREpbyr8lKOIiAh+36NJRERERERERMRXNMaPiIiIiIiIiEgNVSUKP5U5zlBVpd+BiIiIiIiIiJQ3nxd+goODSUlJcXThw1pLSkoKwcHBvg5FRERERERERGoQn4/xExcXR1JSEsnJyb4OxaeCg4OJi4vzdRgiIiIiIiIiUoP4vPDjcrlo1qyZr8MQEREREREREalxfH6rl4iIiIiIiIiIVAwVfkREREREREREaigVfkREREREREREaihTmbNpGWOSgR2V9oAVpw5w0NdBSIVTnp1DuXYG5Vl8QdedMyjPzqFcO4dyLdVNE2tt7PFWVGrhp6Ywxiy11vb0dRxSsZRn51CunUF5Fl/QdecMyrNzKNfOoVxLTaJbvUREREREREREaigVfkREREREREREaigVfk7PeF8HIJVCeXYO5doZlGfxBV13zqA8O4dy7RzKtdQYGuNHRERERERERKSGUo8fEREREREREZEaSoUfEREREREREZEaSoUfkUpkjGlkjAn0fm98HY9UDGPM5caYaF/HIRXPGBNxxPd6TotIuVGbwRnUZnAOtRnEl1T48SFjzC3GmNeNMS18HYtULGPM1caYNcBLwCQAqwG2ahxjzAhjzCKgP5Dv63ik4nhzvQx4xRjzEug5LRVLbQbnUJvBGdRmcA61GaQqCPB1AE7jre76AVcADwJ7gTOMMbuttXrRr4GMMb2AUcCt1tqFxpj1xpju1trlvo5Nyof3eX0j8DbQ11r7s28jkorgzbMLuAO4HLgH2Al8Y4yZb62daowxasxJeVGbwXnUZqj51GZwBrUZpKpRj59KZIwJth7FwHLgDOAN4CygnU+Dk3JljAk+4sdmwI/eBlw9YA2Q7pvIpCJ437SXAB8CBcYYP2PMDcYYPa9rCGNMkPf1uxDPc/hKa+1Ca20Snule24A+wZPyozaDc6jN4CxqM9R8ajNIVaTCTyUxxvwdmGmMuccY08Fau9lamwp8ChjgTN3fWzMcket7jTFNgFVAE2PMJ3je6A3wtjHmee/2use3GjLG/MMYc9ERi7YAs4CvgJVAH+BdY8xz3u31eltNGWP+BnxujBlljGltrf0GSD4ipz2APb6LUGoatRmcQ20GZ1CbwTnUZpCqSi8qlcAY82fgXOAhIBZ4xhjTFMBa6wY+w/Mi0P13++nNvZr5Xa7rAK8A6dbaq4DNwN+ttVcANwHXG2MaqdpfvRhjYowx44F7gWeNMS4A720X3wFvAonW2tuBkcCNxpiG1toSnwUtp8UY08wY8y3QARgLtAZuMcZE/O55a4AVv9tXr99yWtRmcA61GWo+tRmcQ20GqepU+Klg3idyPPC69x7ef+Hp8vfsoW2stbOB7UAnY8xFxpi7vMv15l6NnCTXL3k3CQPWAVhrfwUW4nlTkOolB/jCWhsN7AbuP2LdHuB5a+1WAGvtFjx5blLpUUp5SAW+staOsNZ+B0wDGgJu7335JcYz406ctXaVMaarMeZO0Ou3nB61GZxDbQbHUJvBOdRmkCpNhZ8KdsQT+Xrvz9nAy0ALY8w5R2w6E3gEmAAEVmaMUj5OkOtxQEtjTAfgAPCYMeY8Y8xYoBGeRp5UI9baAmC+98cn8Hya08C7rsT7iTzGmBBjzDggBm/jXaoPbyMtA89r8iFr8fyh5jri+d4LCDPGjAHeQe+rUkrH+4RXbYaaqQy5VpuhGjtBntVmqIF+n2u1GaQ60MVWgY54URgDNDfGnOX9OQX4ADjPu10snk96pgMtrbUv/f5YUrWdIteTgUTgeeBb4HbvukHW2uRKDVTKhbU22/smvwT4HnjqyPXeP9C+8f54kbcxINXIoUaatTbriMVnALt+t6wh0NL7/ZnW2n9XUohS/R3+w8F4eX9Um6HmKUuu1Waovo7K86Hv1WaokY7KtdoMUh1oOvdyYIxJBHpYax87zroAa22BMeZ14AXgDG9Xv2I8b/AAmXju7035/f5StZxmrgvxVPuLgJeNMW9ZTcNbpZ0oz96GnPHee+8PFAEPAz8YY1rhGaMhB88MPFdaa3dXbuRSVqXJtfe5XYSn+/1K7/p+wA489+l3tdZuq+TQpZoyxlwI3AZsNcZMs9bOs9ZaY4y/9w8ItRlqiNPMtdoM1cxJ8uwHnp49qM1QI5Qm12ozSFWlHj9/gPFMv3gzngG8HjbGnHnkeutRZIxp4K3o5hhjxhhj+gND8f7+rbUFasBVbeWQa3vEtmrAVVGlzHOJt5t2oHdZMp6ZOTbimWo5yFqbqQZc1VbGXB+aarkpEGk8A3U+CURaz2xLasDJKRljXMaY/8Nz7byJZ4rua4wxvQGstcVqM9QM5ZBrtRmqgVLkuURthpqhjLlWm0GqJBV+/gBvBX8z0A24E/jnkeu9n+j8C/jMeGbkuBnPgIzPAPOttS9UZrxy+pRrZyhDnj8GOnh77F+Mp6H+sLW2q7crt1RxZcx1G2NMBHAFcCWw1lo72FqrcRik1LxjeWwCrrHWfo1nfIcooBg8vUb1PlIzKNfOUIY8q81QzZUx12ozSJWkW73KyBhzBZ77NX/2LlrofTGYYIy51Rhzk7X2He+6lnh+xxdZa9O8y940xrxrrS2s5NCljJRrZzjNPF96KM/GmI14uu3qnvwqrhxy/RQwRb0tpLSOc829BxQZYwKttbu9fxzU8a5rgd5Hqi3l2hlOM89qM1RD5ZBrtRmkSjFWs8eVijGmLvAJ0ApYDFzu7dJ35DgQF+C5baD/EW/kh/b3t9YWV3rgUmbKtTOUQ54P3cMtVVw55DpQf4xJWZzkmvPz9jbDGBMNfApcZ63d97v99T5STSjXzlAOeVaboZooh1yrzSBVkm71KiVr7QHgS2AIsBfPwF7w2x8Nxtv1bz1wqzEmwhhzFRwe7V1v6tWEcu0M5ZBnNeCqiXLItRpwUiYnueaO/LStMZBhrd1njIkzxgwCvY9UN8q1M5RDntVmqCbKIddqM0iVpMJPKRjvSO3Aq8A6YDZwkfEMylfiXX9om4eA5/CMHVEPfpsWWKo+5doZlGfnUK6lsp3imrPGmEO32ccB/saYe4AZQH3QNVedKNfOoDw7h3ItNZkKP8dhjKnl/eoPhwcBxVrr9lbsFwIbgHsPrbfWFhtjWuAZof8LoLu19lVfxC+lp1w7g/LsHMq1VLbTuOYOffI/GLgEz3hSF1prP6jk0KWMlGtnUJ6dQ7kWJ9EYP17eCm84MBlIsdbecMQ6A79Vcb0vDv2A0XheCPKBQsAA9ay1myo3eikL5doZlGfnUK6lsv3Ba85trd1vjEkAwq21cys7fik95doZlGfnUK7FqdTjx8tb4c0CAoFGxpir4fBgbNbbvS/IGBNkrS221s4H1gJrgB/w/MGQoT8aqj7l2hmUZ+dQrqWy/cFrbp4xppW1dpH+aKj6lGtnUJ6dQ7kWp1Lh52htgWTgZeA6Y0zEoS59xph/AG8DDbw/345nsK+3gM7W2s2+CVlOk3LtDMqzcyjXUtl0zTmHcu0MyrNzKNfiOAGn3qRm8nbRS7XWbjLGGG+Xvi14uvxvA34FbjTGTAPi8Uzp95i1drv3EFuAvtbaLZUfvZSFcu0MyrNzKNdS2XTNOYdy7QzKs3Mo1yIejuvxY4yJMsbMAOYAVxljwrwvAAA9gUxr7Vo8XfoeB/4NrLDWXmut3Wp+G/xrrl4Aqjbl2hmUZ+dQrqWy6ZpzDuXaGZRn51CuRY7muMIPEAbMAu7xfn/WEet2AhHGmI+BB4HlwBZrbTZ4BgOz1hZXcrxy+pRrZ1CenUO5lsqma845lGtnUJ6dQ7kWOYIjCj/GmOuNMWcbYyKttbuB8cAUPLO5nGGMaejdNBqIBfYB3YDbgTbGmHbw2xR/UnUp186gPDuHci2VTdeccyjXzqA8O4dyLXJiNXY6d2OMAerjmaqvBNiKp9o7ylp70LtNP+AqYKm1dpJ3WZ0j1ocDgdbaVB+cgpSScu0MyrNzKNdS2XTNOYdy7QzKs3Mo1yKlUyN7/Bhj/L33cEYAu621g4A7gVQ8lV8ArLU/AtvxVHhree/9PGiM8fd28cvWC0DVplw7g/LsHMq1VDZdc86hXDuD8uwcyrVI6dWowo8xJsAY8yzwrDHmbKANUAxgPVP03Qv08a47ZAIQjmfgr23GmIbW2mJ18avalGtnUJ6dQ7mWyqZrzjmUa2dQnp1DuRYpuxpT+PE+sZfhuWdzC/AU4AYGGGN6A3grwv8Enjxi14vwVIZXAp2stXsqMWw5Dcq1MyjPzqFcS2XTNeccyrUzKM/OoVyLnJ4AXwdQjkqAsUfct9kNaIZner43gB7GGD9gKp4XhqbW2u14Bvs611o73zdhy2lQrp1BeXYO5Voqm64551CunUF5dg7lWuQ01JgeP3gqv1OMMf7en38EGltr3wf8jTH3eLvyxQHF3hcArLVf6gWg2lGunUF5dg7lWiqbrjnnUK6dQXl2DuVa5DTUmMKPtTbXWltgrS32LhoMJHu//xPQzhjzFfAhsBwOjwIv1Yxy7QzKs3Mo11LZdM05h3LtDMqzcyjXIqenJt3qBXhGdwcsUA+Y5l2cBTwCdAR+tdbuhsP3f0o1pVw7g/LsHMq1VDZdc86hXDuD8uwcyrVI2dSYHj9HKAFcwEGgs7fi+xhQYq1dcOgFQGoE5doZlGfnUK6lsumacw7l2hmUZ+dQrkXKwNTEAqgxJgFY6P3/nrX2HR+HJBVEuXYG5dk5lGupbLrmnEO5dgbl2TmUa5HSq6mFnzhgJPCitbbA1/FIxVGunUF5dg7lWiqbrjnnUK6dQXl2DuVapPRqZOFHRERERERERERq5hg/IiIiIiIiIiKCCj8iIiIiIiIiIjWWCj8iIiIiIiIiIjWUCj8iIiIiIiIiIjWUCj8iIiIiIiIiIjWUCj8iIiIiIiIiIjWUCj8iIiIiIiIiIjWUCj8iIiIiIiIiIjXU/wP3Rx7w6J9m1AAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"from gluonts.dataset.common import ListDataset\n",
"plt.rcParams['figure.figsize'] = (20.0, 6.0)\n",
"\n",
"# run forecast\n",
"startdate = '2014-11-01 01:00:00'\n",
"test_pred = ListDataset(\n",
" [{\"start\": startdate, \"target\": raw_df.query('date >= \"2014-11-01 01:00:00\" and client == \"client_12\"').copy()['usage'], \"item_id\": 'client_12'}],\n",
" freq = \"1H\"\n",
")\n",
"\n",
"pred = winning_predictor.predict(test_pred)\n",
"for test_entry, forecast in zip(test_pred, pred):\n",
" print(forecast.start_date)\n",
" plt.plot(pd.date_range(start=startdate, periods=30), pd.DataFrame.from_dict(test_entry['target'])[0][:30],color='b')\n",
" plt.plot(pd.date_range(start=forecast.start_date, periods=df_winner['prediction_length'].item()), forecast.quantile(.3), color='r') #samples contain all 100 quantiles\n",
" plt.plot(pd.date_range(start=forecast.start_date, periods=df_winner['prediction_length'].item()), forecast.quantile(.5), color='b') #samples contain all 100 quantiles\n",
" plt.plot(pd.date_range(start=forecast.start_date, periods=df_winner['prediction_length'].item()), forecast.quantile(.7), color='k') #samples contain all 100 quantiles\n",
" x=pd.date_range(start=forecast.start_date, periods=df_winner['prediction_length'].item()) #samples contain all 100 quantiles\n",
" y=forecast.quantile(.1) \n",
" z=forecast.quantile(.9)\n",
" plt.fill_between(x,y,z,color='g', alpha=0.3)\n",
"plt.xticks(rotation=30)\n",
"plt.legend(['Usage'], loc = 'lower left')\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Conclusion\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"With Amazon SageMaker we saw how easy it is for every developer and data scientist to setup time series forecasting at scale using the MXNet Estimator with the GluonTS toolkit. Amazon SageMaker removes the undifferentiated heavy lifting from every step of our ML process, automates infrastructure management, enables us to improve the training efficiency with SageMaker Debugger, and accelerates adoption of ML workflows from months to days. Please try out the notebook (https://a2i-experiments.notebook.us-east-1.sagemaker.aws/notebooks/gluonTS/rauscn/blog-gluonts-toolkit-on-sagemaker-PR.ipynb) from our post and let us know your comments and feedback."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "conda_mxnet_p36",
"language": "python",
"name": "conda_mxnet_p36"
},
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}