diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..327ba52 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.ipynb linguist-language=Python \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f197c08..6c2121f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -30,4 +30,4 @@ CUDA version: PyTorch version: HuggingFace transformers version: HuggingFace accelerate version: - +Pandas version: diff --git a/.github/workflows/eval-model.yml b/.github/workflows/eval-model.yml index 51f611c..28b4b2b 100644 --- a/.github/workflows/eval-model.yml +++ b/.github/workflows/eval-model.yml @@ -36,13 +36,13 @@ jobs: run: pip install ".[dev]" -f https://download.pytorch.org/whl/cpu/torch_stable.html - name: Run Eval Script for Chronos-2 - run: python scripts/evaluation/evaluate.py chronos-2 ci/evaluate/backtest_config.yaml $CHRONOS_2_RESULTS_CSV --model-id=s3://autogluon/chronos-2 --device=cpu --torch-dtype=float32 + run: python scripts/evaluation/evaluate.py chronos-2 ci/evaluate/backtest_config.yaml $CHRONOS_2_RESULTS_CSV --model-id=amazon/chronos-2 --device=cpu --torch-dtype=float32 - name: Print Chronos-2 CSV run: cat $CHRONOS_2_RESULTS_CSV - name: Run Eval Script for Chronos-Bolt run: python scripts/evaluation/evaluate.py chronos-bolt ci/evaluate/backtest_config.yaml $CHRONOS_BOLT_RESULTS_CSV --model-id=amazon/chronos-bolt-small --device=cpu --torch-dtype=float32 - + - name: Print Chronos-Bolt CSV run: cat $CHRONOS_BOLT_RESULTS_CSV diff --git a/.gitignore b/.gitignore index 8cf79d6..3f85b65 100644 --- a/.gitignore +++ b/.gitignore @@ -160,4 +160,9 @@ cython_debug/ #.idea/ # macOS stuff -.DS_store \ No newline at end of file +.DS_store + +chronos-2-finetuned + +# Kiro IDE +.kiro diff --git a/README.md b/README.md index 5c938c6..b24a1c7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -
- -
-
# Chronos: Pretrained Models for Time Series Forecasting @@ -11,7 +7,7 @@ [![huggingface](https://img.shields.io/badge/%F0%9F%A4%97%20HF-Datasets-FFD21E)](https://huggingface.co/datasets/autogluon/chronos_datasets) [![huggingface](https://img.shields.io/badge/%F0%9F%A4%97%20HF-Models-FFD21E)](https://huggingface.co/collections/amazon/chronos-models-65f1791d630a8d57cb718444) [![fev](https://img.shields.io/static/v1?label=fev&message=Benchmark&color=B31B1B&logo=github)](https://github.com/autogluon/fev) -[![aws](https://img.shields.io/static/v1?label=SageMaker&message=Deploy&color=FF9900&logo=amazon-web-services)](notebooks/deploy-chronos-bolt-to-amazon-sagemaker.ipynb) +[![aws](https://img.shields.io/static/v1?label=SageMaker&message=Deploy&color=FF9900&logo=amazon-web-services)](notebooks/deploy-chronos-to-amazon-sagemaker.ipynb) [![faq](https://img.shields.io/badge/FAQ-Questions%3F-blue)](https://github.com/amazon-science/chronos-forecasting/issues?q=is%3Aissue+label%3AFAQ) [![License: MIT](https://img.shields.io/badge/License-Apache--2.0-green.svg)](https://opensource.org/licenses/Apache-2.0) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/amazon-science/chronos-forecasting) @@ -20,8 +16,8 @@ ## 🚀 News -- **20 Oct 2025**: 🚀 [Chronos-2](https://arxiv.org/abs/2510.15821) released. It offers _zero-shot_ support for univariate, multivariate, and covariate-informed forecasting tasks. Chronos-2 achieves the best performance on fev-bench, GIFT-Eval and Chronos Benchmark II amongst pretrained models. Check out [this notebook](notebooks/chronos-2-quickstart.ipynb) to get started with Chronos-2. -- **14 Feb 2025**: 🚀 Chronos-Bolt is now available on Amazon SageMaker JumpStart! Check out the [tutorial notebook](notebooks/deploy-chronos-bolt-to-amazon-sagemaker.ipynb) to learn how to deploy Chronos endpoints for production use in 3 lines of code. +- **30 Dec 2025**: ☁️ Deploy Chronos-2 to AWS with Amazon SageMaker: new guide covers real-time inference (GPU/CPU), serverless endpoints with automatic scaling, and batch transform for large-scale forecasting. See the [deployment tutorial](notebooks/deploy-chronos-to-amazon-sagemaker.ipynb). +- **20 Oct 2025**: 🚀 [Chronos-2](https://huggingface.co/amazon/chronos-2) released. It offers _zero-shot_ support for univariate, multivariate, and covariate-informed forecasting tasks. Chronos-2 achieves the best performance on fev-bench, GIFT-Eval and Chronos Benchmark II amongst pretrained models. Check out [this notebook](notebooks/chronos-2-quickstart.ipynb) to get started with Chronos-2. - **12 Dec 2024**: 📊 We released [`fev`](https://github.com/autogluon/fev), a lightweight package for benchmarking time series forecasting models based on the [Hugging Face `datasets`](https://huggingface.co/docs/datasets/en/index) library. - **26 Nov 2024**: ⚡️ Chronos-Bolt models released [on HuggingFace](https://huggingface.co/collections/amazon/chronos-models-65f1791d630a8d57cb718444). Chronos-Bolt models are more accurate (5% lower error), up to 250x faster and 20x more memory efficient than the original Chronos models of the same size! - **13 Mar 2024**: 🚀 Chronos [paper](https://arxiv.org/abs/2403.07815) and inference code released. @@ -40,7 +36,9 @@ This package provides an interface to the Chronos family of **pretrained time se | Model ID | Parameters | | ---------------------------------------------------------------------- | ---------- | -| [`s3://autogluon/chronos-2`](https://arxiv.org/abs/2510.15821) | 120M | +| [`amazon/chronos-2`](https://huggingface.co/amazon/chronos-2) | 120M | +| [`autogluon/chronos-2-synth`](https://huggingface.co/autogluon/chronos-2-synth) | 120M | +| [`autogluon/chronos-2-small`](https://huggingface.co/autogluon/chronos-2-small) | 28M | | [`amazon/chronos-bolt-tiny`](https://huggingface.co/amazon/chronos-bolt-tiny) | 9M | | [`amazon/chronos-bolt-mini`](https://huggingface.co/amazon/chronos-bolt-mini) | 21M | | [`amazon/chronos-bolt-small`](https://huggingface.co/amazon/chronos-bolt-small) | 48M | @@ -49,7 +47,7 @@ This package provides an interface to the Chronos family of **pretrained time se | [`amazon/chronos-t5-mini`](https://huggingface.co/amazon/chronos-t5-mini) | 20M | | [`amazon/chronos-t5-small`](https://huggingface.co/amazon/chronos-t5-small) | 46M | | [`amazon/chronos-t5-base`](https://huggingface.co/amazon/chronos-t5-base) | 200M | -| [`amazon/chronos-t5-large`](https://huggingface.co/amazon/chronos-t5-large) | 710M | +| [`amazon/chronos-t5-large`](https://huggingface.co/amazon/chronos-t5-large) | 710M |
@@ -61,6 +59,10 @@ To perform inference with Chronos, the easiest way is to install this package th pip install chronos-forecasting ``` +> [!TIP] +> For reliable production use, we recommend using Chronos-2 models through [Amazon SageMaker JumpStart](https://aws.amazon.com/sagemaker/ai/jumpstart/). Check out [this tutorial](notebooks/deploy-chronos-to-amazon-sagemaker.ipynb) to learn how to deploy Chronos-2 inference endpoints to AWS with just a few lines of code. + + ### Forecasting A minimal example showing how to perform forecasting using Chronos-2: @@ -69,7 +71,7 @@ A minimal example showing how to perform forecasting using Chronos-2: import pandas as pd # requires: pip install 'pandas[pyarrow]' from chronos import Chronos2Pipeline -pipeline = Chronos2Pipeline.from_pretrained("s3://autogluon/chronos-2", device_map="cuda") +pipeline = Chronos2Pipeline.from_pretrained("amazon/chronos-2", device_map="cuda") # Load historical target values and past values of covariates context_df = pd.read_parquet("https://autogluon.s3.amazonaws.com/datasets/timeseries/electricity_price/train.parquet") @@ -116,8 +118,15 @@ plt.legend() ## Example Notebooks - [Chronos-2 Quick Start](notebooks/chronos-2-quickstart.ipynb) -- [Deploy Chronos-Bolt on Amazon SageMaker](notebooks/deploy-chronos-bolt-to-amazon-sagemaker.ipynb) -- Deploy Chronos-2 on Amazon SageMaker (coming soon!) +   + + Open In SageMaker Studio Lab + +   + + Open In Colab + +- [Deploy Chronos-2 on Amazon SageMaker](notebooks/deploy-chronos-to-amazon-sagemaker.ipynb) ## 📝 Citation diff --git a/figures/chronos-logo.png b/figures/chronos-logo.png deleted file mode 100644 index fff5a42..0000000 Binary files a/figures/chronos-logo.png and /dev/null differ diff --git a/figures/main-figure.png b/figures/main-figure.png deleted file mode 100644 index 329b890..0000000 Binary files a/figures/main-figure.png and /dev/null differ diff --git a/figures/zero_shot-agg_scaled_score.svg b/figures/zero_shot-agg_scaled_score.svg deleted file mode 100644 index 560c4de..0000000 --- a/figures/zero_shot-agg_scaled_score.svg +++ /dev/null @@ -1,4875 +0,0 @@ - - - - - - - - 2024-11-26T17:40:11.488708 - image/svg+xml - - - Matplotlib v3.9.2, https://matplotlib.org/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/notebooks/chronos-2-quickstart.ipynb b/notebooks/chronos-2-quickstart.ipynb index 783103e..d2489c1 100644 --- a/notebooks/chronos-2-quickstart.ipynb +++ b/notebooks/chronos-2-quickstart.ipynb @@ -7,6 +7,12 @@ "source": [ "# Getting Started with Chronos-2\n", "\n", + "[![Open In SageMaker Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/amazon-science/chronos-forecasting/blob/main/notebooks/chronos-2-quickstart.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](\n", + "https://colab.research.google.com/github/amazon-science/chronos-forecasting/blob/main/notebooks/chronos-2-quickstart.ipynb)\n", + "\n", + "\n", + "\n", "**Chronos-2** is a foundation model for time series forecasting that builds on [Chronos](https://arxiv.org/abs/2403.07815) and [Chronos-Bolt](https://aws.amazon.com/blogs/machine-learning/fast-and-accurate-zero-shot-forecasting-with-chronos-bolt-and-autogluon/). It offers significant improvements in capabilities and can handle diverse forecasting scenarios not supported by earlier models.\n", "\n", "| Capability | Chronos | Chronos-Bolt | Chronos-2 |\n", @@ -31,7 +37,7 @@ "metadata": {}, "outputs": [], "source": [ - "%pip install -U 'chronos-forecasting>=2.0' 'pandas[pyarrow]' 'matplotlib'" + "%pip install 'chronos-forecasting>=2.2[extras]' 'matplotlib'" ] }, { @@ -41,9 +47,9 @@ "metadata": {}, "outputs": [], "source": [ - "# Use only 1 GPU if available\n", "import os\n", "\n", + "# Use only 1 GPU if available\n", "os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0\"\n", "\n", "import pandas as pd\n", @@ -52,8 +58,8 @@ "from chronos import BaseChronosPipeline, Chronos2Pipeline\n", "\n", "# Load the Chronos-2 pipeline\n", - "# GPU recommended for faster inference, but CPU is also supported\n", - "pipeline: Chronos2Pipeline = BaseChronosPipeline.from_pretrained(\"s3://autogluon/chronos-2/\", device_map=\"cuda\")" + "# GPU recommended for faster inference, but CPU is also supported using device_map=\"cpu\"\n", + "pipeline: Chronos2Pipeline = BaseChronosPipeline.from_pretrained(\"amazon/chronos-2\", device_map=\"cuda\")" ] }, { @@ -210,9 +216,9 @@ " 1750-01-30 04:00:00\n", " target\n", " 624.867981\n", - " 611.385071\n", + " 611.385132\n", " 624.867981\n", - " 638.598755\n", + " 638.598816\n", " \n", " \n", " 1\n", @@ -220,29 +226,29 @@ " 1750-01-30 05:00:00\n", " target\n", " 563.703125\n", - " 546.655029\n", + " 546.655090\n", " 563.703125\n", - " 578.665649\n", + " 578.665710\n", " \n", " \n", " 2\n", " H1\n", " 1750-01-30 06:00:00\n", " target\n", - " 521.589844\n", - " 505.747467\n", - " 521.589844\n", - " 537.950806\n", + " 521.589905\n", + " 505.747498\n", + " 521.589905\n", + " 537.950867\n", " \n", " \n", " 3\n", " H1\n", " 1750-01-30 07:00:00\n", " target\n", - " 489.910706\n", + " 489.910767\n", " 473.671814\n", - " 489.910706\n", - " 508.854126\n", + " 489.910767\n", + " 508.854156\n", " \n", " \n", " 4\n", @@ -260,17 +266,17 @@ ], "text/plain": [ " item_id timestamp target_name predictions 0.1 \\\n", - "0 H1 1750-01-30 04:00:00 target 624.867981 611.385071 \n", - "1 H1 1750-01-30 05:00:00 target 563.703125 546.655029 \n", - "2 H1 1750-01-30 06:00:00 target 521.589844 505.747467 \n", - "3 H1 1750-01-30 07:00:00 target 489.910706 473.671814 \n", + "0 H1 1750-01-30 04:00:00 target 624.867981 611.385132 \n", + "1 H1 1750-01-30 05:00:00 target 563.703125 546.655090 \n", + "2 H1 1750-01-30 06:00:00 target 521.589905 505.747498 \n", + "3 H1 1750-01-30 07:00:00 target 489.910767 473.671814 \n", "4 H1 1750-01-30 08:00:00 target 471.144470 452.199402 \n", "\n", " 0.5 0.9 \n", - "0 624.867981 638.598755 \n", - "1 563.703125 578.665649 \n", - "2 521.589844 537.950806 \n", - "3 489.910706 508.854126 \n", + "0 624.867981 638.598816 \n", + "1 563.703125 578.665710 \n", + "2 521.589905 537.950867 \n", + "3 489.910767 508.854156 \n", "4 471.144470 491.050293 " ] }, @@ -505,12 +511,14 @@ "energy_context_df = pd.read_parquet(\n", " \"https://autogluon.s3.amazonaws.com/datasets/timeseries/electricity_price/train.parquet\"\n", ")\n", + "energy_context_df[timestamp_column] = pd.to_datetime(energy_context_df[timestamp_column])\n", "display(energy_context_df.head())\n", "\n", "# Load future values of covariates\n", "energy_test_df = pd.read_parquet(\n", " \"https://autogluon.s3.amazonaws.com/datasets/timeseries/electricity_price/test.parquet\"\n", ")\n", + "energy_test_df[timestamp_column] = pd.to_datetime(energy_test_df[timestamp_column])\n", "energy_future_df = energy_test_df.drop(columns=target)\n", "display(energy_future_df.head())" ] @@ -559,10 +567,10 @@ " DE\n", " 2017-12-12 00:00:00\n", " target\n", - " 22.242924\n", + " 22.242920\n", " 18.673723\n", - " 22.242924\n", - " 25.403452\n", + " 22.242920\n", + " 25.403454\n", " \n", " \n", " 1\n", @@ -572,16 +580,16 @@ " 19.525620\n", " 14.904278\n", " 19.525620\n", - " 23.316595\n", + " 23.316601\n", " \n", " \n", " 2\n", " DE\n", " 2017-12-12 02:00:00\n", " target\n", - " 17.415371\n", - " 12.209055\n", - " 17.415371\n", + " 17.415363\n", + " 12.209047\n", + " 17.415363\n", " 21.776979\n", " \n", " \n", @@ -590,7 +598,7 @@ " 2017-12-12 03:00:00\n", " target\n", " 16.979263\n", - " 11.165123\n", + " 11.165121\n", " 16.979263\n", " 21.435223\n", " \n", @@ -599,9 +607,9 @@ " DE\n", " 2017-12-12 04:00:00\n", " target\n", - " 18.058657\n", - " 12.096769\n", - " 18.058657\n", + " 18.058651\n", + " 12.096766\n", + " 18.058651\n", " 23.166645\n", " \n", " \n", @@ -610,15 +618,15 @@ ], "text/plain": [ " id timestamp target_name predictions 0.1 0.5 \\\n", - "0 DE 2017-12-12 00:00:00 target 22.242924 18.673723 22.242924 \n", + "0 DE 2017-12-12 00:00:00 target 22.242920 18.673723 22.242920 \n", "1 DE 2017-12-12 01:00:00 target 19.525620 14.904278 19.525620 \n", - "2 DE 2017-12-12 02:00:00 target 17.415371 12.209055 17.415371 \n", - "3 DE 2017-12-12 03:00:00 target 16.979263 11.165123 16.979263 \n", - "4 DE 2017-12-12 04:00:00 target 18.058657 12.096769 18.058657 \n", + "2 DE 2017-12-12 02:00:00 target 17.415363 12.209047 17.415363 \n", + "3 DE 2017-12-12 03:00:00 target 16.979263 11.165121 16.979263 \n", + "4 DE 2017-12-12 04:00:00 target 18.058651 12.096766 18.058651 \n", "\n", " 0.9 \n", - "0 25.403452 \n", - "1 23.316595 \n", + "0 25.403454 \n", + "1 23.316601 \n", "2 21.776979 \n", "3 21.435223 \n", "4 23.166645 " @@ -732,7 +740,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9EAAAFaCAYAAAAZ2N5BAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQAA6qxJREFUeJzs3Xd4FOX2wPHvbEsvkARCJ/QuXekoVQEv9oIKehV/NkTsXkUUFVFULFfswEWxi2BDAUGkikCQ3nsJBEhC2raZ3x+zu8mm7iabZAPn8zx5lC2z7862OXPOe15F0zQNIYQQQgghhBBClMpQ1QMQQgghhBBCCCGqCwmihRBCCCGEEEIIH0kQLYQQQgghhBBC+EiCaCGEEEIIIYQQwkcSRAshhBBCCCGEED6SIFoIIYQQQgghhPCRBNFCCCGEEEIIIYSPJIgWQgghhBBCCCF8JEG0EEIIIYQQQgjhIwmihRDiAjVnzhxatWqF2WwmNja2qocTdFJSUrj22muJi4tDURSmT59e1UOqEPfeey+DBg0q93YmTZqEoih+3TY1NbXcjyuKNmvWLBRF4cCBA1U9lCJt27YNk8nEli1bqnooQgjhNwmihRCiCKtWrWLSpEmkpaVV9VB84u94d+zYwZgxY2jatCkffvghH3zwQcUOMAi89NJLfP/99z7f/qGHHuLXX3/lySefZM6cOQwdOrTiBgcoiuL5M5lM1KxZky5duvDggw+ybdu2Qrc/cOCA130K/r388sulPub+/fv56KOPeOqppyriKfm9zyvDtm3bmDRpUtAGl8Fg7ty5FX7SqE2bNgwbNoyJEydW6OMIIURFUDRN06p6EEIIEWymTZvGo48+yv79+2ncuHFVD6dU/o73vffe45577mH37t00a9as4gcYBCIjI7n22muZNWuWT7dPTExk4MCBfPrppxU7MBdFURg0aBC33XYbmqaRnp7Opk2b+Prrr8nKymLq1KlMmDDBc/sDBw6QlJTETTfdxBVXXFFoe506daJt27YlPub48eP55Zdf2LlzZ7nH73A4cDgchIaGei4rbp9PmjSJ5557jlOnThEfH1/ux/bHN998w3XXXcfSpUvp379/pT52ZXI6ndjtdkJCQnyuEHAbPnw4W7ZsqfATDb/88gtXXHEFe/bsoWnTphX6WEIIEUimqh6AEEJcKDRNIzc3l7CwsKoeCidPngQIaBl3dnY24eHhAdteVTt58mRA909ubi4WiwWDofgisBYtWnDLLbd4Xfbyyy8zYsQIHn74YVq1alUoYO7cuXOh+/jCbrfz2Wef8X//939+37coJpMJk0kOK6paVlYWERERGI1GjEZjVQ+nRAMHDqRGjRrMnj2b559/vqqHI4QQPpNybiGEKGDSpEk8+uijACQlJXnKY91ZmZkzZ3LZZZdRq1YtQkJCaNOmDTNmzCi0ncaNGzN8+HB+/fVXunbtSlhYGO+//z4ABw8e5MorryQiIoJatWp5SocVRWHZsmVe21m7di1Dhw4lJiaG8PBw+vXrx8qVK30eb1HjevbZZwFISEhAURQmTZrkuf7dd9+lbdu2hISEULduXe67775CZeL9+/enXbt2rF+/nr59+xIeHu4pCbZarTz77LM0a9aMkJAQGjRowGOPPYbVai00lk8//ZTu3bsTHh5OjRo16Nu3L7/99pvn+vnz5zNs2DDq1q1LSEgITZs2ZfLkyTidTq/t7N69m2uuuYbExERCQ0OpX78+N954I+np6YCe5c3KymL27Nme/TNmzJgi9497Lqmmafz3v//13N5t3759XHfdddSsWZPw8HAuueQSfvrpJ69tLFu2DEVR+OKLL3j66aepV68e4eHhZGRkFPmYJYmLi+OLL77AZDLx4osv+n3/4qxYsYLU1FQGDhzouUzTNOLj470y3qqqEhsbi9Fo9HofTJ06FZPJRGZmJlB4TrQv+zwtLY0xY8YQGxtLTEwMt99+O9nZ2V63cTgcTJ48maZNmxISEkLjxo156qmnCr2fCr6P3Ro3bux53FmzZnHdddcBcOmll3rGVfAzV9COHTu4/vrrSUhIICwsjJYtW/Kf//zH6zYbN27k8ssvJzo6msjISAYMGMCaNWs81//9998oisLs2bMLbd/92f/xxx8B/fvh3nvvpWXLloSFhREXF8d1111X6DPtfq/+8ccf3HvvvdSqVYv69et7XZf/Pr58nvr3789PP/3EwYMHPfsnf3WLr5/vRYsW0bt3b2JjY4mMjKRly5aFpg2YzWb69+/P/PnzS9z/QggRbOSUsRBCFHD11Veza9cuPv/8c9544w1PuWlCQgIAM2bMoG3btlx55ZWYTCZ++OEH7r33XlRV5b777vPa1s6dO7npppu4++67ueuuu2jZsiVZWVlcdtllHD9+nAcffJDExETmzp3L0qVLC43l999/5/LLL6dLly48++yzGAwGTxD/559/0r1791LHW9D06dP53//+x7x585gxYwaRkZF06NAByCuzHThwIPfccw87d+5kxowZrFu3jpUrV2I2mz3bOX36NJdffjk33ngjt9xyC7Vr10ZVVa688kpWrFjB2LFjad26NZs3b+aNN95g165dXvNjn3vuOSZNmkTPnj15/vnnsVgsrF27lt9//53BgwcDeiAQGRnJhAkTiIyM5Pfff2fixIlkZGTw6quvAmCz2RgyZAhWq5UHHniAxMREjh49yo8//khaWhoxMTHMmTOHO++8k+7duzN27FiAYstH+/bty5w5c7j11ls95dVuKSkp9OzZk+zsbMaNG0dcXByzZ8/myiuv5JtvvuGqq67y2tbkyZOxWCw88sgjWK1WLBZLkY9ZmoYNG9KvXz+WLl1KRkYG0dHRnuuys7OLbNAVGxtbYmZ41apVKIpCp06dPJcpikKvXr1Yvny557J//vmH9PR0DAYDK1euZNiwYQD8+eefdOrUicjIyCK378s+v/7660lKSmLKlCls2LCBjz76iFq1ajF16lTPbe68805mz57Ntddey8MPP8zatWuZMmUK27dvZ968eSXttkL69u3LuHHjeOutt3jqqado3bo1gOe/Rfnnn3/o06cPZrOZsWPH0rhxY/bu3csPP/zgOamxdetW+vTpQ3R0NI899hhms5n333+f/v3788cff3DxxRfTtWtXmjRpwldffcXo0aO9HuPLL7+kRo0aDBkyBIB169axatUqbrzxRurXr8+BAweYMWMG/fv3Z9u2bYUqPu69914SEhKYOHEiWVlZxT4XXz5P//nPf0hPT+fIkSO88cYbAJ7X2NfP99atWxk+fDgdOnTg+eefJyQkhD179nid/HPr0qUL8+fPL/S+FkKIoKYJIYQo5NVXX9UAbf/+/YWuy87OLnTZkCFDtCZNmnhd1qhRIw3QFi5c6HX5a6+9pgHa999/77ksJydHa9WqlQZoS5cu1TRN01RV1Zo3b64NGTJEU1XV6/GTkpK0QYMG+TTeojz77LMaoJ06dcpz2cmTJzWLxaINHjxYczqdnsvfeecdDdA++eQTz2X9+vXTAO29997z2u6cOXM0g8Gg/fnnn16Xv/feexqgrVy5UtM0Tdu9e7dmMBi0q666yuux3M87/3Mt6O6779bCw8O13NxcTdM0bePGjRqgff311yU+54iICG306NEl3iY/QLvvvvu8Lhs/frwGeD2/c+fOaUlJSVrjxo09z2Xp0qUaoDVp0qTI5+Dr4+X34IMPaoC2adMmTdM0bf/+/RpQ7N/q1atLfLxbbrlFi4uLK3T5q6++qhmNRi0jI0PTNE176623tEaNGmndu3fXHn/8cU3TNM3pdGqxsbHaQw895Lmf+z2VX3H73H3bO+64w+vyq666ymtMycnJGqDdeeedXrd75JFHNED7/fffPZcB2rPPPlvosRo1auQ1hq+//trrc1aavn37alFRUdrBgwe9Ls//Ph05cqRmsVi0vXv3ei47duyYFhUVpfXt29dz2ZNPPqmZzWbtzJkznsusVqsWGxvrtS+Kes+sXr1aA7T//e9/nstmzpypAVrv3r01h8PhdXv3dfm/E3z5PGmapg0bNkxr1KhRodv6+vl+4403Cn2/FGfu3LkaoK1du7bU2wohRLCQcm4hhPBT/jnN6enppKam0q9fP/bt2+cpH3ZLSkryZJfcFi5cSL169bjyyis9l4WGhnLXXXd53S45OZndu3dz8803c/r0aVJTU0lNTSUrK4sBAwawfPlyVFUN2PNavHgxNpuN8ePHe83bveuuu4iOji5UshwSEsLtt9/uddnXX39N69atadWqlWe8qampXHbZZQCebPv333+PqqpMnDix0Bzh/CXB+ff1uXPnSE1NpU+fPmRnZ7Njxw4AYmJiAL0ktmApcKD9/PPPdO/end69e3sui4yMZOzYsRw4cKBQF+3Ro0cHbA68Oxt47tw5r8vHjh3LokWLCv21adOmxO2dPn2aGjVqFLq8T58+OJ1OVq1aBegZ5z59+tCnTx/+/PNPALZs2UJaWhp9+vQp13MqOB+7T58+nD592lP2/vPPPwN4lZcDPPzwwwCF3pOBdurUKZYvX84dd9xBw4YNva5zv0+dTie//fYbI0eOpEmTJp7r69Spw80338yKFSs8z+eGG27Abrfz3XffeW7322+/kZaWxg033OC5LP97xm63c/r0aZo1a0ZsbCwbNmwoNM677rrLp/nPvnyeSuLr59vdS2D+/Pmlfke534Oy3JkQojqRIFoIIfy0cuVKBg4cSEREBLGxsSQkJHjm+hUVRBd08OBBmjZtWqhjbsEu2bt37wb0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jb9evXpewe8DDzzAr7/+yldffeUVRDdv3pxXXnnF8+8nnniCli1b8uqrrwLQsmVLtmzZwosvvui5zZQpUxg1apSnuVvz5s1566236NevHzNmzCh2TEIIIYQQQgiRX7UPosNNeka4rDRNY9MZFU2DNjUMhBgVchwaO9JUDAp0qGkotrQ33M+916FDB69/16lTh5MnTxZ52zFjxjBo0CBatmzJ0KFDGT58OIMHDy5x+9u3b2fs2LFel/Xq1Ys333zT67KuXbuWuJ3k5GSuu+66Yq/fvXs3EydOZO3ataSmpqKq+vpghw4d8imILo7T6eSll17iq6++4ujRo9hsNqxWK+Hh4V6369Kli9e/d+7cSbdu3bwuyx90A2zatIl//vmHzz77zHOZpmmoqsr+/ftp3bp1mccthBBCCCGEuHBU+yBaURS/SqoLsjkh1KigADVC9Lmw4SaINCs4Nff2AzM/1mz2HqiiKJ4AtKDOnTuzf/9+fvnlFxYvXsz111/PwIED+eabb8o9joiIkk86hIWFlXj9iBEjaNSoER9++CF169ZFVVXatWtX7iZfr776Km+++SbTp0+nffv2REREMH78+ELbLW38RcnMzOTuu+9m3Lhxha5r2LBhmccshBBCCCGEuLBU+yC6vNzLW1mMeDLOiqIQaVZIt2lkOrSABdH+io6O5oYbbuCGG27g2muvZejQoZw5c4aaNWtiNpsLta9v3bo1K1euZPTo0Z7LVq5cSZs2bfx63A4dOrBkyRKee+65QtedPn2anTt38uGHH9KnTx9Ab9jlL4vFUmj8K1eu5F//+he33HILoDdi27VrV6njb9myJT///LPXZevWrfP6d+fOndm2bRvNmjXza0xCCCGEEEIEO5PJ5OnrYzJd8CFehfOrO7fT6eSZZ54hKSmJsLAwmjZtyuTJk726VGuaxsSJE6lTpw5hYWEMHDiQ3bt3B3zggWJV9bGHGL0D5UhX0jjLXtkj0r3++ut8/vnn7Nixg127dvH111+TmJhIbGwsoHfoXrJkCSdOnPB0zX700UeZNWsWM2bMYPfu3bz++ut89913hZpslebJJ59k3bp13Hvvvfzzzz/s2LGDGTNmkJqaSo0aNYiLi+ODDz5gz549/P7770yYMMHv59e4cWOWL1/O0aNHSU1NBfR5yosWLWLVqlVs376du+++m5SUlFK3dffd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ly6e+7Rq1arErtDJycl06tTJE0CXxfbt27nooos8ATRAr169UFWVnTt3ei5r27atV3ODOnXq+F36XJZtlLbf3Aru74SEBAYPHuwpid+/fz+rV69m1KhRntusX7+eESNG0LBhQ6KioujXrx8Ahw4d8ut5CSGEEEKIypdSTDl3WeXNi65GXYfLoTpkokEP8m0V1KHbryC6Tp06tGnTxuuy1q1be4IHdyYwJSXF6zYpKSklZjWrG3dJt7/l3L7IH5SCXnp99913k5yc7PnbtGkTu3fv9sxF91dYmH9n18rDbDZ7/VtRFL/naZRlG77ut4L7G2DUqFF888032O125s6dS/v27Wnfvj2QV8YeHR3NZ599xrp165g3bx4gjcmEEEIIIaoDdyY6ITSwQfSFsla0P2tEVyXFqDcWUx2BH6xfQXSvXr28sowAu3btolGjRgAkJSWRmJjotURRRkYGa9eupUePHgEYbnDIy0T7d7+1a9d6/XvNmjU0b968xDb0nTt3Ztu2bTRr1qzQn8VioVWrVjgcDtavX++5z86dO0lLSyt2mx06dCA5OZkzZ84Ueb3FYvHKjheldevWbNq0yatR18qVKzEYDLRs2bLE+wZaUeMtbb+V5F//+he5ubksXLiQuXPnemWhd+zYwenTp3n55Zfp06cPrVq1kqZiQgghhBDVyEnPElcBDqLPqqjVIbosJ82p9xSrDpnoimou5lcQ/dBDD7FmzRpeeukl9uzZw9y5c/nggw+477779IEqCuPHj+eFF15gwYIFbN68mdtuu426desycuTIwI++AE3Vywsq+s+g6e8Yf8u5Dx06xIQJE9i5cyeff/45b7/9Ng8++GCJ93n88cdZtWoV999/P8nJyezevZv58+d7GmS1bNmSoUOHcvfdd7N27VrWr1/PnXfeWWK2+aabbiIxMZGRI0eycuVK9u3bx7fffutp/ta4cWP2799PcnIyqampWK2F33mjRo0iNDSU0aNHs2XLFpYuXcoDDzzArbfeWmhOfEVr3Lgxy5cv5+jRo6SmpgKl77eSREREMHLkSJ555hm2b9/OTTfd5LmuYcOGWCwW3n77bfbt28eCBQuYPHlyhT03IYQQQggRWCU1FiuLFrEGIkyQab8wlrpSHQR1Z243RQmSILpbt27MmzePzz//nHbt2jF58mSmT5/ulal77LHHeOCBBxg7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", + "image/png": "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Rnn3eaNGjVBVld27d3s1/0pJSSEtLc1rf9eqVatQF3mbzcbx48fLPCb352DLli3F3iYuLo7Q0NBi3xcGg8Hr5NENN9zAc889x7fffkvdunXJyMjgxhtv9LrfN998w+jRo3nttdc8l+Xm5hZ6fv7w5/NU3D7y9fMNYDAYGDBgAAMGDOD111/npZde4j//+Q9Lly71+i7Zv38/BoPBk80WQoiaQMq5hRCiCGFhYQCFDlrdGZT8mbL09HRmzpzp87aHDBnC0aNHWbBggeey3NxcPvzwQ6/bdenShaZNmzJt2jRPKW9+p06dKnW8/hg4cCAWi4W33nrL6/l9/PHHpKene7oyl+T666/n6NGjhZ4L6CWq7s7BI0eOxGAw8PzzzxfKgLkfu6h9bbPZePfdd71un5GRgcPh8Lqsffv2GAwGr2V3wsLCyrV/AK644gr++usvVq9e7bksKyuLDz74gMaNG5danl4WZ86c4aabbsLpdBZaVqk8evTogaZprF+/vtB1ffr0wWq1Mn36dHr37u0JmPr06cOcOXM4duyYT/Ohy7vP3WtiT58+3etydyY0/3uyadOmXl3FAT744INCmWh/PitxcXH07duXTz75hEOHDnldl/99OnjwYObPn++1nFRKSgpz586ld+/eXqX1rVu3pn379nz55Zd8+eWX1KtXzyuodW+zYDb+7bffLldW3dfPE+j7qKjybl8/32fOnCl0vftkWcGlsNavX0/btm0LncgRQohAJploIYQoQpcuXQB9uZcbb7wRs9nMiBEjGDx4MBaLhREjRnD33XeTmZnJhx9+SJ06dQplvIpz9913884773DTTTfx4IMPUq9ePT777DOCg4OBvCyQwWDgo48+4vLLL6dt27bcfvvt1K9fn6NHj7J06VIiIyP54YcfShyvO2DwRVxcHE8++STPPfccQ4cO5corr2Tnzp28++67dOvWzTN3siS33norX331Ff/3f//H0qVL6dWrF06nkx07dvDVV1951sxu1qwZ//nPf5g8eTJ9+vTh6quvJigoiHXr1pGQkMCUKVPo2bMntWrVYvTo0YwbNw5FUZgzZ06h4OL333/n/vvv57rrrqNFixY4HA7mzJmD0Wjkmmuu8dyuS5cuLF68mNdff52EhASSkpK4+OKLfd4/AE888QSff/45l19+OePGjaN27drMnj2b/fv38+23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iud0Olm2bBnLli2TvjNVQIJo8kq5g4ygKJDjgGxH1Y/j+PHjXH755T7dtiID7p49e3L8+HGioqIqZHu+aNy4MdOnT6+yx/NFII5JCCGEEEKI0kgQXbUkiAasTj3rHGpSqGXR50Kn5lZ9SXd8fDxBQUFV+ph2ux2LxUJ8fHyNbPhks9mqewhCCCGEEEKIC0iND6I1TSPLXr6/NJtGjkPDqWmEGCHHoXEsSyXDqpZ4P39LvlVV5bHHHqN27drEx8czadIkr+vzZ5dtNhv3338/9erVIzg4mEaNGjFlyhRAz5gCXHXVVSiK4vk3wIwZM2jatCkWi4WWLVsyZ86cQo8xY8YMrrzySsLCwnjxxReLLOdeuXIl/fv3JzQ0lFq1ajFkyBDOnj0LwMKFC+nduzfR0dHExMQwfPhw9u7d6/N+6N+/PwcPHuShhx5CURRP8H769Gluuukm6tevT2hoKO3bt+fzzz8vdN/777+f8ePHExsby5AhQwBYsGABzZs3Jzg4mEsvvZTZs2cXek4rVqygT58+hISEkJiYyLhx48jKyipxTEIIIYQQQgiRX43vzp3tgNqzsqrlsc+MCSPMjw7ys2fPZsKECaxdu5bVq1czZswYevXqxaBBgwrd9q233mLBggV89dVXNGzYkMOHD3P48GEA1q1bR506dZg5cyZDhw7FaDQCMG/ePB588EGmT5/OwIED+fHHH7n99ttp0KABl156qWfbkyZN4uWXX2b69OmYTCb27dvn9djJyckMGDCAO+64gzfffBOTycTSpUs9pSFZWVlMmDCBDh06kJmZycSJE7nqqqtITk7GYCj9vMx3333HRRddxNixY7nrrrs8l+fm5tKlSxcef/xxIiMj+emnn7j11ltp2rQp3bt399qP99xzDytXrgRg//79XHvttTz44IPceeedbNy4kUceecTrMffu3cvQoUN54YUX+OSTTzh16hT3338/999/PzNnzix2TEIIIYQQQgiRX40PomuSDh068OyzzwLQvHlz3nnnHZYsWVJkEH3o0CGaN29O7969URSFRo0aea6Li4sDIDo6mvj4eM/l06ZNY8yYMZ414iZMmMCaNWuYNm2aVxB98803c/vtt3v+XTCIfuWVV+jatSvvvvuu57K2bdt6/v+aa67xuv0nn3xCXFwc27Zto127dqXuh9q1a2M0GomIiPAaf/369b2C3wceeIBff/2Vr776yiuIbt68Oa+88orn30888QQtW7bk1VdfBaBly5Zs2bKFF1980XObKVOmMGrUKE9zt+bNm/PWW2/Rr18/ZsyYUeyYhBBCCCGEECK/Gh9Eh5r0jHBZaZrGpjMqmgZtahkIMirkODR2pKkYFOhQ21BsaW+on3uvQ4cOXv+uV68eJ0+eLPK2Y8aMYdCgQbRs2ZKhQ4cyfPhwBg8eXOL2t2/fztixY70u69WrF2+++abXZV27di1xO8nJyVx33XXFXr97924mTpzI2rVrSU1NRVX19cEOHTrkUxBdHKfTyUsvvcRXX33F0aNHsdlsWK1WQkNDvW7XpUsXr3/v3LmTbt26eV2WP+gG2LRpE//88w+fffaZ5zJN01BVlf3799O6desyj1sIIYQQQghx4ajxQbSiKH6VVBdkc0KwUUEBagXpc2FDTRBuVnBq7u1XzPxYs9l7oIqieALQgjp37sz+/fv55ZdfWLx4Mddffz0DBw7km2++Kfc4wsJKPukQEhJS4vUjRoygUaNGfPjhhyQkJKCqKu3atSt3k69XX32VN998k+nTp9O+fXvCwsIYP358oe2WNv6iZGZmcvfddzNu3LhC1zVs2LDMYxZCCCGEEEJcWGp8EF1e7uWtLEY8GWdFUQg3K6TbNDIdWoUF0f6KjIzkhhtu4IYbbuDaa69l6NChnDlzhtq1a2M2mwu1r2/dujUrV65k9OjRnstWrlxJmzZt/HrcDh06sGTJEp577rlC150+fZqdO3fy4Ycf0qdPH0Bv2OUvi8VSaPwrV67kX//6F7fccgugN2LbtWtXqeNv2bIlP//8s9dl69at8/p3586d2bZtG82aNfNrTEIIIYQQQgQ6k8nk6etjMl3wIV6l86s7t9Pp5JlnniEpKYmQkBCaNm3K5MmTvbpUa5rGxIkTqVevHiEhIQwcOJDdu3dX+MArilXVxx5k9A6Uw11J4yx7VY9I9/rrr/P555+zY8cOdu3axddff018fDzR0dGA3qF7yZIlnDhxwtM1+9FHH2XWrFnMmDGD3bt38/rrr/Pdd98VarJVmieffJJ169Zx77338s8//7Bjxw5mzJhBamoqtWrVIiYmhg8++IA9e/bw+++/M2HCBL+fX+PGjVm+fDlHjx4lNTUV0OcpL1q0iFWrVrF9+3buvvtuUlJSSt3W3XffzY4dO3j88cfZtWsXX331FbNmzQLyTow8/vjjrFq1ivvvv5/k5GR2797N/Pnzuf/++0sckxBCCCGEEIHOYDBQv3596tev71OjX1E+fu3hqVOnMmPGDN555x22b9/O1KlTeeWVV3j77bc9t3nllVd46623eO+991i7di1hYWEMGTKE3NzcCh98RbC5M9EF9kSYSQ++MsuwlFVFiIiI8DT46tatGwcOHODnn3/2fChee+01Fi1aRGJiIp06dQJg5MiRvPnmm0ybNo22bdvy/vvvM3PmTPr37+/XY7do0YLffvuNTZs20b17d3r06MH8+fMxmUwYDAa++OIL1q9fT7t27XjooYc8Db388fzzz3PgwAGaNm3qaZT29NNP07lzZ4YMGUL//v2Jj49n5MiRpW4rKSmJb775hu+++44OHTowY8YM/vOf/wB41t3u0KEDf/zxB7t27aJPnz506tSJiRMnkpCQUOKYhBBCCCGEECI/RfMjQhw+fDh169bl448/9lx2zTXXEBISwqeffoqmaSQkJPDwww97sp/p6enUrVuXWbNmceONN5b6GBkZGURFRZGenk5kZKTXdbm5uezfv5+kpCSCg4N9HXaJ9meonLFq1A9TiA/Ni6RVTSM5VUUD2tYyEGySdYNrkhdffJH33nvPsyyYCByV8TkWQgghhLiQOZ1O1qxZA8All1ziWQJX+K6kOLQgvzLRPXv2ZMmSJezatQvQOx6vWLGCyy+/HNDX6z1x4gQDBw703CcqKoqLL76Y1atXF7lNq9VKRkaG119VKq6c25CvYVmmo+oz0cI/7777LuvWrWPfvn3MmTOHV1991WtuuBBCCCGEEOcrp9PJokWLWLRokfT4qQJ+zTp/4oknyMjIoFWrVhiNRpxOJy+++CKjRo0C4MSJEwDUrVvX635169b1XFfQlClTimxgVVXc5dxBRZxOCDcrZNo1suwQKwmzgLZ7925eeOEFzpw5Q8OGDXn44Yd58sknq3tYQgghhBBCiPOMX0H0V199xWeffcbcuXNp27YtycnJjB8/noSEhDJn/Z588kmvxlQZGRkkJiaWaVv+cqoadtcKU5YiKh70edEamXbJRAe6N954gzfeeKO6hyGEEEIIIYQ4z/kVRD/66KM88cQTnrnN7du35+DBg0yZMoXRo0cTHx8PQEpKCvXq1fPcLyUlhY4dOxa5zaCgIE/z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PZc5HA7Wr19f4v183Se+jtOf7RVly5YtdOrUqcz3F0IIIYQQIlAFbBD9WEcLAM/9beWs1Tt4zXQF0ZEW7/vEhyqEmfQs9b5zKlZXIJ1p1ziVq/9/o3ADhlKWtCqoItaJLspll13GnDlz+PPPP9m8eTOjR48ulH1t3LgxS5Ys8QoGL7vsMv7++2/+97//sXv3bp599lm2bNlS6uPdd999nDlzhptuuol169axd+9efv31V26//fZiA6bGjRuTmZnJkiVLSE1NJTs7m4YNG2KxWHj77bfZt28fCxYsYPLkyaU+fkREBKNHj+bRRx9l6dKlbN26lX//+98YDHnLjLVo0YJRo0Zx22238d1337F//37++usvpkyZwk8//VTsmIrSqVMnYmNjvQLfQYMG0bRpU0aPHs0///zDypUrefrppwFKXers0UcfZerUqXz55Zfs3LmTJ554guTkZB588EEAmjVrRmJiIpMmTWL37t389NNPvPbaa6Xul4IefPBBXn75Zb7//nt27NjBvffe69VJuyi+7hNfx+nP9grKzs5m/fr1DB482Of7CCGEEEKIsjOZTNx8883cfPPNVb6U7oUoYIPo21uaaR1t4LQVXtqQVyKsapDjSk5Hmr2DHoOiz1k2KpBlh61nVI5kqhw8p5eaxgYrRFj8C6ABTK67OFQqtOz2ySefpF+/fgwfPpxhw4YxcuRIr7myoHdCXrRoEYmJiZ7M3pAhQ3jmmWd47LHH6NatG+fOneO2224r9fHcmVSn08ngwYNp374948ePJzo6uth1lHv27Mn//d//ccMNNxAXF8crr7xCXFwcs2bN4uuvv6ZNmza8/PLLTJs2zafn/Prrr9OjRw+GDx/OwIED6dWrF61bt/aauzxz5kxuu+02Hn74YVq2bMnIkSNZt24dDRs2LHZMRTEajZ41i/Nf9v3335OZmUm3bt248847+c9//gNQaP50QePGjWPChAk8/PDDtG/fnoULF7JgwQJPZ26z2cznn3/Ojh076NChA1OnTuWFF17wab/k9/DDD3PrrbcyevRoevToQUREBFdddVWJ9/F1n/g6Tn+2V9D8+fNp2LAhffr08fk+QgghhBCi7AwGAy1atKBFixbFHteLiqNolTkZswwyMjKIiooiPT2d1emhXLkwl2Aj7LoxlCiDja2790FMI4KDg2lbu+gln3IcGoez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wIEDHDhwAFWt3IBeU4teIzqQ5O/QXRn8CqIXLFhA165due6666hTpw6dOnXiww8/9Fy/f/9+Tpw4wcCBAz2XRUVFcfHFF7N69eoitzllyhSioqI8f4mJiWV8KlUjf+d6u5/l3LNnz8ZkMvHXX3/x5ptv8vrrr/PRRx953WbatGlcdNFFbNy4kWeeeYa9e/cydOhQrrnmGv755x++/PJLVqxYwf333++5z5gxYzh8+DBLly7lm2++4d133y0xqMvMzKRfv34cPXqUBQsWsGnTJh577DFUVeWGG27g4Ycfpm3bthw/fpzjx49zww03FNpGVlYWQ4YMoVatWqxbt46vv/6axYsXe40LYOnSpezdu5elS5cye/ZsZs2a5QnKfVXSNr777jsaNGjA888/7xkv4NN+K2p/jxo1ii+++MLr5MaXX35JQkICffr0AcButzN58mQ2bdrE999/z4EDBxgzZoxfz0kIIYQQQlQP95zogkE0wOOdzAxraOTt3kEEm0qPEmsHKzQI02+3tRpLuh0Oh+cY2eGo3EZRqhPQAjwT7RpbZQXRfs1+37dvHzNmzGDChAk89dRTrFu3jnHjxmGxWBg9ejQnTpwAoG7dul73q1u3rue6gp588kkmTJjg+XdGRkbAB9JGQANsfn5OEhMTeeONN1AUhZYtW7J582beeOMN7rrrLs9tLrvsMh5++GHPv++8805GjRrlaRDWvHlz3nrrLfr168eMGTM4dOgQv/zyC3/99RfdunUD4OOPP6Z169bFjmPu3LmcOnWKdevWUbt2bQCaNWvmuT48PByTyUR8fHyJ28jNzeV///sfYWFhALzzzjuMGDGCqVOnet4DtWrV4p133sFoNNKqVSuGDRvGkiVLvJ5zaUraRu3atTEajZ6ssNuUKVNK3G/BwXpjiIL7+/rrr2f8+PGeLLb7ud50002eLPcdd9zhuX2TJk1466236NatG5mZmYSHh/v8vIQQQgghRNVzl3PXLSKIrhdq4LshIX5tr11tA0eynGw+o9IzvvLnI1c3d2duJdDXearEDt1+PXVVVencuTMvvfQSnTp1YuzYsdx111289957ZR5AUFAQkZGRXn+Bzn1mw+bnWtGXXHKJV7lxjx492L17N05nXkq7a9euXvfZtGkTs2bNIjw83PM3ZMgQVFVl//79bN++HZPJRJcuXTz3adWqVYld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", "text/plain": [ "
" ] @@ -999,10 +1007,12 @@ "\n", "# Load historical sales and past values of covariates\n", "sales_context_df = pd.read_parquet(\"https://autogluon.s3.amazonaws.com/datasets/timeseries/retail_sales/train.parquet\")\n", + "sales_context_df[timestamp_column] = pd.to_datetime(sales_context_df[timestamp_column])\n", "display(sales_context_df.head())\n", "\n", "# Load future values of covariates\n", "sales_test_df = pd.read_parquet(\"https://autogluon.s3.amazonaws.com/datasets/timeseries/retail_sales/test.parquet\")\n", + "sales_test_df[timestamp_column] = pd.to_datetime(sales_test_df[timestamp_column])\n", "sales_future_df = sales_test_df.drop(columns=target)\n", "display(sales_future_df.head())" ] @@ -1050,19 +1060,19 @@ " 2015-05-03\n", " Sales\n", " 28939.392578\n", - " 25214.275391\n", + " 25214.277344\n", " 28939.392578\n", - " 32411.095703\n", + " 32411.097656\n", " \n", " \n", " 1\n", " 1\n", " 2015-05-10\n", " Sales\n", - " 25541.921875\n", - " 21921.326172\n", - " 25541.921875\n", - " 29191.931641\n", + " 25541.919922\n", + " 21921.324219\n", + " 25541.919922\n", + " 29191.929688\n", " \n", " \n", " 2\n", @@ -1070,9 +1080,9 @@ " 2015-05-17\n", " Sales\n", " 23640.238281\n", - " 20500.337891\n", + " 20500.339844\n", " 23640.238281\n", - " 26884.664062\n", + " 26884.666016\n", " \n", " \n", " 3\n", @@ -1089,10 +1099,10 @@ " 1\n", " 2015-05-31\n", " Sales\n", - " 22679.359375\n", + " 22679.361328\n", " 19722.287109\n", - " 22679.359375\n", - " 25990.041016\n", + " 22679.361328\n", + " 25990.042969\n", " \n", " \n", "\n", @@ -1100,18 +1110,18 @@ ], "text/plain": [ " id timestamp target_name predictions 0.1 0.5 \\\n", - "0 1 2015-05-03 Sales 28939.392578 25214.275391 28939.392578 \n", - "1 1 2015-05-10 Sales 25541.921875 21921.326172 25541.921875 \n", - "2 1 2015-05-17 Sales 23640.238281 20500.337891 23640.238281 \n", + "0 1 2015-05-03 Sales 28939.392578 25214.277344 28939.392578 \n", + "1 1 2015-05-10 Sales 25541.919922 21921.324219 25541.919922 \n", + "2 1 2015-05-17 Sales 23640.238281 20500.339844 23640.238281 \n", "3 1 2015-05-24 Sales 26778.261719 23318.355469 26778.261719 \n", - "4 1 2015-05-31 Sales 22679.359375 19722.287109 22679.359375 \n", + "4 1 2015-05-31 Sales 22679.361328 19722.287109 22679.361328 \n", "\n", " 0.9 \n", - "0 32411.095703 \n", - "1 29191.931641 \n", - "2 26884.664062 \n", + "0 32411.097656 \n", + "1 29191.929688 \n", + "2 26884.666016 \n", "3 30162.820312 \n", - "4 25990.041016 " + "4 25990.042969 " ] }, "metadata": {}, @@ -1215,7 +1225,7 @@ "source": [ "## Cross-Learning with Joint Prediction\n", "\n", - "Chronos-2 supports **cross-learning** through the `predict_batches_jointly=True` parameter, which enables the model to share information across all time series in a batch during prediction. This can be particularly beneficial when forecasting multiple related time series with short historical context." + "Chronos-2 supports **cross-learning** through the `cross_learning=True` parameter, which enables the model to share information across all time series in a batch during prediction. This can be particularly beneficial when forecasting multiple related time series with short historical context." ] }, { @@ -1231,7 +1241,7 @@ " context_df,\n", " prediction_length=24,\n", " quantile_levels=[0.1, 0.5, 0.9],\n", - " predict_batches_jointly=True, # Enable cross-learning\n", + " cross_learning=True, # Enable cross-learning\n", " batch_size=100,\n", ")" ] @@ -1241,9 +1251,11 @@ "id": "b427ca20", "metadata": {}, "source": [ + "
\n", + "\n", "### Important Considerations for Cross-Learning\n", "\n", - "When using `predict_batches_jointly=True`, keep these caveats in mind:\n", + "When using `cross_learning=True`, keep these caveats in mind:\n", "\n", "- **Task-dependent results**: Cross-learning may not always improve forecasts and could worsen performance for some tasks. Evaluate this feature for your specific use case.\n", "\n", @@ -1251,7 +1263,9 @@ "\n", "- **Input homogeneity**: This feature works best with homogeneous inputs (e.g., multiple univariate time series of the same type). Mixing different task types may lead to unexpected behavior.\n", "\n", - "- **Short context benefit**: Cross-learning is most helpful when individual time series have limited historical context, as the model can leverage patterns from related series in the batch." + "- **Short context benefit**: Cross-learning is most helpful when individual time series have limited historical context, as the model can leverage patterns from related series in the batch.\n", + "\n", + "
" ] }, { @@ -1395,9 +1409,15 @@ "id": "c99a5ae1", "metadata": {}, "source": [ - "## (Experimental) Fine-Tuning\n", + "## Fine-Tuning\n", "\n", - "Chronos-2 supports fine-tuning on your own data. This is an experimental feature that may change in future versions." + "Chronos-2 supports fine-tuning on your own data. You may either fine-tune all weights of the model (_full fine-tuning_) or a [low rank adapter (LoRA)](https://huggingface.co/docs/peft/en/package_reference/lora), which significantly reduces the number of trainable parameters.\n", + "\n", + "
\n", + "\n", + "**Note:** Fine-tuning functionality is intended for advanced users. The default fine-tuning hyperparameters may not always improve accuracy for your specific use case. We recommend experimenting with different hyperparameters. In case of limited data (too few and/or too short series), fine-tuning may not improve over zero-shot (and may even worsen accuracy sometimes).\n", + "\n", + "
" ] }, { @@ -1409,13 +1429,17 @@ "\n", "The `fit` method accepts:\n", "- `inputs`: Time series for fine-tuning (same format as predict_quantiles)\n", + "- `finetune_mode`: `\"full\"` or `\"lora\"`\n", + "- `lora_config`: The [`LoraConfig`](https://huggingface.co/docs/peft/en/package_reference/lora#peft.LoraConfig), in case `finetune_mode=\"lora\"`\n", "- `prediction_length`: Forecast horizon for fine-tuning\n", "- `validation_inputs`: Optional validation data (same format as inputs)\n", - "- `learning_rate`: Optimizer learning rate (default: 1e-5)\n", + "- `learning_rate`: Optimizer learning rate (default: 1e-6, we recommend a higher learning rate such as 1e-5 for LoRA)\n", "- `num_steps`: Number of training steps (default: 1000)\n", "- `batch_size`: Batch size for training (default: 256)\n", "\n", - "Returns a new pipeline with the fine-tuned model." + "Returns a new pipeline with the fine-tuned model.\n", + "\n", + "Please read the docstring for details about specific arguments." ] }, { @@ -1450,10 +1474,6 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_2205321/1561245919.py:2: FutureWarning: Fine-tuning support is experimental and may be changed in future versions.\n", - " finetuned_pipeline = pipeline.fit(\n", - "/fsx/ansarnd/repos/chronos-forecasting/.venv/lib/python3.11/site-packages/torch/backends/cuda/__init__.py:131: UserWarning: Please use the new API settings to control TF32 behavior, such as torch.backends.cudnn.conv.fp32_precision = 'tf32' or torch.backends.cuda.matmul.fp32_precision = 'ieee'. Old settings, e.g, torch.backends.cuda.matmul.allow_tf32 = True, torch.backends.cudnn.allow_tf32 = True, allowTF32CuDNN() and allowTF32CuBLAS() will be deprecated after Pytorch 2.9. Please see https://pytorch.org/docs/main/notes/cuda.html#tensorfloat-32-tf32-on-ampere-and-later-devices (Triggered internally at /pytorch/aten/src/ATen/Context.cpp:80.)\n", - " return torch._C._get_cublas_allow_tf32()\n", "Could not estimate the number of tokens of the input, floating-point operations will not be computed\n" ] }, @@ -1463,8 +1483,8 @@ "\n", "
\n", " \n", - " \n", - " [50/50 00:04, Epoch 1/9223372036854775807]\n", + " \n", + " [1000/1000 01:13, Epoch 1/9223372036854775807]\n", "
\n", " \n", " \n", @@ -1474,6 +1494,46 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
1000.645200
2000.531200
3000.506000
4000.463900
5000.458000
6000.523900
7000.460600
8000.431000
9000.443300
10000.501900

" ], @@ -1486,13 +1546,14 @@ } ], "source": [ - "# Fine-tune the model\n", + "# Fine-tune the model by default full fine-tuning will be performed\n", "finetuned_pipeline = pipeline.fit(\n", " inputs=train_inputs,\n", " prediction_length=13,\n", - " num_steps=50, # few fine-tuning steps for a quick demo\n", + " num_steps=1000, \n", " learning_rate=1e-5,\n", " batch_size=32,\n", + " logging_steps=100,\n", ")" ] }, @@ -1504,7 +1565,7 @@ "outputs": [ { "data": { - "image/png": "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8gvGjBmDBg0a4LbbblO2PWfOHLz++utYtGgRAgICcOrUKYfXTktLQ79+/fDYY49h8eLFCAgIwJYtW5T0G6PRiGnTpqF9+/YoKirCrFmzcO+99yItLQ06nfd5ppiYGOh0Onz77beYMmWKsv/OREREYPny5UhISMDBgwcxbtw4REREYPr06S6X//LLLzFr1iy899576NSpE/7++2+MGzcOYWFhGDVqlMdjShA3CjxYN5I6QxAEcU3gmAZP126CqAlQsH4d0r59e8yePRsA0KxZM7z33nvYvHmzy2A9KysLzZo1wy233AJBEJCUlKQ8FxMTAwCIjo52SF9/++23MXr0aKUf47Rp07B79268/fbbDsH6I488gjFjxij/Owfrb775Jrp27eqgSrdp00b5e+jQoQ7Lf/rpp4iJicGRI0fQtm1br8ehfv36eOeddzB9+nS89NJL6Nq1K2677TYMHz4cjRs3VpabOXOm8ndycjKeffZZrFy50m2wPnv2bMyfPx/33XcfAKBRo0Y4cuQI/ve//2HUqFEejylB3CjwNPhiq5yZRK1gCIIgajYFqmCdJloJomZAwbpGQgNkhbu6XtsX2rdv7/B/fHw88vLyXC47evRopa77jjvuwF133YXbb7/d4/aPHj2K8ePHOzzWs2dPLF682OGxrl27etxOWloaHnjgAbfPnzhxArNmzcKff/6JixcvQpLkfs1ZWVmagnUAmDhxIkaOHImtW7di9+7dWLVqFebOnYuffvpJmbz4+uuv8c477yA9PR1FRUWwWq2IjIx0uT2j0Yj09HQ8/vjjGDdunPK41WpVjPPKc0wJ4nqDK+sMQIno+3WMIAiCqFquOtSsV99+EARhh4ZPGhEEwadU9OokMNBxRwVBUAJdZzp37oyMjAz8+uuv2LRpE4YNG4b+/fvj22+/rfB+hIV5ntwICQnx+PzgwYORlJSEpUuXIiEhAZIkoW3btjCbzR7XcyYiIgKDBw/G4MGD8eqrryI1NRWvvvoqBgwYgF27dmH48OF46aWXkJqaiqioKKxcuRLz5893ua2ioiIAwNKlS9GjRw+H53iavT+PKUFcK6hd4I0WCtYJgiBqOg6t28gclCBqBBUymHv99dchCIJDX+8+ffpAEASHnyeffNJhvaysLAwaNAihoaGIjY3Fc889B6vV0cli69at6Ny5MwwGA5o2bYrly5eXef33338fycnJCA4ORo8ePbBnz56KvJ0blsjISDz44INYunQpvv76a3z33Xe4fPkyADnwd27h0KpVK+zYscPhsR07dqB169Y+vW779u2xefNml89dunQJx48fx8yZM9GvXz+0atVKMZ6rCIIgoGXLljAaZf+BnTt3IikpCS+88AK6du2KZs2a4fTp027Xr1evHhISEnDq1Ck0bdrU4adRo0bKcp6OKUHcCBSqUijJEZ4gCKLmQ63bblwCAgIwbtw4jBs3DgEBNLtekyj3p7F3717873//K5NyDQDjxo3Dyy+/rPwfGhqq/C2KIgYNGoS4uDjs3LkTOTk5GDlyJAIDAzF37lwAcm/sQYMG4cknn8SXX36JzZs3Y+zYsYiPj0dqaioAOXV52rRpWLJkCXr06IFFixYhNTUVx48fR2xsbHnf1g3HggULEB8fj06dOkGn02HVqlWIi4tDdHQ0ALmGe/PmzejZsycMBgNq1aqF5557DsOGDUOnTp3Qv39//Pzzz/j++++xadMmn157xowZaNeuHZ566ik8+eSTCAoKwpYtW/DAAw+gdu3aqFOnDj766CPEx8cjKysL//3vf33aflpaGmbPno0RI0agdevWCAoKwrZt2/Dpp5/i+eefByDX9GdlZWHlypXo1q0b1qxZgx9++MHjdl966SVMnjwZUVFRuOOOO2AymfDXX3/hypUrmDZtmtdjShA3AupgvZhqHwmCIGo8+WQwd8Oi0+lQv3796t4NwgXlUtaLioowfPhwLF26FLVq1SrzfGhoKOLi4pQfdf3vhg0bcOTIEXzxxRfo2LEj7rzzTrzyyit4//33lfTmJUuWoFGjRpg/fz5atWqFSZMm4f7778fChQuV7SxYsADjxo3DmDFj0Lp1ayxZsgShoaH49NNPy/OWblgiIiIUo7du3bohMzMTa9euVdzW58+fj40bNyIxMRGdOnUCAAwZMgSLFy/G22+/jTZt2uB///sfli1bhj59+vj02s2bN8eGDRtw4MABdO/eHSkpKfjxxx8REBAAnU6HlStXYt++fWjbti2mTp2Kt956y6ftN2jQAMnJyXjppZfQo0cPdO7cGYsXL8ZLL72EF154AQBw9913Y+rUqZg0aRI6duyInTt34sUXX/S43bFjx+Ljjz/GsmXL0K5dO/Tu3RvLly9XlHVvx5QgbgTUqoyRWgAR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Wq2YPHkyoqOjUadOHTz//PMYNWqUw7Fzd5y2bduG7t27w2AwID4+Hv/9739htdoLfL19doCsWH/88ce49957ERoaimbNmuGnn35yWGft2rVo3rw5QkJCcNtttzkcA1e4Oyd42vrHH3+MRo0aITg4WNN+utseZ8WKFUhOTkZUVBQeeughFBYWOjw/ePBgrFy50uM+EzUHrqzHhcgDPnKDJwiCqNmoa9a5sk416wRR/ZDBnEZKrcW487Pq6eH+66jzCAkM87rc4sWL0aRJE3z00UfYu3cv9Hq9pu3v3bsXsbGxWLZsGe644w7N63E+++wzTJgwATt27AAAXL16FX379sXYsWOxcOFClJSU4Pnnn8ewYcPw22+/udxGXFwctm3bhtOnTyMpKcnlMoWFhRg1ahTeffddMMYwf/58DBw4ECdOnEBERESZ5S0WC1JTU5GSkoLff/8dAQEBePXVV3HHHXfgn3/+gU6nw5AhQzBu3Dj83//9H8xmM/bs2QNBcN+m5I8//sCIESMcHnvjjTfw5ZdfYtmyZWjVqhUWL16M1atX47bbbvN4nM6dO4eBAwdi9OjR+Pzzz3Hs2DGMGzcOwcHBDsG4Fl566SW8+eabeOutt/Duu+9i+PDhOH36NGrXro0zZ87gvvvuw8SJEzF+/Hj89ddf+M9//uNxe57OiZMnT+K7777D999/XynnWHp6OlavXo1ffvkFV65cwbBhw/D66687TNR0794dr732GkwmEwwGg0/Hhqh6ihRlXQdAIkdhgiCIGk6+iQfrQLitZt25swdBEFUPBevXEVFRUYiIiIBer0dcXJzm9WJiYgAA0dHRPq3HadasGd58803l/1dffRWdOnXC3Llzlcc+/fRTJCYm4t9//0Xz5s3LbGP27Nm47777kJycjObNmyMlJQUDBw7E/fffD51OTgDp27evwzofffQRoqOjsW3bNtx1111ltvn1119DkiR8/PHHSgC+bNkyREdHY+vWrejatSvy8/Nx1113oUmTJgCAVq1auX2fV69eRX5+PhISEhwef/fddzFjxgzce++9AID33nsPa9eu9XqcXnjhBSQmJuK9996DIAho2bIlsrOz8fzzz2PWrFnK+9bC6NGj8fDDDwMA5s6di3feeQd79uzBHXfcgQ8//BBNmjRRTNpatGiBgwcP4o033nC7PU/nhNlsxueff64s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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+sAAAFMCAYAAACzhi02AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjcsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvTLEjVAAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnXd4FFX3x7+zm+ymJwQSkkBI6B1CJyKCFIMgiqJYeGlSFEEEXsWXnwhYUVTKqyiKCor6ghULKE2KUgTB0EEICaGFEEgv2+b+/pi9syVbZpNsNibn8zx5ksxOuTM7c+eee875HoExxkAQBEEQBEEQBEEQRI1B5esGEARBEARBEARBEARhCxnrBEEQBEEQBEEQBFHDIGOdIAiCIAiCIAiCIGoYZKwTBEEQBEEQBEEQRA2DjHWCIAiCIAiCIAiCqGGQsU4QBEEQBEEQBEEQNQwy1gmCIAiCIAiCIAiihkHGOkEQBEEQBEEQBEHUMMhYJwiCIAiCIAiCIIgaBhnrBEEQRKXp378/+vfvX63HNBqNmDNnDuLj46FSqTBixIhqPf4/gYMHD+KWW25BcHAwBEFAamqqr5vklsWLF6NNmzYQRVFeVlRUhEmTJiEmJgaCIGDmzJke7XP8+PFITEy0WSYIAhYuXOh222vXruH+++9H/fr1IQgCli1bhp07d0IQBOzcudOjdtRF1qxZA0EQkJGRIS/r3bs35syZ47tGEQRB/EMgY50gCKIOcuzYMdx///1ISEhAQEAAGjVqhMGDB+Ptt9/2ddMU8/HHH+ONN97A/fffj08++QSzZs3ydZO8ypUrV7Bw4ULFBrfBYMADDzyAmzdvYunSpVi7di0SEhK82sZXXnkFd999Nxo2bKjYGLamoKAAr7/+Op599lmoVJYhyquvvoo1a9Zg6tSpWLt2LcaMGVPFLXfOrFmzsHnzZsydOxdr167FkCFDqu3YjigpKcHChQv/0RMFzz77LFasWIGsrCxfN4UgCKJG4+frBhAEQRDVy969e3H77bejSZMmmDx5MmJiYnDx4kXs378fy5cvx5NPPunrJiri119/RaNGjbB06VJfN6VauHLlCl544QUkJiYiKSnJ7fppaWm4cOECVq1ahUmTJnm/gQDmzZuHmJgYdOnSBZs3b/Z4+48//hhGoxEPP/ywzfJff/0VvXv3xoIFC6qqqYr59ddfcc899+Dpp5+Wl7Vq1QqlpaXQaDTV3p6SkhK88MILAFDt0SxVxT333IOwsDC8++67ePHFF33dHIIgiBoLGesEQRB1jFdeeQXh4eE4ePAgIiIibD7Lzs72TaMqQHZ2drn2VwZRFKHX6xEQEFBl+/Ql/LusymtUXFyM4OBgp5+np6cjMTEROTk5iIqK8nj/q1evxt13313uO8jOzka7du083l9V4Og+U6lUteY+8QUqlQr3338/Pv30U7zwwgsQBMHXTSIIgqiRUBg8QRBEHSMtLQ3t27d3aMRFR0fb/L969WoMGDAA0dHR0Gq1aNeuHd577z1Fx9HpdFiwYAFatGgBrVaL+Ph4zJkzBzqdzma9rVu34tZbb0VERARCQkLQunVr/N///Z/T/WZkZEAQBOzYsQMnTpyAIAg2+cPFxcX497//jfj4eGi1WrRu3RpvvvkmGGM2+xEEAdOnT8fnn3+O9u3bQ6vV4pdffgEAXL58GY8++igaNmwIrVaL9u3b4+OPPy7XlrKyMixcuBCtWrVCQEAAYmNjcd999yEtLU1e580338Qtt9yC+vXrIzAwEN26dcPXX39dbl+ursPOnTvRo0cPAMCECRPkc16zZo3DazR+/Hj069cPAPDAAw9AEAQbL+yvv/6Kvn37Ijg4GBEREbjnnntw6tQpm30sXLgQgiDg5MmTeOSRR1CvXj3ceuutTr8XAOXywj0hPT0dR48exaBBg+RlPDc8PT0dGzdulM87IyPDYS609TaVDRPn+2eMYcWKFfKxnR2jf//+6NChA06ePInbb78dQUFBaNSoERYvXlxu30qfDXsyMjLkSRBu5FqnGzjTjrDP2efP0JtvvokPPvgAzZs3h1arRY8ePXDw4MFy258+fRr3338/IiMjERAQgO7du+OHH34ot96JEycwYMAABAYGonHjxnj55ZdttAesGTx4MC5cuPCP0FEgCILwFeRZJwiCqGMkJCRg3759OH78ODp06OBy3ffeew/t27fH3XffDT8/P/z444944oknIIoipk2b5nQ7URRx99134/fff8eUKVPQtm1bHDt2DEuXLsXff/+NDRs2AJAG93fddRc6deqEF198EVqtFufOncOePXuc7jsqKgpr167FK6+8gqKiIixatAgA0LZtWzDGcPfdd2PHjh2YOHEikpKSsHnzZjzzzDO4fPlyuZD5X3/9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7t27A5BCpQHgxx9/hE6nww8//GDjgVMSptu8eXMcOXIEAwcOdOs5U6lUGDhwIAYOHIglS5bg1VdfxXPPPYcdO3bYKIMrISEhAdu2bStn8J0+fVr+3BVRUVEIDQ2FyWRye+zmzZvjjz/+gMFgkMW47Pnmm28QEBCAzZs3Q6vVystXr15dbl1316EqPJD8/M+cOVPus9OnT6NBgwYuS7N5kzZt2gCQVOGVTIhwL3BeXp7NcvvoiZqG0mfjrbfesvHIx8XFAXA+SQFI18Q65J5T0WvSrFkzAIC/v7/b5yEhIQFnz54tt9zRvQZIFRf0er0c9UIQBEGUh8LgCYIg6hg7duxw6H3j+co8bJV73azXzc/Pd2ho2jNq1ChcvnwZq1atKvdZaWmpHGp98+bNcp8nJSUBgNsyVo4YOnQoTCYT3nnnHZvlS5cuhSAIsiK3M9RqNUaOHIlvvvkGx48fL/f59evX5b9HjhyJnJyccscCLNdMrVZDEAQbz2ZGRkY5xW8l14Eb0fbGqSfExsYiKSkJn3zyic1+jh8/ji1btmDo0KEV3ndlSU5OBgD8+eefitbnavu7d++Wl5lMJnzwwQdV37gqROmz0a1bNwwaNEj+4doKQUFBABzfB82bN8fp06dt7tMjR464rK7giujoaPTv3x/vv/++PIlnjfVxhg4div379+PAgQM2n3/++ecO933o0CEAzisaEARBEORZJwiCqHM8+eSTKCkpwb333os2bdpAr9dj7969WL9+PRITE+Xc7DvuuAMajQbDhw/HY489hqKiIqxatQrR0dEOB+7WjBkzBl9++SUef/xx7NixA3369IHJZMLp06fx5ZdfYvPmzejevTtefPFF7N69G8OGDUNCQgKys7Px7rvvonHjxm5rejti+PDhuP322/Hcc88hIyMDnTt3xpYtW/D9999j5syZsoHnitdeew07duxAr169MHnyZLRr1w43b97E4cOHsW3bNtmwHjt2LD799FPMnj0bBw4cQN++fVFcXIxt27bhiSeewD333INhw4ZhyZIlGDJkCB555BFkZ2djxYoVaNGiBY4ePSofU8l1aN68OSIiIrBy5UqEhoYiODgYvXr18jin/I033sCdd96J5ORkTJw4US7dFh4eLtfrrihr167FhQsXUFJSAkAypF9++WUA0j3hKrKhWbNm6NChA7Zt24ZHH33U7bHat2+P3r17Y+7cubh58yYiIyOxbt06GI3GSp2Dt1H6bDgjMDAQ7dq1w/r169GqVStERkaiQ4cO6NChAx599FEsWbIEKSkpmDhxIrKzs7Fy5Uq0b98eBQUFFWrvihUrcOutt6Jjx46YPHkymjVrhmvXrmHfvn24dOkSjhw5AgCYM2cO1q5diyFDhuCpp56SS7clJCTY3OucrVu3okmTJlS2jSAIwhU+UqEnCIIgfMTPP//MHn30UdamTRsWEhLCNBoNa9GiBXvyySfZtWvXbNb94YcfWKdOnVhAQABLTExkr7/+ulyyzLoUk6OSUXq9nr3++uusffv2TKvVsnr16rFu3bqxF154geXn5zPGGNu+fTu75557WFxcHNNoNCwuLo49/PDD7O+//3Z7Ho5KtzHGWGFhIZs1axaLi4tj/v7+rGXLluyNN96wKafGmOOSXJxr166xadOmsfj4eObv789iYmLYwIED2QcffGCzXklJCXvuuedY06ZN5fXuv/9+lpaWJq/z0UcfsZYtWzKtVsvatGnDVq9eLZdF4yi9Dt9//z1r164d8/Pzc1vGzVnpNsYY27ZtG+vTpw8LDAxkYWFhbPjw4ezkyZM26/A2elJWj5cvc/RjXebMGUuWLGEhISHlyt05Kt3GGGNpaWls0KBBTKvVsoYNG7L/+7//Y1u3bvVZ6TZH96OjYyt5Nlyxd+9e1q1bN6bRaMqdx2effcaaNWvGNBoNS0pKYps3b3Zauu2NN95weL721yUtLY2NHTuWxcTEMH9/f9aoUSN21113sa+//tpmvaNHj7J+/fqxgIAA1qhRI/bSSy+xjz76qFx/YTKZWGxsLJs3b57bcyUIgqjLCIw5iIUkCIIgCIKoZvLz89GsWTMsXrwYEydO9HVzCC+xYcMGPPLII0hLS0NsbKyvm0MQBFFjIWOdIAiCIIgaw+uvv47Vq1fj5MmTUKlIWqc2kpycjL59+2Lx4sW+bgpBEESNhox1giAIgiAIgiAIgqhh0JQ1QRAEQRAEQRAEQdQwyFgnCIIgCIIgCIIgiBoGGesEQRAEQRAEQRAEUcMgY50gCIIgCIIgCIIgahh+vm6ArxBFEVeuXEFoaCgEQfB1cwiCIAiCIAiCIIhaDmMMhYWFiIuLc1v1pM4a61euXEF8fLyvm0EQBEEQBEEQBEHUMS5evIjGjRu7XKfOGuuhoaEApIsUFhbm49YQBEEQBEEQBEEQtZ2CggLEx8fL9qgr6qyxzkPfw8LCyFgnCIIgCIIgCKJOYjKZsH37dgDAwIEDoVarfdyiuoGSVGwSmCMIgiAIgiAIgqijmEwm7N27F3v37oXJZPJ1cwgryFgnCIIgCIIgCIIgiBpGnQ2DV4rJZILBYPB1MwiCcIK/vz+FaxEEQRAEQRC1DjLWncAYQ1ZWFvLy8nzdFIIg3BAREYGYmBgqw0gQBEEQBEHUGshYdwI31KOjoxEUFERGAEHUQBhjKCkpQXZ2NgAgNjbWxy0iCIIgCIIgiKqBjHUHmEwm2VCvX7++r5tDEIQLAgMDAQDZ2dmIjo6mkHiCIAiCqASMMXJSEUQNgQTmHMBz1IOCgnzcEoIglMCfVdKXIAiCIIiKM3JLKXp/VwqjyHzdFIIgQJ51l9CsIkH8M6BnlSAIgiAqh1Fk+OmCVLbrYhFD0zB6t9YV/P398cQTT8h/EzUH8qwTBEEQVY5RZFj7twHpBaKvm0IQBEEoIF9v+bvYSJ71uoQgCIiOjkZ0dDQ5QGoYZKwTBEEQVc7WSyZM2qXDM/t1vm4KQRAEoYA8vcVAL6KsMoKoEZCxXsvo378/Zs6c6XIdQRCwYcOGammPNTt37oQgCFVWDi8jIwOCICA1NbVK9ueMhQsXIikpyavHIIjaxpUSadB3rZS8MwRBEP8E8nXWxjr13XUJk8mEnTt3YufOnTCZTL5uDmEFGet1kKtXr+LOO+9UtG5VGva33HILrl69ivDw8CrZnxLS09PxyCOPIC4uDgEBAWjcuDHuuecenD59utraQBB1kUKzh6aYvDMEQRD/CMizXnchY73mQgJzdZCYmJhqP6bBYIBGo6nWYxsMBgwePBitW7fGt99+i9jYWFy6dAk///xzlXn3CYJwDB/oUd4jQRDEPwPrnHXyrBNEzYA86wphjKHY4JsfxjzrMEVRxJw5cxAZGYmYmBgsXLjQ5nNrb7ler8f06dMRGxuLgIAAJCQkYNGiRQCAxMREAMC9994LQRDk/wHgvffeQ/PmzaHRaNC6dWusXbu23DHee+893H333QgODsYrr7ziMAx+z5496N+/P4KCglCvXj2kpKQgNzcXAPDLL7/g1ltvRUREBOrXr4+77roLaWlpiq/DiRMnkJaWhnfffRe9e/dGQkIC+vTpg5dffhm9e/eW13v22WfRqlUrBAUFoVmzZnj++efdlgD78MMP0bZtWwQEBKBNmzZ499135c9cXVOCqCsUmgd6JUYfN4QgCIJQRJ51GDz13QRRIyDPukJKjEDkmmKfHPvm+GAEe1BF4ZNPPsHs2bPxxx9/YN++fRg/fjz69OmDwYMHl1v3v//9L3744Qd8+eWXaNKkCS5evIiLFy8CAA4ePIjo6GisXr0aQ4YMgVqtBgB89913eOqpp7Bs2TIMGjQIP/30EyZMmIDGjRvj9ttvl/e9cOFCvPbaa1i2bBn8/Pxw/vx5m2OnpqZi4MCBePTRR7F8+XL4+flhx44dcvhNcXExZs+ejU6dOqGoqAjz58/Hvffei9TUVKhU7ueZoqKioFKp8PXXX2PmzJly++0JDQ3FmjVrEBcXh2PHjmHy5MkIDQ3FnDlzHK7/+eefY/78+XjnnXfQpUsX/PXXX5g8eTKCg4Mxbtw4l9eUIOoK3FgvJu8MQRDEPwLbMHjquwmiJkDGei2kU6dOWLBgAQCgZcuWeOedd7B9+3aHxnpmZiZatmyJW2+9FYIgICEhQf4sKioKABAREWETvv7mm29i/Pjxcj3G2bNnY//+/XjzzTdtjPVHHnkEEyZMkP+3N9YXL16M7t2723il27dvL/89cuRIm/U//vhjREVF4eTJk+jQoYPb69CoUSP897//xZw5c/DCCy+ge/fuuP322zF69Gg0a9ZMXm/evHny34mJiXj66aexbt06p8b6ggUL8NZbb+G+++4DADRt2hQnT57E+++/j3Hjxrm8pgRRV+Bh8CVGKTKJSsEQBEHUbAqsjHWaaCWImgEZ6woJ8pM83L46tid06tTJ5v/Y2FhkZ2c7XHf8+PFyXveQIUNw11134Y477nC5/1OnTmHKlCk2y/r06YPly5fbLOvevbvL/aSmpuKBBx5w+vnZs2cxf/58/PHHH8jJyYEoSvWaMzMzFRnrADBt2jSMHTsWO3fuxP79+/HVV1/h1VdfxQ8//CBPXqxfvx7//e9/kZaWhqKiIhiNRoSFhTncX3FxMdLS0jBx4kRMnjxZXm40GmXhvIpcU4KobXDPOgNQavK8HyMIgiCqlzybnHXftYMgCAs0fFKIIAgehaL7En9/24YKgiAbuvZ07doV6enp+Pnnn7Ft2zaMGjUKgwYNwtdff13pdgQHu57cCAwMdPn58OHDkZCQgFWrViEuLg6iKKJDhw7Q6/Uut7MnNDQUw4cPx/Dhw/Hyyy8jJSUFL7/8MgYPHox9+/Zh9OjReOGFF5CSkoLw8HCsW7cOb731lsN9FRUVAQBWrVqFXr162XzGw+y9eU0J4p+CtQp8sYGMdYIgiJqOTek2EgcliBpBpQTmXnvtNQiCYFPXu3///hAEwebn8ccft9kuMzMTw4YNQ1BQEKKjo/HMM8/AaLRVsti5cye6du0KrVaLFi1aYM2aNeWOv2LFCiQmJiIgIAC9evXCgQMHKnM6dZawsDA8+OCDWLVqFdavX49vvvkGN2/eBCAZ/vYlHNq2bYs9e/bYLNuzZw/atWvn0XE7deqE7du3O/zsxo0bOHPmDObNm4eBAweibdu2svBcZRAEAW3atEFxsaQ/sHfvXiQkJOC5555D9+7d0bJlS1y4cMHp9g0bNkRcXBzOnz+PFi1a2Pw0bdpUXs/VNSWIukChVQglKcITBEHUfKh0W93Fz88PkydPxuTJk+HnR7PrNYkKfxsHDx7E+++/Xy7kGgAmT56MF198Uf4/KChI/ttkMmHYsGGIiYnB3r17cfXqVYwdOxb+/v549dVXAUi1sYcNG4bHH38cn3/+ObZv345JkyYhNjYWKSkpAKTQ5dmzZ2PlypXo1asXli1bhpSUFJw5cwbR0dEVPa06x5IlSxAbG4suXbpApVLhq6++QkxMDCIiIgBIOdzbt29Hnz59oNVqUa9ePTzzzDMYNWoUunTpgkGDBuHHH3/Et99+i23btnl07Llz56Jjx4544okn8Pjjj0Oj0WDHjh144IEHEBkZifr16+ODDz5AbGwsMjMz8Z///Mej/aempmLBggUYM2YM2rVrB41Gg127duHjjz/Gs88+C0DK6c/MzMS6devQo0cPbNy4Ed99953L/b7wwguYMWMGwsPDMWTIEOh0Ovz555/Izc3F7Nmz3V5TgqgLWBvrJZT7SBAEUePJJ4G5OotKpUKjRo183QzCARXyrBcVFWH06NFYtWoV6tWrV+7zoKAgxMTEyD/W+b9btmzByZMn8dlnnyEpKQl33nknXnrpJaxYsUIOb165ciWaNm2Kt956C23btsX06dNx//33Y+nSpfJ+lixZgsmTJ2PChAlo164dVq5ciaCgIHz88ccVOaU6S2hoqCz01qNHD2RkZGDTpk2y2vpbb72FrVu3Ij4+Hl26dAEAjBgxAsuXL8ebb76J9u3b4/3338fq1avRv39/j47dqlUrbNmyBUeOHEHPnj2RnJyM77//Hn5+flCpVFi3bh0OHTqEDh06YNasWXjjjTc82n/jxo2RmJiIF154Ab169ULXrl2xfPlyvPDCC3juuecAAHfffTdmzZqF6dOnIykpCXv37sXzzz/vcr+TJk3Chx9+iNWrV6Njx47o168f1qxZI3vW3V1TgqgLWHtliqkEEEEQRI3HOme9mDzrBFEjEJinRbwBjBs3DpGRkVi6dCn69++PpKQkLFu2DIAUBn/ixAkwxhATE4Phw4fj+eefl73r8+fPxw8//IDU1FR5f+np6WjWrBkOHz6MLl264LbbbkPXrl3lfQLA6tWrMXPmTOTn50Ov1yMoKAhff/01RowYYdOuvLw8fP/99+XarNPpoNPp5P8LCgoQHx+P/Pz8cmJiZWVlSE9PR9OmTREQEODp5SEIopqhZ7bmUX9NkWywbx4WgP5xFFZHEARRk2nxRTEuFktmQbcGKuy9N8jNFkRtwWQyYf/+/QCA3r17Oy13TFQNBQUFCA8Pd2iH2uPx6GndunU4fPgwDh486PDzRx55BAkJCYiLi8PRo0fx7LPP4syZM/j2228BAFlZWWjYsKHNNvz/rKwsl+sUFBSgtLQUubm5MJlMDtc5ffq0w3YtWrQIL7zwgqenSxAEQXiIyJiNZ72EPOsEQRA1HpucddIaqVOYTCZs3boVANCjRw8y1msQHhnrFy9exFNPPYWtW7c69V5Zl/Tq2LEjYmNjMXDgQKSlpaF58+aVa20lmDt3LmbPni3/zz3rBEEQRNViHz5JOesEQRA1G6PIUGhXxYMgCN/jkbF+6NAhZGdno2vXrvIyk8mE3bt345133oFOpys3E8PLW507dw7NmzdHTExMOdX2a9euAQBiYmLk33yZ9TphYWEIDAyEWq2GWq12uA7fhz1arRZardaT0yUIgiAqQKGdcU456wRBEDWbAruquPb9OEEQvsEjxauBAwfi2LFjSE1NlX+6d++O0aNHIzU11WHIBM9Nj42NBQAkJyfj2LFjyM7OltfZunUrwsLC5NJfycnJ5Up6bd26FcnJyQAAjUaDbt262awjiiK2b98ur0MQBEH4hkI7jwyVbiMIgqjZWIfAA5JIaAVkrQiCqGI88qyHhoaiQ4cONsuCg4NRv359dOjQAWlpafjiiy8wdOhQ1K9fH0ePHsWsWbNw2223ySXe7rjjDrRr1w5jxozB4sWLkZWVhXnz5mHatGmy5/vxxx/HO++8gzlz5uDRRx/Fr7/+ii+//BIbN26Ujzt79myMGzcO3bt3R8+ePbFs2TIUFxdjwoQJlb0mBEEQRCWwL/lTQuGUBEEQNZoCs7Ee7CdFQ5kYoDMBAaQNShA+pUofQY1Gg23btsmGc3x8PEaOHIl58+bJ66jVavz000+YOnUqkpOTERwcjHHjxtnUZW/atCk2btyIWbNmYfny5WjcuDE+/PBDucY6ADz44IO4fv065s+fj6ysLCQlJeGXX34pJzpHEARBVC/lw+DJO0MQBFGT4Z71uGABZ/Olv4uMZKwThK+p9CO4c+dO+e/4+Hjs2rXL7TYJCQnYtGmTy3X69++Pv/76y+U606dPx/Tp0xW1kyAIgqgeyofB+6YdBEEQhDLyzdWN62sFXFIzlJqkKKkGAYJvG0YQdRyaLyMIgiCqFPsw+GISKiIIgqjRcM96uFZAiL+AUhOjvrsO4efnh/Hjx8t/EzUH+jYIgiCIKqXQTlWY6qwTBEHUbLixHqEREOwPXC+TROaIuoFKpUJiYqKvm0E4wCM1eKLmwxjDlClTEBkZCUEQZDX+uoIgCNiwYYNXj/HRRx/hjjvu8OoxvM3OnTshCALy8vJ82o6FCxciKSnJ5ToPPfQQ3nrrreppEFElUM46QRDEP4t87lnXAKH+Uug7lW8jCN9Dxnot45dffsGaNWvw008/4erVq+XU+51RHUauO1atWoXOnTsjJCQEERER6NKlCxYtWuTTNtlTVlaG559/HgsWLPB1U7xOVd8TFd3fvHnz8MorryA/P7/K2kJ4Fx4GH+Yv/V9M3hmCIIgaTZ45Zz1CKyCE+u46h8lkwoEDB3DgwAGYTCZfN4ewgoz1WkZaWhpiY2Nxyy23ICYmptrzTvR6vfuVHPDxxx9j5syZmDFjBlJTU7Fnzx7MmTMHRUVFVdzCyvH1118jLCwMffr0qdR+KnqdahrVcR4dOnRA8+bN8dlnn3n9WETVwAXmGgZJ3pkS8qwTBEHUaCyedQHBflLfXUR9d53BZDJh06ZN2LRpExnrNQwy1hXCGEOpodgnP4wp6yzHjx+PJ598EpmZmRAEQc49SUxMxLJly2zWTUpKwsKFC+XPAeDee++12W78+PEYMWKEzXYzZ85E//795f/79++P6dOnY+bMmWjQoIFcXu/48eO48847ERISgoYNG2LMmDHIyclx2vYffvgBo0aNwsSJE9GiRQu0b98eDz/8MF555RV5nYMHD2Lw4MFo0KABwsPD0a9fPxw+fNjlNbl48SJGjRqFiIgIREZG4p577kFGRob8+c6dO9GzZ08EBwcjIiICffr0wYULF5zub926dRg+fLjNMqPRiBkzZiAiIgL169fHs88+i3HjxtlcO2fXadeuXejZsye0Wi1iY2Pxn//8B0ajJcHX3XcHSB7rDz/8EPfeey+CgoLQsmVL/PDDDzbbbNq0Ca1atUJgYCBuv/12m2vgCGf3BA9b//DDD9G0aVMEBAQoaqez/XHWrl2LxMREhIeH46GHHkJhYaHN58OHD8e6detctpmoOXDPekygNOAjNXiCIIiajXXOOvesU846QfgeEphTSJmxBHd+4psa7j+Pu4ZA/2C36y1fvhzNmzfHBx98gIMHD0KtViva/8GDBxEdHY3Vq1djyJAhirfjfPLJJ5g6dSr27NkDAMjLy8OAAQMwadIkLF26FKWlpXj22WcxatQo/Prrrw73ERMTg127duHChQtISEhwuE5hYSHGjRuHt99+G4wxvPXWWxg6dCjOnj2L0NDQcusbDAakpKQgOTkZv/32G/z8/PDyyy9jyJAhOHr0KFQqFUaMGIHJkyfjf//7H/R6PQ4cOABBcF6m5Pfff8eYMWNslr3++uv4/PPPsXr1arRt2xbLly/Hhg0bcPvtt7u8TpcvX8bQoUMxfvx4fPrppzh9+jQmT56MgIAAG2NcCS+88AIWL16MN954A2+//TZGjx6NCxcuIDIyEhcvXsR9992HadOmYcqUKfjzzz/x73//2+X+XN0T586dwzfffINvv/22Su6xtLQ0bNiwAT/99BNyc3MxatQovPbaazYTNT179sQrr7wCnU4HrVbr0bUhqp8i2bOuAiCSojBBEEQNJ1/HjXUgxJyzbl/ZgyCI6oeM9VpEeHg4QkNDoVarERMTo3i7qKgoAEBERIRH23FatmyJxYsXy/+//PLL6NKlC1599VV52ccff4z4+Hj8/fffaNWqVbl9LFiwAPfddx8SExPRqlUrJCcnY+jQobj//vuhUkkBIAMGDLDZ5oMPPkBERAR27dqFu+66q9w+169f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", "text/plain": [ "

" ] @@ -1531,17 +1592,150 @@ " sales_test_df,\n", " target_column=\"Sales\",\n", " timeseries_id=\"1\",\n", - " title_suffix=\"(fine-tuned)\",\n", + " title_suffix=\"(full fine-tuned)\",\n", ")" ] }, { - "cell_type": "markdown", - "id": "91083481", + "cell_type": "code", + "execution_count": 21, + "id": "7944046c", "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Could not estimate the number of tokens of the input, floating-point operations will not be computed\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [1000/1000 01:53, Epoch 1/9223372036854775807]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss
1000.752000
2000.617800
3000.596500
4000.539700
5000.544400
6000.605700
7000.546800
8000.511900
9000.537200
10000.583500

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "**Note:** Fine-tuning is experimental functionality intended for advanced users. The default fine-tuning hyperparameters may not always improve accuracy for your specific use case." + "# Fine-tune the model with LoRA\n", + "lora_finetuned_pipeline = pipeline.fit(\n", + " inputs=train_inputs,\n", + " prediction_length=13,\n", + " num_steps=1000,\n", + " learning_rate=1e-4,\n", + " batch_size=32,\n", + " logging_steps=100,\n", + " finetune_mode=\"lora\",\n", + ")" ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "44e5d367", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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3LMeohIQ6C2gRM+o765FeHl5YcKECdJrwnOgX4MgCIKoVAqsVIWpzjpBEIRnw431UB8BAd5AVqkoMkfUDhQKBWJiYqq7GYQNXFKDJzwfxhimTp2KunXrQhAESY2/tiAIArZt2+bWY3z22WcYPHiwW4/hbg4cOABBEJCbm1ut7Vi8eDFiY2MdrvP444/jvffeq5oGEZUC5awTBEH8s8jjnnUfIMhbDH2n8m0EUf2QsV7D2LlzJzZs2ICffvoJ6enpZdT77VEVRq4z1qxZg86dOyMwMBChoaHo0qULli5dWq1tsqa0tBQvv/wyFi1aVN1NcTuVfU2Ud38LFizA66+/jry8vEprC+FeeBh8sLf4voi8MwRBEB5NrjFnPVQlIJD67lqHXq/HiRMncOLECej1+upuDmEGGes1jOTkZERERODee+9FeHh4leedaDQa5yvZYN26dZg9ezZmzZqFxMREHDlyBPPmzUNhYWElt7BifPPNNwgODkbv3r0rtJ/ynidPoyq+R4cOHdC8eXN8+eWXbj8WUTlwgbmG/qJ3ppg86wRBEB6NybMuIMBL7LsLqe+uNej1euzYsQM7duwgY93DIGNdJowxlGiLquWPMXmd5YQJE/Dss88iLS0NgiBIuScxMTFYsWKFxbqxsbFYvHixtBwAHnroIYvtJkyYgFGjRllsN3v2bPTr1096369fP8ycOROzZ89G/fr1pfJ6Z8+exdChQxEYGIiGDRti3LhxyM7Ottv27du3Y8yYMZg0aRJatGiB9u3b44knnsDrr78urXPy5EkMGjQI9evXR0hICPr27YvTp087PCfXr1/HmDFjEBoairp16+LBBx9EamqqtPzAgQPo2bMnAgICEBoait69e+PatWt297dlyxaMHDnS4jOdTodZs2YhNDQU9erVw4svvoiEhASLc2fvPB08eBA9e/aESqVCREQE/vvf/0KnMyX4OvvtANFjvXbtWjz00EPw9/dHy5YtsX37dottduzYgVatWsHPzw/333+/xTmwhb1rgoetr127Fk2bNoWvr6+sdtrbH2fjxo2IiYlBSEgIHn/8cRQUFFgsHzlyJLZs2eKwzYTnwD3r4X7igI/U4AmCIDwb85x17lmnnHWCqH5IYE4mpbpiDP28emq4/5JwG37eAU7XW7lyJZo3b45PP/0UJ0+ehFKplLX/kydPokGDBli/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", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Use the LoRA fine-tuned model for predictions\n", + "lora_finetuned_pred_df = lora_finetuned_pipeline.predict_df(\n", + " sales_context_df,\n", + " future_df=sales_future_df,\n", + " prediction_length=13,\n", + " quantile_levels=[0.1, 0.5, 0.9],\n", + " id_column=\"id\",\n", + " timestamp_column=\"timestamp\",\n", + " target=\"Sales\",\n", + ")\n", + "\n", + "plot_forecast(\n", + " sales_context_df,\n", + " lora_finetuned_pred_df,\n", + " sales_test_df,\n", + " target_column=\"Sales\",\n", + " timeseries_id=\"1\",\n", + " title_suffix=\"(LoRA fine-tuned)\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c899976", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1565,7 +1759,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.11" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/deploy-chronos-bolt-to-amazon-sagemaker.ipynb b/notebooks/deploy-chronos-bolt-to-amazon-sagemaker.ipynb deleted file mode 100644 index 486f0ae..0000000 --- a/notebooks/deploy-chronos-bolt-to-amazon-sagemaker.ipynb +++ /dev/null @@ -1,1003 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SageMaker JumpStart - Deploy Chronos endpoints to AWS for production use" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this demo notebook, we will walk through the process of using the **SageMaker Python SDK** to deploy a **Chronos** model to a cloud endpoint on AWS. To simplify deployment, we will leverage **SageMaker JumpStart**.\n", - "\n", - "### Why Deploy to an Endpoint?\n", - "So far, we’ve seen how to run models locally, which is useful for experimentation. However, in a production setting, a forecasting model is typically just one component of a larger system. Running models locally doesn’t scale well and lacks the reliability needed for real-world applications.\n", - "\n", - "To address this, we deploy models as **endpoints** on AWS. An endpoint acts as a **hosted service**—we can send it requests (containing time series data), and it returns forecasts in response. This allows seamless integration into production workflows, ensuring scalability and real-time inference." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Deploy the model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, update the SageMaker SDK to access the latest models:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "!pip install -U -q sagemaker" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We create a `JumpStartModel` with the necessary configuration based on the model ID. The key parameters are:\n", - "- `model_id`: Specifies the model to use. Here, we choose the [Chronos-Bolt (Base)](https://huggingface.co/amazon/chronos-bolt-base) model. Currently, the following model IDs are supported:\n", - " - `autogluon-forecasting-chronos-bolt-base` - [Chronos-Bolt (Base)](https://huggingface.co/amazon/chronos-bolt-base).\n", - " - `autogluon-forecasting-chronos-bolt-small` - [Chronos-Bolt (Small)](https://huggingface.co/amazon/chronos-bolt-small).\n", - " - [Original Chronos models](https://huggingface.co/amazon/chronos-t5-small) in sizes `small`, `base` and `large` can be accessed, e.g., as `autogluon-forecasting-chronos-t5-small`. Note that these models require a GPU to run, are much slower and don't support covariates. Therefore, for most practical purposes we recommend using Chronos-Bolt models instead.\n", - "- `instance_type`: Defines the AWS instance for serving the endpoint. We use `ml.c5.2xlarge` to run the model on CPU. To use a GPU, select an instance like `ml.g5.2xlarge`, or choose other CPU options such as `ml.m5.xlarge` or `ml.m5.4xlarge`. You can check the pricing for different SageMaker instance types for real-time inference [here](https://aws.amazon.com/sagemaker-ai/pricing/).\n", - "\n", - "The `JumpStartModel` will automatically set the necessary attributes such as `image_uri` based on the chosen `model_id` and `instance_type`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sagemaker.jumpstart.model import JumpStartModel\n", - "\n", - "model_id = \"autogluon-forecasting-chronos-bolt-base\"\n", - "\n", - "model = JumpStartModel(\n", - " model_id=model_id,\n", - " instance_type=\"ml.c5.2xlarge\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we deploy the model and create an endpoint. Deployment typically takes a few minutes, as SageMaker provisions the instance, loads the model, and sets up the endpoint for inference.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predictor = model.deploy()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> **Note:** Once the endpoint is deployed, it remains active and incurs charges on your AWS account until it is deleted. The cost depends on factors such as the instance type, the region where the endpoint is hosted, and the duration it remains running. To avoid unnecessary charges, make sure to delete the endpoint when it is no longer needed. For detailed pricing information, refer to the [SageMaker AI pricing page](https://aws.amazon.com/sagemaker-ai/pricing/).\n", - "\n", - "\n", - "If the previous step results in an error, you may need to update the model configuration. For example, specifying a `role` when creating the `JumpStartModel` ensures the necessary AWS resources are accessible." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# model = JumpStartModel(role=\"your-sagemaker-execution-role\", model_id=model_id, instance_type=\"ml.c5.2xlarge\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Alternatively, you can create a predictor for an existing endpoint." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# from sagemaker.predictor import retrieve_default\n", - "\n", - "# endpoint_name = \"NAME-OF-EXISTING-ENDPOINT\"\n", - "# predictor = retrieve_default(endpoint_name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Querying the endpoint" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now invoke the endpoint to make a forecast. We send a **payload** to the endpoint, which includes historical time series values and configuration parameters, such as the prediction length. The endpoint processes this input and returns a **response** containing the forecasted values based on the provided data." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Define a utility function to print the response in a pretty format\n", - "from pprint import pformat\n", - "\n", - "\n", - "def nested_round(data, decimals=2):\n", - " \"\"\"Round numbers, including nested dicts and list.\"\"\"\n", - " if isinstance(data, float):\n", - " return round(data, decimals)\n", - " elif isinstance(data, list):\n", - " return [nested_round(item, decimals) for item in data]\n", - " elif isinstance(data, dict):\n", - " return {key: nested_round(value, decimals) for key, value in data.items()}\n", - " else:\n", - " return data\n", - "\n", - "\n", - "def pretty_format(data):\n", - " return pformat(nested_round(data), width=150, sort_dicts=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "07605824", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'predictions': [{'mean': [-1.58, 0.52, 1.88, 1.39, -1.03, -3.34, -2.67, -0.64, 0.96, 1.59],\n", - " '0.1': [-4.17, -2.71, -1.7, -2.35, -4.79, -6.98, -6.59, -4.87, -3.45, -2.89],\n", - " '0.5': [-1.58, 0.52, 1.88, 1.39, -1.03, -3.34, -2.67, -0.64, 0.96, 1.59],\n", - " '0.9': [1.47, 4.47, 6.27, 5.98, 3.5, 1.11, 2.06, 4.47, 6.41, 7.17]}]}\n" - ] - } - ], - "source": [ - "payload = {\n", - " \"inputs\": [\n", - " {\"target\": [0.0, 4.0, 5.0, 1.5, -3.0, -5.0, -3.0, 1.5, 5.0, 4.0, 0.0, -4.0, -5.0, -1.5, 3.0, 5.0, 3.0, -1.5, -5.0, -4.0]},\n", - " ],\n", - " \"parameters\": {\n", - " \"prediction_length\": 10\n", - " }\n", - "}\n", - "response = predictor.predict(payload)\n", - "print(pretty_format(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A payload may also contain **multiple time series**, potentially including `start` and `item_id` fields." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "d476c397", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'predictions': [{'mean': [1.41, 1.5, 1.49, 1.45, 1.51],\n", - " '0.1': [0.12, -0.08, -0.25, -0.41, -0.45],\n", - " '0.5': [1.41, 1.5, 1.49, 1.45, 1.51],\n", - " '0.9': [3.29, 3.82, 4.09, 4.3, 4.56],\n", - " 'item_id': 'product_A',\n", - " 'start': '2024-01-01T10:00:00'},\n", - " {'mean': [-1.22, -1.3, -1.3, -1.14, -1.13],\n", - " '0.1': [-4.51, -5.48, -6.12, -6.5, -7.1],\n", - " '0.5': [-1.22, -1.3, -1.3, -1.14, -1.13],\n", - " '0.9': [2.84, 4.02, 4.92, 5.99, 6.79],\n", - " 'item_id': 'product_B',\n", - " 'start': '2024-02-02T10:00:00'}]}\n" - ] - } - ], - "source": [ - "payload = {\n", - " \"inputs\": [\n", - " {\n", - " \"target\": [1.0, 2.0, 3.0, 2.0, 0.5, 2.0, 3.0, 2.0, 1.0],\n", - " \"item_id\": \"product_A\",\n", - " \"start\": \"2024-01-01T01:00:00\",\n", - " },\n", - " {\n", - " \"target\": [5.4, 3.0, 3.0, 2.0, 1.5, 2.0, -1.0],\n", - " \"item_id\": \"product_B\",\n", - " \"start\": \"2024-02-02T03:00:00\",\n", - " },\n", - " ],\n", - " \"parameters\": {\n", - " \"prediction_length\": 5,\n", - " \"freq\": \"1h\",\n", - " \"quantile_levels\": [0.1, 0.5, 0.9],\n", - " \"batch_size\": 2,\n", - " },\n", - "}\n", - "response = predictor.predict(payload)\n", - "print(pretty_format(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Chronos-Bolt models also support forecasting with covariates (a.k.a. exogenous features or related time series). These can be provided using the `past_covariates` and `future_covariates` keys." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'predictions': [{'mean': [1.41, 1.5, 1.49], '0.1': [0.12, -0.08, -0.25], '0.5': [1.41, 1.5, 1.49], '0.9': [3.29, 3.82, 4.09]},\n", - " {'mean': [-1.22, -1.3, -1.3], '0.1': [-4.51, -5.48, -6.12], '0.5': [-1.22, -1.3, -1.3], '0.9': [2.84, 4.02, 4.92]}]}\n" - ] - } - ], - "source": [ - "payload = {\n", - " \"inputs\": [\n", - " {\n", - " \"target\": [1.0, 2.0, 3.0, 2.0, 0.5, 2.0, 3.0, 2.0, 1.0],\n", - " # past_covariates must have the same length as \"target\"\n", - " \"past_covariates\": {\n", - " \"feat_1\": [3.0, 6.0, 9.0, 6.0, 1.5, 6.0, 9.0, 6.0, 3.0],\n", - " \"feat_2\": [\"A\", \"B\", \"B\", \"B\", \"A\", \"A\", \"A\", \"A\", \"B\"],\n", - " },\n", - " # future_covariates must have length equal to \"prediction_length\"\n", - " \"future_covariates\": {\n", - " \"feat_1\": [2.5, 2.2, 3.3],\n", - " \"feat_2\": [\"B\", \"A\", \"A\"],\n", - " },\n", - " },\n", - " {\n", - " \"target\": [5.4, 3.0, 3.0, 2.0, 1.5, 2.0, -1.0],\n", - " \"past_covariates\": {\n", - " \"feat_1\": [0.6, 1.2, 1.8, 1.2, 0.3, 1.2, 1.8],\n", - " \"feat_2\": [\"A\", \"B\", \"B\", \"B\", \"A\", \"A\", \"A\"],\n", - " },\n", - " \"future_covariates\": {\n", - " \"feat_1\": [1.2, 0.3, 4.4],\n", - " \"feat_2\": [\"A\", \"B\", \"A\"],\n", - " },\n", - " },\n", - " ],\n", - " \"parameters\": {\n", - " \"prediction_length\": 3,\n", - " \"quantile_levels\": [0.1, 0.5, 0.9],\n", - " },\n", - "}\n", - "response = predictor.predict(payload)\n", - "print(pretty_format(response))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Endpoint API\n", - "So far, we have explored several examples of querying the endpoint with different payload structures. Below is a comprehensive API specification detailing all supported parameters, their meanings, and how they affect the model’s predictions.\n", - "\n", - "* **inputs** (required): List with at most 1000 time series that need to be forecasted. Each time series is represented by a dictionary with the following keys:\n", - " * **target** (required): List of observed numeric time series values. \n", - " - It is recommended that each time series contains at least 30 observations.\n", - " - If any time series contains fewer than 5 observations, an error will be raised.\n", - " * **item_id**: String that uniquely identifies each time series. \n", - " - If provided, the ID must be unique for each time series.\n", - " - If provided, then the endpoint response will also include the **item_id** field for each forecast.\n", - " * **start**: Timestamp of the first time series observation in ISO format (`YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ss`). \n", - " - If **start** field is provided, then **freq** must also be provided as part of **parameters**.\n", - " - If provided, then the endpoint response will also include the **start** field indicating the first timestamp of each forecast.\n", - " * **past_covariates**: Dictionary containing the past values of the covariates for this time series.\n", - " - If **past_covariates** field is provided, then **future_covariates** must be provided as well with the same keys.\n", - " - Each key in **past_covariates** correspond to the name of the covariate. Each value must be an array consisting of all-numeric or all-string values, with the length equal to the length of the **target**.\n", - " * **future_covariates**: Dictionary containing the future values of the covariates for this time series (values during the forecast horizon).\n", - " - If **future_covariates** field is provided, then **past_covariates** must be provided as well with the same keys.\n", - " - Each key in **future_covariates** correspond to the name of the covariate. Each value must be an array consisting of all-numeric or all-string values, with the length equal to **prediction_length**.\n", - " - If both **past_covariates** and **future_covariates** are provided, a regression model specified by **covariate_model** will be used to incorporate the covariate information into the forecast.\n", - "* **parameters**: Optional parameters to configure the model.\n", - " * **prediction_length**: Integer corresponding to the number of future time series values that need to be predicted. Defaults to `1`.\n", - " - Recommended to keep prediction_length <= 64 since larger values will result in inaccurate quantile forecasts. Values above 1000 will raise an error.\n", - " * **quantile_levels**: List of floats in range (0, 1) specifying which quantiles should should be included in the probabilistic forecast. Defaults to `[0.1, 0.5, 0.9]`. \n", - " - Note that Chronos-Bolt cannot produce quantiles outside the [0.1, 0.9] range (predictions outside the range will be clipped).\n", - " * **freq**: Frequency of the time series observations in [pandas-compatible format](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases). For example, `1h` for hourly data or `2W` for bi-weekly data. \n", - " - If **freq** is provided, then **start** must also be provided for each time series in **inputs**.\n", - " * **batch_size**: Number of time series processed in parallel by the model. Larger values speed up inference but may lead to out of memory errors. Defaults to `256`.\n", - " * **covariate_model**: Name of the tabular regression model applied to the covariates. Possible options: `GBM` (LightGBM), `LR` (linear regression), `RF` (random forest), `CAT` (CatBoost), `XGB` (XGBoost). Defaults to `GBM`.\n", - "\n", - "All keys not marked with (required) are optional.\n", - "\n", - "The endpoint response contains the probabilistic (quantile) forecast for each time series included in the request." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Working with long-format data frames" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The endpoint communicates using JSON format for both input and output. However, in practice, time series data is often stored in a **long-format data frame** (where each row represents a timestamp for a specific item).\n", - "\n", - "In the following example, we demonstrate how to:\n", - "\n", - "1. Convert a long-format data frame into the JSON payload format required by the endpoint.\n", - "2. Send the request and retrieve predictions.\n", - "3. Convert the response back into a long-format data frame for further analysis.\n", - "\n", - "First, we load an example dataset in long data frame format." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
item_idtimestampscaled_pricepromotion_emailpromotion_homepageunit_sales
01062_1012018-01-010.8791300.00.0636.0
11062_1012018-01-080.9945170.00.0123.0
21062_1012018-01-151.0055130.00.0391.0
31062_1012018-01-221.0000000.00.0339.0
41062_1012018-01-290.8833090.00.0661.0
\n", - "
" - ], - "text/plain": [ - " item_id timestamp scaled_price promotion_email promotion_homepage \\\n", - "0 1062_101 2018-01-01 0.879130 0.0 0.0 \n", - "1 1062_101 2018-01-08 0.994517 0.0 0.0 \n", - "2 1062_101 2018-01-15 1.005513 0.0 0.0 \n", - "3 1062_101 2018-01-22 1.000000 0.0 0.0 \n", - "4 1062_101 2018-01-29 0.883309 0.0 0.0 \n", - "\n", - " unit_sales \n", - "0 636.0 \n", - "1 123.0 \n", - "2 391.0 \n", - "3 339.0 \n", - "4 661.0 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "df = pd.read_csv(\n", - " \"https://autogluon.s3.amazonaws.com/datasets/timeseries/grocery_sales/test.csv\",\n", - " parse_dates=[\"timestamp\"],\n", - ")\n", - "df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We split the data into two parts:\n", - "- Past data, including historic values of the target column and the covariates.\n", - "- Future data that contains the future values of the covariates during the forecast horizon." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "prediction_length = 8\n", - "target_col = \"unit_sales\"\n", - "freq = pd.infer_freq(df[df.item_id == df.item_id[0]][\"timestamp\"])\n", - "\n", - "past_df = df.groupby(\"item_id\").head(-prediction_length)\n", - "future_df = df.groupby(\"item_id\").tail(prediction_length).drop(columns=[target_col])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
item_idtimestampscaled_pricepromotion_emailpromotion_homepageunit_sales
01062_1012018-01-010.8791300.00.0636.0
11062_1012018-01-080.9945170.00.0123.0
21062_1012018-01-151.0055130.00.0391.0
31062_1012018-01-221.0000000.00.0339.0
41062_1012018-01-290.8833090.00.0661.0
\n", - "
" - ], - "text/plain": [ - " item_id timestamp scaled_price promotion_email promotion_homepage \\\n", - "0 1062_101 2018-01-01 0.879130 0.0 0.0 \n", - "1 1062_101 2018-01-08 0.994517 0.0 0.0 \n", - "2 1062_101 2018-01-15 1.005513 0.0 0.0 \n", - "3 1062_101 2018-01-22 1.000000 0.0 0.0 \n", - "4 1062_101 2018-01-29 0.883309 0.0 0.0 \n", - "\n", - " unit_sales \n", - "0 636.0 \n", - "1 123.0 \n", - "2 391.0 \n", - "3 339.0 \n", - "4 661.0 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "past_df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
item_idtimestampscaled_pricepromotion_emailpromotion_homepage
231062_1012018-06-111.0054250.00.0
241062_1012018-06-181.0054540.00.0
251062_1012018-06-251.0000000.00.0
261062_1012018-07-021.0055130.00.0
271062_1012018-07-091.0000000.00.0
\n", - "
" - ], - "text/plain": [ - " item_id timestamp scaled_price promotion_email promotion_homepage\n", - "23 1062_101 2018-06-11 1.005425 0.0 0.0\n", - "24 1062_101 2018-06-18 1.005454 0.0 0.0\n", - "25 1062_101 2018-06-25 1.000000 0.0 0.0\n", - "26 1062_101 2018-07-02 1.005513 0.0 0.0\n", - "27 1062_101 2018-07-09 1.000000 0.0 0.0" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "future_df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now convert this data into a JSON payload." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def convert_df_to_payload(\n", - " past_df,\n", - " future_df=None,\n", - " prediction_length=1,\n", - " freq=\"D\",\n", - " target_col=\"target\",\n", - " id_col=\"item_id\",\n", - " timestamp_col=\"timestamp\",\n", - "):\n", - " \"\"\"\n", - " Converts past and future DataFrames into JSON payload format for the Chronos endpoint.\n", - "\n", - " Args:\n", - " past_df (pd.DataFrame): Historical data with `target_col`, `timestamp_col`, and `id_col`.\n", - " future_df (pd.DataFrame, optional): Future covariates with `timestamp_col` and `id_col`.\n", - " prediction_length (int): Number of future time steps to predict.\n", - " freq (str): Pandas-compatible frequency of the time series.\n", - " target_col (str): Column name for target values.\n", - " id_col (str): Column name for item IDs.\n", - " timestamp_col (str): Column name for timestamps.\n", - "\n", - " Returns:\n", - " dict: JSON payload formatted for the Chronos endpoint.\n", - " \"\"\"\n", - " past_df = past_df.sort_values([id_col, timestamp_col])\n", - " if future_df is not None:\n", - " future_df = future_df.sort_values([id_col, timestamp_col])\n", - "\n", - " covariate_cols = list(past_df.columns.drop([target_col, id_col, timestamp_col]))\n", - " if covariate_cols and (future_df is None or not set(covariate_cols).issubset(future_df.columns)):\n", - " raise ValueError(f\"If past_df contains covariates {covariate_cols}, they should also be present in future_df\")\n", - "\n", - " inputs = []\n", - " for item_id, past_group in past_df.groupby(id_col):\n", - " target_values = past_group[target_col].tolist()\n", - "\n", - " if len(target_values) < 5:\n", - " raise ValueError(f\"Time series '{item_id}' has fewer than 5 observations.\")\n", - "\n", - " series_dict = {\n", - " \"target\": target_values,\n", - " \"item_id\": str(item_id),\n", - " \"start\": past_group[timestamp_col].iloc[0].isoformat(),\n", - " }\n", - "\n", - " if covariate_cols:\n", - " series_dict[\"past_covariates\"] = past_group[covariate_cols].to_dict(orient=\"list\")\n", - " future_group = future_df[future_df[id_col] == item_id]\n", - " if len(future_group) != prediction_length:\n", - " raise ValueError(\n", - " f\"future_df must contain exactly {prediction_length=} values for each item_id from past_df \"\n", - " f\"(got {len(future_group)=}) for {item_id=}\"\n", - " )\n", - " series_dict[\"future_covariates\"] = future_group[covariate_cols].to_dict(orient=\"list\")\n", - "\n", - " inputs.append(series_dict)\n", - "\n", - "\n", - " return {\n", - " \"inputs\": inputs,\n", - " \"parameters\": {\"prediction_length\": prediction_length, \"freq\": freq},\n", - " }" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "payload = convert_df_to_payload(\n", - " past_df,\n", - " future_df,\n", - " prediction_length=prediction_length,\n", - " freq=freq,\n", - " target_col=\"unit_sales\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can now send the payload to the endpoint." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "response = predictor.predict(payload)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note how Chronos-Bolt generated predictions for >300 time series in the dataset (with covariates!) in less than 2 seconds, even when running on a small CPU instance.\n", - "\n", - "Finally, we can convert the response back to a long-format data frame." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def convert_response_to_df(response, freq=\"D\"):\n", - " \"\"\"\n", - " Converts a JSON response from the Chronos endpoint into a long-format DataFrame.\n", - "\n", - " Args:\n", - " response (dict): JSON response containing forecasts.\n", - " freq (str): Pandas-compatible frequency of the time series.\n", - "\n", - " Returns:\n", - " pd.DataFrame: Long-format DataFrame with timestamps, item_id, and forecasted values.\n", - " \"\"\"\n", - " dfs = []\n", - " for forecast in response[\"predictions\"]:\n", - " forecast_df = pd.DataFrame(forecast).drop(columns=[\"start\"])\n", - " forecast_df[\"timestamp\"] = pd.date_range(forecast[\"start\"], freq=freq, periods=len(forecast_df))\n", - " dfs.append(forecast_df)\n", - " return pd.concat(dfs)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
mean0.10.50.9item_idtimestamp
0315.504037210.074945315.504037487.4844081062_1012018-06-11
1315.364478200.272695315.364478508.1458501062_1012018-06-18
2310.507265193.902630310.507265511.5597401062_1012018-06-25
3317.322873200.051215317.322873525.0138301062_1012018-07-02
4319.089405199.634549319.089405534.1025181062_1012018-07-09
\n", - "
" - ], - "text/plain": [ - " mean 0.1 0.5 0.9 item_id timestamp\n", - "0 315.504037 210.074945 315.504037 487.484408 1062_101 2018-06-11\n", - "1 315.364478 200.272695 315.364478 508.145850 1062_101 2018-06-18\n", - "2 310.507265 193.902630 310.507265 511.559740 1062_101 2018-06-25\n", - "3 317.322873 200.051215 317.322873 525.013830 1062_101 2018-07-02\n", - "4 319.089405 199.634549 319.089405 534.102518 1062_101 2018-07-09" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "forecast_df = convert_response_to_df(response, freq=freq)\n", - "forecast_df.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Clean up the endpoint\n", - "Don't forget to clean up resources when finished to avoid unnecessary charges." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "predictor.delete_predictor()" - ] - } - ], - "metadata": { - "instance_type": "ml.t3.medium", - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "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.11.10" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/notebooks/deploy-chronos-to-amazon-sagemaker.ipynb b/notebooks/deploy-chronos-to-amazon-sagemaker.ipynb new file mode 100644 index 0000000..27e678e --- /dev/null +++ b/notebooks/deploy-chronos-to-amazon-sagemaker.ipynb @@ -0,0 +1,1425 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0c7f9134", + "metadata": {}, + "source": [ + "# Deploy Chronos-2 to AWS with Amazon SageMaker" + ] + }, + { + "cell_type": "markdown", + "id": "3053768c", + "metadata": {}, + "source": [ + "This notebook shows how to deploy **Chronos-2** to AWS using **Amazon SageMaker**.\n", + "\n", + "### Why Deploy to SageMaker?\n", + "Running models locally works for experimentation, but production use cases need reliability, scale, and integration into existing workflows. For example, you may need to generate forecasts for thousands of time series on a regular schedule, or integrate forecasts into applications that serve many users. SageMaker lets you deploy Chronos-2 to the cloud and access it from anywhere.\n", + "\n", + "### Deployment Options\n", + "This notebook covers three deployment modes on SageMaker:\n", + "\n", + "1. **[Real-time Inference](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html)**\n", + " - ✅ Highest throughput, consistently low latency, supports both GPU and CPU instances\n", + " - ✅ Simple setup via JumpStart\n", + " - ❌ By default, you pay for the time the endpoint is running (can be configured to [scale to zero](https://docs.aws.amazon.com/sagemaker/latest/dg/endpoint-auto-scaling-zero-instances.html))\n", + "\n", + "2. **[Serverless Inference (CPU only)](https://docs.aws.amazon.com/sagemaker/latest/dg/serverless-endpoints.html)**\n", + " - ✅ Pay only for active inference time, no infrastructure management\n", + " - ✅ Cost-efficient for intermittent or unpredictable traffic\n", + " - ❌ Cold start latency on first request after idle, lowest throughput of all options\n", + " - ❌ More complex setup (requires repackaging model artifacts)\n", + "\n", + "3. **[Batch Transform](https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html)**\n", + " - ✅ Pay only for active compute time, no persistent infrastructure\n", + " - ✅ Cost-efficient for large-scale batch prediction jobs\n", + " - ❌ Initialization takes severa minutes for each job (not for real-time use), requires data in S3\n", + " - ❌ More complex setup (requires repackaging model artifacts)\n", + "\n", + "**Reference benchmark** on a dataset with 1M rows (2000 time series with 500 observations each) and prediction length of 28:\n", + "| Mode | Instance | Inference time (s) |\n", + "|------|----------|------|\n", + "| Real-time (GPU) | ml.g5.2xlarge | 18 |\n", + "| Real-time (CPU) | ml.c5.4xlarge | 50 |\n", + "| Serverless | 6GB memory | 120 |\n", + "| Batch Transform | ml.c5.4xlarge | 60 (+200s setup) |\n", + "\n", + "We recommend starting with **Real-time Inference** as it offers the simplest setup and highest throughput. Consider Serverless or Batch Transform when you need to optimize costs and don't require GPU acceleration.\n", + "\n", + "For a complete specification of all supported request parameters, see the **Endpoint API Reference** at the end of this notebook." + ] + }, + { + "cell_type": "markdown", + "id": "78b40323", + "metadata": {}, + "source": [ + "
\n", + "ℹ️ New to Chronos-2?
\n", + "For an overview of Chronos-2 capabilities (univariate, multivariate, covariates), see the Chronos-2 Quick Start notebook.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "a07155fb", + "metadata": {}, + "source": [ + "
\n", + "⚠️ Looking for Chronos-Bolt or original Chronos?
\n", + "This notebook covers Chronos-2, the latest and recommended model. For documentation on older models (Chronos-Bolt and original Chronos), see the legacy deployment walkthrough.\n", + "
" + ] + }, + { + "cell_type": "markdown", + "id": "1f595c0a", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4907ecb7", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -U -q \"sagemaker<3\"" + ] + }, + { + "cell_type": "markdown", + "id": "69fa28b0", + "metadata": {}, + "source": [ + "If running in a SageMaker Notebook with the correct execution role, `role` can be set to `None`. Otherwise, specify your IAM role ARN." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c135de1", + "metadata": {}, + "outputs": [], + "source": [ + "role = None # or \"arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXXXXXXXXXXX\"" + ] + }, + { + "cell_type": "markdown", + "id": "9be17b67", + "metadata": {}, + "source": [ + "---\n", + "## Section 1: Real-time Inference\n", + "\n", + "Real-time inference is the simplest option. SageMaker keeps a dedicated instance running, ready to serve predictions with low latency.\n", + "\n", + "**When to use:**\n", + "- Interactive applications that need sub-second response times\n", + "- Consistent, predictable traffic\n", + "- When simplicity matters more than cost optimization" + ] + }, + { + "cell_type": "markdown", + "id": "1abbbaf5", + "metadata": {}, + "source": [ + "### Deploy the Model\n", + "\n", + "With SageMaker JumpStart, you configure the deployment with a few parameters:\n", + "\n", + "- `model_id`: The model to deploy. Use `pytorch-forecasting-chronos-2` for [Chronos-2](https://huggingface.co/amazon/chronos-2).\n", + "- `instance_type`: The AWS instance type for serving. Supported options:\n", + " - **GPU**: `ml.g5.xlarge`, `ml.g5.2xlarge`, `ml.g6.xlarge`, `ml.g6.2xlarge`, `ml.g6e.xlarge`, `ml.g6e.2xlarge`, `ml.g4dn.xlarge`, `ml.g4dn.2xlarge`\n", + " - **CPU**: `ml.m5.xlarge`, `ml.m5.2xlarge`, `ml.m5.4xlarge`, `ml.c5.xlarge`, `ml.c5.2xlarge`, `ml.c5.4xlarge`\n", + "\n", + "JumpStart automatically sets other attributes like `image_uri` based on your choices. See [SageMaker pricing](https://aws.amazon.com/sagemaker/ai/pricing/) for instance costs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba78fc0b", + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.jumpstart.model import JumpStartModel\n", + "\n", + "js_model = JumpStartModel(\n", + " model_id=\"pytorch-forecasting-chronos-2\",\n", + " instance_type=\"ml.g5.2xlarge\",\n", + " role=role,\n", + ")\n", + "\n", + "predictor = js_model.deploy()" + ] + }, + { + "cell_type": "markdown", + "id": "f1ce1202", + "metadata": {}, + "source": [ + "> **Note:** After the endpoint is deployed, it will incur charges until you delete it with `predictor.delete_predictor()`" + ] + }, + { + "cell_type": "markdown", + "id": "9ef676fc", + "metadata": {}, + "source": [ + "To connect to an existing endpoint instead:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "159e1e83", + "metadata": {}, + "outputs": [], + "source": [ + "# from sagemaker.predictor import Predictor\n", + "# from sagemaker.serializers import JSONSerializer\n", + "# from sagemaker.deserializers import JSONDeserializer\n", + "#\n", + "# predictor = Predictor(\"NAME_OF_EXISTING_ENDPOINT\", serializer=JSONSerializer(), deserializer=JSONDeserializer())" + ] + }, + { + "cell_type": "markdown", + "id": "88c075c6", + "metadata": {}, + "source": [ + "### Query the Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c5d7cfd", + "metadata": { + "lines_to_next_cell": 1 + }, + "outputs": [], + "source": [ + "from pprint import pformat\n", + "\n", + "\n", + "def nested_round(data, decimals=2):\n", + " \"\"\"Round numbers, including nested dicts and lists.\"\"\"\n", + " if isinstance(data, float):\n", + " return round(data, decimals)\n", + " elif isinstance(data, list):\n", + " return [nested_round(item, decimals) for item in data]\n", + " elif isinstance(data, dict):\n", + " return {key: nested_round(value, decimals) for key, value in data.items()}\n", + " return data\n", + "\n", + "\n", + "def pretty_format(data):\n", + " return pformat(nested_round(data), width=150, sort_dicts=False)" + ] + }, + { + "cell_type": "markdown", + "id": "e008ad07", + "metadata": {}, + "source": [ + "#### Univariate Forecasting" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "af030c65", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'predictions': [{'mean': [-0.36, 4.02, 5.3, 2.45, -2.48, -5.14, -4.33, 0.06, 4.42, 5.14],\n", + " '0.1': [-1.68, 2.86, 4.01, 1.01, -3.77, -6.22, -5.39, -1.77, 2.6, 3.62],\n", + " '0.5': [-0.36, 4.02, 5.3, 2.45, -2.48, -5.14, -4.33, 0.06, 4.42, 5.14],\n", + " '0.9': [1.02, 5.02, 6.32, 3.82, -0.85, -3.92, -2.93, 1.83, 5.63, 6.44]}]}\n" + ] + } + ], + "source": [ + "payload = {\n", + " \"inputs\": [\n", + " {\"target\": [0.0, 4.0, 5.0, 1.5, -3.0, -5.0, -3.0, 1.5, 5.0, 4.0, 0.0, -4.0, -5.0, -1.5, 3.0, 5.0, 3.0, -1.5, -5.0, -4.0]},\n", + " ],\n", + " \"parameters\": {\"prediction_length\": 10},\n", + "}\n", + "response = predictor.predict(payload)\n", + "print(pretty_format(response))" + ] + }, + { + "cell_type": "markdown", + "id": "a2e4d3a2", + "metadata": {}, + "source": [ + "#### Multiple Time Series with Metadata" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "cd8d2d7c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'predictions': [{'mean': [1.69, 1.94, 1.65, 1.54, 1.84],\n", + " '0.1': [0.28, 0.31, -0.07, -0.35, -0.18],\n", + " '0.5': [1.69, 1.94, 1.65, 1.54, 1.84],\n", + " '0.9': [3.09, 3.77, 3.62, 3.58, 4.23],\n", + " 'item_id': 'product_A',\n", + " 'start': '2024-01-01T10:00:00'},\n", + " {'mean': [-1.2, -1.41, -1.27, -1.37, -1.3],\n", + " '0.1': [-4.21, -5.83, -6.39, -7.58, -8.05],\n", + " '0.5': [-1.2, -1.41, -1.27, -1.37, -1.3],\n", + " '0.9': [2.01, 2.91, 3.55, 4.66, 5.66],\n", + " 'item_id': 'product_B',\n", + " 'start': '2024-02-02T10:00:00'}]}\n" + ] + } + ], + "source": [ + "payload = {\n", + " \"inputs\": [\n", + " {\"target\": [1.0, 2.0, 3.0, 2.0, 0.5, 2.0, 3.0, 2.0, 1.0], \"item_id\": \"product_A\", \"start\": \"2024-01-01T01:00:00\"},\n", + " {\"target\": [5.4, 3.0, 3.0, 2.0, 1.5, 2.0, -1.0], \"item_id\": \"product_B\", \"start\": \"2024-02-02T03:00:00\"},\n", + " ],\n", + " \"parameters\": {\"prediction_length\": 5, \"freq\": \"1h\", \"quantile_levels\": [0.1, 0.5, 0.9]},\n", + "}\n", + "response = predictor.predict(payload)\n", + "print(pretty_format(response))" + ] + }, + { + "cell_type": "markdown", + "id": "d6a84b17", + "metadata": {}, + "source": [ + "#### Forecasting with Covariates" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "0dcaa27a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'predictions': [{'mean': [1.73, 2.09, 1.74], '0.1': [0.35, 0.58, 0.17], '0.5': [1.73, 2.09, 1.74], '0.9': [3.11, 3.79, 3.52]}]}\n" + ] + } + ], + "source": [ + "payload = {\n", + " \"inputs\": [\n", + " {\n", + " \"target\": [1.0, 2.0, 3.0, 2.0, 0.5, 2.0, 3.0, 2.0, 1.0],\n", + " \"past_covariates\": {\n", + " \"feat_1\": [3.0, 6.0, 9.0, 6.0, 1.5, 6.0, 9.0, 6.0, 3.0],\n", + " \"feat_2\": [\"A\", \"B\", \"B\", \"B\", \"A\", \"A\", \"A\", \"A\", \"B\"],\n", + " \"feat_3\": [10.0, 20.0, 30.0, 20.0, 5.0, 20.0, 30.0, 20.0, 10.0], # past-only\n", + " },\n", + " \"future_covariates\": {\"feat_1\": [2.5, 2.2, 3.3], \"feat_2\": [\"B\", \"A\", \"A\"]},\n", + " },\n", + " ],\n", + " \"parameters\": {\"prediction_length\": 3, \"quantile_levels\": [0.1, 0.5, 0.9]},\n", + "}\n", + "response = predictor.predict(payload)\n", + "print(pretty_format(response))" + ] + }, + { + "cell_type": "markdown", + "id": "98c40db2", + "metadata": {}, + "source": [ + "#### Multivariate Forecasting" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "9ca28aea", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'predictions': [{'mean': [[3.66, 3.54, 3.5, 3.42], [2.01, 2.07, 2.2, 2.25], [3.33, 3.27, 3.25, 3.21]],\n", + " '0.1': [[1.98, 1.52, 1.16, 0.88], [0.84, 0.21, 0.03, -0.27], [2.49, 2.26, 2.08, 1.94]],\n", + " '0.5': [[3.66, 3.54, 3.5, 3.42], [2.01, 2.07, 2.2, 2.25], [3.33, 3.27, 3.25, 3.21]],\n", + " '0.9': [[5.76, 6.22, 6.59, 6.99], [3.8, 4.48, 4.89, 5.31], [4.38, 4.61, 4.79, 5.0]]}]}\n" + ] + } + ], + "source": [ + "payload = {\n", + " \"inputs\": [\n", + " {\n", + " \"target\": [\n", + " [1.0, 2.0, 3.0, 2.0, 1.0, 2.0, 3.0, 4.0], # Dimension 1\n", + " [5.0, 4.0, 3.0, 4.0, 5.0, 4.0, 3.0, 2.0], # Dimension 2\n", + " [2.0, 2.5, 3.0, 2.5, 2.0, 2.5, 3.0, 3.5], # Dimension 3\n", + " ],\n", + " },\n", + " ],\n", + " \"parameters\": {\"prediction_length\": 4, \"quantile_levels\": [0.1, 0.5, 0.9]},\n", + "}\n", + "response = predictor.predict(payload)\n", + "print(pretty_format(response))" + ] + }, + { + "cell_type": "markdown", + "id": "e04e42b2", + "metadata": {}, + "source": [ + "### Working with Long-Format DataFrames\n", + "\n", + "Time series data is often stored in long-format DataFrames. The following helper functions convert between DataFrame and payload formats. You can skip this section if you prefer to construct payloads manually." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "fb8e4c95", + "metadata": { + "lines_to_next_cell": 1 + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "\n", + "def convert_df_to_payload(\n", + " past_df,\n", + " future_df=None,\n", + " prediction_length=1,\n", + " freq=\"D\",\n", + " target=\"target\",\n", + " id_column=\"item_id\",\n", + " timestamp_column=\"timestamp\",\n", + "):\n", + " \"\"\"\n", + " Converts past and future DataFrames into JSON payload format for the Chronos endpoint.\n", + "\n", + " Args:\n", + " past_df: Historical data with target, timestamp_column, and id_column.\n", + " future_df: Future covariates with timestamp_column and id_column.\n", + " prediction_length: Number of future time steps to predict.\n", + " freq: Pandas-compatible frequency of the time series.\n", + " target: Column name(s) for target values (str for univariate, list for multivariate).\n", + " id_column: Column name for item IDs.\n", + " timestamp_column: Column name for timestamps.\n", + "\n", + " Returns:\n", + " dict: JSON payload formatted for the Chronos endpoint.\n", + " \"\"\"\n", + " past_df = past_df.sort_values([id_column, timestamp_column])\n", + " if future_df is not None:\n", + " future_df = future_df.sort_values([id_column, timestamp_column])\n", + "\n", + " target_cols = [target] if isinstance(target, str) else target\n", + " past_covariate_cols = list(past_df.columns.drop([*target_cols, id_column, timestamp_column]))\n", + " future_covariate_cols = [] if future_df is None else [col for col in past_covariate_cols if col in future_df.columns]\n", + "\n", + " inputs = []\n", + " for item_id, past_group in past_df.groupby(id_column):\n", + " if len(target_cols) > 1:\n", + " target_values = [past_group[col].tolist() for col in target_cols]\n", + " series_length = len(target_values[0])\n", + " else:\n", + " target_values = past_group[target_cols[0]].tolist()\n", + " series_length = len(target_values)\n", + "\n", + " if series_length < 5:\n", + " raise ValueError(f\"Time series '{item_id}' has fewer than 5 observations.\")\n", + "\n", + " series_dict = {\n", + " \"target\": target_values,\n", + " \"item_id\": str(item_id),\n", + " \"start\": past_group[timestamp_column].iloc[0].isoformat(),\n", + " }\n", + "\n", + " if past_covariate_cols:\n", + " series_dict[\"past_covariates\"] = past_group[past_covariate_cols].to_dict(orient=\"list\")\n", + "\n", + " if future_covariate_cols:\n", + " future_group = future_df[future_df[id_column] == item_id]\n", + " if len(future_group) != prediction_length:\n", + " raise ValueError(\n", + " f\"future_df must contain exactly {prediction_length=} values for each item_id from past_df \"\n", + " f\"(got {len(future_group)=}) for {item_id=}\"\n", + " )\n", + " series_dict[\"future_covariates\"] = future_group[future_covariate_cols].to_dict(orient=\"list\")\n", + "\n", + " inputs.append(series_dict)\n", + "\n", + " return {\n", + " \"inputs\": inputs,\n", + " \"parameters\": {\"prediction_length\": prediction_length, \"freq\": freq},\n", + " }\n", + "\n", + "\n", + "def convert_response_to_df(response, freq=\"D\"):\n", + " \"\"\"\n", + " Converts a JSON response from the Chronos endpoint into a long-format DataFrame.\n", + "\n", + " Args:\n", + " response: JSON response containing forecasts.\n", + " freq: Pandas-compatible frequency of the time series.\n", + "\n", + " Returns:\n", + " pd.DataFrame: Long-format DataFrame with timestamps, item_id, and forecasted values.\n", + " \"\"\"\n", + " dfs = []\n", + " for forecast in response[\"predictions\"]:\n", + " if isinstance(forecast[\"mean\"], list) and isinstance(forecast[\"mean\"][0], list):\n", + " # Multivariate forecast\n", + " timestamps = pd.date_range(forecast[\"start\"], freq=freq, periods=len(forecast[\"mean\"][0]))\n", + " for dim_idx in range(len(forecast[\"mean\"])):\n", + " dim_data = {\"item_id\": forecast.get(\"item_id\"), \"timestamp\": timestamps, \"target\": f\"target_{dim_idx + 1}\"}\n", + " for key, value in forecast.items():\n", + " if key not in [\"item_id\", \"start\"]:\n", + " dim_data[key] = value[dim_idx]\n", + " dfs.append(pd.DataFrame(dim_data))\n", + " else:\n", + " # Univariate forecast\n", + " forecast_df = pd.DataFrame(forecast).drop(columns=[\"start\"])\n", + " forecast_df[\"timestamp\"] = pd.date_range(forecast[\"start\"], freq=freq, periods=len(forecast_df))\n", + " cols = [\"item_id\", \"timestamp\"] + [c for c in forecast_df.columns if c not in [\"item_id\", \"timestamp\"]]\n", + " forecast_df = forecast_df[cols]\n", + " dfs.append(forecast_df)\n", + "\n", + " return pd.concat(dfs, ignore_index=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "ed20630a", + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "df = pd.read_csv(\n", + " \"https://autogluon.s3.amazonaws.com/datasets/timeseries/grocery_sales/test.csv\",\n", + " parse_dates=[\"timestamp\"],\n", + ")\n", + "\n", + "prediction_length = 8\n", + "target_col = \"unit_sales\"\n", + "freq = pd.infer_freq(df[df.item_id == df.item_id[0]][\"timestamp\"])\n", + "\n", + "past_df = df.groupby(\"item_id\").head(-prediction_length)\n", + "future_df = df.groupby(\"item_id\").tail(prediction_length).drop(columns=[target_col])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "e9528df2", + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
item_idtimestampscaled_pricepromotion_emailpromotion_homepageunit_sales
01062_1012018-01-010.8791300.00.0636.0
11062_1012018-01-080.9945170.00.0123.0
21062_1012018-01-151.0055130.00.0391.0
31062_1012018-01-221.0000000.00.0339.0
41062_1012018-01-290.8833090.00.0661.0
\n", + "
" + ], + "text/plain": [ + " item_id timestamp scaled_price promotion_email promotion_homepage \\\n", + "0 1062_101 2018-01-01 0.879130 0.0 0.0 \n", + "1 1062_101 2018-01-08 0.994517 0.0 0.0 \n", + "2 1062_101 2018-01-15 1.005513 0.0 0.0 \n", + "3 1062_101 2018-01-22 1.000000 0.0 0.0 \n", + "4 1062_101 2018-01-29 0.883309 0.0 0.0 \n", + "\n", + " unit_sales \n", + "0 636.0 \n", + "1 123.0 \n", + "2 391.0 \n", + "3 339.0 \n", + "4 661.0 " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "past_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "b3e58f08", + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
item_idtimestampscaled_pricepromotion_emailpromotion_homepage
231062_1012018-06-111.0054250.00.0
241062_1012018-06-181.0054540.00.0
251062_1012018-06-251.0000000.00.0
261062_1012018-07-021.0055130.00.0
271062_1012018-07-091.0000000.00.0
\n", + "
" + ], + "text/plain": [ + " item_id timestamp scaled_price promotion_email promotion_homepage\n", + "23 1062_101 2018-06-11 1.005425 0.0 0.0\n", + "24 1062_101 2018-06-18 1.005454 0.0 0.0\n", + "25 1062_101 2018-06-25 1.000000 0.0 0.0\n", + "26 1062_101 2018-07-02 1.005513 0.0 0.0\n", + "27 1062_101 2018-07-09 1.000000 0.0 0.0" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "future_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "68aef8ee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
item_idtimestampmean0.10.50.9
01062_1012018-06-11320.102539186.102356320.102539486.852112
11062_1012018-06-18317.431396174.692490317.431396495.592224
21062_1012018-06-25316.319000169.798355316.319000507.396881
31062_1012018-07-02316.502472170.463837316.502472505.163483
41062_1012018-07-09309.931396164.362732309.931396505.276794
\n", + "
" + ], + "text/plain": [ + " item_id timestamp mean 0.1 0.5 0.9\n", + "0 1062_101 2018-06-11 320.102539 186.102356 320.102539 486.852112\n", + "1 1062_101 2018-06-18 317.431396 174.692490 317.431396 495.592224\n", + "2 1062_101 2018-06-25 316.319000 169.798355 316.319000 507.396881\n", + "3 1062_101 2018-07-02 316.502472 170.463837 316.502472 505.163483\n", + "4 1062_101 2018-07-09 309.931396 164.362732 309.931396 505.276794" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "payload = convert_df_to_payload(past_df, future_df, prediction_length=prediction_length, freq=freq, target=\"unit_sales\")\n", + "response = predictor.predict(payload)\n", + "forecast_df = convert_response_to_df(response, freq=freq)\n", + "forecast_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "19467a6e", + "metadata": {}, + "source": [ + "### Clean Up\n", + "\n", + "The endpoint incurs charges until deleted. Alternatively, you can configure [scaling to zero](https://docs.aws.amazon.com/sagemaker/latest/dg/endpoint-auto-scaling-zero-instances.html) to save costs when the endpoint is idle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2ab130b", + "metadata": {}, + "outputs": [], + "source": [ + "predictor.delete_predictor()" + ] + }, + { + "cell_type": "markdown", + "id": "bad58ba2", + "metadata": {}, + "source": [ + "---\n", + "## Setup for Serverless Inference and Batch Transform\n", + "\n", + "Serverless Inference and Batch Transform only support CPU instances. Unlike real-time inference with JumpStart, these modes require you to create a custom SageMaker Model with repackaged artifacts.\n", + "\n", + "The following section sets up a reusable model that you can use for both Serverless (Section 2) and Batch Transform (Section 3)." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "64a2da8d", + "metadata": { + "lines_to_next_cell": 1 + }, + "outputs": [], + "source": [ + "import boto3\n", + "import json\n", + "import tempfile\n", + "import tarfile\n", + "from pathlib import Path\n", + "from sagemaker import Session\n", + "from sagemaker.model import Model\n", + "from sagemaker.jumpstart.model import JumpStartModel\n", + "from sagemaker.serializers import JSONSerializer\n", + "from sagemaker.deserializers import JSONDeserializer\n", + "\n", + "\n", + "def repackage_jumpstart_model(js_model, output_bucket, output_key):\n", + " \"\"\"\n", + " Repackages JumpStart model artifacts into a single tar.gz file for serverless/batch deployment.\n", + "\n", + " Args:\n", + " js_model: JumpStartModel instance with model_data configured.\n", + " output_bucket: S3 bucket to store the repackaged model.\n", + " output_key: S3 key for the output tar.gz file.\n", + "\n", + " Returns:\n", + " str: S3 URI of the repackaged model.\n", + " \"\"\"\n", + " s3 = boto3.client(\"s3\")\n", + " s3_uri = js_model.model_data[\"S3DataSource\"][\"S3Uri\"].rstrip(\"/\") + \"/\"\n", + " bucket, prefix = s3_uri.replace(\"s3://\", \"\").split(\"/\", 1)\n", + "\n", + " with tempfile.TemporaryDirectory() as tmpdir:\n", + " tmpdir = Path(tmpdir)\n", + "\n", + " # Download all model artifacts\n", + " for page in s3.get_paginator(\"list_objects_v2\").paginate(Bucket=bucket, Prefix=prefix):\n", + " for obj in page.get(\"Contents\", []):\n", + " if not obj[\"Key\"].endswith(\"/\"):\n", + " local_file = tmpdir / obj[\"Key\"][len(prefix):]\n", + " local_file.parent.mkdir(parents=True, exist_ok=True)\n", + " s3.download_file(bucket, obj[\"Key\"], str(local_file))\n", + "\n", + " # Create tar.gz archive\n", + " tar_path = tmpdir / \"model.tar.gz\"\n", + " with tarfile.open(tar_path, \"w:gz\") as tar:\n", + " tar.add(tmpdir, arcname=\".\")\n", + "\n", + " s3.upload_file(str(tar_path), output_bucket, output_key)\n", + "\n", + " return f\"s3://{output_bucket}/{output_key}\"" + ] + }, + { + "cell_type": "markdown", + "id": "44cb4b63", + "metadata": {}, + "source": [ + "### Create the SageMaker Model\n", + "\n", + "This model can be used for both Serverless Inference and Batch Transform." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83b50172", + "metadata": {}, + "outputs": [], + "source": [ + "# Reuse the role defined in Setup, or define a new one\n", + "# role = None # or \"arn:aws:iam::...\"\n", + "\n", + "# Use JumpStart to get the model artifacts and container image\n", + "js_model = JumpStartModel(\n", + " model_id=\"pytorch-forecasting-chronos-2\",\n", + " instance_type=\"ml.c5.4xlarge\", # Important: use CPU instance to ensure that correct image_uri is used\n", + " role=role,\n", + ")\n", + "\n", + "# Repackage model artifacts into a single tar.gz\n", + "session = Session()\n", + "bucket = session.default_bucket() # or \"your-bucket-name\"\n", + "s3_prefix = \"chronos-2\" # S3 prefix for model artifacts and data\n", + "\n", + "model_uri = repackage_jumpstart_model(js_model, bucket, output_key=f\"{s3_prefix}/model.tar.gz\")\n", + "print(f\"Repackaged model uploaded to: {model_uri}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89da3362", + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.predictor import Predictor\n", + "\n", + "chronos_model = Model(\n", + " name=\"chronos-2-cpu\", # Important: Model name should start with 'chronos-2'\n", + " model_data=model_uri,\n", + " image_uri=js_model.image_uri,\n", + " role=role,\n", + " predictor_cls=Predictor,\n", + ")\n", + "chronos_model.create()" + ] + }, + { + "cell_type": "markdown", + "id": "129bc389", + "metadata": {}, + "source": [ + "Alternatively, you can load an existing model as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7cb0f14", + "metadata": {}, + "outputs": [], + "source": [ + "# model_info = boto3.client(\"sagemaker\").describe_model(ModelName=\"chronos-2-cpu\")\n", + "# model = Model(\n", + "# model_data=model_info[\"PrimaryContainer\"][\"ModelDataUrl\"],\n", + "# image_uri=model_info[\"PrimaryContainer\"][\"Image\"],\n", + "# role=model_info[\"ExecutionRoleArn\"],\n", + "# name=model_info[\"ModelName\"],\n", + "# )" + ] + }, + { + "cell_type": "markdown", + "id": "ba12b52d", + "metadata": {}, + "source": [ + "---\n", + "## Section 2: Serverless Inference\n", + "\n", + "[Serverless Inference](https://docs.aws.amazon.com/sagemaker/latest/dg/serverless-endpoints.html) scales compute capacity based on traffic and scales to zero when idle, so you only pay for actual inference time.\n", + "\n", + "**When to use:**\n", + "- Sporadic or unpredictable traffic\n", + "- Cost-sensitive workloads with variable demand\n", + "- Development and testing environments\n", + "\n", + "**Limitations:**\n", + "- Cold start latency (first request after idle typically takes 30-60 seconds)\n", + "- Maximum memory: 6GB" + ] + }, + { + "cell_type": "markdown", + "id": "f6fc783c", + "metadata": {}, + "source": [ + "### Deploy Serverless Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6006c1a6", + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.serverless import ServerlessInferenceConfig\n", + "\n", + "serverless_predictor = chronos_model.deploy(\n", + " serverless_inference_config=ServerlessInferenceConfig(\n", + " memory_size_in_mb=6144, # Maximum available memory\n", + " max_concurrency=1,\n", + " ),\n", + " serializer=JSONSerializer(),\n", + " deserializer=JSONDeserializer(),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ed5056fa", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "### Query Serverless Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "8cb6f9f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'predictions': [{'mean': [-0.36, 4.02, 5.3, 2.45, -2.48, -5.14, -4.33, 0.06, 4.42, 5.14],\n", + " '0.1': [-1.68, 2.86, 4.01, 1.01, -3.77, -6.22, -5.39, -1.77, 2.6, 3.62],\n", + " '0.5': [-0.36, 4.02, 5.3, 2.45, -2.48, -5.14, -4.33, 0.06, 4.42, 5.14],\n", + " '0.9': [1.02, 5.02, 6.32, 3.82, -0.85, -3.92, -2.93, 1.83, 5.63, 6.44]}]}\n" + ] + } + ], + "source": [ + "payload = {\n", + " \"inputs\": [\n", + " {\"target\": [0.0, 4.0, 5.0, 1.5, -3.0, -5.0, -3.0, 1.5, 5.0, 4.0, 0.0, -4.0, -5.0, -1.5, 3.0, 5.0, 3.0, -1.5, -5.0, -4.0]},\n", + " ],\n", + " \"parameters\": {\"prediction_length\": 10},\n", + "}\n", + "response = serverless_predictor.predict(payload)\n", + "print(pretty_format(response))" + ] + }, + { + "cell_type": "markdown", + "id": "b4224e6a", + "metadata": {}, + "source": [ + "### Clean Up" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85d3f37e", + "metadata": {}, + "outputs": [], + "source": [ + "serverless_predictor.delete_predictor()" + ] + }, + { + "cell_type": "markdown", + "id": "47b366e3", + "metadata": {}, + "source": [ + "---\n", + "## Section 3: Batch Transform\n", + "\n", + "[Batch Transform](https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html) processes large datasets offline. SageMaker spins up compute, processes all data, and shuts down automatically.\n", + "\n", + "\n", + "**When to use:**\n", + "- Large-scale batch forecasting (thousands of time series)\n", + "- Scheduled or periodic forecasting jobs\n", + "- When latency is not critical\n", + "\n", + "**Limitations:**\n", + "- Not suitable for real-time predictions\n", + "- Requires data to be staged in S3" + ] + }, + { + "cell_type": "markdown", + "id": "7f94af60", + "metadata": {}, + "source": [ + "### Prepare Input Data\n", + "\n", + "The model uses the same API as described in the Endpoint API Reference at the end of the notebook, so you need to prepare your data in the expected JSON format.\n", + "\n", + "Batch Transform reads input from S3. Each line in the input file is a JSON payload that can contain multiple time series. For large datasets, use `items_per_record` to control how many time series are included per line (and thus per request)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ebe07edc", + "metadata": {}, + "outputs": [], + "source": [ + "# Load sample data\n", + "df = pd.read_csv(\n", + " \"https://autogluon.s3.amazonaws.com/datasets/timeseries/grocery_sales/test.csv\",\n", + " parse_dates=[\"timestamp\"],\n", + ")\n", + "\n", + "prediction_length = 8\n", + "target_col = \"unit_sales\"\n", + "freq = pd.infer_freq(df[df.item_id == df.item_id[0]][\"timestamp\"])\n", + "\n", + "past_df = df.groupby(\"item_id\").head(-prediction_length)\n", + "future_df = df.groupby(\"item_id\").tail(prediction_length).drop(columns=[target_col])\n", + "\n", + "# Convert DataFrame to payload and split into chunks\n", + "payload = convert_df_to_payload(past_df, future_df, prediction_length=prediction_length, freq=freq, target=target_col)\n", + "items_per_record = 100 # Number of time series per JSONL line\n", + "inputs, params = payload[\"inputs\"], payload[\"parameters\"]\n", + "lines = [json.dumps({\"inputs\": inputs[i:i + items_per_record], \"parameters\": params}) for i in range(0, len(inputs), items_per_record)]\n", + "\n", + "# Upload input data to S3\n", + "input_key = f\"{s3_prefix}/batch-input/input.jsonl\"\n", + "boto3.client(\"s3\").put_object(Bucket=bucket, Key=input_key, Body=\"\\n\".join(lines).encode())\n", + "input_s3_uri = f\"s3://{bucket}/{input_key}\"\n", + "print(f\"Input data uploaded to: {input_s3_uri} ({len(lines)} records)\")" + ] + }, + { + "cell_type": "markdown", + "id": "87f9ad5f", + "metadata": {}, + "source": [ + "### Run Batch Transform\n", + "\n", + "This uses the same `chronos_model` created in the setup section above." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d49d7b94", + "metadata": {}, + "outputs": [], + "source": [ + "from sagemaker.transformer import Transformer\n", + "\n", + "output_s3_uri = f\"s3://{bucket}/{s3_prefix}/batch-output/\"\n", + "\n", + "transformer = Transformer(\n", + " model_name=chronos_model.name,\n", + " instance_count=1,\n", + " instance_type=\"ml.c5.4xlarge\", # CPU instance\n", + " output_path=output_s3_uri,\n", + " strategy=\"SingleRecord\", # Process one JSON line at a time\n", + " assemble_with=\"Line\",\n", + " accept=\"application/json\",\n", + ")\n", + "\n", + "transformer.transform(\n", + " data=input_s3_uri,\n", + " content_type=\"application/json\",\n", + " split_type=\"Line\",\n", + " wait=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "dd65239f", + "metadata": {}, + "source": [ + "### Retrieve Batch Results" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "8c0fe2a4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
item_idtimestampmean0.10.50.9
01062_1012018-06-11320.102539186.102356320.102539486.852112
11062_1012018-06-18317.431396174.692490317.431396495.592224
21062_1012018-06-25316.319000169.798355316.319000507.396881
31062_1012018-07-02316.502472170.463837316.502472505.163483
41062_1012018-07-09309.931396164.362732309.931396505.276794
\n", + "
" + ], + "text/plain": [ + " item_id timestamp mean 0.1 0.5 0.9\n", + "0 1062_101 2018-06-11 320.102539 186.102356 320.102539 486.852112\n", + "1 1062_101 2018-06-18 317.431396 174.692490 317.431396 495.592224\n", + "2 1062_101 2018-06-25 316.319000 169.798355 316.319000 507.396881\n", + "3 1062_101 2018-07-02 316.502472 170.463837 316.502472 505.163483\n", + "4 1062_101 2018-07-09 309.931396 164.362732 309.931396 505.276794" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "output_key = f\"{s3_prefix}/batch-output/{input_key.split('/')[-1]}.out\"\n", + "result = boto3.client(\"s3\").get_object(Bucket=bucket, Key=output_key)\n", + "output_lines = result[\"Body\"].read().decode().strip().split(\"\\n\")\n", + "\n", + "# Combine predictions from all records\n", + "all_predictions = [p for line in output_lines for p in json.loads(line)[\"predictions\"]]\n", + "forecast_df = convert_response_to_df({\"predictions\": all_predictions}, freq=freq)\n", + "forecast_df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "19a8d5d6", + "metadata": {}, + "source": [ + "---\n", + "## See Also\n", + "\n", + "- [Scale real-time endpoints to zero](https://docs.aws.amazon.com/sagemaker/latest/dg/endpoint-auto-scaling-zero-instances.html) to optimize costs when the endpoint is idle\n", + "- [Asynchronous Inference](https://docs.aws.amazon.com/sagemaker/latest/dg/async-inference.html) handles traffic spikes better than real-time inference thanks to request queueing" + ] + }, + { + "cell_type": "markdown", + "id": "0164216d", + "metadata": {}, + "source": [ + "---\n", + "## Endpoint API Reference\n", + "\n", + "Below is a complete API specification for the Chronos-2 endpoint.\n", + "\n", + "* **inputs** (required): List with at most 1000 time series that need to be forecasted. Each time series is represented by a dictionary with the following keys:\n", + " * **target** (required): Observed time series values.\n", + " - For univariate forecasting: List of numeric values.\n", + " - For multivariate forecasting: List of lists, where each inner list represents one dimension. All dimensions must have the same length. If converted to a numpy array via `np.array(target)`, the shape would be `[num_dimensions, length]`.\n", + " - It is recommended that each time series contains at least 30 observations.\n", + " - If any time series contains fewer than 5 observations, an error will be raised.\n", + " * **item_id**: String that uniquely identifies each time series.\n", + " - If provided, the ID must be unique for each time series.\n", + " - If provided, then the endpoint response will also include the **item_id** field for each forecast.\n", + " * **start**: Timestamp of the first time series observation in ISO format (`YYYY-MM-DD` or `YYYY-MM-DDThh:mm:ss`).\n", + " - If **start** field is provided, then **freq** must also be provided as part of **parameters**.\n", + " - If provided, then the endpoint response will also include the **start** field indicating the first timestamp of each forecast.\n", + " * **past_covariates**: Dictionary containing the past values of the covariates for this time series.\n", + " - Each key in **past_covariates** corresponds to the name of the covariate. Each value must be an array consisting of all-numeric or all-string values, with the length equal to the length of the **target**.\n", + " - Covariates that appear only in **past_covariates** (and not in **future_covariates**) are treated as past-only covariates.\n", + " * **future_covariates**: Dictionary containing the future values of the covariates for this time series (values during the forecast horizon).\n", + " - Each key in **future_covariates** corresponds to the name of the covariate. Each value must be an array consisting of all-numeric or all-string values, with the length equal to **prediction_length**.\n", + " - Covariates that appear in both **past_covariates** and **future_covariates** are treated as known future covariates.\n", + "* **parameters**: Optional parameters to configure the model.\n", + " * **prediction_length**: Integer corresponding to the number of future time series values that need to be predicted. Defaults to `1`. Values up to `1024` are supported.\n", + " * **quantile_levels**: List of floats in range (0, 1) specifying which quantiles should be included in the probabilistic forecast. Defaults to `[0.1, 0.5, 0.9]`.\n", + " - Chronos-2 natively supports quantile levels in range `[0.01, 0.99]`. Predictions outside the range will be clipped.\n", + " * **freq**: Frequency of the time series observations in [pandas-compatible format](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases). For example, `1h` for hourly data or `2W` for bi-weekly data.\n", + " - If **freq** is provided, then **start** must also be provided for each time series in **inputs**.\n", + " * **batch_size**: Number of time series processed in parallel by the model. Larger values speed up inference but may lead to out of memory errors. Defaults to `256`.\n", + " * **cross_learning**: If `True`, the model will apply group attention to all items in the batch, instead of processing each item separately (described as \"full cross-learning mode\" in the [technical report](https://www.arxiv.org/abs/2510.15821)). This may produce more accurate forecasts for some tasks. Defaults to `False`.\n", + "\n", + "All keys not marked with (required) are optional.\n", + "\n", + "The endpoint response contains the probabilistic (quantile) forecast for each time series included in the request." + ] + } + ], + "metadata": { + "jupytext": { + "cell_metadata_filter": "-all", + "main_language": "python", + "notebook_metadata_filter": "-all" + }, + "kernelspec": { + "display_name": "ag", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index b42c37f..d9e7117 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,13 +14,12 @@ readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.10" dependencies = [ - "torch>=2.0,<3", - "transformers>=4.49,<5", + "torch>=2.2,<3", + "transformers>=4.41,<5", "accelerate>=0.34,<2", "numpy>=1.21,<3", "einops>=0.7.0,<1", "scikit-learn>=1.6.0,<2", - "boto3", ] classifiers = [ "Programming Language :: Python :: 3", @@ -40,7 +39,19 @@ packages = ["src/chronos"] path = "src/chronos/__about__.py" [project.optional-dependencies] -test = ["pytest~=8.0", "numpy>=1.21,<3", "fev>=0.6.1", "pandas>=2.0,<2.4"] +extras = [ + "boto3>=1.10,<2", + "peft>=0.13.0,<0.18", + "fev>=0.6.1", + "pandas[pyarrow]>=2.0,<2.4", +] +test = [ + "pytest~=8.0", + "boto3>=1.10,<2", + "peft>=0.13.0,<1", + "fev>=0.6.1", + "pandas[pyarrow]>=2.0,<2.4", +] typecheck = ["mypy~=1.9"] dev = [ "gluonts[pro]~=0.16", diff --git a/scripts/evaluation/evaluate.py b/scripts/evaluation/evaluate.py index 1ea9fca..594f0c2 100644 --- a/scripts/evaluation/evaluate.py +++ b/scripts/evaluation/evaluate.py @@ -295,7 +295,7 @@ def chronos_2( device: str = "cuda", torch_dtype: str = "float32", batch_size: int = 32, - predict_batches_jointly: bool = False, + cross_learning: bool = False, ): """Evaluate Chronos-2 models. @@ -316,7 +316,7 @@ def chronos_2( batch_size : int, optional, default = 32 Batch size for inference. For Chronos-Bolt models, significantly larger batch sizes can be used - predict_batches_jointly: bool, optional, default = False + cross_learning: bool, optional, default = False If True, cross-learning is enables and model makes joint predictions for all items in the batch """ @@ -335,7 +335,7 @@ def chronos_2( metrics_path=metrics_path, model_id=model_id, batch_size=batch_size, - predict_batches_jointly=predict_batches_jointly, + cross_learning=cross_learning, ) diff --git a/scripts/training/train.py b/scripts/training/train.py index c16092e..09d5d8e 100644 --- a/scripts/training/train.py +++ b/scripts/training/train.py @@ -663,7 +663,6 @@ def main( lr_scheduler_type=lr_scheduler_type, warmup_ratio=warmup_ratio, optim=optim, - logging_dir=str(output_dir / "logs"), logging_strategy="steps", logging_steps=log_steps, save_strategy="steps", diff --git a/src/chronos/__about__.py b/src/chronos/__about__.py index 8c0d5d5..ba51ced 100644 --- a/src/chronos/__about__.py +++ b/src/chronos/__about__.py @@ -1 +1 @@ -__version__ = "2.0.0" +__version__ = "2.2.2" diff --git a/src/chronos/base.py b/src/chronos/base.py index 34fa91b..2bba087 100644 --- a/src/chronos/base.py +++ b/src/chronos/base.py @@ -17,8 +17,10 @@ import torch if TYPE_CHECKING: import datasets import fev + import pandas as pd from transformers import PreTrainedModel + from .utils import left_pad_and_stack_1D @@ -53,6 +55,14 @@ class BaseChronosPipeline(metaclass=PipelineRegistry): # for easy access to the inner HF-style model self.inner_model = inner_model + @property + def model_context_length(self) -> int: + raise NotImplementedError() + + @property + def model_prediction_length(self) -> int: + raise NotImplementedError() + def _prepare_and_validate_context(self, context: Union[torch.Tensor, List[torch.Tensor]]): if isinstance(context, list): context = left_pad_and_stack_1D(context) @@ -122,6 +132,123 @@ class BaseChronosPipeline(metaclass=PipelineRegistry): """ raise NotImplementedError() + def predict_df( + self, + df: "pd.DataFrame", + *, + id_column: str = "item_id", + timestamp_column: str = "timestamp", + target: str = "target", + prediction_length: int | None = None, + quantile_levels: list[float] = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9], + validate_inputs: bool = True, + freq: str | None = None, + **predict_kwargs, + ) -> "pd.DataFrame": + """ + Perform forecasting on time series data in a long-format pandas DataFrame. + + Parameters + ---------- + df + Time series data in long format with an id column, a timestamp, and one target column. + Any other columns, if present, will be ignored + id_column + The name of the column which contains the unique time series identifiers, by default "item_id" + timestamp_column + The name of the column which contains timestamps, by default "timestamp" + All time series in the dataframe must have regular timestamps with the same frequency (no gaps) + target + The name of the column which contains the target variables to be forecasted, by default "target" + prediction_length + Number of steps to predict for each time series + quantile_levels + Quantile levels to compute + validate_inputs + [ADVANCED] When True (default), validates dataframes before prediction. Setting to False removes the + validation overhead, but may silently lead to wrong predictions if data is misformatted. When False, you + must ensure: (1) all dataframes are sorted by (id_column, timestamp_column); (2) future_df (if provided) + has the same item IDs as df with exactly prediction_length rows of future timestamps per item; (3) all + timestamps are regularly spaced (e.g., with hourly frequency). + freq + Frequency string for timestamp generation (e.g., "h", "D", "W"). Can only be used when + validate_inputs=False. When provided, skips frequency inference from the data. + **predict_kwargs + Additional arguments passed to predict_quantiles + + Returns + ------- + The forecasts dataframe generated by the model with the following columns + - `id_column`: The time series ID + - `timestamp_column`: Future timestamps + - "target_name": The name of the target column + - "predictions": The point predictions generated by the model + - One column for predictions at each quantile level in `quantile_levels` + """ + try: + import pandas as pd + + from .df_utils import convert_df_input_to_list_of_dicts_input + except ImportError: + raise ImportError("pandas is required for predict_df. Please install it with `pip install pandas`.") + + if not isinstance(target, str): + raise ValueError( + f"Expected `target` to be str, but found {type(target)}. {self.__class__.__name__} only supports univariate forecasting." + ) + + if prediction_length is None: + prediction_length = self.model_prediction_length + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + id_column=id_column, + timestamp_column=timestamp_column, + target_columns=[target], + prediction_length=prediction_length, + freq=freq, + validate_inputs=validate_inputs, + ) + + # NOTE: any covariates, if present, are ignored here + context = [torch.tensor(item["target"]).squeeze(0) for item in inputs] # squeeze the extra variate dim + + # Generate forecasts + quantiles, mean = self.predict_quantiles( + inputs=context, + prediction_length=prediction_length, + quantile_levels=quantile_levels, + limit_prediction_length=False, + **predict_kwargs, + ) + + quantiles_np = quantiles.numpy() # [n_series, horizon, num_quantiles] + mean_np = mean.numpy() # [n_series, horizon] + + series_ids = list(prediction_timestamps.keys()) + future_ts = list(prediction_timestamps.values()) + + data = { + id_column: np.repeat(series_ids, prediction_length), + timestamp_column: np.concatenate(future_ts), + "target_name": target, + "predictions": mean_np.ravel(), + } + + quantiles_flat = quantiles_np.reshape(-1, len(quantile_levels)) + for q_idx, q_level in enumerate(quantile_levels): + data[str(q_level)] = quantiles_flat[:, q_idx] + + predictions_df = pd.DataFrame(data) + # If validate_inputs=False, the df is used as-is without sorting by item_id, no reordering required + if validate_inputs: + predictions_df.set_index(id_column, inplace=True) + predictions_df = predictions_df.loc[original_order] + predictions_df.reset_index(inplace=True) + + return predictions_df + def predict_fev( self, task: "fev.Task", batch_size: int = 32, **kwargs ) -> tuple[list["datasets.DatasetDict"], float]: diff --git a/src/chronos/boto_utils.py b/src/chronos/boto_utils.py index 7d0d16d..3e20e97 100644 --- a/src/chronos/boto_utils.py +++ b/src/chronos/boto_utils.py @@ -6,6 +6,7 @@ import logging import os import re +import warnings from pathlib import Path import boto3 @@ -110,6 +111,12 @@ def cache_model_from_s3( # Use CloudFront CDN for faster, cached downloads if available if cloudfront_url: + warnings.warn( + f"Loading {s3_uri} from CloudFront is deprecated and will be removed in a future version. " + f'Please specify a HuggingFace model_id instead. For example: Chronos2Pipeline.from_pretrained("amazon/chronos-2")', + category=FutureWarning, + stacklevel=3, + ) try: download_model_files_from_cloudfront( cloudfront_url=cloudfront_url, diff --git a/src/chronos/chronos.py b/src/chronos/chronos.py index 94211a0..5540df3 100644 --- a/src/chronos/chronos.py +++ b/src/chronos/chronos.py @@ -377,6 +377,14 @@ class ChronosPipeline(BaseChronosPipeline): self.tokenizer = tokenizer self.model = model + @property + def model_context_length(self) -> int: + return self.model.config.context_length + + @property + def model_prediction_length(self) -> int: + return self.model.config.prediction_length + def _prepare_and_validate_context(self, context: Union[torch.Tensor, List[torch.Tensor]]): if isinstance(context, list): context = left_pad_and_stack_1D(context) diff --git a/src/chronos/chronos2/config.py b/src/chronos/chronos2/config.py index f73fda5..c6e011c 100644 --- a/src/chronos/chronos2/config.py +++ b/src/chronos/chronos2/config.py @@ -4,7 +4,7 @@ # Authors: Abdul Fatir Ansari from dataclasses import dataclass -from typing import List +from typing import List, Literal from transformers.configuration_utils import PretrainedConfig @@ -39,6 +39,8 @@ class Chronos2CoreConfig(PretrainedConfig): Token ID for padding/missing value token, by default 0 rope_theta The base theta for rotary position embedding (RoPE), by default 10000.0 + attn_implementation + The attention implementation to use. Options: "eager" or "sdpa", by default None (uses "sdpa") """ model_type = "t5" @@ -63,6 +65,7 @@ class Chronos2CoreConfig(PretrainedConfig): vocab_size: int = 2, pad_token_id: int = 0, rope_theta: float = 10000.0, + attn_implementation: Literal["eager", "sdpa"] | None = None, **kwargs, ): self.vocab_size = vocab_size @@ -83,11 +86,17 @@ class Chronos2CoreConfig(PretrainedConfig): assert not self.is_gated_act, "gated activation is not supported" + # Attention implementation - default to "sdpa" if not specified + attn_implementation = attn_implementation or "sdpa" + assert attn_implementation in ["eager", "sdpa"], f"attn_implementation {attn_implementation} not supported" + # unused kwargs.pop("is_encoder_decoder", None) kwargs.pop("eos_token_id", None) - super().__init__(pad_token_id=pad_token_id, is_encoder_decoder=False, **kwargs) + super().__init__( + pad_token_id=pad_token_id, is_encoder_decoder=False, attn_implementation=attn_implementation, **kwargs + ) @dataclass diff --git a/src/chronos/chronos2/dataset.py b/src/chronos/chronos2/dataset.py index 61a8a0f..2e1b6a1 100644 --- a/src/chronos/chronos2/dataset.py +++ b/src/chronos/chronos2/dataset.py @@ -5,7 +5,7 @@ import math from enum import Enum -from typing import TYPE_CHECKING, Iterator, Mapping, Sequence, TypeAlias, cast +from typing import TYPE_CHECKING, Any, Iterable, Iterator, Mapping, Sequence, TypeAlias, TypedDict, cast import numpy as np import torch @@ -15,12 +15,21 @@ from torch.utils.data import IterableDataset if TYPE_CHECKING: import datasets import fev - import pandas as pd TensorOrArray: TypeAlias = torch.Tensor | np.ndarray +class PreparedInput(TypedDict): + """A preprocessed time series input ready for model training/inference.""" + + context: torch.Tensor # (n_variates, history_length), float32 + future_covariates: torch.Tensor # (n_variates, prediction_length), float32 + n_targets: int + n_covariates: int + n_future_covariates: int + + def left_pad_and_cat_2D(tensors: list[torch.Tensor]) -> torch.Tensor: """ Left pads tensors in the list to the length of the longest tensor along the second axis, then concats @@ -38,14 +47,14 @@ def left_pad_and_cat_2D(tensors: list[torch.Tensor]) -> torch.Tensor: return torch.cat(padded, dim=0) -def validate_and_prepare_single_dict_task( - task: Mapping[str, TensorOrArray | Mapping[str, TensorOrArray]], idx: int, prediction_length: int -) -> tuple[torch.Tensor, torch.Tensor, int, int, int]: - """Validates and prepares a single dictionary task for Chronos2Model. +def validate_and_prepare_single_dict_input( + raw_input: Mapping[str, TensorOrArray | Mapping[str, TensorOrArray]], idx: int, prediction_length: int +) -> PreparedInput: + """Validates and prepares a single dictionary input for Chronos2Model. Parameters ---------- - task + raw_input A dictionary representing a time series that contains: - `target` (required): a 1-d or 2-d `torch.Tensor` or `np.ndarray` of shape (history_length,) or (n_variates, history_length). Forecasts will be generated for items in `target`. @@ -56,27 +65,27 @@ def validate_and_prepare_single_dict_task( covariates and values must be 1-d `torch.Tensor` or `np.ndarray` with length equal to the `prediction_length`. All keys in `future_covariates` must be a subset of the keys in `past_covariates`. idx - Index of this task in the list of tasks, used for error messages + Index of this input in the list of inputs, used for error messages prediction_length Number of future time steps to predict, used to validate future covariates Returns ------ - A tuple containing: - - task_context_tensor: Concatenated tensor of target and past covariates of shape (group_size, history_length), - the first `task_n_targets` items along the first axis contain the target variables and the remaining items contain past-only covariates + A PreparedInput containing: + - context: Concatenated tensor of target and past covariates of shape (group_size, history_length), + the first `n_targets` items along the first axis contain the target variables and the remaining items contain past-only covariates and past values of known future covariates. - - task_future_covariates_tensor: Tensor of future covariates of shape (group_size, prediction_length). The last `task_n_future_covariates` + - future_covariates: Tensor of future covariates of shape (group_size, prediction_length). The last `n_future_covariates` items along the first axis contain future covariates. All the remaining elements corresponding to target and past-only covariates are NaNs. - - task_n_targets: Number of target variables - - task_n_covariates: Total number of covariates (sum of past-only and known future covariates) - - task_n_future_covariates: Number of known future covariates + - n_targets: Number of target variables + - n_covariates: Total number of covariates (sum of past-only and known future covariates) + - n_future_covariates: Number of known future covariates """ allowed_keys = {"target", "past_covariates", "future_covariates"} # validate keys - keys = set(task.keys()) + keys = set(raw_input.keys()) if not keys.issubset(allowed_keys): raise ValueError( f"Found invalid keys in element at index {idx}. Allowed keys are {allowed_keys}, but found {keys}" @@ -85,38 +94,58 @@ def validate_and_prepare_single_dict_task( raise ValueError(f"Element at index {idx} does not contain the required key 'target'") # validate target - task_target = task["target"] - if isinstance(task_target, np.ndarray): - task_target = torch.from_numpy(task_target) - assert isinstance(task_target, torch.Tensor) - if task_target.ndim > 2: + target = raw_input["target"] + if isinstance(target, np.ndarray): + target = torch.from_numpy(target) + assert isinstance(target, torch.Tensor) + if target.ndim > 2: raise ValueError( "When the input is a list of dicts, the `target` should either be 1-d with shape (history_length,) " - f" or 2-d with shape (n_variates, history_length). Found element at index {idx} with shape {tuple(task_target.shape)}." + f" or 2-d with shape (n_variates, history_length). Found element at index {idx} with shape {tuple(target.shape)}." ) - history_length = task_target.shape[-1] - task_target = task_target.view(-1, history_length) + history_length = target.shape[-1] + target = target.view(-1, history_length) # validate past_covariates cat_encoders: dict = {} - task_past_covariates = task.get("past_covariates", {}) - if not isinstance(task_past_covariates, dict): + past_covariates = raw_input.get("past_covariates", {}) + if not isinstance(past_covariates, dict): raise ValueError( f"Found invalid type for `past_covariates` in element at index {idx}. " - f'Expected dict with {{"feat_1": tensor_1, "feat_2": tensor_2, ...}}, but found {type(task_past_covariates)}' + f'Expected dict with {{"feat_1": tensor_1, "feat_2": tensor_2, ...}}, but found {type(past_covariates)}' ) - task_covariates_keys = sorted(task_past_covariates.keys()) - task_past_covariates_list: list[torch.Tensor] = [] - for key in task_covariates_keys: - tensor = task_past_covariates[key] + + # gather keys and ensure known-future keys come last to match downstream assumptions + covariates_keys = sorted(past_covariates.keys()) + + future_covariates = raw_input.get("future_covariates", {}) + if not isinstance(future_covariates, dict): + raise ValueError( + f"Found invalid type for `future_covariates` in element at index {idx}. " + f'Expected dict with {{"feat_1": tensor_1, "feat_2": tensor_2, ...}}, but found {type(future_covariates)}' + ) + future_covariates_keys = sorted(future_covariates.keys()) + if not set(future_covariates_keys).issubset(covariates_keys): + raise ValueError( + f"Expected keys in `future_covariates` to be a subset of `past_covariates` {covariates_keys}, " + f"but found {future_covariates_keys} in element at index {idx}" + ) + + # create ordered keys: past-only first, then known-future (so known-future are the last rows) + past_only_keys = [k for k in covariates_keys if k not in future_covariates_keys] + ordered_covariate_keys = past_only_keys + future_covariates_keys + + past_covariates_list: list[torch.Tensor] = [] + for key in ordered_covariate_keys: + tensor = past_covariates[key] if isinstance(tensor, np.ndarray): # apply encoding to categorical variates if not np.issubdtype(tensor.dtype, np.number): # target encoding, if the target is 1-d - if task_target.shape[0] == 1: + if target.shape[0] == 1: cat_encoder = TargetEncoder(target_type="continuous", smooth=1.0) X = tensor.astype(str).reshape(-1, 1) - y = task_target.view(-1).numpy() + y = target.view(-1).numpy() mask = np.isfinite(y) X = X[mask] y = y[mask] @@ -134,29 +163,18 @@ def validate_and_prepare_single_dict_task( f"Individual `past_covariates` must be 1-d with length equal to the length of `target` (= {history_length}), " f"found: {key} with shape {tuple(tensor.shape)} in element at index {idx}" ) - task_past_covariates_list.append(tensor) - task_past_covariates_tensor = ( - torch.stack(task_past_covariates_list, dim=0) - if task_past_covariates_list - else torch.zeros((0, history_length), device=task_target.device) + past_covariates_list.append(tensor) + past_covariates_tensor = ( + torch.stack(past_covariates_list, dim=0) + if past_covariates_list + else torch.zeros((0, history_length), device=target.device) ) - # validate future_covariates - task_future_covariates = task.get("future_covariates", {}) - if not isinstance(task_future_covariates, dict): - raise ValueError( - f"Found invalid type for `future_covariates` in element at index {idx}. " - f'Expected dict with {{"feat_1": tensor_1, "feat_2": tensor_2, ...}}, but found {type(task_future_covariates)}' - ) - task_future_covariates_keys = sorted(task_future_covariates.keys()) - if not set(task_future_covariates_keys).issubset(task_covariates_keys): - raise ValueError( - f"Expected keys in `future_covariates` to be a subset of `past_covariates` {task_covariates_keys}, " - f"but found {task_future_covariates_keys} in element at index {idx}" - ) - task_future_covariates_list: list[torch.Tensor] = [] - for key in task_covariates_keys: + + # validate future_covariates (build rows in the same ordered_covariate_keys order) + future_covariates_list: list[torch.Tensor] = [] + for key in ordered_covariate_keys: # future values of past-only covariates are filled with NaNs - tensor = task_future_covariates.get(key, torch.full((prediction_length,), fill_value=torch.nan)) + tensor = future_covariates.get(key, torch.full((prediction_length,), fill_value=torch.nan)) if isinstance(tensor, np.ndarray): # apply encoding to categorical variates if not np.issubdtype(tensor.dtype, np.number): @@ -169,34 +187,118 @@ def validate_and_prepare_single_dict_task( f"Individual `future_covariates` must be 1-d with length equal to the {prediction_length=}, " f"found: {key} with shape {tuple(tensor.shape)} in element at index {idx}" ) - task_future_covariates_list.append(tensor) - task_future_covariates_tensor = ( - torch.stack(task_future_covariates_list, dim=0) - if task_future_covariates_list - else torch.zeros((0, prediction_length), device=task_target.device) + future_covariates_list.append(tensor) + future_covariates_tensor = ( + torch.stack(future_covariates_list, dim=0) + if future_covariates_list + else torch.zeros((0, prediction_length), device=target.device) ) # future values of target series are filled with NaNs - task_future_covariates_target_padding = torch.full( - (task_target.shape[0], prediction_length), fill_value=torch.nan, device=task_target.device + future_covariates_target_padding = torch.full( + (target.shape[0], prediction_length), fill_value=torch.nan, device=target.device ) - task_context_tensor = torch.cat([task_target, task_past_covariates_tensor], dim=0).to(dtype=torch.float32) - task_future_covariates_tensor = torch.cat( - [task_future_covariates_target_padding, task_future_covariates_tensor], dim=0 + context_tensor = torch.cat([target, past_covariates_tensor], dim=0).to(dtype=torch.float32) + future_covariates_tensor = torch.cat( + [future_covariates_target_padding, future_covariates_tensor], dim=0 ).to(dtype=torch.float32) - task_n_targets = task_target.shape[0] - task_n_covariates = task_past_covariates_tensor.shape[0] - task_n_future_covariates = len(task_future_covariates_list) + n_targets = target.shape[0] + n_covariates = past_covariates_tensor.shape[0] + # number of known-future covariates + n_future_covariates = len(future_covariates_keys) - return ( - task_context_tensor, - task_future_covariates_tensor, - task_n_targets, - task_n_covariates, - task_n_future_covariates, + return PreparedInput( + context=context_tensor, + future_covariates=future_covariates_tensor, + n_targets=n_targets, + n_covariates=n_covariates, + n_future_covariates=n_future_covariates, ) +def prepare_inputs( + raw_inputs: Iterable[Mapping[str, Any]], + prediction_length: int, + min_past: int = 1, + mode: "DatasetMode | str" = "train", +) -> list[PreparedInput]: + """Prepare multiple time series inputs for training/inference. + + This function handles mode-specific preprocessing (e.g., filtering short series) + and calls validate_and_prepare_single_dict_input for each input. + """ + inputs: list[PreparedInput] = [] + + for idx, raw_input in enumerate(raw_inputs): + # For non-TEST modes, fix future_covariates (replace None/empty with NaN arrays) + if mode != DatasetMode.TEST: + raw_future_covariates = raw_input.get("future_covariates", {}) + if raw_future_covariates: + raw_future_covariates = cast(dict[str, TensorOrArray | None], raw_future_covariates) + fixed_future_covariates = {} + for key, value in raw_future_covariates.items(): + fixed_future_covariates[key] = ( + np.full(prediction_length, np.nan) if value is None or len(value) == 0 else value + ) + raw_input = {**raw_input, "future_covariates": fixed_future_covariates} + + raw_input = cast(dict[str, TensorOrArray | Mapping[str, TensorOrArray]], raw_input) + prepared = validate_and_prepare_single_dict_input(raw_input, idx, prediction_length) + + # Filter by minimum length (except in TEST mode) + if mode != DatasetMode.TEST and prepared["context"].shape[-1] < min_past + prediction_length: + continue + + inputs.append(prepared) + + if len(inputs) == 0: + raise ValueError( + "The dataset is empty after filtering based on the length of the time series (length >= min_past + prediction_length). " + "Please provide longer time series or reduce `min_past` or `prediction_length`. " + ) + + return inputs + + +def validate_prepared_schema(prepared_input: Any) -> None: + """Validate that an input matches the PreparedInput schema.""" + if not isinstance(prepared_input, Mapping): + raise TypeError( + f"Expected input to be a dict-like, got {type(prepared_input).__name__}. " + "Set convert_inputs=True when calling fit() to preprocess raw inputs." + ) + + required_keys = {"context", "future_covariates", "n_targets", "n_covariates", "n_future_covariates"} + missing = required_keys - set(prepared_input.keys()) + if missing: + raise TypeError( + f"Input is missing required keys: {missing}. Set convert_inputs=True when calling fit() to preprocess raw inputs." + ) + + context = prepared_input["context"] + if not isinstance(context, torch.Tensor) or context.ndim != 2: + raise TypeError( + f"Expected 'context' to be 2-d torch.Tensor, got {type(context).__name__} " + f"with shape {getattr(context, 'shape', 'N/A')}. " + "Set convert_inputs=True when calling fit() to preprocess raw inputs." + ) + + future_covariates = prepared_input["future_covariates"] + if not isinstance(future_covariates, torch.Tensor) or future_covariates.ndim != 2: + raise TypeError( + f"Expected 'future_covariates' to be 2-d torch.Tensor, got {type(future_covariates).__name__} " + f"with shape {getattr(future_covariates, 'shape', 'N/A')}. " + "Set convert_inputs=True when calling fit() to preprocess raw inputs." + ) + + if context.shape[0] != future_covariates.shape[0]: + raise ValueError( + f"Expected 'context' and 'future_covariates' to have the same first dimension, " + f"got {context.shape[0]} and {future_covariates.shape[0]}. " + "Set convert_inputs=True when calling fit() to preprocess raw inputs." + ) + + def convert_list_of_tensors_input_to_list_of_dicts_input( list_of_tensors: Sequence[TensorOrArray], ) -> list[dict[str, torch.Tensor]]: @@ -265,308 +367,6 @@ def convert_tensor_input_to_list_of_dicts_input(tensor: TensorOrArray) -> list[d return output -def _validate_df_types_and_cast( - df: "pd.DataFrame", - future_df: "pd.DataFrame | None", - target_columns: list[str], - id_column: str = "item_id", - timestamp_column: str = "timestamp", -) -> tuple["pd.DataFrame", "pd.DataFrame | None"]: - import pandas as pd - - astype_dict = {} - future_astype_dict = {} - for col in df.columns.drop([id_column, timestamp_column]): - col_dtype = df[col].dtype - if col in target_columns and not pd.api.types.is_numeric_dtype(df[col]): - raise ValueError(f"All target columns must be numeric but got {col=} with dtype={col_dtype}") - - if ( - pd.api.types.is_object_dtype(df[col]) - or pd.api.types.is_string_dtype(df[col]) - or isinstance(col_dtype, pd.CategoricalDtype) - ): - astype_dict[col] = "category" - elif pd.api.types.is_numeric_dtype(df[col]) or pd.api.types.is_bool_dtype(df[col]): - astype_dict[col] = "float32" - else: - raise ValueError( - f"All columns must contain numeric, object, category, string, or bool dtype but got {col=} with dtype={col_dtype}" - ) - - if future_df is not None and col in future_df.columns: - if future_df[col].dtype != col_dtype: - raise ValueError( - f"Column {col} in future_df has dtype {future_df[col].dtype} but column in df has dtype {col_dtype}" - ) - future_astype_dict[col] = astype_dict[col] - - df = df.astype(astype_dict, copy=True) - if future_df is not None: - future_df = future_df.astype(future_astype_dict, copy=True) - - return df, future_df - - -def validate_df_inputs( - df: "pd.DataFrame", - future_df: "pd.DataFrame | None", - target_columns: list[str], - prediction_length: int, - id_column: str = "item_id", - timestamp_column: str = "timestamp", -) -> tuple["pd.DataFrame", "pd.DataFrame | None", "pd.Timedelta", list[int], list[int] | None, np.ndarray]: - """ - Validates and prepares dataframe inputs passed to `Chronos2Pipeline.predict_df`. - - Parameters - ---------- - df - Input dataframe containing time series data with columns: - - id_column: Identifier for each time series - - timestamp_column: Timestamps for each observation - - target_columns: One or more target variables to forecast - - Additional columns are treated as covariates - future_df - Optional dataframe containing future covariate values with columns: - - id_column: Identifier for each time series - - timestamp_column: Future timestamps - - Subset of covariate columns from df - target_columns - Names of target columns to forecast - prediction_length - Number of future time steps to predict - id_column - Name of column containing time series identifiers - timestamp_column - Name of column containing timestamps - - Returns - ------- - A tuple containing: - - Validated and sorted input dataframe - - Validated and sorted future dataframe (if provided) - - Inferred frequency of the time series - - List of series lengths from input dataframe - - List of series lengths from future dataframe (if provided) - - Original order of time series IDs - - Raises - ------ - ValueError - If validation fails for: - - Missing required columns - - Invalid data types - - Inconsistent frequencies - - Insufficient data points - - Mismatched series between df and future_df - - Invalid future_df lengths - """ - - import pandas as pd - - required_cols = [id_column, timestamp_column] + target_columns - missing_cols = [col for col in required_cols if col not in df.columns] - if missing_cols: - raise ValueError(f"df does not contain all expected columns. Missing columns: {missing_cols}") - - if future_df is not None: - future_required_cols = [id_column, timestamp_column] - missing_future_cols = [col for col in future_required_cols if col not in future_df.columns] - targets_in_future = [col for col in future_df.columns if col in target_columns] - extra_future_cols = [col for col in future_df.columns if col not in df.columns] - if missing_future_cols: - raise ValueError( - f"future_df does not contain all expected columns. Missing columns: {missing_future_cols}" - ) - if targets_in_future: - raise ValueError( - f"future_df cannot contain target columns. Target columns found in future_df: {targets_in_future}" - ) - if extra_future_cols: - raise ValueError(f"future_df cannot contain columns not present in df. Extra columns: {extra_future_cols}") - - df, future_df = _validate_df_types_and_cast( - df, future_df, id_column=id_column, timestamp_column=timestamp_column, target_columns=target_columns - ) - - # Get the original order of time series IDs - original_order = df[id_column].unique() - - # Sort and prepare df - df[timestamp_column] = pd.to_datetime(df[timestamp_column]) - df = df.sort_values([id_column, timestamp_column]) - - # Get series lengths - series_lengths = df[id_column].value_counts(sort=False).to_list() - - def validate_freq(timestamps: pd.Series, series_id: str): - freq = pd.infer_freq(timestamps) - if not freq: - raise ValueError(f"Could not infer frequency for series {series_id}") - return freq - - # Validate each series - all_freqs = [] - start_idx = 0 - for length in series_lengths: - if length < 3: - series_id = df.iloc[start_idx][id_column] - raise ValueError( - f"Every time series must have at least 3 data points, found {length=} for series {series_id}" - ) - - series_data = df.iloc[start_idx : start_idx + length] - timestamps = series_data[timestamp_column] - series_id = series_data.iloc[0][id_column] - all_freqs.append(validate_freq(timestamps, series_id)) - start_idx += length - - if len(set(all_freqs)) > 1: - raise ValueError("All time series must have the same frequency") - - inferred_freq = all_freqs[0] - - # Sort future_df if provided and validate its series lengths - future_series_lengths = None - if future_df is not None: - future_df[timestamp_column] = pd.to_datetime(future_df[timestamp_column]) - future_df = future_df.sort_values([id_column, timestamp_column]) - - # Validate that future_df contains all series from df - context_ids = set(df[id_column].unique()) - future_ids = set(future_df[id_column].unique()) - if context_ids != future_ids: - raise ValueError("future_df must contain the same time series IDs as df") - - future_series_lengths = future_df[id_column].value_counts(sort=False).to_list() - - # Validate future series lengths match prediction_length - future_start_idx = 0 - for future_length in future_series_lengths: - future_series_data = future_df.iloc[future_start_idx : future_start_idx + future_length] - future_timestamps = future_series_data[timestamp_column] - future_series_id = future_series_data.iloc[0][id_column] - if future_length != prediction_length: - raise ValueError( - f"Future covariates all time series must have length {prediction_length}, got {future_length} for series {future_series_id}" - ) - if future_length < 3 or inferred_freq != validate_freq(future_timestamps, future_series_id): - raise ValueError( - f"Future covariates must have the same frequency as context, found series {future_series_id} with a different frequency" - ) - future_start_idx += future_length - - assert len(series_lengths) == len(future_series_lengths) - - return df, future_df, inferred_freq, series_lengths, future_series_lengths, original_order - - -def convert_df_input_to_list_of_dicts_input( - df: "pd.DataFrame", - future_df: "pd.DataFrame | None", - target_columns: list[str], - prediction_length: int, - id_column: str = "item_id", - timestamp_column: str = "timestamp", -) -> tuple[list[dict[str, np.ndarray | dict[str, np.ndarray]]], np.ndarray, dict[str, "pd.DatetimeIndex"]]: - """ - Convert from dataframe input format to a list of dictionaries input format. - - Parameters - ---------- - df - Input dataframe containing time series data with columns: - - id_column: Identifier for each time series - - timestamp_column: Timestamps for each observation - - target_columns: One or more target variables to forecast - - Additional columns are treated as covariates - future_df - Optional dataframe containing future covariate values with columns: - - id_column: Identifier for each time series - - timestamp_column: Future timestamps - - Subset of covariate columns from df - target_columns - Names of target columns to forecast - prediction_length - Number of future time steps to predict - id_column - Name of column containing time series identifiers - timestamp_column - Name of column containing timestamps - - Returns - ------- - A tuple containing: - - List of dictionaries in the format expected by `Chronos2Pipeline.predict` - - Original order of time series IDs - - Dictionary mapping series IDs to future time index - """ - - import pandas as pd - - df, future_df, freq, series_lengths, future_series_lengths, original_order = validate_df_inputs( - df, - future_df=future_df, - id_column=id_column, - timestamp_column=timestamp_column, - target_columns=target_columns, - prediction_length=prediction_length, - ) - - # Convert to list of dicts format - inputs: list[dict[str, np.ndarray | dict[str, np.ndarray]]] = [] - prediction_timestamps: dict[str, pd.DatetimeIndex] = {} - start_idx: int = 0 - future_start_idx: int = 0 - - for i, length in enumerate(series_lengths): - series_data = df.iloc[start_idx : start_idx + length] - # Extract target(s) - target_data = series_data[target_columns].to_numpy().T # Shape: (n_targets, history_length) - task: dict[str, np.ndarray | dict[str, np.ndarray]] = {"target": target_data} - - # Generate future timestamps - series_id = series_data.iloc[0][id_column] - last_timestamp = series_data[timestamp_column].iloc[-1] - future_ts = pd.date_range(start=last_timestamp, periods=prediction_length + 1, freq=freq)[1:] - prediction_timestamps[series_id] = future_ts - - # Handle covariates if present - covariate_cols = [ - col for col in series_data.columns if col not in [id_column, timestamp_column] + target_columns - ] - - if covariate_cols: - past_covariates = {col: series_data[col].to_numpy() for col in covariate_cols} - task["past_covariates"] = past_covariates - - # Handle future covariates - if future_df is not None: - assert future_series_lengths is not None - future_length = future_series_lengths[i] - future_data = future_df.iloc[future_start_idx : future_start_idx + future_length] - assert future_data[timestamp_column].iloc[0] == future_ts[0], ( - f"the first timestamp in future_df must be the first forecast timestamp, found mismatch " - f"({future_data[timestamp_column].iloc[0]} != {future_ts[0]}) in series {series_id}" - ) - - if len(future_data) > 0: - future_covariates = { - col: future_data[col].to_numpy() for col in covariate_cols if col in future_data.columns - } - if future_covariates: - task["future_covariates"] = future_covariates - future_start_idx += future_length - - inputs.append(task) - start_idx += length - - assert len(inputs) == len(series_lengths) - - return inputs, original_order, prediction_timestamps - - def _cast_fev_features( past_data: "datasets.Dataset", future_data: "datasets.Dataset", @@ -676,49 +476,65 @@ class Chronos2Dataset(IterableDataset): Arguments ---------- inputs - Time series data. Must be a list of dictionaries where each dictionary may have the following keys. - - `target` (required): a 1-d or 2-d `torch.Tensor` or `np.ndarray` of shape (history_length,) or (n_variates, history_length). - Forecasts will be generated for items in `target`. - - `past_covariates` (optional): a dict of past-only covariates or past values of known future covariates. The keys of the dict - must be names of the covariates and values must be 1-d `torch.Tensor` or `np.ndarray` with length equal to the `history_length` - of `target`. - - `future_covariates` (optional): a dict of future values of known future covariates. The keys of the dict must be names of the - covariates and values must be 1-d `torch.Tensor` or `np.ndarray` with length equal to the `prediction_length`. All keys in - `future_covariates` must be a subset of the keys in `past_covariates`. - Note: when the mode is set to TRAIN, the values inside `future_covariates` are not technically used for training the model; - however, this key is used to infer which covariates are known into the future. Therefore, if your task contains known future covariates, - make sure that this key exists in `inputs`. The values of individual future covariates may be set to `None` or an empty array. + Time series data. Can be either: + + 1. Raw inputs (when `convert_inputs=True`, default): A sequence of dictionaries where each + dictionary may have the following keys: + - `target` (required): a 1-d or 2-d `torch.Tensor` or `np.ndarray` of shape (history_length,) + or (n_variates, history_length). Forecasts will be generated for items in `target`. + - `past_covariates` (optional): a dict of past-only covariates or past values of known future + covariates. + - `future_covariates` (optional): a dict of future values of known future covariates. + + 2. Pre-processed inputs (when `convert_inputs=False`): A sequence of `PreparedInput` dicts with keys: + `context`, `future_covariates`, `n_targets`, `n_covariates`, `n_future_covariates`. + Use `prepare_inputs()` to create pre-processed inputs. context_length The maximum context length used for training or inference prediction_length The prediction horizon batch_size - The batch size for training the model. Note that the batch size here means the number of time series, including target(s) and - covariates, that are input into the model. If your data has multiple target and/or covariates, the effective number of time series - tasks in a batch will be lower than this value. + The batch size for training the model. Note that the batch size here means the number of time series, + including target(s) and covariates, that are input into the model. output_patch_size - The output patch size of the model. This is used to compute the number of patches needed to cover `prediction_length` + The output patch size of the model. This is used to compute the number of patches needed to cover + `prediction_length` min_past - The minimum number of time steps the context must have during training. All time series shorter than `min_past + prediction_length` - are filtered out, by default 1 + The minimum number of time steps the context must have during training. All time series shorter than + `min_past + prediction_length` are filtered out, by default 1 mode `DatasetMode` governing whether to generate training, validation or test samples, by default "train" + convert_inputs + If True (default), preprocess raw inputs. If False, inputs are expected to be already preprocessed. """ def __init__( self, - inputs: Sequence[Mapping[str, TensorOrArray | Mapping[str, TensorOrArray | None]]], + inputs: TensorOrArray | Sequence[TensorOrArray] | Sequence[Mapping[str, Any]] | Sequence[PreparedInput], context_length: int, prediction_length: int, batch_size: int, output_patch_size: int, min_past: int = 1, mode: str | DatasetMode = DatasetMode.TRAIN, + convert_inputs: bool = True, ) -> None: super().__init__() assert mode in {DatasetMode.TRAIN, DatasetMode.VALIDATION, DatasetMode.TEST}, f"Invalid mode: {mode}" - self.tasks = Chronos2Dataset._prepare_tasks(inputs, prediction_length, min_past, mode) + self.inputs: Sequence[PreparedInput] + if convert_inputs: + if isinstance(inputs, (torch.Tensor, np.ndarray)): + inputs = convert_tensor_input_to_list_of_dicts_input(inputs) + elif ( + isinstance(inputs, Sequence) and len(inputs) > 0 and isinstance(inputs[0], (torch.Tensor, np.ndarray)) + ): + inputs = convert_list_of_tensors_input_to_list_of_dicts_input(cast(Sequence[TensorOrArray], inputs)) + self.inputs = prepare_inputs(cast(Iterable[Mapping[str, Any]], inputs), prediction_length, min_past, mode) + else: + validate_prepared_schema(inputs[0]) + self.inputs = cast(Sequence[PreparedInput], inputs) + self.context_length = context_length self.prediction_length = prediction_length self.batch_size = batch_size @@ -726,53 +542,16 @@ class Chronos2Dataset(IterableDataset): self.min_past = min_past self.mode = mode - @staticmethod - def _prepare_tasks( - inputs: Sequence[Mapping[str, TensorOrArray | Mapping[str, TensorOrArray | None]]], - prediction_length: int, - min_past: int, - mode: str | DatasetMode, - ): - tasks = [] - for idx, raw_task in enumerate(inputs): - if mode != DatasetMode.TEST: - raw_future_covariates = raw_task.get("future_covariates", {}) - raw_future_covariates = cast(dict[str, TensorOrArray | None], raw_future_covariates) - if raw_future_covariates: - fixed_future_covariates = {} - for key, value in raw_future_covariates.items(): - fixed_future_covariates[key] = ( - np.full(prediction_length, np.nan) if value is None or len(value) == 0 else value - ) - raw_task = {**raw_task, "future_covariates": fixed_future_covariates} + def _construct_slice(self, input_idx: int) -> tuple[torch.Tensor, torch.Tensor | None, torch.Tensor, int]: + prepared = self.inputs[input_idx] + past_tensor = prepared["context"].clone() # shape: (n_targets + n_covariates, history_length) + future_tensor = prepared["future_covariates"].clone() + n_targets = int(prepared["n_targets"]) + n_covariates = int(prepared["n_covariates"]) + n_future_covariates = int(prepared["n_future_covariates"]) + n_past_only_covariates = n_covariates - n_future_covariates - raw_task = cast(dict[str, TensorOrArray | Mapping[str, TensorOrArray]], raw_task) - # convert to a format compatible with model's forward - task = validate_and_prepare_single_dict_task(raw_task, idx, prediction_length) - - if mode != DatasetMode.TEST and task[0].shape[-1] < min_past + prediction_length: - # filter tasks based on min_past + prediction_length - continue - tasks.append(task) - - if len(tasks) == 0: - raise ValueError( - "The dataset is empty after filtering based on the length of the time series (length >= min_past + prediction_length). " - "Please provide longer time series or reduce `min_past` or `prediction_length`. " - ) - return tasks - - def _construct_slice(self, task_idx: int) -> tuple[torch.Tensor, torch.Tensor | None, torch.Tensor, int]: - ( - task_past_tensor, # shape: (task_n_targets + task_n_covariates, history_length) - task_future_tensor, - task_n_targets, - task_n_covariates, - task_n_future_covariates, - ) = self.tasks[task_idx] - task_n_past_only_covariates = task_n_covariates - task_n_future_covariates - - full_length = task_past_tensor.shape[-1] + full_length = past_tensor.shape[-1] if self.mode == DatasetMode.TRAIN: # slice a random subsequence from the full series @@ -786,72 +565,74 @@ class Chronos2Dataset(IterableDataset): if slice_idx >= self.context_length: # slice series, if it is longer than context_length - task_context = task_past_tensor[:, slice_idx - self.context_length : slice_idx] + context = past_tensor[:, slice_idx - self.context_length : slice_idx] else: - task_context = task_past_tensor[:, :slice_idx] + context = past_tensor[:, :slice_idx] - # In the TEST mode, we have no target available and the task_future_covariates can be directly used - # In the TRAIN and VALIDATION modes, the target and task_future_covariates need to be constructed from - # the task_context_tensor by slicing the appropriate indices which we do below + # In the TEST mode, we have no target available and the future_covariates can be directly used + # In the TRAIN and VALIDATION modes, the target and future_covariates need to be constructed from + # the context_tensor by slicing the appropriate indices which we do below if self.mode in [DatasetMode.TRAIN, DatasetMode.VALIDATION]: - # the first task_n_targets elements in task_context_tensor are the targets - task_future_target = task_past_tensor[:, slice_idx : slice_idx + self.prediction_length] + # the first n_targets elements in context_tensor are the targets + future_target = past_tensor[:, slice_idx : slice_idx + self.prediction_length].clone() + # mask out all rows corresponding to covariates + future_target[n_targets:] = torch.nan - if task_n_future_covariates > 0: - # the last task_n_future_covariates elements in task_context_tensor are the known covariates - task_future_covariates = task_past_tensor[ - -task_n_future_covariates:, slice_idx : slice_idx + self.prediction_length + if n_future_covariates > 0: + # the last n_future_covariates elements in context_tensor are the known covariates + future_covariates = past_tensor[ + -n_future_covariates:, slice_idx : slice_idx + self.prediction_length ] else: # zero-length tensor for easy concatenation later - task_future_covariates = torch.zeros((0, self.prediction_length)) + future_covariates = torch.zeros((0, self.prediction_length)) - # the leading task_n_targets + task_n_past_only_covariates elements are masked because the target(s) + # the leading n_targets + n_past_only_covariates elements are masked because the target(s) # and past-only covariates are not known into the future - task_future_covariates_padding = torch.full( - (task_n_targets + task_n_past_only_covariates, self.prediction_length), + future_covariates_padding = torch.full( + (n_targets + n_past_only_covariates, self.prediction_length), fill_value=torch.nan, ) - task_future_covariates = torch.cat([task_future_covariates_padding, task_future_covariates], dim=0) + future_covariates = torch.cat([future_covariates_padding, future_covariates], dim=0) else: - task_future_target = None - task_future_covariates = task_future_tensor + future_target = None + future_covariates = future_tensor - # task_context: (task_n_targets + task_n_covariates, min(context_length, history_length)) - # task_future_target: (task_n_targets + task_n_covariates, prediction_length), the future values of known future covariates + # context: (n_targets + n_covariates, min(context_length, history_length)) + # future_target: (n_targets + n_covariates, prediction_length), the future values of known future covariates # are ignored during loss computation - # task_future_covariates: (task_n_targets + task_n_past_only_covariates + task_n_future_covariates, prediction_length), + # future_covariates: (n_targets + n_past_only_covariates + n_future_covariates, prediction_length), # the entries corresponding to targets and past-only covariates are NaNs - return task_context, task_future_target, task_future_covariates, task_n_targets + return context, future_target, future_covariates, n_targets - def _build_batch(self, task_indices: list[int]) -> dict[str, torch.Tensor | int | list[tuple[int, int]] | None]: - """Build a batch from given task indices.""" - batch_context_tensor_list = [] - batch_future_target_tensor_list = [] - batch_future_covariates_tensor_list = [] + def _build_batch(self, input_indices: list[int]) -> dict[str, torch.Tensor | int | list[tuple[int, int]] | None]: + """Build a batch from given input indices.""" + batch_context_list = [] + batch_future_target_list = [] + batch_future_covariates_list = [] batch_group_ids_list = [] target_idx_ranges: list[tuple[int, int]] = [] target_start_idx = 0 - for group_id, task_idx in enumerate(task_indices): - task_context, task_future_target, task_future_covariates, task_n_targets = self._construct_slice(task_idx) + for group_id, input_idx in enumerate(input_indices): + context, future_target, future_covariates, n_targets = self._construct_slice(input_idx) - group_size = task_context.shape[0] - task_group_ids = torch.full((group_size,), fill_value=group_id) - batch_context_tensor_list.append(task_context) - batch_future_target_tensor_list.append(task_future_target) - batch_future_covariates_tensor_list.append(task_future_covariates) - batch_group_ids_list.append(task_group_ids) - target_idx_ranges.append((target_start_idx, target_start_idx + task_n_targets)) + group_size = context.shape[0] + group_ids = torch.full((group_size,), fill_value=group_id) + batch_context_list.append(context) + batch_future_target_list.append(future_target) + batch_future_covariates_list.append(future_covariates) + batch_group_ids_list.append(group_ids) + target_idx_ranges.append((target_start_idx, target_start_idx + n_targets)) target_start_idx += group_size return { - "context": left_pad_and_cat_2D(batch_context_tensor_list), + "context": left_pad_and_cat_2D(batch_context_list), "future_target": None if self.mode == DatasetMode.TEST - else torch.cat(cast(list[torch.Tensor], batch_future_target_tensor_list), dim=0), - "future_covariates": torch.cat(batch_future_covariates_tensor_list, dim=0), + else torch.cat(cast(list[torch.Tensor], batch_future_target_list), dim=0), + "future_covariates": torch.cat(batch_future_covariates_list, dim=0), "group_ids": torch.cat(batch_group_ids_list, dim=0), "num_output_patches": self.num_output_patches, "target_idx_ranges": target_idx_ranges, @@ -860,27 +641,27 @@ class Chronos2Dataset(IterableDataset): def _generate_train_batches(self): while True: current_batch_size = 0 - task_indices = [] + input_indices = [] while current_batch_size < self.batch_size: - task_idx = np.random.randint(len(self.tasks)) - task_indices.append(task_idx) - current_batch_size += self.tasks[task_idx][0].shape[0] + input_idx = np.random.randint(len(self.inputs)) + input_indices.append(input_idx) + current_batch_size += self.inputs[input_idx]["context"].shape[0] - yield self._build_batch(task_indices) + yield self._build_batch(input_indices) def _generate_sequential_batches(self): - task_idx = 0 - while task_idx < len(self.tasks): + input_idx = 0 + while input_idx < len(self.inputs): current_batch_size = 0 - task_indices = [] + input_indices = [] - while task_idx < len(self.tasks) and current_batch_size < self.batch_size: - task_indices.append(task_idx) - current_batch_size += self.tasks[task_idx][0].shape[0] - task_idx += 1 + while input_idx < len(self.inputs) and current_batch_size < self.batch_size: + input_indices.append(input_idx) + current_batch_size += self.inputs[input_idx]["context"].shape[0] + input_idx += 1 - yield self._build_batch(task_indices) + yield self._build_batch(input_indices) def __iter__(self) -> Iterator: """ @@ -907,39 +688,3 @@ class Chronos2Dataset(IterableDataset): yield batch else: yield from self._generate_sequential_batches() - - @classmethod - def convert_inputs( - cls, - inputs: TensorOrArray - | Sequence[TensorOrArray] - | Sequence[Mapping[str, TensorOrArray | Mapping[str, TensorOrArray | None]]], - context_length: int, - prediction_length: int, - batch_size: int, - output_patch_size: int, - min_past: int = 1, - mode: str | DatasetMode = DatasetMode.TRAIN, - ) -> "Chronos2Dataset": - """Convert from different input formats to a Chronos2Dataset.""" - if isinstance(inputs, (torch.Tensor, np.ndarray)): - inputs = convert_tensor_input_to_list_of_dicts_input(inputs) - elif isinstance(inputs, list) and all([isinstance(x, (torch.Tensor, np.ndarray)) for x in inputs]): - inputs = cast(list[TensorOrArray], inputs) - inputs = convert_list_of_tensors_input_to_list_of_dicts_input(inputs) - elif isinstance(inputs, list) and all([isinstance(x, dict) for x in inputs]): - pass - else: - raise ValueError("Unexpected inputs format") - - inputs = cast(list[dict[str, TensorOrArray | dict[str, TensorOrArray]]], inputs) - - return cls( - inputs, - context_length=context_length, - prediction_length=prediction_length, - batch_size=batch_size, - output_patch_size=output_patch_size, - min_past=min_past, - mode=mode, - ) diff --git a/src/chronos/chronos2/layers.py b/src/chronos/chronos2/layers.py index 2c4e6b3..b00e8a8 100644 --- a/src/chronos/chronos2/layers.py +++ b/src/chronos/chronos2/layers.py @@ -155,6 +155,7 @@ class MHA(nn.Module): self.n_heads: int = config.num_heads self.dropout: float = config.dropout_rate self.inner_dim: int = self.n_heads * self.kv_proj_dim + self.config = config self.q = nn.Linear(self.d_model, self.inner_dim, bias=False) self.k = nn.Linear(self.d_model, self.inner_dim, bias=False) @@ -165,6 +166,64 @@ class MHA(nn.Module): if use_rope: self.rope_embed = RoPE(dim=self.kv_proj_dim, base=config.rope_theta) + def _eager_attention( + self, + query_states: torch.Tensor, + key_states: torch.Tensor, + value_states: torch.Tensor, + mask: torch.Tensor, + ) -> tuple[torch.Tensor, torch.Tensor]: + """Eager attention implementation using manual matmul. + + Args: + query_states: [batch, n_heads, seq_len, kv_proj_dim] + key_states: [batch, n_heads, seq_len, kv_proj_dim] + value_states: [batch, n_heads, seq_len, kv_proj_dim] + mask: [batch, n_heads, q_len, kv_len] + + Returns: + attn_output: [batch, n_heads, seq_len, kv_proj_dim] + attn_weights: [batch, n_heads, q_len, kv_len] + """ + # Compute attention weights (no scaling - this is the original Chronos-2 implementation) + scores = torch.matmul(query_states, key_states.transpose(3, 2)) # "bnqd,bnkd->bnqk" + scores += mask + attn_weights = nn.functional.softmax(scores.float(), dim=-1).type_as(scores) + attn_weights = nn.functional.dropout(attn_weights, p=self.dropout, training=self.training) + attn_output = torch.matmul(attn_weights, value_states) + + return attn_output, attn_weights + + def _sdpa_attention( + self, + query_states: torch.Tensor, + key_states: torch.Tensor, + value_states: torch.Tensor, + mask: torch.Tensor, + ) -> tuple[torch.Tensor, None]: + """SDPA attention implementation using torch.nn.functional.scaled_dot_product_attention. + + Args: + query_states: [batch, n_heads, seq_len, kv_proj_dim] + key_states: [batch, n_heads, seq_len, kv_proj_dim] + value_states: [batch, n_heads, seq_len, kv_proj_dim] + mask: [batch, n_heads, q_len, kv_len] - additive mask (0 for valid, -inf for invalid) + + Returns: + attn_output: [batch, n_heads, seq_len, kv_proj_dim] + attn_weights: None (SDPA doesn't return weights) + """ + attn_output = nn.functional.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=mask, + dropout_p=self.dropout if self.training else 0.0, + scale=1.0, # Match eager implementation (no scaling) + ) + + return attn_output, None + def forward( self, hidden_states: torch.Tensor, @@ -190,6 +249,11 @@ class MHA(nn.Module): if self.use_rope: assert position_ids is not None, "position_ids must be provided when self.use_rope=True" + # Force eager attention if output_attentions is True (only eager returns weights) + attn_implementation = self.config._attn_implementation + if output_attentions: + attn_implementation = "eager" + seq_length = hidden_states.shape[1] def shape(states: torch.Tensor) -> torch.Tensor: @@ -215,12 +279,10 @@ class MHA(nn.Module): cos, sin = self.rope_embed(value_states, position_ids) query_states, key_states = RoPE.apply_rotary_pos_emb(query_states, key_states, cos, sin) - # Compute attention weights - scores = torch.matmul(query_states, key_states.transpose(3, 2)) # "bnqd,bnkd->bnqk" - scores += mask - attn_weights = nn.functional.softmax(scores.float(), dim=-1).type_as(scores) - attn_weights = nn.functional.dropout(attn_weights, p=self.dropout, training=self.training) - attn_output = torch.matmul(attn_weights, value_states) + if attn_implementation == "sdpa": + attn_output, attn_weights = self._sdpa_attention(query_states, key_states, value_states, mask) + else: # eager + attn_output, attn_weights = self._eager_attention(query_states, key_states, value_states, mask) # Project attention output attn_output = unshape(attn_output) diff --git a/src/chronos/chronos2/model.py b/src/chronos/chronos2/model.py index 06eb708..0397be2 100644 --- a/src/chronos/chronos2/model.py +++ b/src/chronos/chronos2/model.py @@ -199,6 +199,7 @@ class Chronos2Model(PreTrainedModel): config_class = Chronos2CoreConfig # type: ignore[assignment] _supports_long_horizon: bool = True _supports_future_covariates: bool = True + _supports_sdpa: bool = True def __init__(self, config: Chronos2CoreConfig): assert hasattr(config, "chronos_config"), "Not a valid Chronos config" @@ -546,6 +547,74 @@ class Chronos2Model(PreTrainedModel): return loss + def encode( + self, + context: torch.Tensor, + context_mask: torch.Tensor | None = None, + group_ids: torch.Tensor | None = None, + future_covariates: torch.Tensor | None = None, + future_covariates_mask: torch.Tensor | None = None, + num_output_patches: int = 1, + future_target: torch.Tensor | None = None, + future_target_mask: torch.Tensor | None = None, + output_attentions: bool = False, + ): + self._validate_input( + context=context, + context_mask=context_mask, + future_covariates=future_covariates, + future_covariates_mask=future_covariates_mask, + group_ids=group_ids, + num_output_patches=num_output_patches, + future_target=future_target, + future_target_mask=future_target_mask, + ) + + batch_size = context.shape[0] + patched_context, attention_mask, loc_scale = self._prepare_patched_context( + context=context, context_mask=context_mask + ) + num_context_patches = attention_mask.shape[-1] + + # get input embeddings of shape (batch, num_context_patches, d_model) + input_embeds: torch.Tensor = self.input_patch_embedding(patched_context) + # append [REG] special token embedding, if needed + if self.chronos_config.use_reg_token: + reg_input_ids = torch.full((batch_size, 1), self.config.reg_token_id, device=input_embeds.device) + reg_embeds = self.shared(reg_input_ids) + input_embeds = torch.cat([input_embeds, reg_embeds], dim=-2) + attention_mask = torch.cat( + [attention_mask.to(self.dtype), torch.ones_like(reg_input_ids).to(self.dtype)], dim=-1 + ) + + patched_future, patched_future_covariates_mask = self._prepare_patched_future( + future_covariates=future_covariates, + future_covariates_mask=future_covariates_mask, + loc_scale=loc_scale, + num_output_patches=num_output_patches, + batch_size=batch_size, + ) + future_attention_mask = torch.ones(batch_size, num_output_patches, dtype=self.dtype, device=self.device) + + # get future embeddings of shape (batch, num_output_patches, d_model) + future_embeds: torch.Tensor = self.input_patch_embedding(patched_future) + + # concatenate context and future embeddings and masks + input_embeds = torch.cat([input_embeds, future_embeds], dim=-2) + attention_mask = torch.cat([attention_mask, future_attention_mask], dim=-1) + + if group_ids is None: + # by default, each time series is treated independently, i.e., no mixing across the batch + group_ids = torch.arange(batch_size, dtype=torch.long, device=self.device) + + encoder_outputs: Chronos2EncoderOutput = self.encoder( + attention_mask=attention_mask, + inputs_embeds=input_embeds, + group_ids=group_ids, + output_attentions=output_attentions, + ) + return encoder_outputs, loc_scale, patched_future_covariates_mask, num_context_patches + def forward( self, context: torch.Tensor, @@ -624,63 +693,19 @@ class Chronos2Model(PreTrainedModel): - enc_time_self_attn_weights: Time self attention weights, if output_attentions=True - enc_group_self_attn_weights: Group self attention weights, if output_attentions=True """ - - self._validate_input( + batch_size = context.shape[0] + encoder_outputs, loc_scale, patched_future_covariates_mask, num_context_patches = self.encode( context=context, context_mask=context_mask, + group_ids=group_ids, future_covariates=future_covariates, future_covariates_mask=future_covariates_mask, - group_ids=group_ids, num_output_patches=num_output_patches, future_target=future_target, future_target_mask=future_target_mask, - ) - - batch_size = context.shape[0] - patched_context, attention_mask, loc_scale = self._prepare_patched_context( - context=context, context_mask=context_mask - ) - num_context_patches = attention_mask.shape[-1] - - # get input embeddings of shape (batch, num_context_patches, d_model) - input_embeds: torch.Tensor = self.input_patch_embedding(patched_context) - # append [REG] special token embedding, if needed - if self.chronos_config.use_reg_token: - reg_input_ids = torch.full((batch_size, 1), self.config.reg_token_id, device=input_embeds.device) - reg_embeds = self.shared(reg_input_ids) - input_embeds = torch.cat([input_embeds, reg_embeds], dim=-2) - attention_mask = torch.cat( - [attention_mask.to(self.dtype), torch.ones_like(reg_input_ids).to(self.dtype)], dim=-1 - ) - - patched_future, patched_future_covariates_mask = self._prepare_patched_future( - future_covariates=future_covariates, - future_covariates_mask=future_covariates_mask, - loc_scale=loc_scale, - num_output_patches=num_output_patches, - batch_size=batch_size, - ) - future_attention_mask = torch.ones(batch_size, num_output_patches, dtype=self.dtype, device=self.device) - - # get future embeddings of shape (batch, num_output_patches, d_model) - future_embeds: torch.Tensor = self.input_patch_embedding(patched_future) - - # concatenate context and future embeddings and masks - input_embeds = torch.cat([input_embeds, future_embeds], dim=-2) - attention_mask = torch.cat([attention_mask, future_attention_mask], dim=-1) - - if group_ids is None: - # by default, each time series is treated independently, i.e., no mixing across the batch - group_ids = torch.arange(batch_size, dtype=torch.long, device=self.device) - - encoder_outputs: Chronos2EncoderOutput = self.encoder( - attention_mask=attention_mask, - inputs_embeds=input_embeds, - group_ids=group_ids, output_attentions=output_attentions, ) hidden_states: torch.Tensor = encoder_outputs[0] - assert hidden_states.shape == (batch_size, num_context_patches + 1 + num_output_patches, self.model_dim) # slice the last num_output_patches hidden states to be input into the output_patch_embedding diff --git a/src/chronos/chronos2/pipeline.py b/src/chronos/chronos2/pipeline.py index e00d336..223689d 100644 --- a/src/chronos/chronos2/pipeline.py +++ b/src/chronos/chronos2/pipeline.py @@ -9,29 +9,29 @@ import time import warnings from copy import deepcopy from pathlib import Path -from typing import TYPE_CHECKING, Any, Mapping, Sequence +from typing import TYPE_CHECKING, Callable, Literal, Mapping, Sequence import numpy as np import torch from einops import rearrange, repeat from torch.utils.data import DataLoader from transformers import AutoConfig +from transformers.utils.import_utils import is_peft_available +from transformers.utils.peft_utils import find_adapter_config_file import chronos.chronos2 from chronos.base import BaseChronosPipeline, ForecastType from chronos.chronos2 import Chronos2Model -from chronos.chronos2.dataset import ( - Chronos2Dataset, - DatasetMode, - TensorOrArray, - convert_df_input_to_list_of_dicts_input, -) +from chronos.chronos2.dataset import Chronos2Dataset, DatasetMode, TensorOrArray +from chronos.df_utils import convert_df_input_to_list_of_dicts_input from chronos.utils import interpolate_quantiles, weighted_quantile if TYPE_CHECKING: import datasets import fev import pandas as pd + from peft import LoraConfig + from transformers.trainer_callback import TrainerCallback logger = logging.getLogger(__name__) @@ -103,13 +103,19 @@ class Chronos2Pipeline(BaseChronosPipeline): | Sequence[TensorOrArray] | Sequence[Mapping[str, TensorOrArray | Mapping[str, TensorOrArray | None]]] | None = None, + finetune_mode: Literal["full", "lora"] = "full", + lora_config: "LoraConfig | dict | None" = None, context_length: int | None = None, - learning_rate: float = 1e-5, + learning_rate: float = 1e-6, num_steps: int = 1000, batch_size: int = 256, output_dir: Path | str | None = None, min_past: int | None = None, finetuned_ckpt_name: str = "finetuned-ckpt", + callbacks: list["TrainerCallback"] | None = None, + remove_printer_callback: bool = False, + disable_data_parallel: bool = True, + convert_inputs: bool = True, **extra_trainer_kwargs, ) -> "Chronos2Pipeline": """ @@ -127,10 +133,16 @@ class Chronos2Pipeline(BaseChronosPipeline): validation_inputs The time series used for validation and model selection. The format of `validation_inputs` is exactly the same as `inputs`, by default None which means that no validation is performed. Note that enabling validation may slow down fine-tuning for large datasets. + finetune_mode + One of "full" (performs full fine-tuning) or "lora" (performs Low Rank Adaptation (LoRA) fine-tuning), by default "full" + lora_config + The configuration to use for LoRA fine-tuning when finetune_mode="lora". Can be a `LoraConfig` object or a dict which is used to initialize `LoraConfig`. + When unspecified and finetune_mode="lora", a default configuration is used context_length The maximum context length used during fine-tuning, by default set to the model's default context length learning_rate - The learning rate for the optimizer, by default 1e-5 + The learning rate for the optimizer, by default 1e-6 + When finetune_mode="lora", we recommend using a higher value of the learning rate, such as 1e-5 num_steps The number of steps to fine-tune for, by default 1000 batch_size @@ -144,6 +156,16 @@ class Chronos2Pipeline(BaseChronosPipeline): are filtered out, by default set equal to prediction_length finetuned_ckpt_name The name of the directory inside `output_dir` in which the final fine-tuned checkpoint will be saved, by default "finetuned-ckpt" + callbacks + A list of `TrainerCallback`s which will be forwarded to the HuggingFace `Trainer` + remove_printer_callback + If True, all instances of `PrinterCallback` are removed from callbacks + disable_data_parallel + If True, ensures that DataParallel is disabled and training happens on a single GPU + convert_inputs + If True (default), preprocess raw inputs (convert tensors, encode categoricals, validate). + If False, inputs are expected to be already preprocessed using `chronos.chronos2.dataset.prepare_inputs`. + This allows for efficient training on large datasets that don't fit in memory. **extra_trainer_kwargs Extra kwargs are directly forwarded to `TrainingArguments` @@ -153,28 +175,66 @@ class Chronos2Pipeline(BaseChronosPipeline): """ import torch.cuda + from transformers.trainer_callback import PrinterCallback from transformers.training_args import TrainingArguments + if finetune_mode == "lora": + if is_peft_available(): + from peft import LoraConfig, get_peft_model + else: + warnings.warn( + "`peft` is required for `finetune_mode='lora'`. Please install it with `pip install peft`. Falling back to `finetune_mode='full'`." + ) + finetune_mode = "full" + lora_config = None + from chronos.chronos2.trainer import Chronos2Trainer, EvaluateAndSaveFinalStepCallback - warnings.warn( - "Fine-tuning support is experimental and may be changed in future versions.", - category=FutureWarning, - stacklevel=2, - ) + assert finetune_mode in ["full", "lora"], f"finetune_mode must be one of ['full', 'lora'], got {finetune_mode}" + + if finetune_mode == "full" and lora_config is not None: + raise ValueError( + "lora_config should not be specified when `finetune_mode='full'`. To enable LoRA, set `finetune_mode='lora'`." + ) # Create a copy of the model to avoid modifying the original config = deepcopy(self.model.config) model = Chronos2Model(config).to(self.model.device) # type: ignore model.load_state_dict(self.model.state_dict()) + if finetune_mode == "lora": + if lora_config is None: + lora_config = LoraConfig( + r=8, + lora_alpha=16, + target_modules=[ + "self_attention.q", + "self_attention.v", + "self_attention.k", + "self_attention.o", + "output_patch_embedding.output_layer", + ], + ) + elif isinstance(lora_config, dict): + lora_config = LoraConfig(**lora_config) + else: + assert isinstance(lora_config, LoraConfig), ( + f"lora_config must be an instance of LoraConfig or a dict, got {type(lora_config)}" + ) + + model = get_peft_model(model, lora_config) + n_trainable_params, n_params = model.get_nb_trainable_parameters() + logger.info( + f"Using LoRA. Number of trainable parameters: {n_trainable_params}, total parameters: {n_params}." + ) + if context_length is None: context_length = self.model_context_length if min_past is None: min_past = prediction_length - train_dataset = Chronos2Dataset.convert_inputs( + train_dataset = Chronos2Dataset( inputs=inputs, context_length=context_length, prediction_length=prediction_length, @@ -182,6 +242,7 @@ class Chronos2Pipeline(BaseChronosPipeline): output_patch_size=self.model_output_patch_size, min_past=min_past, mode=DatasetMode.TRAIN, + convert_inputs=convert_inputs, ) if output_dir is None: @@ -211,14 +272,13 @@ class Chronos2Pipeline(BaseChronosPipeline): lr_scheduler_type="linear", warmup_ratio=0.0, optim="adamw_torch_fused", - logging_dir=str(output_dir / "logs"), logging_strategy="steps", logging_steps=100, disable_tqdm=False, report_to="none", max_steps=num_steps, gradient_accumulation_steps=1, - dataloader_num_workers=1, + dataloader_num_workers=0, tf32=has_sm80 and not use_cpu, bf16=has_sm80 and not use_cpu, save_only_model=True, @@ -234,16 +294,16 @@ class Chronos2Pipeline(BaseChronosPipeline): ) eval_dataset = None - callbacks = [] + callbacks = callbacks or [] if validation_inputs is not None: - # construct validation dataset - eval_dataset = Chronos2Dataset.convert_inputs( + eval_dataset = Chronos2Dataset( inputs=validation_inputs, context_length=context_length, prediction_length=prediction_length, batch_size=batch_size, output_patch_size=self.model_output_patch_size, mode=DatasetMode.VALIDATION, + convert_inputs=convert_inputs, ) # set validation parameters @@ -268,6 +328,11 @@ class Chronos2Pipeline(BaseChronosPipeline): training_args = TrainingArguments(**training_kwargs) + if disable_data_parallel and not use_cpu: + # This is a hack to disable the default `transformers` behavior of using DataParallel + training_args._n_gpu = 1 + assert training_args.n_gpu == 1 # Ensure that the hack worked + trainer = Chronos2Trainer( model=model, args=training_args, @@ -275,12 +340,19 @@ class Chronos2Pipeline(BaseChronosPipeline): eval_dataset=eval_dataset, callbacks=callbacks, ) + + if remove_printer_callback: + trainer.pop_callback(PrinterCallback) + trainer.train() - # update max_output_patches, if the model was fine-tuned with longer prediction_length + # update context_length and max_output_patches, if the model was fine-tuned with larger values + model.chronos_config.context_length = max(model.chronos_config.context_length, context_length) model.chronos_config.max_output_patches = max( model.chronos_config.max_output_patches, math.ceil(prediction_length / self.model_output_patch_size) ) + # update chronos_config in model's config, so it is saved correctly + model.config.chronos_config = model.chronos_config.__dict__ # Create a new pipeline with the fine-tuned model finetuned_pipeline = Chronos2Pipeline(model=model) @@ -389,7 +461,7 @@ class Chronos2Pipeline(BaseChronosPipeline): prediction_length: int | None = None, batch_size: int = 256, context_length: int | None = None, - predict_batches_jointly: bool = False, + cross_learning: bool = False, limit_prediction_length: bool = False, **kwargs, ) -> list[torch.Tensor]: @@ -475,7 +547,7 @@ class Chronos2Pipeline(BaseChronosPipeline): will be lower than this value, by default 256 context_length The maximum context length used during for inference, by default set to the model's default context length - predict_batches_jointly + cross_learning If True, cross-learning is enabled, i.e., all the tasks in `inputs` will be predicted jointly and the model will share information across all inputs, by default False The following must be noted when using cross-learning: - Cross-learning doesn't always improve forecast accuracy and must be tested for individual use cases. @@ -495,6 +567,14 @@ class Chronos2Pipeline(BaseChronosPipeline): if prediction_length is None: prediction_length = model_prediction_length + if kwargs.get("predict_batches_jointly") is not None: + warnings.warn( + "The `predict_batches_jointly` argument is deprecated and will be removed in a future version. " + "Please use `cross_learning=True` to enable the cross-learning mode.", + category=FutureWarning, + stacklevel=2, + ) + cross_learning = kwargs.pop("predict_batches_jointly") # The maximum number of output patches to generate in a single forward pass before the long-horizon heuristic kicks in. Note: A value larger # than the model's default max_output_patches may lead to degradation in forecast accuracy, defaults to a model-specific value max_output_patches = kwargs.pop("max_output_patches", self.max_output_patches) @@ -503,6 +583,8 @@ class Chronos2Pipeline(BaseChronosPipeline): # effective batch size increases by a factor of `len(unrolled_quantiles)` when making long-horizon predictions, # by default [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] unrolled_quantiles = kwargs.pop("unrolled_quantiles", [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) + # A callback which is called after each batch has been processed + after_batch_callback: Callable = kwargs.pop("after_batch", lambda: None) if len(kwargs) > 0: raise TypeError(f"Unexpected keyword arguments: {list(kwargs.keys())}.") @@ -534,8 +616,8 @@ class Chronos2Pipeline(BaseChronosPipeline): ) context_length = self.model_context_length - test_dataset = Chronos2Dataset.convert_inputs( - inputs=inputs, + test_dataset = Chronos2Dataset( + inputs, context_length=context_length, prediction_length=prediction_length, batch_size=batch_size, @@ -543,7 +625,7 @@ class Chronos2Pipeline(BaseChronosPipeline): mode=DatasetMode.TEST, ) test_loader = DataLoader( - test_dataset, batch_size=None, num_workers=1, pin_memory=True, shuffle=False, drop_last=False + test_dataset, batch_size=None, pin_memory=self.model.device.type == "cuda", shuffle=False, drop_last=False ) all_predictions: list[torch.Tensor] = [] @@ -554,7 +636,7 @@ class Chronos2Pipeline(BaseChronosPipeline): batch_future_covariates = batch["future_covariates"] batch_target_idx_ranges = batch["target_idx_ranges"] - if predict_batches_jointly: + if cross_learning: batch_group_ids = torch.zeros_like(batch_group_ids) batch_prediction = self._predict_batch( @@ -567,6 +649,7 @@ class Chronos2Pipeline(BaseChronosPipeline): target_idx_ranges=batch_target_idx_ranges, ) all_predictions.extend(batch_prediction) + after_batch_callback() return all_predictions @@ -745,6 +828,10 @@ class Chronos2Pipeline(BaseChronosPipeline): prediction_length: int | None = None, quantile_levels: list[float] = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9], batch_size: int = 256, + context_length: int | None = None, + cross_learning: bool = False, + validate_inputs: bool = True, + freq: str | None = None, **predict_kwargs, ) -> "pd.DataFrame": """ @@ -774,6 +861,24 @@ class Chronos2Pipeline(BaseChronosPipeline): The batch size used for prediction. Note that the batch size here means the number of time series, including target(s) and covariates, which are input into the model. If your data has multiple target and/or covariates, the effective number of time series tasks in a batch will be lower than this value, by default 256 + context_length + The maximum context length used during for inference, by default set to the model's default context length + cross_learning + If True, cross-learning is enabled, i.e., all the tasks in `inputs` will be predicted jointly and the model will share information across all inputs, by default False + The following must be noted when using cross-learning: + - Cross-learning doesn't always improve forecast accuracy and must be tested for individual use cases. + - Results become dependent on batch size. Very large batch sizes may not provide benefits as they deviate from the maximum group size used during pretraining. + For optimal results, consider using a batch size around 100 (as used in the Chronos-2 technical report). + - Cross-learning is most helpful when individual time series have limited historical context, as the model can leverage patterns from related series in the batch. + validate_inputs + [ADVANCED] When True (default), validates dataframes before prediction. Setting to False removes the + validation overhead, but may silently lead to wrong predictions if data is misformatted. When False, you + must ensure: (1) all dataframes are sorted by (id_column, timestamp_column); (2) future_df (if provided) + has the same item IDs as df with exactly prediction_length rows of future timestamps per item; (3) all + timestamps are regularly spaced (e.g., with hourly frequency). + freq + Frequency string for timestamp generation (e.g., "h", "D", "W"). Can only be used when + validate_inputs=False. When provided, skips frequency inference from the data. **predict_kwargs Additional arguments passed to predict_quantiles @@ -804,6 +909,8 @@ class Chronos2Pipeline(BaseChronosPipeline): timestamp_column=timestamp_column, target_columns=target, prediction_length=prediction_length, + freq=freq, + validate_inputs=validate_inputs, ) # Generate forecasts @@ -813,33 +920,37 @@ class Chronos2Pipeline(BaseChronosPipeline): quantile_levels=quantile_levels, limit_prediction_length=False, batch_size=batch_size, + context_length=context_length, + cross_learning=cross_learning, **predict_kwargs, ) # since predict_df tasks are homogenous by input design, we can safely stack the list of tensors into a single tensor quantiles_np = torch.stack(quantiles).numpy() # [n_tasks, n_variates, horizon, num_quantiles] mean_np = torch.stack(mean).numpy() # [n_tasks, n_variates, horizon] - results_dfs = [] - for i, (series_id, future_ts) in enumerate(prediction_timestamps.items()): - q_pred = quantiles_np[i] # (n_variates, prediction_length, len(quantile_levels)) - point_pred = mean_np[i] # (n_variates, prediction_length) + n_tasks = len(prediction_timestamps) + n_variates = len(target) - for target_idx, target_col in enumerate(target): - series_forecast_data: dict[str | tuple[str, str], Any] = { - id_column: series_id, - timestamp_column: future_ts, - "target_name": target_col, - } - series_forecast_data["predictions"] = point_pred[target_idx] - for q_idx, q_level in enumerate(quantile_levels): - series_forecast_data[str(q_level)] = q_pred[target_idx, :, q_idx] + series_ids = list(prediction_timestamps.keys()) + future_ts = list(prediction_timestamps.values()) - results_dfs.append(pd.DataFrame(series_forecast_data)) + data = { + id_column: np.repeat(series_ids, n_variates * prediction_length), + timestamp_column: np.concatenate([np.tile(ts, n_variates) for ts in future_ts]), + "target_name": np.tile(np.repeat(target, prediction_length), n_tasks), + "predictions": mean_np.ravel(), + } - predictions_df = pd.concat(results_dfs, ignore_index=True) - predictions_df.set_index(id_column, inplace=True) - predictions_df = predictions_df.loc[original_order] - predictions_df.reset_index(inplace=True) + quantiles_flat = quantiles_np.reshape(-1, len(quantile_levels)) + for q_idx, q_level in enumerate(quantile_levels): + data[str(q_level)] = quantiles_flat[:, q_idx] + + predictions_df = pd.DataFrame(data) + # If validate_inputs=False, the df is used as-is without sorting by item_id, no reordering required + if validate_inputs: + predictions_df.set_index(id_column, inplace=True) + predictions_df = predictions_df.loc[original_order] + predictions_df.reset_index(inplace=True) return predictions_df @@ -974,11 +1085,7 @@ class Chronos2Pipeline(BaseChronosPipeline): finetune_kwargs["prediction_length"] = first_window.horizon finetune_kwargs["batch_size"] = finetune_kwargs.get("batch_size", batch_size) - try: - pipeline = self.fit(inputs=inputs, **finetune_kwargs) - except Exception as e: - msg = f"Finetuning failed with error: {e}. Continuing with the pretrained model." - warnings.warn(msg, category=UserWarning, stacklevel=2) + pipeline = self.fit(inputs=inputs, **finetune_kwargs) predictions_per_window = [] inference_time_s = 0.0 @@ -995,6 +1102,86 @@ class Chronos2Pipeline(BaseChronosPipeline): return predictions_per_window, inference_time_s + @torch.no_grad() + def embed( + self, inputs: TensorOrArray | Sequence[TensorOrArray], batch_size: int = 256, context_length: int | None = None + ) -> tuple[list[torch.Tensor], list[tuple[torch.Tensor, torch.Tensor]]]: + """ + Get encoder embeddings for the given time series. + + Parameters + ---------- + inputs + The time series to get embeddings for, can be one of: + - A 3-dimensional `torch.Tensor` or `np.ndarray` of shape (batch, n_variates, history_length). When `n_variates > 1`, information + will be shared among the different variates of each time series in the batch. + - A list of `torch.Tensor` or `np.ndarray` where each element can either be 1-dimensional of shape (history_length,) + or 2-dimensional of shape (n_variates, history_length). The history_lengths may be different across elements; left-padding + will be applied, if needed. + batch_size + The batch size used for generating embeddings. Note that the batch size here means the total number of time series which are input into the model. + If your data has multiple variates, the effective number of time series tasks in a batch will be lower than this value, by default 256 + context_length + The maximum context length used during for inference, by default set to the model's default context length + + Returns + ------- + embeddings + a list of `torch.Tensor` where each element has shape (n_variates, num_patches + 2, d_model) and the number of elements are equal to the number + of target time series (univariate or multivariate) in the `inputs`. The extra +2 is due to embeddings of the [REG] token and a masked output patch token. + loc_scale + a list of tuples with the mean and standard deviation of each time series. + """ + if context_length is None: + context_length = self.model_context_length + + if context_length > self.model_context_length: + warnings.warn( + f"The specified context_length {context_length} is greater than the model's default context length {self.model_context_length}. " + f"Resetting context_length to {self.model_context_length}." + ) + context_length = self.model_context_length + + test_dataset = Chronos2Dataset( + inputs, + context_length=context_length, + prediction_length=0, + batch_size=batch_size, + output_patch_size=self.model_output_patch_size, + mode=DatasetMode.TEST, + ) + test_loader = DataLoader( + test_dataset, + batch_size=None, + num_workers=0, + pin_memory=self.model.device.type == "cuda", + shuffle=False, + drop_last=False, + ) + all_embeds: list[torch.Tensor] = [] + all_loc_scales: list[tuple[torch.Tensor, torch.Tensor]] = [] + for batch in test_loader: + assert batch["future_target"] is None + batch_context = batch["context"] + batch_group_ids = batch["group_ids"] + batch_target_idx_ranges = batch["target_idx_ranges"] + + encoder_outputs, (locs, scales), *_ = self.model.encode( + context=batch_context.to(device=self.model.device, dtype=torch.float32), + group_ids=batch_group_ids.to(self.model.device), + ) + batch_embeds = [encoder_outputs[0][start:end].cpu() for (start, end) in batch_target_idx_ranges] + batch_loc_scales = list( + zip( + [locs[start:end].cpu() for (start, end) in batch_target_idx_ranges], + [scales[start:end].cpu() for (start, end) in batch_target_idx_ranges], + ) + ) + all_embeds.extend(batch_embeds) + all_loc_scales.extend(batch_loc_scales) + + return all_embeds, all_loc_scales + @classmethod def from_pretrained(cls, pretrained_model_name_or_path, *args, **kwargs): """ @@ -1002,9 +1189,25 @@ class Chronos2Pipeline(BaseChronosPipeline): Supports the same arguments as ``AutoConfig`` and ``AutoModel`` from ``transformers``. """ + # Check if the model is on S3 and cache it locally first + # NOTE: Only base models (not LoRA adapters) are supported via S3 if str(pretrained_model_name_or_path).startswith("s3://"): return BaseChronosPipeline.from_pretrained(pretrained_model_name_or_path, *args, **kwargs) + # Check if the hub model_id or local path is a LoRA adapter + if find_adapter_config_file(pretrained_model_name_or_path) is not None: + if not is_peft_available(): + raise ImportError( + f"The model at {pretrained_model_name_or_path} is a `peft` adaptor, but `peft` is not available. " + f"Please install `peft` with `pip install peft` to use this model. " + ) + from peft import AutoPeftModel + + model = AutoPeftModel.from_pretrained(pretrained_model_name_or_path, *args, **kwargs) + model = model.merge_and_unload() + return cls(model=model) + + # Handle the case for the base model config = AutoConfig.from_pretrained(pretrained_model_name_or_path, *args, **kwargs) assert hasattr(config, "chronos_config"), "Not a Chronos config file" diff --git a/src/chronos/chronos2/trainer.py b/src/chronos/chronos2/trainer.py index 561da9e..bd4e464 100644 --- a/src/chronos/chronos2/trainer.py +++ b/src/chronos/chronos2/trainer.py @@ -3,6 +3,7 @@ # Authors: Abdul Fatir Ansari +import warnings from typing import TYPE_CHECKING, cast from torch.utils.data import DataLoader, Dataset @@ -48,11 +49,16 @@ class Chronos2Trainer(Trainer): train_dataset = cast("Chronos2Dataset", self.train_dataset) - assert train_dataset.batch_size == self.args.train_batch_size, ( - f"The batch_size of the train_dataset ({train_dataset.batch_size}) does not match the batch_size " - f"in TrainingArguments ({self.args.train_batch_size}). If you're using a machine with multiple GPUs, " - f"ensure that only a single GPU is visible by setting the CUDA_VISIBLE_DEVICES environment variable." - ) + if self.args.train_batch_size > train_dataset.batch_size: + warnings.warn( + f"The batch_size of the train_dataset ({train_dataset.batch_size}) does not match the batch_size " + f"in TrainingArguments ({self.args.train_batch_size}). On machines with multiple GPUs, this may indicate " + f"that multiple GPUs are visible and transformers is using DataParallel for training by default. " + f"This may lead to unnecessary slowdown and unexpected behavior. We strongly recommend setting the CUDA_VISIBLE_DEVICES " + f"environment variable to ensure that only a single GPU is visible.", + category=UserWarning, + stacklevel=3, + ) dataloader_params = { # Disable automatic batching as we handle batching ourselves @@ -74,11 +80,16 @@ class Chronos2Trainer(Trainer): eval_dataset = cast("Chronos2Dataset", self.eval_dataset) - assert eval_dataset.batch_size == self.args.eval_batch_size, ( - f"The batch_size of the eval_dataset ({eval_dataset.batch_size}) does not match the batch_size " - f"in TrainingArguments ({self.args.eval_batch_size}). If you're using a machine with multiple GPUs, " - f"ensure that only a single GPU is visible by setting the CUDA_VISIBLE_DEVICES environment variable." - ) + if self.args.eval_batch_size > eval_dataset.batch_size: + warnings.warn( + f"The batch_size of the eval_dataset ({eval_dataset.batch_size}) does not match the batch_size " + f"in TrainingArguments ({self.args.eval_batch_size}). On machines with multiple GPUs, this may indicate " + f"that multiple GPUs are visible and transformers is using DataParallel for training by default. " + f"This may lead to unnecessary slowdown and unexpected behavior. We strongly recommend setting the CUDA_VISIBLE_DEVICES " + f"environment variable to ensure that only a single GPU is visible.", + category=UserWarning, + stacklevel=3, + ) dataloader_params = { # Disable automatic batching as we handle batching ourselves diff --git a/src/chronos/chronos_bolt.py b/src/chronos/chronos_bolt.py index 1b60a8f..743ec06 100644 --- a/src/chronos/chronos_bolt.py +++ b/src/chronos/chronos_bolt.py @@ -408,6 +408,14 @@ class ChronosBoltPipeline(BaseChronosPipeline): super().__init__(inner_model=model) # type: ignore self.model = model + @property + def model_context_length(self) -> int: + return self.model.chronos_config.context_length + + @property + def model_prediction_length(self) -> int: + return self.model.chronos_config.prediction_length + @property def quantiles(self) -> List[float]: return self.model.config.chronos_config["quantiles"] @@ -487,14 +495,12 @@ class ChronosBoltPipeline(BaseChronosPipeline): """ context_tensor = self._prepare_and_validate_context(context=inputs) - model_context_length: int = self.model.config.chronos_config["context_length"] - model_prediction_length: int = self.model.config.chronos_config["prediction_length"] if prediction_length is None: - prediction_length = model_prediction_length + prediction_length = self.model_prediction_length - if prediction_length > model_prediction_length: + if prediction_length > self.model_prediction_length: msg = ( - f"We recommend keeping prediction length <= {model_prediction_length}. " + f"We recommend keeping prediction length <= {self.model_prediction_length}. " "The quality of longer predictions may degrade since the model is not optimized for it. " ) if limit_prediction_length: @@ -507,32 +513,46 @@ class ChronosBoltPipeline(BaseChronosPipeline): # We truncate the context here because otherwise batches with very long # context could take up large amounts of GPU memory unnecessarily. - if context_tensor.shape[-1] > model_context_length: - context_tensor = context_tensor[..., -model_context_length:] + if context_tensor.shape[-1] > self.model_context_length: + context_tensor = context_tensor[..., -self.model_context_length :] - # TODO: We unroll the forecast of Chronos Bolt greedily with the full forecast - # horizon that the model was trained with (i.e., 64). This results in variance collapsing - # every 64 steps. - context_tensor = context_tensor.to( - device=self.model.device, - dtype=torch.float32, - ) - while remaining > 0: - with torch.no_grad(): - prediction = self.model( - context=context_tensor, - ).quantile_preds.to(context_tensor) + context_tensor = context_tensor.to(device=self.model.device, dtype=torch.float32) + # First block prediction + with torch.no_grad(): + prediction: torch.Tensor = self.model(context=context_tensor).quantile_preds.to(context_tensor) predictions.append(prediction) remaining -= prediction.shape[-1] - if remaining <= 0: - break + # NOTE: The following heuristic for better prediction intervals with long-horizon forecasts + # uses all quantiles generated by the model for the first `model_prediction_length` steps, + # concatenating each quantile with the context and generating the next `model_prediction_length` steps. + # The `num_quantiles * num_quantiles` "samples" thus generated are then reduced to `num_quantiles` + # by computing empirical quantiles. Note that this option scales the batch size by `num_quantiles` + # when the `prediction_length` is greater than `model_prediction_length`. - central_idx = torch.abs(torch.tensor(self.quantiles) - 0.5).argmin() - central_prediction = prediction[:, central_idx] + if remaining > 0: + # Expand the context along quantile axis + context_tensor = context_tensor.unsqueeze(1).repeat(1, len(self.quantiles), 1) - context_tensor = torch.cat([context_tensor, central_prediction], dim=-1) + quantile_tensor = torch.tensor(self.quantiles, device=context_tensor.device) + while remaining > 0: + # Append the prediction to context + context_tensor = torch.cat([context_tensor, prediction], dim=-1)[..., -self.model_context_length :] + (batch_size, n_quantiles, context_length) = context_tensor.shape + + with torch.no_grad(): + # Reshape (batch, n_quantiles, context_length) -> (batch * n_quantiles, context_length) + prediction = self.model( + context=context_tensor.reshape(batch_size * n_quantiles, context_length) + ).quantile_preds.to(context_tensor) + # Reshape predictions from (batch * n_quantiles, n_quantiles, model_prediction_length) to (batch, n_quantiles * n_quantiles, model_prediction_length) + prediction = prediction.reshape(batch_size, n_quantiles * n_quantiles, -1) + # Reduce `n_quantiles * n_quantiles` to n_quantiles and transpose back to (batch_size, n_quantiles, model_prediction_length) + prediction = torch.quantile(prediction, q=quantile_tensor, dim=1).transpose(0, 1) + + predictions.append(prediction) + remaining -= prediction.shape[-1] return torch.cat(predictions, dim=-1)[..., :prediction_length].to(dtype=torch.float32, device="cpu") diff --git a/src/chronos/df_utils.py b/src/chronos/df_utils.py new file mode 100644 index 0000000..3adc1b0 --- /dev/null +++ b/src/chronos/df_utils.py @@ -0,0 +1,341 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +# Authors: Abdul Fatir Ansari + + +import warnings +from typing import TYPE_CHECKING + +import numpy as np + +if TYPE_CHECKING: + import pandas as pd + + +def _validate_df_types_and_cast( + df: "pd.DataFrame", + future_df: "pd.DataFrame | None", + target_columns: list[str], + id_column: str = "item_id", + timestamp_column: str = "timestamp", +) -> tuple["pd.DataFrame", "pd.DataFrame | None"]: + import pandas as pd + + astype_dict = {} + future_astype_dict = {} + for col in df.columns.drop([id_column, timestamp_column]): + col_dtype = df[col].dtype + if col in target_columns and not pd.api.types.is_numeric_dtype(df[col]): + raise ValueError(f"All target columns must be numeric but got {col=} with dtype={col_dtype}") + + if ( + pd.api.types.is_object_dtype(df[col]) + or pd.api.types.is_string_dtype(df[col]) + or isinstance(col_dtype, pd.CategoricalDtype) + ): + astype_dict[col] = "category" + elif pd.api.types.is_numeric_dtype(df[col]) or pd.api.types.is_bool_dtype(df[col]): + astype_dict[col] = "float32" + else: + raise ValueError( + f"All columns must contain numeric, object, category, string, or bool dtype but got {col=} with dtype={col_dtype}" + ) + + if future_df is not None and col in future_df.columns: + if future_df[col].dtype != col_dtype: + raise ValueError( + f"Column {col} in future_df has dtype {future_df[col].dtype} but column in df has dtype {col_dtype}" + ) + future_astype_dict[col] = astype_dict[col] + + df = df.astype(astype_dict, copy=True) + if future_df is not None: + future_df = future_df.astype(future_astype_dict, copy=True) + + return df, future_df + + +def validate_df_inputs( + df: "pd.DataFrame", + future_df: "pd.DataFrame | None", + target_columns: list[str], + prediction_length: int, + id_column: str = "item_id", + timestamp_column: str = "timestamp", +) -> tuple["pd.DataFrame", "pd.DataFrame | None", str, list[int], np.ndarray]: + """ + Validates and prepares dataframe inputs + + Parameters + ---------- + df + Input dataframe containing time series data with columns: + - id_column: Identifier for each time series + - timestamp_column: Timestamps for each observation + - target_columns: One or more target variables to forecast + - Additional columns are treated as covariates + future_df + Optional dataframe containing future covariate values with columns: + - id_column: Identifier for each time series + - timestamp_column: Future timestamps + - Subset of covariate columns from df + target_columns + Names of target columns to forecast + prediction_length + Number of future time steps to predict + id_column + Name of column containing time series identifiers + timestamp_column + Name of column containing timestamps + + Returns + ------- + A tuple containing: + - Validated and sorted input dataframe + - Validated and sorted future dataframe (if provided) + - Inferred frequency of the time series + - List of series lengths from input dataframe + - Original order of time series IDs + + Raises + ------ + ValueError + If validation fails for: + - Missing required columns + - Invalid data types + - Inconsistent frequencies + - Insufficient data points + - Mismatched series between df and future_df + - Invalid future_df lengths + """ + + import pandas as pd + + required_cols = [id_column, timestamp_column] + target_columns + missing_cols = [col for col in required_cols if col not in df.columns] + if missing_cols: + raise ValueError(f"df does not contain all expected columns. Missing columns: {missing_cols}") + + if future_df is not None: + future_required_cols = [id_column, timestamp_column] + missing_future_cols = [col for col in future_required_cols if col not in future_df.columns] + targets_in_future = [col for col in future_df.columns if col in target_columns] + extra_future_cols = [col for col in future_df.columns if col not in df.columns] + if missing_future_cols: + raise ValueError( + f"future_df does not contain all expected columns. Missing columns: {missing_future_cols}" + ) + if targets_in_future: + raise ValueError( + f"future_df cannot contain target columns. Target columns found in future_df: {targets_in_future}" + ) + if extra_future_cols: + raise ValueError(f"future_df cannot contain columns not present in df. Extra columns: {extra_future_cols}") + + df, future_df = _validate_df_types_and_cast( + df, future_df, id_column=id_column, timestamp_column=timestamp_column, target_columns=target_columns + ) + + # Get the original order of time series IDs + original_order = df[id_column].unique() + + # Sort and prepare df + df[timestamp_column] = pd.to_datetime(df[timestamp_column]) + df = df.sort_values([id_column, timestamp_column]) + + # Get series lengths + series_lengths = df[id_column].value_counts(sort=False).to_list() + + def validate_freq(timestamps: pd.DatetimeIndex, series_id: str): + freq = pd.infer_freq(timestamps) + if not freq: + raise ValueError(f"Could not infer frequency for series {series_id}") + return freq + + # Validate each series + all_freqs = [] + start_idx = 0 + timestamp_index = pd.DatetimeIndex(df[timestamp_column]) + for length in series_lengths: + if length < 3: + series_id = df[id_column].iloc[start_idx] + raise ValueError( + f"Every time series must have at least 3 data points, found {length=} for series {series_id}" + ) + timestamps = timestamp_index[start_idx : start_idx + length] + series_id = df[id_column].iloc[start_idx] + all_freqs.append(validate_freq(timestamps, series_id)) + start_idx += length + + if len(set(all_freqs)) > 1: + raise ValueError("All time series must have the same frequency") + + inferred_freq = all_freqs[0] + + # Sort future_df if provided and validate its series lengths + future_series_lengths = None + if future_df is not None: + future_df[timestamp_column] = pd.to_datetime(future_df[timestamp_column]) + future_df = future_df.sort_values([id_column, timestamp_column]) + + # Validate that future_df contains all series from df + context_ids = set(df[id_column].unique()) + future_ids = set(future_df[id_column].unique()) + if context_ids != future_ids: + raise ValueError("future_df must contain the same time series IDs as df") + + future_series_lengths = future_df[id_column].value_counts(sort=False) + if (future_series_lengths != prediction_length).any(): + invalid_series = future_series_lengths[future_series_lengths != prediction_length] + raise ValueError( + f"future_df must contain {prediction_length=} values for each series, " + f"but found series with different lengths: {invalid_series.to_dict()}" + ) + + return df, future_df, inferred_freq, series_lengths, original_order + + +def convert_df_input_to_list_of_dicts_input( + df: "pd.DataFrame", + future_df: "pd.DataFrame | None", + target_columns: list[str], + prediction_length: int, + id_column: str = "item_id", + timestamp_column: str = "timestamp", + validate_inputs: bool = True, + freq: str | None = None, +) -> tuple[list[dict[str, np.ndarray | dict[str, np.ndarray]]], np.ndarray, dict[str, "pd.DatetimeIndex"]]: + """ + Convert from dataframe input format to a list of dictionaries input format. + + Parameters + ---------- + df + Input dataframe containing time series data with columns: + - id_column: Identifier for each time series + - timestamp_column: Timestamps for each observation + - target_columns: One or more target variables to forecast + - Additional columns are treated as covariates + future_df + Optional dataframe containing future covariate values with columns: + - id_column: Identifier for each time series + - timestamp_column: Future timestamps + - Subset of covariate columns from df + target_columns + Names of target columns to forecast + prediction_length + Number of future time steps to predict + id_column + Name of column containing time series identifiers + timestamp_column + Name of column containing timestamps + validate_inputs + [ADVANCED] When True (default), validates dataframes before prediction. Setting to False removes the + validation overhead, but may silently lead to wrong predictions if data is misformatted. When False, you + must ensure: (1) all dataframes are sorted by (id_column, timestamp_column); (2) future_df (if provided) + has the same item IDs as df with exactly prediction_length rows of future timestamps per item; (3) all + timestamps are regularly spaced (e.g., with hourly frequency). + freq + Frequency string for timestamp generation (e.g., "h", "D", "W"). Can only be used + when validate_inputs=False. When provided, skips frequency inference from the data. + + Returns + ------- + A tuple containing: + - Time series converted to list of dictionaries format + - Original order of time series IDs + - Dictionary mapping series IDs to future time index + """ + + import pandas as pd + + if freq is not None and validate_inputs: + raise ValueError( + "freq can only be provided when validate_inputs=False. " + "When using freq with validate_inputs=False, you must ensure: " + "(1) all dataframes are sorted by (id_column, timestamp_column); " + "(2) future_df (if provided) has the same item IDs as df with exactly " + "prediction_length rows of future timestamps per item; " + "(3) all timestamps are regularly spaced." + ) + + if validate_inputs: + df, future_df, freq, series_lengths, original_order = validate_df_inputs( + df, + future_df=future_df, + id_column=id_column, + timestamp_column=timestamp_column, + target_columns=target_columns, + prediction_length=prediction_length, + ) + else: + # Get the original order of time series IDs + original_order = df[id_column].unique() + + # Get series lengths + series_lengths = df[id_column].value_counts(sort=False).to_list() + + # If freq is not provided, infer from the first series with >= 3 points + if freq is None: + timestamp_index = pd.DatetimeIndex(df[timestamp_column]) + start_idx = 0 + for length in series_lengths: + if length < 3: + start_idx += length + continue + timestamps = timestamp_index[start_idx : start_idx + length] + freq = pd.infer_freq(timestamps) + break + + assert freq is not None, "validate_inputs is False, but could not infer frequency from the dataframe" + + # Convert to list of dicts format + inputs: list[dict[str, np.ndarray | dict[str, np.ndarray]]] = [] + prediction_timestamps: dict[str, pd.DatetimeIndex] = {} + + indptr = np.concatenate([[0], np.cumsum(series_lengths)]).astype("int64") + target_array = df[target_columns].to_numpy().T # Shape: (n_targets, len(df)) + last_ts = pd.DatetimeIndex(df[timestamp_column].iloc[indptr[1:] - 1]) # Shape: (n_series,) + offset = pd.tseries.frequencies.to_offset(freq) + with warnings.catch_warnings(): + # Silence PerformanceWarning for non-vectorized offsets https://github.com/pandas-dev/pandas/blob/95624ca2e99b0/pandas/core/arrays/datetimes.py#L822 + warnings.simplefilter("ignore", category=pd.errors.PerformanceWarning) + # Generate all prediction timestamps at once by stacking offsets into shape (n_series * prediction_length) + prediction_timestamps_array = pd.DatetimeIndex( + np.dstack([last_ts + step * offset for step in range(1, prediction_length + 1)]).ravel() + ) + + past_covariates_dict = { + col: df[col].to_numpy() for col in df.columns if col not in [id_column, timestamp_column] + target_columns + } + future_covariates_dict = {} + if future_df is not None: + for col in future_df.columns.drop([id_column, timestamp_column]): + future_covariates_dict[col] = future_df[col].to_numpy() + if validate_inputs: + if (pd.DatetimeIndex(future_df[timestamp_column]) != pd.DatetimeIndex(prediction_timestamps_array)).any(): + raise ValueError( + "future_df timestamps do not match the expected prediction timestamps. " + "You can disable this check by setting `validate_inputs=False`" + ) + + for i in range(len(series_lengths)): + start_idx, end_idx = indptr[i], indptr[i + 1] + future_start_idx, future_end_idx = i * prediction_length, (i + 1) * prediction_length + + series_id = df[id_column].iloc[start_idx] + prediction_timestamps[series_id] = prediction_timestamps_array[future_start_idx:future_end_idx] + task: dict[str, np.ndarray | dict[str, np.ndarray]] = {"target": target_array[:, start_idx:end_idx]} + + if len(past_covariates_dict) > 0: + task["past_covariates"] = {col: values[start_idx:end_idx] for col, values in past_covariates_dict.items()} + if len(future_covariates_dict) > 0: + task["future_covariates"] = { + col: values[future_start_idx:future_end_idx] for col, values in future_covariates_dict.items() + } + inputs.append(task) + + assert len(inputs) == len(series_lengths) + + return inputs, original_order, prediction_timestamps diff --git a/test/dummy-chronos2-lora/adapter_config.json b/test/dummy-chronos2-lora/adapter_config.json new file mode 100644 index 0000000..1e714bb --- /dev/null +++ b/test/dummy-chronos2-lora/adapter_config.json @@ -0,0 +1,35 @@ +{ + "alpha_pattern": {}, + "auto_mapping": { + "base_model_class": "Chronos2Model", + "parent_library": "chronos.chronos2.model" + }, + "base_model_name_or_path": "test/dummy-chronos2-model", + "bias": "none", + "fan_in_fan_out": false, + "inference_mode": true, + "init_lora_weights": true, + "layer_replication": null, + "layers_pattern": null, + "layers_to_transform": null, + "loftq_config": {}, + "lora_alpha": 16, + "lora_dropout": 0.0, + "megatron_config": null, + "megatron_core": "megatron.core", + "modules_to_save": null, + "peft_type": "LORA", + "r": 8, + "rank_pattern": {}, + "revision": null, + "target_modules": [ + "self_attention.q", + "self_attention.k", + "self_attention.o", + "output_patch_embedding.output_layer", + "self_attention.v" + ], + "task_type": null, + "use_dora": false, + "use_rslora": false +} \ No newline at end of file diff --git a/test/dummy-chronos2-lora/adapter_model.safetensors b/test/dummy-chronos2-lora/adapter_model.safetensors new file mode 100644 index 0000000..384ea1a Binary files /dev/null and b/test/dummy-chronos2-lora/adapter_model.safetensors differ diff --git a/test/test_chronos.py b/test/test_chronos.py index b491da0..621abf9 100644 --- a/test/test_chronos.py +++ b/test/test_chronos.py @@ -3,6 +3,8 @@ from pathlib import Path +import numpy as np +import pandas as pd import pytest import torch @@ -12,7 +14,14 @@ from chronos import ( ChronosPipeline, MeanScaleUniformBins, ) -from test.util import validate_tensor +from test.util import create_df, get_forecast_start_times, validate_tensor + +DUMMY_MODEL_PATH = Path(__file__).parent / "dummy-chronos-model" + + +@pytest.fixture +def pipeline() -> ChronosPipeline: + return BaseChronosPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu") def test_base_chronos_pipeline_loads_from_huggingface(): @@ -167,11 +176,7 @@ def test_tokenizer_random_data(use_eos_token: bool): @pytest.mark.parametrize("model_dtype", [torch.float32, torch.bfloat16]) @pytest.mark.parametrize("input_dtype", [torch.float32, torch.bfloat16, torch.int64]) def test_pipeline_predict(model_dtype: torch.dtype, input_dtype: torch.dtype): - pipeline = ChronosPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos-model", - device_map="cpu", - torch_dtype=model_dtype, - ) + pipeline = ChronosPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu", torch_dtype=model_dtype) context = 10 * torch.rand(size=(4, 16)) + 10 context = context.to(dtype=input_dtype) @@ -238,11 +243,7 @@ def test_pipeline_predict_quantiles( prediction_length: int, quantile_levels: list[int], ): - pipeline = ChronosPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos-model", - device_map="cpu", - torch_dtype=model_dtype, - ) + pipeline = ChronosPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu", torch_dtype=model_dtype) context = 10 * torch.rand(size=(4, 16)) + 10 context = context.to(dtype=input_dtype) @@ -284,11 +285,7 @@ def test_pipeline_predict_quantiles( @pytest.mark.parametrize("model_dtype", [torch.float32, torch.bfloat16]) @pytest.mark.parametrize("input_dtype", [torch.float32, torch.bfloat16, torch.int64]) def test_pipeline_embed(model_dtype: torch.dtype, input_dtype: torch.dtype): - pipeline = ChronosPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos-model", - device_map="cpu", - torch_dtype=model_dtype, - ) + pipeline = ChronosPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu", torch_dtype=model_dtype) d_model = pipeline.model.model.config.d_model context = 10 * torch.rand(size=(4, 16)) + 10 context = context.to(dtype=input_dtype) @@ -312,6 +309,88 @@ def test_pipeline_embed(model_dtype: torch.dtype, input_dtype: torch.dtype): validate_tensor(scale, shape=(1,), dtype=torch.float32) +@pytest.mark.parametrize( + "context_setup, expected_rows", + [ + # Targets only + ({}, 6), # 2 series * 3 predictions + # Different context lengths + ( + {"series_ids": ["X", "Y", "Z"], "n_points": [10, 17, 56], "target_cols": ["custom_target"]}, + 9, + ), # 3 series * 3 predictions + ], +) +@pytest.mark.parametrize("freq", ["s", "min", "30min", "h", "D", "W", "ME", "QE", "YE"]) +def test_predict_df_works_for_valid_inputs(pipeline, context_setup, expected_rows, freq): + prediction_length = 3 + df = create_df(**context_setup, freq=freq) + forecast_start_times = get_forecast_start_times(df, freq) + + series_ids = context_setup.get("series_ids", ["A", "B"]) + target_columns = context_setup.get("target_cols", ["target"]) + n_series = len(series_ids) + n_targets = len(target_columns) + result = pipeline.predict_df(df, target=target_columns[0], prediction_length=prediction_length) + + assert len(result) == expected_rows + assert "item_id" in result.columns and np.all( + result["item_id"].to_numpy() == np.array(series_ids).repeat(n_targets * prediction_length) + ) + assert "target_name" in result.columns and np.all( + result["target_name"].to_numpy() == np.tile(np.array(target_columns).repeat(prediction_length), n_series) + ) + assert "timestamp" in result.columns and np.all( + result.groupby("item_id")["timestamp"].min().to_numpy() == pd.to_datetime(forecast_start_times).to_numpy() + ) + assert "predictions" in result.columns + assert all(str(q) in result.columns for q in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) + + +def test_predict_df_with_non_uniform_timestamps_raises_error(pipeline): + df = create_df() + # Make timestamps non-uniform for series A + df.loc[df["item_id"] == "A", "timestamp"] = [ + "2023-01-01", + "2023-01-02", + "2023-01-04", + "2023-01-05", + "2023-01-06", + "2023-01-07", + "2023-01-08", + "2023-01-09", + "2023-01-10", + "2023-01-11", + ] + + with pytest.raises(ValueError, match="not infer frequency"): + pipeline.predict_df(df) + + +def test_predict_df_with_inconsistent_frequencies_raises_error(pipeline): + df = pd.DataFrame( + { + "item_id": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"], + "timestamp": [ + "2023-01-01", + "2023-01-02", + "2023-01-03", + "2023-01-04", + "2023-01-05", + "2023-01-01", + "2023-02-01", + "2023-03-01", + "2023-04-01", + "2023-05-01", + ], + "target": [1.0] * 10, + } + ) + + with pytest.raises(ValueError, match="same frequency"): + pipeline.predict_df(df) + + @pytest.mark.parametrize("n_tokens", [10, 1000, 10000]) def test_tokenizer_number_of_buckets(n_tokens): config = ChronosConfig( diff --git a/test/test_chronos2.py b/test/test_chronos2.py index 753a944..2d95a37 100644 --- a/test/test_chronos2.py +++ b/test/test_chronos2.py @@ -13,8 +13,10 @@ import pytest import torch from chronos import BaseChronosPipeline, Chronos2Pipeline -from chronos.chronos2.dataset import convert_df_input_to_list_of_dicts_input -from test.util import validate_tensor +from chronos.chronos2.config import Chronos2CoreConfig +from chronos.chronos2.layers import MHA +from chronos.df_utils import convert_df_input_to_list_of_dicts_input +from test.util import create_df, create_future_df, get_forecast_start_times, validate_tensor, timeout_callback DUMMY_MODEL_PATH = Path(__file__).parent / "dummy-chronos2-model" @@ -32,6 +34,14 @@ def test_base_chronos2_pipeline_loads_from_s3(): BaseChronosPipeline.from_pretrained("s3://autogluon/chronos-2", device_map="cpu") +def test_base_chronos2_pipeline_loads_from_hf(): + BaseChronosPipeline.from_pretrained("amazon/chronos-2", device_map="cpu") + + +def test_chronos2_lora_pipeline_loads_from_disk(): + Chronos2Pipeline.from_pretrained(Path(__file__).parent / "dummy-chronos2-lora", device_map="cpu") + + @pytest.mark.parametrize( "inputs, prediction_length, expected_output_shapes", [ @@ -317,13 +327,11 @@ def test_when_input_is_invalid_then_predict_raises_value_error(pipeline, inputs, _ = pipeline.predict(inputs, prediction_length=10) -@pytest.mark.parametrize("torch_dtype", [torch.float32, torch.bfloat16]) +@pytest.mark.parametrize("dtype", [torch.float32, torch.bfloat16]) @pytest.mark.parametrize("input_dtype", [torch.float32, torch.bfloat16, torch.int64]) -def test_pipeline_predict_can_handle_different_model_and_input_dtypes( - torch_dtype: torch.dtype, input_dtype: torch.dtype -): +def test_pipeline_predict_can_handle_different_model_and_input_dtypes(dtype: torch.dtype, input_dtype: torch.dtype): pipeline = BaseChronosPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos2-model", device_map="cpu", torch_dtype=torch_dtype + Path(__file__).parent / "dummy-chronos2-model", device_map="cpu", torch_dtype=dtype ) context = 10 * torch.rand(size=(4, 3, 16)) + 10 context = context.to(dtype=input_dtype) @@ -336,6 +344,35 @@ def test_pipeline_predict_can_handle_different_model_and_input_dtypes( validate_tensor(quantiles_item, (3, expected_num_quantiles, 7), dtype=torch.float32) +@pytest.mark.parametrize( + "inputs, expected_output_shapes", + [ + # NOTE: d_model for the dummy model is 6 + # Homogenous univariate task + (torch.rand(4, 1, 16), [(1, 3, 6)] * 4), + # Homogenous multivariate task + (torch.rand(4, 3, 37), [(3, 5, 6)] * 4), + # Heterogenous tasks with different history lengths + ( + [torch.rand(100), torch.rand(2, 150), torch.rand(120)], + [(1, 12, 6), (2, 12, 6), (1, 12, 6)], + ), + ], +) +def test_when_input_is_valid_then_pipeline_can_embed(pipeline, inputs, expected_output_shapes): + embeds, loc_scales = pipeline.embed(inputs) + + assert ( + isinstance(embeds, list) + and len(embeds) == len(expected_output_shapes) + and len(loc_scales) == len(expected_output_shapes) + ) + for embed, loc_scale, expected_shape in zip(embeds, loc_scales, expected_output_shapes): + validate_tensor(embed, expected_shape, dtype=torch.float32) + validate_tensor(loc_scale[0], (expected_shape[0], 1), dtype=torch.float32) + validate_tensor(loc_scale[1], (expected_shape[0], 1), dtype=torch.float32) + + @pytest.mark.parametrize( "task_kwargs", [ @@ -383,81 +420,54 @@ def test_pipeline_can_evaluate_on_dummy_fev_task(pipeline, task_kwargs): assert isinstance(eval_summary["test_error"], float) -def create_df(series_ids=["A", "B"], n_points=[10, 10], target_cols=["target"], covariates=None, freq="h"): - """Helper to create test context DataFrames.""" - series_dfs = [] - for series_id, length in zip(series_ids, n_points): - series_data = {"item_id": series_id, "timestamp": pd.date_range(end="2001-10-01", periods=length, freq=freq)} - for target_col in target_cols: - series_data[target_col] = np.random.randn(length) - if covariates: - for cov in covariates: - series_data[cov] = np.random.randn(length) - series_dfs.append(pd.DataFrame(series_data)) - return pd.concat(series_dfs, ignore_index=True) - - -def create_future_df(forecast_start_times: list, series_ids=["A", "B"], n_points=[5, 5], covariates=None, freq="h"): - """Helper to create test future DataFrames.""" - series_dfs = [] - for series_id, length, start in zip(series_ids, n_points, forecast_start_times): - series_data = {"item_id": series_id, "timestamp": pd.date_range(start=start, periods=length, freq=freq)} - if covariates: - for cov in covariates: - series_data[cov] = np.random.randn(length) - series_dfs.append(pd.DataFrame(series_data)) - return pd.concat(series_dfs, ignore_index=True) - - -def get_forecast_start_times(df, freq="h"): - context_end_times = df.groupby("item_id")["timestamp"].max() - forecast_start_times = [pd.date_range(end_time, periods=2, freq=freq)[-1] for end_time in context_end_times] - - return forecast_start_times - - @pytest.mark.parametrize( - "context_setup, future_setup, expected_rows", + "context_setup, future_setup", [ # Targets only - ({}, None, 6), # 2 series * 3 predictions + ({}, None), # Multiple targets with different context lengths - ( - {"target_cols": ["sales", "revenue", "profit"], "n_points": [10, 17]}, - None, - 18, - ), # 2 series * 3 targets * 3 predictions + ({"target_cols": ["sales", "revenue", "profit"], "n_points": [10, 17]}, None), # With past covariates - ({"covariates": ["cov1"]}, None, 6), + ({"covariates": ["cov1"]}, None), # With future covariates - ({"covariates": ["cov1"]}, {"covariates": ["cov1"], "n_points": [3, 3]}, 6), + ({"covariates": ["cov1"]}, {"covariates": ["cov1"]}), # With past-only and future covariates - ({"covariates": ["cov1", "cov2"]}, {"covariates": ["cov1"], "n_points": [3, 3]}, 6), + ({"covariates": ["cov1", "cov2"]}, {"covariates": ["cov1"]}), # With past-only and future covariates and different series order ( {"series_ids": ["B", "C", "A", "Z"], "n_points": [10, 20, 100, 256], "covariates": ["cov1", "cov2"]}, - { - "series_ids": ["B", "C", "A", "Z"], - "covariates": ["cov1"], - "n_points": [3, 3, 3, 3], - }, - 12, + {"series_ids": ["B", "C", "A", "Z"], "covariates": ["cov1"]}, ), ], ) @pytest.mark.parametrize("freq", ["s", "min", "30min", "h", "D", "W", "ME", "QE", "YE"]) -def test_predict_df_works_for_valid_inputs(pipeline, context_setup, future_setup, expected_rows, freq): - prediction_length = 3 +@pytest.mark.parametrize("prediction_length", [1, 4]) +@pytest.mark.parametrize("validate_inputs", [True, False]) +def test_predict_df_works_for_valid_inputs( + pipeline, context_setup, future_setup, freq, validate_inputs, prediction_length +): df = create_df(**context_setup, freq=freq) forecast_start_times = get_forecast_start_times(df, freq) - future_df = create_future_df(forecast_start_times, **future_setup, freq=freq) if future_setup else None + if future_setup: + series_ids = future_setup.get("series_ids", ["A", "B"]) + future_setup_with_n_points = {**future_setup, "n_points": [prediction_length] * len(series_ids)} + future_df = create_future_df(forecast_start_times, **future_setup_with_n_points, freq=freq) + else: + future_df = None series_ids = context_setup.get("series_ids", ["A", "B"]) target_columns = context_setup.get("target_cols", ["target"]) n_series = len(series_ids) n_targets = len(target_columns) - result = pipeline.predict_df(df, future_df=future_df, target=target_columns, prediction_length=prediction_length) + result = pipeline.predict_df( + df, + future_df=future_df, + target=target_columns, + prediction_length=prediction_length, + validate_inputs=validate_inputs, + ) + expected_rows = n_series * n_targets * prediction_length assert len(result) == expected_rows assert "item_id" in result.columns and np.all( result["item_id"].to_numpy() == np.array(series_ids).repeat(n_targets * prediction_length) @@ -512,9 +522,10 @@ def test_predict_df_future_df_validation_errors(pipeline, future_data, error_mat pipeline.predict_df(df, future_df=future_df) -def test_predict_df_with_non_uniform_timestamps_raises_error(pipeline): +@pytest.mark.parametrize("validate_inputs", [True, False]) +def test_predict_df_with_non_uniform_timestamps_raises_error(pipeline, validate_inputs): df = create_df() - # Make timestamps non-uniform for series A + # Make timestamps non-uniform for series A (first series) df.loc[df["item_id"] == "A", "timestamp"] = [ "2023-01-01", "2023-01-02", @@ -528,8 +539,8 @@ def test_predict_df_with_non_uniform_timestamps_raises_error(pipeline): "2023-01-11", ] - with pytest.raises(ValueError, match="not infer frequency"): - pipeline.predict_df(df) + with pytest.raises((ValueError, AssertionError), match="not infer frequency"): + pipeline.predict_df(df, validate_inputs=validate_inputs) def test_predict_df_with_inconsistent_frequencies_raises_error(pipeline): @@ -566,26 +577,80 @@ def test_predict_df_with_future_df_missing_series_raises_error(pipeline): pipeline.predict_df(df, future_df=future_df) -def test_predict_df_with_future_df_with_different_lengths_raises_error(pipeline): - df = create_df(series_ids=["A", "B"], covariates=["cov1"]) - future_df = create_future_df( - get_forecast_start_times(df), series_ids=["A", "B"], n_points=[3, 7], covariates=["cov1"] - ) - - with pytest.raises(ValueError, match="all time series must have length"): - pipeline.predict_df(df, future_df=future_df, prediction_length=3) - - def test_predict_df_with_future_df_with_different_freq_raises_error(pipeline): df = create_df(series_ids=["A", "B"], covariates=["cov1"], freq="h") future_df = create_future_df( get_forecast_start_times(df), series_ids=["A", "B"], n_points=[3, 3], covariates=["cov1"], freq="D" ) - with pytest.raises(ValueError, match="must have the same frequency as context"): + with pytest.raises(ValueError, match="future_df timestamps do not match"): pipeline.predict_df(df, future_df=future_df, prediction_length=3) +def test_predict_df_with_future_df_with_different_lengths_raises_error(pipeline): + df = create_df(series_ids=["A", "B"], covariates=["cov1"]) + future_df = create_future_df( + get_forecast_start_times(df), series_ids=["A", "B"], n_points=[3, 7], covariates=["cov1"] + ) + + with pytest.raises(ValueError, match="future_df must contain prediction"): + pipeline.predict_df(df, future_df=future_df, prediction_length=3) + + +@pytest.mark.parametrize( + "context_setup, future_setup", + [ + # Targets only + ({}, None), + # Multiple targets with different context lengths + ({"target_cols": ["sales", "revenue", "profit"], "n_points": [10, 17]}, None), + # With past covariates + ({"covariates": ["cov1"]}, None), + # With future covariates + ({"covariates": ["cov1"]}, {"covariates": ["cov1"]}), + # With past-only and future covariates + ({"covariates": ["cov1", "cov2"]}, {"covariates": ["cov1"]}), + # With past-only and future covariates and different series order + ( + {"series_ids": ["B", "C", "A", "Z"], "n_points": [10, 20, 100, 256], "covariates": ["cov1", "cov2"]}, + {"series_ids": ["B", "C", "A", "Z"], "covariates": ["cov1"]}, + ), + ], +) +@pytest.mark.parametrize("prediction_length", [1, 4]) +def test_predict_df_outputs_different_results_with_cross_learning_enabled( + pipeline, context_setup, future_setup, prediction_length +): + freq = "h" + df = create_df(**context_setup, freq=freq) + forecast_start_times = get_forecast_start_times(df, freq) + if future_setup: + series_ids = future_setup.get("series_ids", ["A", "B"]) + future_setup_with_n_points = {**future_setup, "n_points": [prediction_length] * len(series_ids)} + future_df = create_future_df(forecast_start_times, **future_setup_with_n_points, freq=freq) + else: + future_df = None + + series_ids = context_setup.get("series_ids", ["A", "B"]) + target_columns = context_setup.get("target_cols", ["target"]) + result_with_cross_learning = pipeline.predict_df( + df, + future_df=future_df, + target=target_columns, + prediction_length=prediction_length, + cross_learning=True, + ) + result_without_cross_learning = pipeline.predict_df( + df, + future_df=future_df, + target=target_columns, + prediction_length=prediction_length, + cross_learning=False, + ) + + assert not np.array_equal(result_with_cross_learning["predictions"], result_without_cross_learning["predictions"]) + + @pytest.mark.parametrize( "inputs, prediction_length, expected_output_shapes", [ @@ -671,12 +736,20 @@ def test_predict_df_with_future_df_with_different_freq_raises_error(pipeline): ), ], ) +@pytest.mark.parametrize("finetune_mode", ["full", "lora"]) def test_when_input_is_valid_then_pipeline_can_be_finetuned( - pipeline, inputs, prediction_length, expected_output_shapes + pipeline, inputs, prediction_length, expected_output_shapes, finetune_mode ): # Get outputs before fine-tuning orig_outputs_before = pipeline.predict(inputs, prediction_length=prediction_length) - ft_pipeline = pipeline.fit(inputs, prediction_length=prediction_length, num_steps=5, min_past=1, batch_size=32) + ft_pipeline = pipeline.fit( + inputs, + prediction_length=prediction_length, + num_steps=5, + min_past=1, + batch_size=32, + finetune_mode=finetune_mode, + ) # Get outputs from fine-tuned pipeline ft_outputs = ft_pipeline.predict(inputs, prediction_length=prediction_length) # Get outputs from original pipeline after fine-tuning @@ -852,40 +925,36 @@ def test_when_input_time_series_are_too_short_then_finetuning_raises_error(pipel @pytest.mark.parametrize( - "context_setup, future_setup, expected_rows", + "context_setup, future_setup", [ # Targets only - ({}, None, 6), # 2 series * 3 predictions + ({}, None), # Multiple targets with different context lengths - ( - {"target_cols": ["sales", "revenue", "profit"], "n_points": [10, 17]}, - None, - 18, - ), # 2 series * 3 targets * 3 predictions + ({"target_cols": ["sales", "revenue", "profit"], "n_points": [10, 17]}, None), # With past covariates - ({"covariates": ["cov1"]}, None, 6), + ({"covariates": ["cov1"]}, None), # With future covariates - ({"covariates": ["cov1"]}, {"covariates": ["cov1"], "n_points": [3, 3]}, 6), + ({"covariates": ["cov1"]}, {"covariates": ["cov1"]}), # With past-only and future covariates - ({"covariates": ["cov1", "cov2"]}, {"covariates": ["cov1"], "n_points": [3, 3]}, 6), + ({"covariates": ["cov1", "cov2"]}, {"covariates": ["cov1"]}), # With past-only and future covariates and different series order ( {"series_ids": ["B", "C", "A", "Z"], "n_points": [10, 20, 100, 256], "covariates": ["cov1", "cov2"]}, - { - "series_ids": ["B", "C", "A", "Z"], - "covariates": ["cov1"], - "n_points": [3, 3, 3, 3], - }, - 12, + {"series_ids": ["B", "C", "A", "Z"], "covariates": ["cov1"]}, ), ], ) @pytest.mark.parametrize("freq", ["h", "D", "ME"]) -def test_two_step_finetuning_with_df_input_works(pipeline, context_setup, future_setup, expected_rows, freq): +def test_two_step_finetuning_with_df_input_works(pipeline, context_setup, future_setup, freq): prediction_length = 3 df = create_df(**context_setup, freq=freq) forecast_start_times = get_forecast_start_times(df, freq) - future_df = create_future_df(forecast_start_times, **future_setup, freq=freq) if future_setup else None + if future_setup: + series_ids = future_setup.get("series_ids", ["A", "B"]) + future_setup_with_n_points = {**future_setup, "n_points": [prediction_length] * len(series_ids)} + future_df = create_future_df(forecast_start_times, **future_setup_with_n_points, freq=freq) + else: + future_df = None series_ids = context_setup.get("series_ids", ["A", "B"]) target_columns = context_setup.get("target_cols", ["target"]) @@ -918,6 +987,7 @@ def test_two_step_finetuning_with_df_input_works(pipeline, context_setup, future ) # Check predictions from the fine-tuned model are valid + expected_rows = n_series * n_targets * prediction_length assert len(result) == expected_rows assert "item_id" in result.columns and np.all( result["item_id"].to_numpy() == np.array(series_ids).repeat(n_targets * prediction_length) @@ -936,3 +1006,164 @@ def test_two_step_finetuning_with_df_input_works(pipeline, context_setup, future # Check predictions from the fine-tuned model are different from the original predictions assert not np.allclose(orig_result_before["predictions"].to_numpy(), result["predictions"].to_numpy()) + + +def test_when_predict_df_called_with_timeout_callback_then_timeout_error_is_raised(pipeline): + num_series = 1000 + large_df = create_df(series_ids=[j for j in range(num_series)], n_points=[2048] * num_series) + with pytest.raises(TimeoutError, match="time limit exceeded"): + pipeline.predict_df( + large_df, + prediction_length=48, + after_batch=timeout_callback(0.1), + ) + + +@pytest.mark.parametrize("attn_implementation", ["eager", "sdpa"]) +def test_pipeline_works_with_different_attention_implementations(attn_implementation): + """Test that the pipeline works with different attention implementations.""" + # Load the dummy model + model_path = Path(__file__).parent / "dummy-chronos2-model" + + # Load with specified attention implementation + pipeline = BaseChronosPipeline.from_pretrained( + model_path, device_map="cpu", attn_implementation=attn_implementation + ) + + # Verify the config has the correct attention implementation + assert pipeline.model.config._attn_implementation == attn_implementation + + # Test prediction with simple input + inputs = torch.rand(2, 1, 16) + prediction_length = 7 + + outputs = pipeline.predict(inputs, prediction_length=prediction_length) + + # Check outputs are valid + assert isinstance(outputs, list) and len(outputs) == 2 + for out in outputs: + validate_tensor(out, (1, DEFAULT_MODEL_NUM_QUANTILES, 7), dtype=torch.float32) + + +@pytest.mark.parametrize("attn_implementation", ["eager", "sdpa"]) +@pytest.mark.parametrize("output_attentions", [False, True]) +def test_attention_implementations_with_output_attentions(attn_implementation, output_attentions): + """Test that attention implementations handle output_attentions correctly.""" + # Create config with specified attention implementation + config = Chronos2CoreConfig( + d_model=128, + d_kv=32, + num_heads=4, + dropout_rate=0.1, + attn_implementation=attn_implementation, + ) + + # Create MHA layer + mha = MHA(config, use_rope=True) + mha.eval() + + # Create dummy inputs + batch_size = 2 + seq_len = 10 + hidden_states = torch.randn(batch_size, seq_len, config.d_model) + position_ids = torch.arange(seq_len).unsqueeze(0).expand(batch_size, -1) + mask = torch.zeros(batch_size, config.num_heads, seq_len, seq_len) + + # Test forward pass + output = mha( + hidden_states=hidden_states, + mask=mask, + position_ids=position_ids, + output_attentions=output_attentions, + ) + + # Check output shape + assert output.hidden_states.shape == (batch_size, seq_len, config.d_model) + + # Check attention weights - should only be returned when output_attentions=True + if output_attentions: + assert output.attn_weights is not None + assert output.attn_weights.shape == (batch_size, config.num_heads, seq_len, seq_len) + else: + # SDPA doesn't return weights + if attn_implementation == "sdpa": + assert output.attn_weights is None + + +def test_eager_and_sdpa_produce_identical_outputs(pipeline): + """Test that eager and SDPA implementations produce identical outputs on full pipeline.""" + # Reload pipeline with SDPA + model_path = Path(__file__).parent / "dummy-chronos2-model" + pipeline_sdpa = BaseChronosPipeline.from_pretrained( + model_path, device_map="cpu", attn_implementation="sdpa", torch_dtype=torch.float32 + ) + + # Note: the original pipeline fixture uses default attn_implementation which should be sdpa + # Force eager for comparison + pipeline_eager = BaseChronosPipeline.from_pretrained( + model_path, device_map="cpu", attn_implementation="eager", torch_dtype=torch.float32 + ) + + # Test 1: Simple univariate input + inputs_simple = torch.rand(2, 1, 16) + prediction_length = 7 + + with torch.no_grad(): + outputs_eager = pipeline_eager.predict(inputs_simple, prediction_length=prediction_length) + outputs_sdpa = pipeline_sdpa.predict(inputs_simple, prediction_length=prediction_length) + + # Verify outputs match exactly + assert len(outputs_eager) == len(outputs_sdpa) + for out_eager, out_sdpa in zip(outputs_eager, outputs_sdpa): + # Should match exactly or very close (numerical precision) + assert torch.allclose(out_eager, out_sdpa, atol=1e-5, rtol=1e-4) + + # Test 2: Multivariate inputs with covariates to test group attention + inputs_grouped = [ + { + "target": np.random.randn(2, 36), + "past_covariates": { + "temperature": np.random.randn(36), + "weather_type": np.random.choice(["sunny", "cloudy", "rainy"], size=36), + }, + "future_covariates": { + "temperature": np.random.randn(prediction_length), + "weather_type": np.random.choice(["sunny", "cloudy", "rainy"], size=prediction_length), + }, + } + for _ in range(5) + ] + + with torch.no_grad(): + outputs_eager_grouped = pipeline_eager.predict(inputs_grouped, prediction_length=prediction_length) + outputs_sdpa_grouped = pipeline_sdpa.predict(inputs_grouped, prediction_length=prediction_length) + + # Verify outputs match for grouped inputs + assert len(outputs_eager_grouped) == len(outputs_sdpa_grouped) + for out_eager, out_sdpa in zip(outputs_eager_grouped, outputs_sdpa_grouped): + # Should match exactly or very close (numerical precision) + assert torch.allclose(out_eager, out_sdpa, atol=1e-5, rtol=1e-4) + + +def test_pipeline_can_be_finetuned_with_preprocessed_hf_dataset(pipeline): + """Test that fine-tuning works with preprocessed inputs from a HuggingFace Dataset.""" + from chronos.chronos2.dataset import prepare_inputs + + prediction_length = 8 + raw_inputs = [{"target": torch.rand(20)}, {"target": torch.rand(25)}, {"target": torch.rand(30)}] + + # Preprocess and convert to HF Dataset (simulating Arrow-based lazy loading) + prepared_tasks = prepare_inputs(raw_inputs, prediction_length=prediction_length, min_past=1, mode="train") + hf_dataset = datasets.Dataset.from_list(prepared_tasks).with_format("torch") + + # Fine-tune with preprocessed inputs + ft_pipeline = pipeline.fit( + hf_dataset, prediction_length=prediction_length, num_steps=5, min_past=1, batch_size=32, convert_inputs=False + ) + + # Verify fine-tuned model can predict + ft_outputs = ft_pipeline.predict(raw_inputs, prediction_length=prediction_length) + assert len(ft_outputs) == len(raw_inputs) + for ft_out in ft_outputs: + assert ft_out.shape == (1, DEFAULT_MODEL_NUM_QUANTILES, prediction_length) + assert not torch.isnan(ft_out).any() diff --git a/test/test_chronos_bolt.py b/test/test_chronos_bolt.py index 4749b3e..cabe8c5 100644 --- a/test/test_chronos_bolt.py +++ b/test/test_chronos_bolt.py @@ -5,12 +5,21 @@ from pathlib import Path import datasets import fev +import numpy as np +import pandas as pd import pytest import torch from chronos import BaseChronosPipeline, ChronosBoltPipeline from chronos.chronos_bolt import InstanceNorm, Patch -from test.util import validate_tensor +from test.util import create_df, get_forecast_start_times, validate_tensor + +DUMMY_MODEL_PATH = Path(__file__).parent / "dummy-chronos-bolt-model" + + +@pytest.fixture +def pipeline() -> ChronosBoltPipeline: + return BaseChronosPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu") def test_base_chronos_pipeline_loads_from_huggingface(): @@ -20,11 +29,7 @@ def test_base_chronos_pipeline_loads_from_huggingface(): @pytest.mark.parametrize("torch_dtype", [torch.float32, torch.bfloat16]) @pytest.mark.parametrize("input_dtype", [torch.float32, torch.bfloat16, torch.int64]) def test_pipeline_predict(torch_dtype: torch.dtype, input_dtype: torch.dtype): - pipeline = ChronosBoltPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos-bolt-model", - device_map="cpu", - torch_dtype=torch_dtype, - ) + pipeline = ChronosBoltPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu", torch_dtype=torch_dtype) context = 10 * torch.rand(size=(4, 16)) + 10 context = context.to(dtype=input_dtype) expected_num_quantiles = len(pipeline.quantiles) @@ -84,11 +89,7 @@ def test_pipeline_predict_quantiles( prediction_length: int, quantile_levels: list[float], ): - pipeline = ChronosBoltPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos-bolt-model", - device_map="cpu", - torch_dtype=torch_dtype, - ) + pipeline = ChronosBoltPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu", torch_dtype=torch_dtype) context = 10 * torch.rand(size=(4, 16)) + 10 context = context.to(dtype=input_dtype) @@ -127,11 +128,7 @@ def test_pipeline_predict_quantiles( @pytest.mark.parametrize("model_dtype", [torch.float32, torch.bfloat16]) @pytest.mark.parametrize("input_dtype", [torch.float32, torch.bfloat16, torch.int64]) def test_pipeline_embed(model_dtype: torch.dtype, input_dtype: torch.dtype): - pipeline = ChronosBoltPipeline.from_pretrained( - Path(__file__).parent / "dummy-chronos-bolt-model", - device_map="cpu", - torch_dtype=model_dtype, - ) + pipeline = ChronosBoltPipeline.from_pretrained(DUMMY_MODEL_PATH, device_map="cpu", torch_dtype=model_dtype) d_model = pipeline.model.config.d_model context = 10 * torch.rand(size=(4, 16)) + 10 context = context.to(dtype=input_dtype) @@ -160,6 +157,88 @@ def test_pipeline_embed(model_dtype: torch.dtype, input_dtype: torch.dtype): validate_tensor(loc_scale[1], shape=(1,), dtype=torch.float32) +@pytest.mark.parametrize( + "context_setup, expected_rows", + [ + # Targets only + ({}, 6), # 2 series * 3 predictions + # Different context lengths + ( + {"series_ids": ["X", "Y", "Z"], "n_points": [10, 17, 56], "target_cols": ["custom_target"]}, + 9, + ), # 3 series * 3 predictions + ], +) +@pytest.mark.parametrize("freq", ["s", "min", "30min", "h", "D", "W", "ME", "QE", "YE"]) +def test_predict_df_works_for_valid_inputs(pipeline, context_setup, expected_rows, freq): + prediction_length = 3 + df = create_df(**context_setup, freq=freq) + forecast_start_times = get_forecast_start_times(df, freq) + + series_ids = context_setup.get("series_ids", ["A", "B"]) + target_columns = context_setup.get("target_cols", ["target"]) + n_series = len(series_ids) + n_targets = len(target_columns) + result = pipeline.predict_df(df, target=target_columns[0], prediction_length=prediction_length) + + assert len(result) == expected_rows + assert "item_id" in result.columns and np.all( + result["item_id"].to_numpy() == np.array(series_ids).repeat(n_targets * prediction_length) + ) + assert "target_name" in result.columns and np.all( + result["target_name"].to_numpy() == np.tile(np.array(target_columns).repeat(prediction_length), n_series) + ) + assert "timestamp" in result.columns and np.all( + result.groupby("item_id")["timestamp"].min().to_numpy() == pd.to_datetime(forecast_start_times).to_numpy() + ) + assert "predictions" in result.columns + assert all(str(q) in result.columns for q in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) + + +def test_predict_df_with_non_uniform_timestamps_raises_error(pipeline): + df = create_df() + # Make timestamps non-uniform for series A + df.loc[df["item_id"] == "A", "timestamp"] = [ + "2023-01-01", + "2023-01-02", + "2023-01-04", + "2023-01-05", + "2023-01-06", + "2023-01-07", + "2023-01-08", + "2023-01-09", + "2023-01-10", + "2023-01-11", + ] + + with pytest.raises(ValueError, match="not infer frequency"): + pipeline.predict_df(df) + + +def test_predict_df_with_inconsistent_frequencies_raises_error(pipeline): + df = pd.DataFrame( + { + "item_id": ["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"], + "timestamp": [ + "2023-01-01", + "2023-01-02", + "2023-01-03", + "2023-01-04", + "2023-01-05", + "2023-01-01", + "2023-02-01", + "2023-03-01", + "2023-04-01", + "2023-05-01", + ], + "target": [1.0] * 10, + } + ) + + with pytest.raises(ValueError, match="same frequency"): + pipeline.predict_df(df) + + # The following tests have been taken from # https://github.com/autogluon/autogluon/blob/f57beb26cb769c6e0d484a6af2b89eab8aee73a8/timeseries/tests/unittests/models/chronos/pipeline/test_chronos_bolt.py # Author: Caner Turkmen diff --git a/test/test_df_utils.py b/test/test_df_utils.py new file mode 100644 index 0000000..7d5d814 --- /dev/null +++ b/test/test_df_utils.py @@ -0,0 +1,462 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0 + +from unittest.mock import patch + +import numpy as np +import pandas as pd +import pytest + +from chronos.df_utils import ( + convert_df_input_to_list_of_dicts_input, + validate_df_inputs, +) +from test.util import create_df, create_future_df, get_forecast_start_times + +# Tests for validate_df_inputs function + + +@pytest.mark.parametrize("freq", ["s", "min", "30min", "h", "D", "W", "ME", "QE", "YE"]) +def test_validate_df_inputs_returns_correct_metadata_for_valid_inputs(freq): + """Test that function returns validated dataframes, frequency, series lengths, and original order.""" + # Create test data with 2 series + df = create_df(series_ids=["A", "B"], n_points=[10, 15], target_cols=["target"], freq=freq) + + # Call validate_df_inputs + validated_df, validated_future_df, inferred_freq, series_lengths, original_order = validate_df_inputs( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + id_column="item_id", + timestamp_column="timestamp", + ) + + # Verify key return values + assert validated_future_df is None + assert inferred_freq is not None + assert series_lengths == [10, 15] + assert list(original_order) == ["A", "B"] + # Verify dataframe is sorted + assert validated_df["item_id"].iloc[0] == "A" + assert validated_df["item_id"].iloc[10] == "B" + + +def test_validate_df_inputs_casts_mixed_dtypes_correctly(): + """Test that numeric columns are cast to float32 and categorical/string/object columns are cast to category.""" + # Create dataframe with mixed column types + df = pd.DataFrame( + { + "item_id": ["A"] * 10, + "timestamp": pd.date_range(end="2001-10-01", periods=10, freq="h"), + "target": np.random.randn(10), # numeric + "numeric_cov": np.random.randint(0, 10, 10), # integer numeric + "string_cov": ["cat1"] * 5 + ["cat2"] * 5, # string + "bool_cov": [True, False] * 5, # boolean + } + ) + + # Call validate_df_inputs + validated_df, _, _, _, _ = validate_df_inputs( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + ) + + # Verify dtypes after validation + assert validated_df["target"].dtype == np.float32 + assert validated_df["numeric_cov"].dtype == np.float32 + assert validated_df["string_cov"].dtype.name == "category" + assert validated_df["bool_cov"].dtype == np.float32 # booleans are cast to float32 + + +def test_validate_df_inputs_raises_error_when_series_has_insufficient_data(): + """Test that ValueError is raised for series with < 3 data points.""" + # Create dataframe with one series having only 2 points + df = create_df(series_ids=["A", "B"], n_points=[10, 2], target_cols=["target"], freq="h") + + # Verify error is raised with series ID in message + with pytest.raises(ValueError, match=r"Every time series must have at least 3 data points.*series B"): + validate_df_inputs( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + ) + + +def test_validate_df_inputs_raises_error_when_future_df_has_mismatched_series_ids(): + """Test that ValueError is raised when future_df has different series IDs than df.""" + # Create df with series A and B + df = create_df(series_ids=["A", "B"], n_points=[10, 15], target_cols=["target"], freq="h") + + # Create future_df with only series A + forecast_start_times = get_forecast_start_times(df, freq="h") + future_df = create_future_df( + forecast_start_times=[forecast_start_times[0]], series_ids=["A"], n_points=[5], covariates=None, freq="h" + ) + + # Verify appropriate error is raised + with pytest.raises(ValueError, match=r"future_df must contain the same time series IDs as df"): + validate_df_inputs( + df=df, + future_df=future_df, + target_columns=["target"], + prediction_length=5, + ) + + +def test_validate_df_inputs_raises_error_when_future_df_has_incorrect_lengths(): + """Test that ValueError is raised when future_df lengths don't match prediction_length.""" + # Create df with series A and B with a covariate + df = create_df(series_ids=["A", "B"], n_points=[10, 13], target_cols=["target"], covariates=["cov1"], freq="h") + + # Create future_df with varying lengths per series (3 and 7 instead of 5) + forecast_start_times = get_forecast_start_times(df, freq="h") + future_df = create_future_df( + forecast_start_times=forecast_start_times, + series_ids=["A", "B"], + n_points=[3, 7], # incorrect lengths + covariates=["cov1"], + freq="h", + ) + + # Verify error message indicates which series have incorrect lengths + with pytest.raises( + ValueError, match=r"future_df must contain prediction_length=5 values for each series.*different lengths" + ): + validate_df_inputs( + df=df, + future_df=future_df, + target_columns=["target"], + prediction_length=5, + ) + + +# Tests for convert_df_input_to_list_of_dicts_input function + + +def test_convert_df_with_single_target_preserves_values(): + """Test conversion with single target column.""" + df = create_df(series_ids=["A", "B"], n_points=[10, 12], target_cols=["target"], freq="h") + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + ) + + # Verify output list has correct length (one per series) + assert len(inputs) == 2 + + # Verify target arrays have correct shape and values match input + assert inputs[0]["target"].shape == (1, 10) # (n_targets=1, n_timesteps=10) + assert inputs[1]["target"].shape == (1, 12) # (n_targets=1, n_timesteps=12) + + # Verify values are preserved + df_sorted = df.sort_values(["item_id", "timestamp"]) + np.testing.assert_array_almost_equal( + inputs[0]["target"][0], df_sorted[df_sorted["item_id"] == "A"]["target"].values + ) + np.testing.assert_array_almost_equal( + inputs[1]["target"][0], df_sorted[df_sorted["item_id"] == "B"]["target"].values + ) + + +def test_convert_df_with_multiple_targets_preserves_values_and_shape(): + """Test conversion with multiple target columns.""" + df = create_df(series_ids=["A", "B"], n_points=[10, 14], target_cols=["target1", "target2"], freq="h") + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + target_columns=["target1", "target2"], + prediction_length=5, + ) + + # Verify target arrays have shape (n_targets, n_timesteps) + assert inputs[0]["target"].shape == (2, 10) + assert inputs[1]["target"].shape == (2, 14) + + # Verify all target values are preserved for both series + df_sorted = df.sort_values(["item_id", "timestamp"]) + for i, series_id in enumerate(["A", "B"]): + series_data = df_sorted[df_sorted["item_id"] == series_id] + np.testing.assert_array_almost_equal(inputs[i]["target"][0], series_data["target1"].values) + np.testing.assert_array_almost_equal(inputs[i]["target"][1], series_data["target2"].values) + + +def test_convert_df_with_past_covariates_includes_them_in_output(): + """Test conversion with past covariates only.""" + df = create_df( + series_ids=["A", "B"], n_points=[10, 16], target_cols=["target"], covariates=["cov1", "cov2"], freq="h" + ) + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + ) + + # Verify output includes past_covariates dictionary + assert "past_covariates" in inputs[0] + assert "cov1" in inputs[0]["past_covariates"] + assert "cov2" in inputs[0]["past_covariates"] + + # Verify covariate values match input for both series + assert inputs[0]["past_covariates"]["cov1"].shape == (10,) + assert inputs[0]["past_covariates"]["cov2"].shape == (10,) + assert inputs[1]["past_covariates"]["cov1"].shape == (16,) + assert inputs[1]["past_covariates"]["cov2"].shape == (16,) + + # Verify no future_covariates key in output + assert "future_covariates" not in inputs[0] + + +def test_convert_df_with_past_and_future_covariates_includes_both(): + """Test conversion with both past and future covariates.""" + df = create_df(series_ids=["A", "B"], n_points=[10, 18], target_cols=["target"], covariates=["cov1"], freq="h") + + forecast_start_times = get_forecast_start_times(df, freq="h") + future_df = create_future_df( + forecast_start_times=forecast_start_times, + series_ids=["A", "B"], + n_points=[5, 5], + covariates=["cov1"], + freq="h", + ) + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=future_df, + target_columns=["target"], + prediction_length=5, + ) + + # Verify output includes both past_covariates and future_covariates dictionaries for both series + assert "past_covariates" in inputs[0] + assert "future_covariates" in inputs[0] + assert "past_covariates" in inputs[1] + assert "future_covariates" in inputs[1] + + # Verify all covariate values are preserved with correct shapes + assert inputs[0]["past_covariates"]["cov1"].shape == (10,) + assert inputs[0]["future_covariates"]["cov1"].shape == (5,) + assert inputs[1]["past_covariates"]["cov1"].shape == (18,) + assert inputs[1]["future_covariates"]["cov1"].shape == (5,) + + +@pytest.mark.parametrize("freq", ["s", "min", "30min", "h", "D", "W", "ME", "QE", "YE"]) +def test_convert_df_generates_prediction_timestamps_with_correct_frequency(freq): + """Test that prediction timestamps follow the inferred frequency.""" + # Use multiple series with irregular lengths + df = create_df(series_ids=["A", "B", "C"], n_points=[10, 15, 12], target_cols=["target"], freq=freq) + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + ) + + # Verify timestamps for all series + for series_id in ["A", "B", "C"]: + # Verify timestamps start after last context timestamp + last_context_time = df[df["item_id"] == series_id]["timestamp"].max() + first_pred_time = prediction_timestamps[series_id][0] + assert first_pred_time > last_context_time + + # Verify timestamps are evenly spaced according to frequency + pred_times = prediction_timestamps[series_id] + assert len(pred_times) == 5 + inferred_freq = pd.infer_freq(pred_times) + assert inferred_freq is not None + + +def test_convert_df_skips_validation_when_disabled(): + """Test that validate_inputs=False skips validation.""" + df = create_df(series_ids=["A", "B"], n_points=[10, 12], target_cols=["target"], freq="h") + + # Mock validate_df_inputs to verify it's not called when validation is disabled + with patch("chronos.df_utils.validate_df_inputs") as mock_validate: + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + validate_inputs=False, + ) + + # Verify validate_df_inputs was not called + mock_validate.assert_not_called() + + # Verify conversion still works + assert len(inputs) == 2 + + +def test_convert_df_preserves_all_values_with_random_inputs(): + """Generate random dataframe and verify all values are preserved exactly.""" + # Generate random parameters + n_series = np.random.randint(2, 5) + n_targets = np.random.randint(1, 4) + n_past_only_covariates = np.random.randint(1, 3) + n_future_covariates = np.random.randint(1, 3) + prediction_length = 5 + + series_ids = [f"series_{i}" for i in range(n_series)] + n_points = [np.random.randint(10, 20) for _ in range(n_series)] + target_cols = [f"target_{i}" for i in range(n_targets)] + past_only_covariates = [f"past_cov_{i}" for i in range(n_past_only_covariates)] + future_covariates = [f"future_cov_{i}" for i in range(n_future_covariates)] + all_covariates = past_only_covariates + future_covariates + + # Create dataframe with all covariates + df = create_df( + series_ids=series_ids, n_points=n_points, target_cols=target_cols, covariates=all_covariates, freq="h" + ) + + # Create future_df with only future covariates (not past-only ones) + forecast_start_times = get_forecast_start_times(df, freq="h") + future_df = create_future_df( + forecast_start_times=forecast_start_times, + series_ids=series_ids, + n_points=[prediction_length] * n_series, + covariates=future_covariates, + freq="h", + ) + + # Convert to list-of-dicts format + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=future_df, + target_columns=target_cols, + prediction_length=prediction_length, + ) + + # Verify all target values are preserved exactly + df_sorted = df.sort_values(["item_id", "timestamp"]) + for i, series_id in enumerate(series_ids): + series_data = df_sorted[df_sorted["item_id"] == series_id] + assert inputs[i]["target"].shape == (n_targets, n_points[i]) + + for j, target_col in enumerate(target_cols): + np.testing.assert_array_almost_equal(inputs[i]["target"][j], series_data[target_col].values) + + # Verify all past covariate values are preserved (both past-only and future covariates) + for i, series_id in enumerate(series_ids): + series_data = df_sorted[df_sorted["item_id"] == series_id] + assert "past_covariates" in inputs[i] + for cov in all_covariates: + np.testing.assert_array_almost_equal(inputs[i]["past_covariates"][cov], series_data[cov].values) + + # Verify only future covariates are in future_covariates (not past-only ones) + future_df_sorted = future_df.sort_values(["item_id", "timestamp"]) + for i, series_id in enumerate(series_ids): + series_future_data = future_df_sorted[future_df_sorted["item_id"] == series_id] + assert "future_covariates" in inputs[i] + # Only future covariates should be present + assert set(inputs[i]["future_covariates"].keys()) == set(future_covariates) + for cov in future_covariates: + np.testing.assert_array_almost_equal(inputs[i]["future_covariates"][cov], series_future_data[cov].values) + + # Verify output structure is correct + assert len(inputs) == n_series + assert list(original_order) == series_ids + assert len(prediction_timestamps) == n_series + + +def test_convert_df_with_freq_and_validate_inputs_raises_error(): + """Test that providing freq with validate_inputs=True raises ValueError.""" + df = create_df(series_ids=["A", "B"], n_points=[10, 12], target_cols=["target"], freq="h") + + with pytest.raises(ValueError, match="freq can only be provided when validate_inputs=False"): + convert_df_input_to_list_of_dicts_input( + df=df, + future_df=None, + target_columns=["target"], + prediction_length=5, + freq="h", + validate_inputs=True, + ) + + +@pytest.mark.parametrize("use_future_df", [True, False]) +def test_convert_df_with_freq_and_validate_inputs_false(use_future_df): + """Test that freq works with validate_inputs=False.""" + df = create_df(series_ids=["A", "B"], n_points=[10, 12], target_cols=["target"], covariates=["cov1"], freq="h") + prediction_length = 5 + + future_df = None + if use_future_df: + forecast_start_times = get_forecast_start_times(df, freq="h") + future_df = create_future_df( + forecast_start_times=forecast_start_times, + series_ids=["A", "B"], + n_points=[prediction_length, prediction_length], + covariates=["cov1"], + freq="h", + ) + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=future_df, + target_columns=["target"], + prediction_length=prediction_length, + freq="h", + validate_inputs=False, + ) + + assert len(inputs) == 2 + assert len(prediction_timestamps) == 2 + for series_id in ["A", "B"]: + assert len(prediction_timestamps[series_id]) == prediction_length + + +@pytest.mark.parametrize("use_future_df", [True, False]) +def test_convert_df_with_mismatched_freq_uses_user_provided_freq(use_future_df): + """Test that user-provided freq overrides data frequency when validate_inputs=False.""" + # Create data with hourly frequency + data_freq = "h" + df = create_df( + series_ids=["A", "B"], n_points=[10, 12], target_cols=["target"], covariates=["cov1"], freq=data_freq + ) + prediction_length = 5 + + # User provides daily frequency (different from data) + user_freq = "D" + + future_df = None + if use_future_df: + # Create future_df with hourly frequency (matching data, not user freq) + forecast_start_times = get_forecast_start_times(df, freq=data_freq) + future_df = create_future_df( + forecast_start_times=forecast_start_times, + series_ids=["A", "B"], + n_points=[prediction_length, prediction_length], + covariates=["cov1"], + freq=data_freq, + ) + + inputs, original_order, prediction_timestamps = convert_df_input_to_list_of_dicts_input( + df=df, + future_df=future_df, + target_columns=["target"], + prediction_length=prediction_length, + freq=user_freq, + validate_inputs=False, + ) + + # Prediction should work + assert len(inputs) == 2 + assert len(prediction_timestamps) == 2 + + # Forecast timestamps should use user-provided freq (daily), not data freq (hourly) + for series_id in ["A", "B"]: + pred_ts = prediction_timestamps[series_id] + assert len(pred_ts) == prediction_length + # Verify the frequency matches user-provided freq + inferred_freq = pd.infer_freq(pred_ts) + assert inferred_freq == user_freq diff --git a/test/util.py b/test/util.py index ac1b64c..943e072 100644 --- a/test/util.py +++ b/test/util.py @@ -1,5 +1,8 @@ -from typing import Optional, Tuple +import time +from typing import Callable, Optional, Tuple +import numpy as np +import pandas as pd import torch @@ -9,3 +12,47 @@ def validate_tensor(a: torch.Tensor, shape: Tuple[int, ...], dtype: Optional[tor if dtype is not None: assert a.dtype == dtype + + +def create_df(series_ids=["A", "B"], n_points=[10, 10], target_cols=["target"], covariates=None, freq="h"): + """Helper to create test context DataFrames.""" + series_dfs = [] + for series_id, length in zip(series_ids, n_points): + series_data = {"item_id": series_id, "timestamp": pd.date_range(end="2001-10-01", periods=length, freq=freq)} + for target_col in target_cols: + series_data[target_col] = np.random.randn(length) + if covariates: + for cov in covariates: + series_data[cov] = np.random.randn(length) + series_dfs.append(pd.DataFrame(series_data)) + return pd.concat(series_dfs, ignore_index=True) + + +def create_future_df(forecast_start_times: list, series_ids=["A", "B"], n_points=[5, 5], covariates=None, freq="h"): + """Helper to create test future DataFrames.""" + series_dfs = [] + for series_id, length, start in zip(series_ids, n_points, forecast_start_times): + series_data = {"item_id": series_id, "timestamp": pd.date_range(start=start, periods=length, freq=freq)} + if covariates: + for cov in covariates: + series_data[cov] = np.random.randn(length) + series_dfs.append(pd.DataFrame(series_data)) + return pd.concat(series_dfs, ignore_index=True) + + +def get_forecast_start_times(df, freq="h"): + context_end_times = df.groupby("item_id")["timestamp"].max() + forecast_start_times = [pd.date_range(end_time, periods=2, freq=freq)[-1] for end_time in context_end_times] + + return forecast_start_times + + +def timeout_callback(seconds: float | None) -> Callable: + """Return a callback object that raises an exception if time limit is exceeded.""" + start_time = time.monotonic() + + def callback() -> None: + if seconds is not None and time.monotonic() - start_time > seconds: + raise TimeoutError("time limit exceeded") + + return callback