Explorar o código

[TSPP] 24.03 Release

Dawid Majchrowski hai 1 ano
pai
achega
729963dd47
Modificáronse 100 ficheiros con 2404 adicións e 616 borrados
  1. 4 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/.dockerignore
  2. 2 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/.gitignore
  3. 26 7
      Tools/PyTorch/TimeSeriesPredictionPlatform/Dockerfile
  4. 1 1
      Tools/PyTorch/TimeSeriesPredictionPlatform/LICENSE
  5. 1 1
      Tools/PyTorch/TimeSeriesPredictionPlatform/NOTICE
  6. 429 108
      Tools/PyTorch/TimeSeriesPredictionPlatform/README.md
  7. 2 1
      Tools/PyTorch/TimeSeriesPredictionPlatform/callbacks/callbacks.py
  8. 2 1
      Tools/PyTorch/TimeSeriesPredictionPlatform/callbacks/ctl_callbacks.py
  9. 16 3
      Tools/PyTorch/TimeSeriesPredictionPlatform/callbacks/hydra_callbacks.py
  10. 7 3
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/conf_utils.py
  11. 2 15
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/converter_config.yaml
  12. 92 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/M5.yaml
  13. 99 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/M5_norm.yaml
  14. 92 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/M5_xgb.yaml
  15. 7 20
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/electricity.yaml
  16. 52 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/electricity_xgb.yaml
  17. 90 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay.yaml
  18. 95 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_enc24.yaml
  19. 92 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_enc288.yaml
  20. 96 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_enc48.yaml
  21. 85 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_xgb.yaml
  22. 7 20
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/traffic.yaml
  23. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert.yaml
  24. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert/onnx.yaml
  25. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert/torchscript.yaml
  26. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert/trt.yaml
  27. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/deploy.yaml
  28. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/export/onnx.yaml
  29. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/export/ts-script.yaml
  30. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/export/ts-trace.yaml
  31. 2 15
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment_config.yaml
  32. 13 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/ensemble_conf.yaml
  33. 4 13
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/ctlevaluator.yaml
  34. 8 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/postprocessor/clip_and_round.yaml
  35. 6 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/postprocessor/clip_to_zero.yaml
  36. 3 13
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/statevaluator.yaml
  37. 3 13
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/xgbevaluator.yaml
  38. 0 13
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/hydra/callbacks/merge_logs.yaml
  39. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/hydra/job_logging/primary.yaml
  40. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/hydra/job_logging/secondary.yaml
  41. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference/native.yaml
  42. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference/triton.yaml
  43. 2 15
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference_config.yaml
  44. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference_triton_config.yaml
  45. 27 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/logger.yaml
  46. 17 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/auto_arima.yaml
  47. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/dask_xgboost.yaml
  48. 21 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/dcrnn.yaml
  49. 13 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/deepar.yaml
  50. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/lstm.yaml
  51. 23 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/mtgnn.yaml
  52. 17 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/nbeats.yaml
  53. 15 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/nhits.yaml
  54. 3 16
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/tft.yaml
  55. 9 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/toy_gnn.yaml
  56. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/trivial.yaml
  57. 1 14
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/xgboost.yaml
  58. 0 17
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/auto_arima_electricity.yaml
  59. 0 17
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/cuml_auto_arima_electricity.yaml
  60. 12 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/dcrnn_pems_bay.yaml
  61. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/deepar_M5.yaml
  62. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/deepar_M5_norm.yaml
  63. 8 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/deepar_pems_bay.yaml
  64. 12 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/mtgnn_pems_bay.yaml
  65. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_M5.yaml
  66. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_M5_norm.yaml
  67. 19 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_electricity.yaml
  68. 9 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_pems_bay.yaml
  69. 19 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_traffic.yaml
  70. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nhits_M5.yaml
  71. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nhits_M5_norm.yaml
  72. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_M5.yaml
  73. 14 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_M5_norm.yaml
  74. 16 15
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_electricity.yaml
  75. 13 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_favorita.yaml
  76. 13 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_pems_bay.yaml
  77. 2 15
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_traffic.yaml
  78. 15 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_M5.yaml
  79. 59 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_M5_xgb.yaml
  80. 8 22
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_electricity.yaml
  81. 20 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_electricity_xgb.yaml
  82. 20 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_pems_bay_xgb.yaml
  83. 38 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_0.yaml
  84. 37 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_1.yaml
  85. 38 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_2.yaml
  86. 37 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_3.yaml
  87. 28 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/hp_search.yaml
  88. 33 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_0.yaml
  89. 32 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_1.yaml
  90. 33 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_2.yaml
  91. 33 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_3.yaml
  92. 27 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/hp_search.yaml
  93. 28 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/best_0.yaml
  94. 27 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/best_1.yaml
  95. 28 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/best_2.yaml
  96. 21 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/hp_search.yaml
  97. 27 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/best_0.yaml
  98. 26 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/best_1.yaml
  99. 27 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/best_2.yaml
  100. 25 0
      Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/hp_search.yaml

+ 4 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/.dockerignore

@@ -6,3 +6,7 @@
 .gitignore
 Dockerfile
 .dockerignore
+/outputs/
+/datasets/
+/multirun/
+/notebooks/

+ 2 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/.gitignore

@@ -3,3 +3,5 @@ __pycache__
 /outputs/
 *.zip
 /datasets/*/
+/datasets/
+/notebooks/

+ 26 - 7
Tools/PyTorch/TimeSeriesPredictionPlatform/Dockerfile

@@ -1,5 +1,19 @@
+# Copyright 2021-2024 NVIDIA CORPORATION
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #SPDX-License-Identifier: Apache-2.0
-ARG FROM_IMAGE_NAME=nvcr.io/nvidia/pytorch:22.04-py3
+ARG FROM_IMAGE_NAME=nvcr.io/nvidia/pytorch:22.12-py3
 
 FROM ${FROM_IMAGE_NAME}
 
@@ -30,26 +44,31 @@ RUN apt-get update && \
     rm -rf /var/lib/apt/lists/*
 
 
-# Install perf_client required library
 RUN apt-get update && \
     apt-get install -y libb64-dev libb64-0d curl && \
     apt-get clean && \
     rm -rf /var/lib/apt/lists/*
 
-# Set workdir and python path
 WORKDIR /workspace
 ENV PYTHONPATH /workspace
 
+RUN rm /usr/lib/libxgboost.so
+
 ADD requirements.txt /workspace/requirements.txt
 ADD triton/requirements.txt /workspace/triton/requirements.txt
 RUN pip install -r /workspace/requirements.txt
 RUN pip install -r /workspace/triton/requirements.txt
 RUN pip install nvidia-pyindex
 RUN pip install git+https://github.com/NVIDIA/dllogger#egg=dllogger
-RUN pip install --no-cache-dir -r requirements.txt -f https://data.dgl.ai/wheels/repo.html
+RUN pip install --no-cache-dir -r requirements.txt
+RUN pip install dgl==1.0.1 -f https://data.dgl.ai/wheels/cu117/repo.html
 
-# Add model files to workspace
-ADD . /workspace
+ADD ./hydra_plugins /workspace/hydra_plugins
+RUN pip install /workspace/hydra_plugins/hydra_optuna_sweeper/
+RUN pip install /workspace/hydra_plugins/hydra_joblib_launcher/
+RUN pip install /workspace/hydra_plugins/hydra_multiprocessing_launcher/
+RUN pip install /workspace/hydra_plugins/hydra_torchrun_launcher/
+RUN cp /workspace/hydra_plugins/optuna_sweeper.py /usr/local/lib/python3.8/dist-packages/hydra/plugins/sweeper.py
 
-RUN pip install -e distributed_launcher
+ADD . /workspace
 RUN rm -rf examples docker-examples tutorials

+ 1 - 1
Tools/PyTorch/TimeSeriesPredictionPlatform/LICENSE

@@ -186,7 +186,7 @@
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright 2021-2022 NVIDIA Corporation
+   Copyright [yyyy] [name of copyright owner]
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.

+ 1 - 1
Tools/PyTorch/TimeSeriesPredictionPlatform/NOTICE

@@ -190,7 +190,7 @@ This repository contains code from https://github.com/rwightman/pytorch-image-mo
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright 2021-2022 NVIDIA Corporation
+   Copyright [yyyy] [name of copyright owner]
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.

+ 429 - 108
Tools/PyTorch/TimeSeriesPredictionPlatform/README.md

@@ -2,17 +2,57 @@
 
 Time-series prediction is a common problem in multiple domains for various applications, including retail, industry, smart cities, and financial services. Research in the time-series field is growing exponentially, with hundreds of deep learning time-series forecasting paper submissions to ICML, ECML, ITISE, and multiple journals every year. However, there is currently no common framework to compare the accuracy and performance of all the models from the industry or academia.
 
+## Table Of Contents
+- [Solution overview](#solution-overview)
+  * [Time-Series Prediction Platform architecture](#time-series-prediction-platform-architecture)
+  * [Default configuration](#default-configuration)
+  * [Feature support matrix](#feature-support-matrix)
+    * [Features](#features)
+  * [Mixed precision training](#mixed-precision-training)
+    * [Enabling mixed precision](#enabling-mixed-precision)
+  * [Models](#models)
+  * [Datasets](#datasets)
+- [Setup](#setup)
+  * [Requirements](#requirements)
+- [Quick Start Guide](#quick-start-guide)
+  * [Getting Started](#getting-started)
+  * [Adding a new dataset](#adding-a-new-dataset)
+    * [New dataset example](#new-dataset-example)
+  * [Adding a new model](#adding-a-new-model)
+    * [New model example](#new-model-example)
+- [Advanced](#advanced)
+  * [Memory mapping large datasets](#memory-mapping-large-datasets)
+  * [Running multi-GPU experiments](#running-multi-gpu-experiments)
+  * [Parallel training](#parallel-training)
+  * [Running experiments with Exponential Moving Averaging](#running-experiments-with-exponential-moving-averaging)
+  * [Running experiments with Curriculum Learning](#running-experiments-with-curriculum-learning)
+  * [Hyperparameter Search](#hyperparameter-search)
+  * [Custom launchers](#custom-launchers)
+  * [XGBoost Training](#xgboost-training)
+  * [Postprocessing of predictions](#postprocessing-of-predictions)
+  * [Interprete your model](#interprete-your-model)
+  * [Ensembling](#ensembling)
+  * [Conversion, Deployment, and Inference](#conversion-deployment-and-inference)
+    * [Online Inference](#online-inference)
+  * [Parameters](#parameters)
+- [Release notes](#release-notes)
+  * [Changelog](#changelog)
+  * [Known issues](#known-issues)
+- [Reference](#reference)
+  * [Cite](#cite)
+
 ## Solution Overview
 Time-Series Prediction Platform (TSPP) enables users to mix and match datasets and models. In this case, the user has complete control over the following settings and can compare side-by-side results obtained from various solutions. These include:
-- Evaluation metrics 
-- Evaluation datasets 
-- Prediction horizons 
-- Prediction sliding window sizes Model choice
+- Evaluation metrics
+- Evaluation datasets
+- Prediction horizons
+- Prediction sliding window sizes
+- Model choice
 - Model hyperparameters
 
 ### Time-Series Prediction Platform architecture
 
-The platform has the following architecture. 
+The platform has the following architecture.
 
 
 ![Time-series Prediction Platform architecture
@@ -29,23 +69,14 @@ The platform is designed to support multiple data types for input features, incl
 <br>
 </div>
 
-### Default configuration
-The TSPP utilizes the default configurations provided by each model for each accompanying dataset. More information on individual model configurations can be found within the respective model repositories. By default, Temporal Fusion Transformer (TFT) is included within the TSPP.
-
-### Models
-    - Temporal Fusion Transformers
-    - XGBoost
-    - AutoARIMA
-    - LSTM
-
 ### Feature support matrix
-This tool supports the following features: 
+This tool supports the following features:
 
-| Feature               | Time-Series Prediction Platform               
+| Feature               | Time-Series Prediction Platform              
 |-----------------------|--------------------------
-|[Automatic mixed precision (AMP)](https://pytorch.org/docs/stable/amp.html)| Yes          
-|[Multi-GPU training with (PyTorch DDP)](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html)   | Yes  
-|[TorchScript, ONNX, and TRT conversion and NVIDIA Triton Deployment]	| Yes  
+|[Automatic mixed precision (AMP)](https://pytorch.org/docs/stable/amp.html)| Yes         
+|[Multi-GPU training with (PyTorch DDP)](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html)   | Yes 
+|[TorchScript, ONNX, and TRT conversion and NVIDIA Triton Deployment](https://github.com/triton-inference-server/server)   | Yes
 
 #### Features
 
@@ -53,15 +84,13 @@ This tool supports the following features:
 
 Multi-GPU training with [PyTorch Distributed Data Parallel](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html) is a mode of computation for PyTorch models that allows operations to be executed across multiple GPUs in parallel to accelerate computation.
 
-**TorchScript, ONNX, and TRT conversion and NVIDIA Triton Deployment** refer to the conversion of a model to the aforementioned formats and the ability to deploy the resulting converted models to an NVIDIA Triton inference server.  More detail about this process and native inference can be found in the Advanced tab under the Conversion, Deployment, and Inference subsection.
-
-
+**TorchScript, ONNX, and TRT conversion and NVIDIA Triton Deployment** refer to the conversion of a model to the aforementioned formats and the ability to deploy the resulting converted models to an NVIDIA Triton inference server.  More detail about this process and native inference can be found in the Advanced tab under the [Conversion, Deployment, and Inference](#conversion-deployment-and-inference) subsection.
 
 
 ### Mixed precision training
 
 Mixed precision is the combined use of different numerical precisions in a computational method. [Mixed precision](https://arxiv.org/abs/1710.03740) training offers significant computational speedup by performing operations in half-precision format while storing minimal information in single-precision to retain as much information as possible in critical parts of the network. Since the introduction of [Tensor Cores](https://developer.nvidia.com/tensor-cores) in NVIDIA Volta, and following with both the NVIDIA Turing and NVIDIA Ampere Architectures, significant training speedups are experienced by switching to mixed precision -- up to 3x overall speedup on the most arithmetically intense model architectures. Using mixed precision training requires two steps:
-1.  Porting the model to use the FP16 data type where appropriate.    
+1.  Porting the model to use the FP16 data type where appropriate.   
 2.  Adding loss scaling to preserve small gradient values.
 
 The ability to train deep learning networks with lower precision was introduced in the NVIDIA Pascal architecture and first supported in [CUDA 8](https://devblogs.nvidia.com/parallelforall/tag/fp16/) in the NVIDIA Deep Learning SDK.
@@ -74,10 +103,34 @@ For information about:
 #### Enabling mixed precision
 
 Mixed precision can be enabled by specifying `trainer.config.amp=True` in the launch call. For some cases, when the batch size is small, the overhead of scheduling kernels for mixed precision can be larger than the performance gain from using lower precision, effectively succeeding with lower throughput.
+
+### Default configuration
+The TSPP utilizes the default configurations provided by each model for each accompanying dataset. More information on individual model configurations can be found within the respective model repositories. By default, Temporal Fusion Transformer (TFT) is included within the TSPP.
+
+### Models
+   - [Temporal Fusion Transformers](https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/Forecasting/TFT/modeling.py) ( [conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/tft.yaml) )
+   - [XGBoost](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/tspp_xgboost.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/xgboost.yaml))
+   - [AutoARIMA](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/stat_models.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/auto_arima.yaml))
+   - [LSTM](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/lstm.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/lstm.yaml))
+   - [N-BEATS](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/nbeats.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/nbeats.yaml))
+   - [N-HITS](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/nhits.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/nhits.yaml))
+   - [DeepAR](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/deepar.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/deepar.yaml))
+   - [MTGNN](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/mtgnn.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/mtgnn.yaml))
+   - [DCRNN](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/models/dcrnn.py) ([conf](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/dcrnn.yaml))
+
+### Datasets
+  - [Electricity](https://archive.ics.uci.edu/dataset/321/electricityloaddiagrams20112014)
+  - [Traffic](https://archive.ics.uci.edu/dataset/204/pems+sf)
+  - [M5](https://github.com/Mcompetitions/M5-methods)
+  - [PEMS-BAY](https://pems.dot.ca.gov/?dnode=Clearinghouse)
+
+**Note**: We don't provide scripts to download `M5` and `PEMS-BAY` datasets, each user is responsible for downloading them from corresponding websites.
+
+**Note**: Each user is responsible for checking the content of datasets and the applicable licenses and determining if suitable for the intended use.
+
 ## Setup
 The following section lists the requirements you need to meet to run the Time-Series Prediction Platform.
 
-
 ### Requirements
 
 This repository contains a Dockerfile that extends the PyTorch NGC container and encapsulates some dependencies. Aside from these dependencies, ensure you have the following components:
@@ -89,21 +142,20 @@ This repository contains a Dockerfile that extends the PyTorch NGC container and
 For more information about how to get started with NGC containers, refer to the following sections from the NVIDIA GPU Cloud Documentation and the Deep Learning Documentation:
 -   [Getting Started Using NVIDIA GPU Cloud](https://docs.nvidia.com/ngc/ngc-getting-started-guide/index.html)
 -   [Accessing And Pulling From The NGC Container Registry](https://docs.nvidia.com/deeplearning/frameworks/user-guide/index.html#accessing_registry)
-  
-For those unable to set up the required environment or create your own container, refer to the versioned [NVIDIA Container Support Matrix](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html).
+ For those unable to set up the required environment or create your own container, refer to the versioned [NVIDIA Container Support Matrix](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html).
 
 
 ## Quick start guide
 
 ### Getting Started
-1. Create a dataset directory.  The directory can be arbitrary, and it is recommended not to include it in the TimeSeriesPredictionPlatform directory.  This arbitrary directory will be mounted to the TSPP container later.  In the following steps, this directory will be referred to as /your/datasets/.
+1. Create a dataset directory.  The directory can be arbitrary, and it is recommended not to include it in the TimeSeriesPredictionPlatform directory.  This arbitrary directory will be mounted to the TSPP container later.  In the following steps, this directory will be referred to as `/your/datasets/`.
 
 2. Enter the Deep Learning Examples TSPP repository:
 
 ```
 cd DeeplearningExamples/Tools/TimeSeriesPredictionPlatform
 ```
-3. Copy the relevant temporal fusion transformer code to the TSPP:
+3. Copy the relevant temporal fusion transformer [code](https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/Forecasting/TFT/modeling.py) to the TSPP:
 ```
 mkdir -p models/tft_pyt/ && cp ../../PyTorch/Forecasting/TFT/modeling.py models/tft_pyt/
 ```
@@ -112,17 +164,18 @@ mkdir -p models/tft_pyt/ && cp ../../PyTorch/Forecasting/TFT/modeling.py models/
 docker build -t tspp .
 ```
 
-5. Next, we will start our container and mount the dataset directory, which means that /workspace/datasets/ points to /your/datasets/.  Any changes made to this folder in the docker container are reflected in the original directory and vice versa.  If we want to mount additional folders, we can add ‘-v /path/on/local/:/path/in/container/’ to the run command.  This will be useful if we want to save the outputs from training or inference once we close the container. To start the docker container:
+5. Next, we will start our container and mount the dataset directory, which means that `/workspace/datasets/` points to `/your/datasets/`.  Any changes made to this folder in the docker container are reflected in the original directory and vice versa.  If we want to mount additional folders, we can add `-v /path/on/local/:/path/in/container/` to the run command.  This will be useful if we want to save the outputs from training or inference once we close the container. To start the docker container:
 ```
 docker run -it --gpus all --ipc=host --network=host -v /your/datasets/:/workspace/datasets/ tspp bash
 ```
 
-6. After running the previous command, you will be placed inside the docker container in the /workspace directory.  Inside the container, download either the `electricity` or `traffic` dataset:
+6. After running the previous command, you will be placed inside the docker container in the /workspace directory.  Inside the container preprocess `electricity`, `traffic`, `M5` or `pems_bay` dataset. Some of the datasets might need manual download of the data, see [datasets](#datasets):
+
 ```
-python data/script_download_data.py --dataset {dataset_name} --output_dir /workspace/datasets/
+python data/script_preprocess_data.py --dataset {dataset_name} --output_dir /workspace/datasets/
 ```
 The raw electricity dataset is the 15-minute  electricity consumption of 370 customers from the UCI Electricity Load Diagrams.  We aggregate to an hourly forecast and use the previous week to predict the following day.
-The raw traffic dataset is the 10-minute  occupancy rate of San Francisco freeways from 440 sensors downloaded from the UCI PEMS-SF Data Set.  We again aggregate to an hourly forecast and use the previous week to predict the following day.  
+The raw traffic dataset is the 10-minute  occupancy rate of San Francisco freeways from 440 sensors downloaded from the UCI PEMS-SF Data Set.  We again aggregate to an hourly forecast and use the previous week to predict the following day. 
 
 7. Preprocess the dataset:
 ```
@@ -147,36 +200,36 @@ cd DeeplearningExamples/Tools/TimeSeriesPredictionPlatform
 
 2. Do a preliminary data transposition. TSPP `launch_preproc.py` script is designed to work with CSV input. Each row should contain only a single datapoint. CSV should contain at least three columns: one for time feature, one for labels, and one for dataset ID (we assume a single file will contain data for multiple correlated time series). For reference, see `data/script_download_data.py` script.
 
-3. Include the target dataset in the directory where you want to keep your datasets. The directory can be arbitrary, and it is recommended not to include it in the TimeSeriesPredictionPlatform directory. This arbitrary directory will be mounted to the TSPP container later 
+3. Include the target dataset in the directory where you want to keep your datasets. The directory can be arbitrary, and it is recommended not to include it in the TimeSeriesPredictionPlatform directory. This arbitrary directory will be mounted to the TSPP container later
 
 4. Create a configuration file for your dataset, found in TimeSeriesPredictionPlatform/conf/dataset, that includes the following values:
 
- 	* source_path: The path to the CSV that contains your dataset
+   * source_path: The path to the CSV that contains your dataset
 
- 	* dest_path: The path to where preprocessing should write your preprocessed dataset
+   * dest_path: The path to where preprocessing should write your preprocessed dataset
 
- 	* time_ids: The name of the column within your source CSV that is the feature to split your training, validation, and test datasets on.
+   * time_ids: The name of the column within your source CSV that is the feature to split your training, validation, and test datasets on.
 
- 	* train_range, valid_range, test_range: The ranges that mark the edges of the train, validation, and test subsets. Remember that subsets can overlap  since predicting the first ‘unseen element’ requires the input of the seen elements before it. As an alternative, a valid_boundary can be specified, which marks the end of training.  Then from the valid boundary, the next horizon length number of entries are for validation, and finally, following the end of the validation set, the next horizon length number of entries are for testing.
+   * train_range, valid_range, test_range: The ranges that mark the edges of the train, validation, and test subsets. Remember that subsets can overlap, since predicting the first ‘unseen element’ requires the input of the seen elements before it. As an alternative, a `valid_boundary` can be specified, which marks the end of training.  Then from the `valid boundary`, the next `horizon length` number of entries are for validation, and finally, from the end of the validation set, the next horizon length number of entries are for testing.
 
- 	* dataset_stride: The stride the dataloader uses to walk the sliding window through the dataset. Default: 1
-    
- 	* scale_per_id: Whether to scale continuous features during preprocessing using scalers fitted on just samples from the same ID (True), or all samples (False, Default)
-   
- 	* encoder_length: The length of data known up until the ‘present’
+   * stride: The stride the dataloader uses to walk the sliding window through the dataset. Default: 1
+  
+   * scale_per_id: Whether to scale continuous features during preprocessing using scalers fitted on just samples from the same ID (True), or all samples (False, Default)
+ 
+   * encoder_length: The length of data known up until the ‘present’
 
- 	* example_length: The length of all data, including data known into the future. The prediction horizon is the difference between example_length and encoder_length.
+   * example_length: The length of all data, including data known into the future. The prediction horizon is the difference between example_length and encoder_length.
 
- 	* features: A list of the features that the model takes as input. Each feature should be represented by an object containing descriptive attributes. All features should have at least a feature_type (ID, TIME, TARGET, WEIGHT, SAMPLE_WEIGHT, KNOWN, OBSERVED, or STATIC) and feature_embed_type (CONTINUOUS or CATEGORICAL). Continuous features may have a scaler attribute that represents the type of scaler used in preprocessing. Categorical columns should have a cardinality attribute that represents the number of unique values the feature takes plus one (this is due to mapping NaNs to 0 in all cases). Examples can be found in the files in /TimeSeriesPredictionPlatform/conf/dataset/. Required features are one TIME feature, at least one ID feature, one TARGET feature, and at least one KNOWN, OBSERVED, or STATIC feature.
+   * features: A list of the features that the model takes as input. Each feature should be represented by an object containing descriptive attributes. All features should have at least a feature_type (ID, TIME, TARGET, WEIGHT, SAMPLE_WEIGHT, KNOWN, OBSERVED, or STATIC) and feature_embed_type (CONTINUOUS or CATEGORICAL). Continuous features may have a scaler attribute that represents the type of scaler used in preprocessing. Categorical columns should have a cardinality attribute that represents the number of unique values the feature takes plus one (this is due to mapping NaNs to 0 in all cases). Examples can be found in the files in /TimeSeriesPredictionPlatform/conf/dataset/. Required features are one TIME feature, at least one ID feature, one TARGET feature, and at least one KNOWN, OBSERVED, or STATIC feature.
 
 
- 	* train_samples: The number of samples that should be taken at train time to use as train input to your model for a single epoch
+   * train_samples: The number of samples that should be taken at train time to use as train input to your model for a single epoch
 
- 	* valid_samples: The number of samples that should be taken at train time to use as validation input to your model for a single epoch
+   * valid_samples: The number of samples that should be taken at train time to use as validation input to your model for a single epoch
 
- 	* binarized: Whether or not preprocessing should accelerate data loading by outputting the preprocessed dataset in a binarized format
+   * binarized: Whether preprocessing should accelerate data loading by outputting the preprocessed dataset in a binarized format
 
- 	* time_series_count: The number of unique time-series contained in the dataset.
+   * time_series_count: The number of unique time-series contained in the dataset.
 
 
 5. After a specification has been written, it is ready to be preprocessed with:
@@ -197,17 +250,115 @@ docker run -it --gpus all -v /your/datasets/:/workspace/datasets/ --ipc=host tsp
 python launch_training.py dataset={YOUR_DATASET} model=tft trainer/criterion=quantile
 ```
 
+#### New dataset example
+<details>
+ <summary>see example</summary>
+ In this section, we will demonstrate how to add a new dataset. Let's assume we want to add a few sine waves dataset to demonstrate the model's ability to fit a deterministic timeseries, in TSPP we should follow these steps:
+
+ 1. Create dataset and save in datasets directory
+ ```python
+ # script_generate_sine.py
+ import os
+ import numpy as np
+ import pandas as pd
+
+
+ if __name__ == '__main__':
+   dest_path = '/workspace/datasets/sines/'
+   os.makedirs(dest_path, exist_ok=True)
+   # generate series with general form y = k * sin(x)
+   ks = [1, 10, 125]
+   xs = np.linspace(0, 4*np.pi, num=200)
+   df = pd.concat([pd.DataFrame({'y': k * np.sin(xs), 'x': xs, 'point_idx': np.arange(len(xs)), 'ts_id': i}) for i, k in enumerate(ks)])
+
+   df.to_csv(os.path.join(dest_path, 'sines.csv'))
+ ```
+ ```bash
+ python script_generate_sine.py
+ ```
+
+ 2. Create dataset description for data in `conf/dataset/<name>.yaml`
+ For our example we want to predict the next value based on series id, previous value and corresponding x values.
+ `example_length` is going to be 2, since we want to predict the next value from previous and `encoder_length` is 1 to indicate that 1 of 2 values in the example are used as a lookback window.
+
+ For evaluation and testing, we will leave last two values. Easiest way to achieve this is to set `valid_boundary` (to learn more on how to use ranges instead of boundary, refer to [electricity.yaml](https://github.com/NVIDIA/DeepLearningExamples/blob/master/Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/electricity.yaml)).
+
+ Also, since we know that series have widely different scales, we want to scale them separately, hence `scale_per_id`
+
+ ```yaml
+ # conf/dataset/sines.yaml
+ _target_: data.datasets.create_datasets
+ config:
+   graph: False
+   source_path: /workspace/datasets/sines/sines.csv
+   dest_path: /workspace/datasets/sines/
+   valid_boundary: 198
+   scale_per_id: True
+   encoder_length: 1
+   input_length: 1
+   example_length: 2
+   stride: 1
+   MultiID: False
+   features:
+   - name: 'ts_id'
+    feature_type: 'ID'
+    feature_embed_type: 'CATEGORICAL'
+    cardinality: 4
+   - name: 'point_idx'
+    feature_type: 'TIME'
+    feature_embed_type: 'CONTINUOUS'
+   - name: 'y'
+    feature_type: 'TARGET'
+    feature_embed_type: 'CONTINUOUS'
+    scaler:
+      _target_: sklearn.preprocessing.StandardScaler
+   - name: 'x'
+    feature_type: 'KNOWN'
+    feature_embed_type: 'CONTINUOUS'
+    scaler:
+      _target_: sklearn.preprocessing.StandardScaler
+   - name: 'ts_id'
+    feature_type: 'STATIC'
+    feature_embed_type: 'CATEGORICAL'
+    cardinality: 4
+   train_samples: -1
+   valid_samples: -1
+   binarized: True
+   time_series_count: 3
+ ```
+
+ **NOTE**: How  the same column can be used to describe several different features. The only one you probably wouldn't want to appear more than once is TARGET column ;)
+
+ 3. Congratulations! You created your own dataset, now you can proceed to preprocess it and train your models with it.
+ ```bash
+ python launch_preproc.py dataset=sines
+ python launch_training.py dataset=sines model=tft trainer.config.num_epochs=1
+ ```
+
+</details>
 
 
 ### Adding a new model
 
-Models added to the prediction platform are subject to a few key constraints. Namely, the models should be constructed using vanilla PyTorch. Models should handle  the forecasting task (anomaly detection and classification are planned); models should expect that the data is fed in a sliding window and that tensors will be aggregated by Temporal/Data Type. An example of this can be found in data/dataset.py. \
-The default format of the data batch is a dictionary with tensors representing different kinds of covariates. A complete list of the tensors can be found in a batch:
+Models added to the prediction platform are subject to a few key constraints. Namely, the models should be constructed using PyTorch. Models should handle the forecasting task (anomaly detection and classification are planned); models should expect that the data is fed in a sliding window and that tensors will be aggregated by Temporal/Data Type. An example of this can be found in data/dataset.py. \
+The default format of the data batch is a dictionary with tensors representing different kinds of covariates. A complete list of the tensor names and types that can be found in a batch:
 ```
-FEAT_NAMES = ["s_cat", "s_cont", "k_cat", "k_cont", "o_cat", "o_cont", "target", "weight", "sample_weight", "id"]
+FEAT_NAME_MAP = {
+   "s_cat":             (InputTypes.STATIC, DataTypes.CATEGORICAL),
+   "s_cont":            (InputTypes.STATIC, DataTypes.CONTINUOUS),
+   "k_cat":             (InputTypes.KNOWN, DataTypes.CATEGORICAL),
+   "k_cont":            (InputTypes.KNOWN, DataTypes.CONTINUOUS),
+   "o_cat":             (InputTypes.OBSERVED, DataTypes.CATEGORICAL),
+   "o_cont":            (InputTypes.OBSERVED, DataTypes.CONTINUOUS),
+   "target":            (InputTypes.TARGET, DataTypes.CONTINUOUS),
+   "weight":            (InputTypes.WEIGHT, DataTypes.CONTINUOUS),
+   "sample_weight":     (InputTypes.SAMPLE_WEIGHT, DataTypes.CONTINUOUS),
+   "id":                (InputTypes.ID, DataTypes.CATEGORICAL),
+   "timestamp":         (InputTypes.TIME, DataTypes.CATEGORICAL) # During preprocessing we cast all time data to int
+}
 ```
 
-To integrate a model into the TSPP: 
+To integrate a model into the TSPP:
 
 1. Enter the Deep Learning Examples repository:
 
@@ -215,20 +366,22 @@ To integrate a model into the TSPP:
 cd DeeplearningExamples
 ```
 
-2. Copy the model files into the Deep Learning Examples DeeplearningExamples/Tools/PyTorch/TimeSeriesPredictionPlatform/models/ directory:
+2. Copy the model files into the Deep Learning Examples DeepLearningExamples/Tools/PyTorch/TimeSeriesPredictionPlatform/models/ directory:
 
 ```
 cp -r /PATH/TO/YOUR/MODEL Tools/PyTorch/TimeSeriesPredictionPlatform/models
 ```
 
-3. Write a configuration file for the model in `DeeplearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model`. 
+3. Write a configuration file for the model in `DeepLearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model`.
+
+This configuration file should reflect the default configuration for your model. Within this file, the _target_ of the model component should be set to point to your model class and global override to define the trainer type used for your model. Currently, we support `ctltrainer` - used for DL models, `stat` and `xgb` trainers used for stat and xgb models respectively. If you need a custom trainer, you can check `conf/trainer/<type>trainer.yaml` or feel free to open an issue with suggestions. For example, on how to define a trainer for your model, see `conf/model/tft.yaml`.
 
-This configuration file should reflect the default configuration for your model. Within this file, the _target_ of the model component should be set to point to your model class. If your model needs additional configuration values based on the dataset, you should create a configuration file in `DeeplearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model_dataset/{modelname_datasetname.yaml}` named according to the model and dataset names. Examples can be found in the `DeeplearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model/tft.yaml` and `DeeplearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model_dataset/tft_traffic.yaml` files.
+If your model needs additional configuration values based on the dataset, you should create a configuration file in `DeepLearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model_dataset/{modelname_datasetname.yaml}` named according to the model and dataset names. Examples can be found in the `DeepLearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model/tft.yaml` and `DeepLearningExamples/Tools/TimeSeriesPredictionPlatform/conf/model_dataset/tft_traffic.yaml` files.
 
 4. Build and launch container:
 ```
-cd DeeplearningExamples/Tools/
-docker build -t tspp TimeSeriesPredictionPlatform
+cd DeepLearningExamples/Tools/TimeSeriesPredictionPlatform
+docker build -t tspp .
 docker run -it --rm --ipc=host --network=host --gpus all -v /your/datasets/:/workspace/datasets/ tspp bash
 ```
 
@@ -239,42 +392,97 @@ python launch_training.py model={model_name}
 Some additional values may be needed in this call. For example, if your model requires the Gaussian NLL criterion, you will need to append trainer/criterion=GLL to your call.
 
 
+#### New model example
+
+<details>
+ <summary>see example</summary>
+ Let's assume that you want to test linear model performance for your research and you want to consume all static categorical and known continuous data you have available:
+  1. Write your model that consumes `config` argument:
+
+ ```python
+ # models/linear.py
+ import torch
+ import torch.nn as nn
+
+ class LinearModel(nn.Module):
+  def __init__(self, config):
+    super().__init__()
+    self.encoder_length = config.encoder_length
+    self.example_length = config.example_length
+    self.forecest_len = self.example_length - self.encoder_length
+    self.num_targets = config.temporal_target_size
+    self.input_size = (len(config.static_categorical_inp_lens) +
+                           config.temporal_known_continuous_inp_size) * self.encoder_length
+    self.model = nn.Linear(self.input_size,
+                           self.num_targets * self.forecest_len,
+                           bias=config.use_bias)
+
+  def forward(self, batch):
+    batch_size = batch['target'].shape[0]
+    inp = torch.cat((batch['s_cat'][:, :self.encoder_length].view(batch_size, -1),
+                     batch['k_cont'][:, :self.encoder_length].view(batch_size, -1)),
+                     dim=1)
+    pred = self.model(inp)
+    return pred.reshape(batch_size, self.forecest_len, self.num_targets)
+ ```
+
+ 2. Write `conf/model/` entry for your model:
+ ```yaml
+ # conf/model/linear.yaml
+ _target_: models.linear.LinearModel
+ config:
+   use_bias: True
+
+ defaults:
+   - _self_
+   - /trainer@_global_/trainer: ctltrainer
+ ```
+ **NOTE**: `static_continuous_inp_size`, `temporal_known_continuous_inp_size`, etc. are 'magic' values that are injected into config during parsing time, to know more see `conf/train_derived_fields.yaml`. This file connects different parts of config and creates aggregate fields that, for example, keep track of number and cardinality of categorical variables in model config.
+
+ 3. Congratulations! You are ready to train your model.
+ ```bash
+ python launch_training.py model=linear dataset=electricity
+ ```
+
+</details>
 
 ## Advanced
 The following sections provide more details about  changing the dataset, altering the data preprocessing, and comparing the training results.
 
 
-### Running multi-GPU experiments
+### Memory mapping large datasets
+Since March 2024 release, we have an option designed for large datasets. Instead of loading dataset into RAM, you can use option `+dataset.config.memory_mapped=True` with `launch_training.py` to memory map dataset from the drive. Note, however, that in order to saturate GPUs, you will have to increase the number of dataloader workers `trainer.config.num_workers` to compensate for longer example loading time. Loading time depends heavily on drives and file system your machine uses.
 
+### Running multi-GPU experiments
 
 Launching on multi-GPU requires no changes to model code and can be executed as follows within a TSPP container:
 ```
-python launch_training.py -m hydra/launcher=torchrun hydra.launcher.nproc_per_node={num_gpus} {override parameters} 
+python launch_training.py -m hydra/launcher=torchrun hydra.launcher.nproc_per_node={num_gpus} {override parameters}
 ```
 
-Statistical models (like AutoARIMA) are not run on GPU, so they are unsuitable  for multi-GPU acceleration.  In addition, XGBoost has a separate way of doing multi-GPU acceleration.
+Statistical models (like AutoARIMA) do not run on GPU, so they are unsuitable for multi-GPU acceleration. In addition, XGBoost has a separate way of doing multi-GPU acceleration (see `dask_xgboost`).
 
 ### Parallel training
 
 While doing seed sweeps or hp searches on a machine with more than one GPU, we can parallelize the workload by using the `joblib` hydra plugin. To use the plugin, one has to specify `hydra/launcher=joblib` together with the number of parallel jobs `hydra.launcher.n_jobs=8`. For example:
 ```bash
 python launch_training.py \
-	-m \
-	seed='range(1,17)' \
-	model=tft \
-	dataset=electricity \
-	trainer/criterion=quantile \
-	trainer.config.num_epochs=3 \
-    hydra/launcher=joblib \
-    hydra.launcher.n_jobs=8 \
-    hydra.sweeper.max_batch_size=8
+   -m \
+   seed='range(1,17)' \
+   model=tft \
+   dataset=electricity \
+   trainer/criterion=quantile \
+   trainer.config.num_epochs=3 \
+   hydra/launcher=joblib \
+   hydra.launcher.n_jobs=8 \
+   hydra.sweeper.max_batch_size=8
 ```
 
 *Warning*: Sweeper sends jobs to a launcher in batches. In order to avoid race conditions, specify sweeper batch size to exactly match the number of parallel jobs. For the default sweeper it would be: `hydra.sweeper.max_batch_size=8`, and for optuna sweeper: `hydra.sweeper.n_jobs=8`.
 
 ### Running experiments with Exponential Moving Averaging
 
-Exponential moving averaging is a technique in which, while training, the model weights are integrated into a weighted moving average, and the weighted moving average is used in lieu of the directly trained model weights at test time. Our experiments have found this technique improves the convergence properties of most models and datasets we work with. The full paper of EMA can be found here (https://arxiv.org/pdf/1803.05407.pdf)
+Exponential moving averaging is a technique in which, while training, the model weights are integrated into a weighted moving average, and the weighted moving average is used in lieu of the directly trained model weights at test time. Our experiments have found this technique improves the convergence properties of most models and datasets we work with. The full paper of EMA can be found [here](https://arxiv.org/pdf/1803.05407.pdf).
 
 To activate EMA in the TSPP, specify `trainer.config.ema=True` in the command line call at runtime. The decay parameter in the moving average can be modified using the `+trainer.config.ema_decay={decay}`.
 
@@ -288,48 +496,139 @@ Hyperparameter searches can be used to find close-to-optimal hyperparameter conf
 ```bash
 python launch_training.py -m hydra/sweeper=optuna hydra.sweeper.n_trials={N} {parameter_ranges}
 ```
+
+For example: let's tune model size and learning rate for `tft` model on `electricity` dataset.
+```bash
+export RESULTS=/ws/test_sweep
+mkdir -p ${RESULTS}
+
+python launch_training.py -m \
+       'model.config.n_head=choice(1,2,4)' \
+       'model.config.hidden_size=choice(128,256)' \
+       'trainer.optimizer.lr=tag(log, interval(1e-5, 1e-2))' \
+       model=tft \
+       dataset=electricity \
+       trainer.config.batch_size=1024 \
+       evaluator.config.batch_size=1024 \
+       hydra/sweeper=optuna \
+       +optuna_objectives=[MAE,RMSE]   \
+       hydra.sweeper.direction=[minimize,minimize] \
+       hydra.sweeper.n_trials=128 \
+       hydra/launcher=joblib \
+       hydra.launcher.n_jobs=8 \
+       hydra.sweeper.storage="sqlite:///${RESULTS}/hp_search_multiobjective.db"
+```
+
 For more info how to properly set up {parameter_ranges} visit [hydra docs](https://hydra.cc/docs/plugins/optuna_sweeper/#search-space-configuration)
 
+### Custom launchers
+
+TSPP now have custom sweeper and launchers in order to boost performance during hp searches with optuna. To utilize more of your resources during long sweeps, you can select `multiprocessing` as your launcher and set your `hydra.sweeper.experiment_sequence` to `hydra_utils.TSPPOptunaExperimentSequence` in the existing sweeps:
+```bash
+python launch_training.py -m \
+       hydra/sweeper=optuna \
+       hydra/launcher=multiprocessing \
+       hydra.launcher.n_jobs=<num_gpus> \
+       hydra.sweeper.n_trials={N} \
+       hydra.sweeper.experiment_sequence=hydra_utils.TSPPOptunaExperimentSequence \
+       {parameter_ranges}
+```
+
+This might boost performance, especially if you are using early stopping and sweep over model sizes or any other parameter that changes model training time.
+For more information and motivation behind the changes, see this [hydra issue](https://github.com/facebookresearch/hydra/issues/2435) and related [PR](https://github.com/facebookresearch/hydra/pull/2461)
+
 ### XGBoost Training
 
-XGBoost and RAPIDS packages are now automatically present in the base NGC PyTorch containers.  The TSPP is able to leverage this and allow users to perform training, inference, and deployment on XGBoost and Dask XGBoost using the same commands as Neural Network models.  To train:
+XGBoost and RAPIDS packages are now automatically present in the base NGC PyTorch containers.  The TSPP is able to leverage this and allow users to perform training, inference, and deployment on XGBoost and Dask XGBoost using the same commands as neural network models.  To train:
 ```bash
 python launch_training.py model={xgboost, dask_xgboost} dataset={dataset}
 ```
 Note: All stages of XGBoost are run on GPU. CPU training is currently not supported.
-This launches training using CSV  files from the output of preprocessing.  Validation data is automatically used for early stopping if applicable.  
-The TSPP trains a separate XGBoost model for each step in the horizon.  If some arbitrary row in the dataframe is at time `t`, then for the ith model, we train it to predict timestep `t+i`.  As a part of this, we give the model access to all the features at time step t and bring up the static and known features at timestep `t+i`. Each ID is handled separately, so for any given training/prediction sample, there is only data from 1 ID. 
-XGBoost itself cannot create new features or process features in the same way as neural networks.  To this end, we have created a framework where one can specify lag_features and moving_average_features.  Lag_features allow the XGBoost model to have access to the values of the given feature in the past, while moving_average_features allow the model to have access to the moving average of the given feature to some number of previous time steps.  For an example of  how to specify these features, take a look at conf/model_dataset/xgboost_electricity.yaml.  To specify a lag_feature, one needs to select a feature, a min value, and a max value.  The TSPP then automatically adds the values of that feature at timestep `t-min_value` to `t-max_value`.  Instead of specifying min and max, one can also specify value, which is a list of values for finer control.  Note the values must be greater than 0 and must be natural numbers.
-To specify a moveing_average_feature, one needs to select a feature and a window_size.  This window_size indicates that a new feature will be added that is the average of the values of the feature from `t-window_size` to `t`.  
-For model parameters, the standard XGBoost parameters can be passed using `model.config.{parameter}`, some may require `+model.config.{parameter}` if the parameter is not set inside the conf/ directory.  In addition, one can specify the number of boosting rounds using `model.config.n_rounds`.  
+This launches training using CSV files from the output of preprocessing. Validation data is automatically used for early stopping if applicable. 
+The TSPP trains a separate XGBoost model for each step in the horizon.  If some arbitrary row in the dataframe is at time `t`, then for the `i`th model, we train it to predict timestep `t+i`.  As a part of this, we give the model access to all the features at time step `t` and bring up the static and known features at timestep `t+i`. Each ID is handled separately, so for any given training/prediction sample, there is only data from 1 ID.
+XGBoost itself cannot create new features or process features in the same way as neural networks.  To this end, we have created a framework where one can specify `lag_features` and `moving_average_features`. `lag_features` allow the XGBoost model to have access to the values of the given feature in the past, while `moving_average_features` allow the model to have access to the moving average of the given feature to some number of previous time steps.  For an example of how to specify these features, take a look at `conf/model_dataset/xgboost_electricity.yaml`.  To specify a `lag_feature`, one needs to select a feature, a min value, and a max value. The TSPP then automatically adds the values of that feature at timestep `t-min_value` to `t-max_value`.  Instead of specifying min and max, one can also specify value, which is a list of values for finer control.  Note the values must be greater than 0 and must be natural numbers.
+To specify a `moveing_average_feature`, one needs to select a feature and a `window_size`.  This `window_size` indicates that a new feature will be added that is the average of the values of the feature from `t-window_size` to `t`. 
+For model parameters, the standard XGBoost parameters can be passed using `model.config.{parameter}`, some may require `+model.config.{parameter}` if the parameter is not set inside the conf/ directory.  In addition, one can specify the number of boosting rounds using `model.config.n_rounds`. 
 There are a few additional parameters that are used exclusively for DaskXGBoost for initialization of the LocalCUDACluster: `model.config.cluster.world_size`, which sets the number of GPUs to use, `model.config.cluster.device_pool_frac`, which sets the amount of memory to allocate on the GPUs, `model.config.cluster.protocol` which sets the protocol to use on the cluster, and `model.config.cluster.npartitions` which sets the number of partitions to use for converting to Dask-cuDF.
-Finally, `trainer.callbacks.early_stopping.patience` can be used to set the early stopping patience of the XGBoost rounds, and `trainer.config.log_interval` can be used to set the frequency of the logging for XGBoost. 
+Finally, `trainer.callbacks.early_stopping.patience` can be used to set the early stopping patience of the XGBoost rounds, and `trainer.config.log_interval` can be used to set the frequency of the logging for XGBoost.
+
+### Postprocessing of predictions
+Some datasets require additional post-processing to make predictions more accurate, e.g. during sales prediction you are more than sure to sale at least 0 of a given product. That's why TSPP evaluator module now support postprocessing. To use it, you need to set `evaluator/postprocessor` to one of the predefined postprocessors, or create your own in `conf/evaluator/postprocessor/`
+
+```bash
+python launch_training.py model=tft dataset=electricity trainer.config.num_epochs=1 evaluator/postprocessor=clip_to_zero
+```
+
+### Interprete your model
+For selected models (ones that inherit from `InterpretableModelBase`) TSPP allows users to visualize activations/attention masks/etc. In order to visualize the model, you have to add `TensorBoardBackend` and/or `WandBBackend` to your `conf/logger.yaml`, since those backends support figure logging. Next, you need to specify which examples you want to visualize adding `+evaluator.config.visualisation_indices` to your config. For example to visualise tft attention on samples 1, 1025, 1026 and 2048 use:
+```bash
+TFT_SCRIPTING=1 python launch_training.py \
+      dataset=${DATASET} \
+      model=tft \
+      trainer/criterion=quantile \
+      trainer.config.batch_size=1024 \
+      +evaluator.config.visualisation_indices='[1, 1025, 1026, 2048]'
+```
+Note: Interpretability for TFT model requires environmental variable `TFT_SCRIPTING` to be set.
+
+### Ensembling
+Currently, we only support ensembling of DL models with the same type. This can be used to ensemble same models with different hyperparameters, most commonly random generator `seed`. For example, this script trains 8 models with different seeds and then uses them to produce one prediction:
+```bash
+RESULTS=/ws/tft_ensemble_checkpoints
+mkdir -p ${RESULTS}
+
+python launch_training.py \
+	-m \
+	seed="range(1,9)" \
+	model=tft \
+	dataset=electricity \
+	overrides=tft/electricity/best_0 \
+	trainer.config.log_interval=-1 \
+	+trainer.config.force_rerun=True \
+    evaluator.config.metrics=[MAE,RMSE,SMAPE,TDI] \
+    hydra.sweep.dir=${RESULTS} \
+    hydra/launcher=joblib \
+    hydra.launcher.n_jobs=8 \
+    hydra.sweeper.max_batch_size=8
+
+rm ${RESULTS}/*/last_checkpoint.zip
+
+MODEL_LIST="["
+for I in $( seq 0 7 )
+do
+	MODEL_LIST+="{dir: ${RESULTS}/$I, checkpoint: best_checkpoint.zip, weight:1.0},"
+done
+MODEL_LIST=${MODEL_LIST::-1}
+MODEL_LIST+="]"
+TFT_SCRIPTING=1 python launch_ensembling.py model.config.model_list="${MODEL_LIST}"
+```
+Note: we export `TFT_SCRIPTING` to use native `torch.nn.LayerNorm` instead of `apex.FusedLayerNorm`. Using `apex` implementation might lead to errors during ensembling and it will be removed in the next release as this API is deprecated.
+
 
 ### Conversion, Deployment, and Inference
 
-Inference takes place after a model has been trained and one wants to run data through.  Since this only entails using a forward function, the model can be optimized and converted to many different formats that can perform the forward pass more efficiently.  In addition, one can set up a [NVIDIA Triton inference server](https://github.com/triton-inference-server/server), which allows for a continuous stream of data to be presented to and passed through the model. The server provides an inference service via an HTTP or gRPC endpoint at ports 8000 and 8001, respectively, on the “bridge” docker network.  
- 
+Inference takes place after a model has been trained and one wants to run data through.  Since this only entails using a forward function, the model can be optimized and converted to many different formats that can perform the forward pass more efficiently.  In addition, one can set up a [NVIDIA Triton inference server](https://github.com/triton-inference-server/server), which allows for a continuous stream of data to be presented to and passed through the model. The server provides an inference service via an HTTP or gRPC endpoint at ports 8000 and 8001, respectively, on the “bridge” docker network. 
 
 The TSPP supports a few versions of inference, including native inference and NVIDIA Triton deployment. Both use the test_forward function specified in the model config (defaults to forward()) as the forward function.
 
-To launch native inference, one must have a checkpoint directory from a TSPP training call that includes a .hydra directory and a best_checkpoint.zip from training a Neural Net, a populated checkpoints directory from training an XGBoost, or an arima.pkl file from training an ARIMA model.  Then run 
+To launch native inference, one must have a checkpoint directory from a TSPP training call that includes a .hydra directory and a best_checkpoint.zip from training a Neural Net, a populated checkpoints directory from training an XGBoost, or an arima.pkl file from training an ARIMA model.  Then run
 ```
 python launch_inference.py checkpoint=/path/to/checkpoint/directory
 ```
-Note: Do not confuse the checkpoint directory with the TimeSeriesPredictionPlatform/outputs/ directory.  The directory to use in the inference call is typically two levels lower (for example, /path/to/TimeSeriesPredictionPlatform/outputs/2021-08-23/03-03-11/).  
+Note: Do not confuse the checkpoint directory with the TimeSeriesPredictionPlatform/outputs/ directory.  The directory to use in the inference call is typically two levels lower (for example, `/path/to/TimeSeriesPredictionPlatform/outputs/2021-08-23/03-03-11/`). 
 
 The device argument refers to the device that one would like the model to be built on and run on.  Note that multi-GPU inference launches are not supported.  By default, the evaluator uses the configs specified in the .hydra/config.yaml file from the checkpoint directory.  One can override these by including them in the launch.  For example, if one wanted to adjust the metrics to use MAE and RMSE only.
 ```
 python launch_inference.py checkpoint=/path/to/checkpoint/directory “+inference.config.evaluator.config.metrics=[‘MAE’, ‘RMSE’]”
 ```
-Note: Be sure to include the + when overriding any of the evaluator configs.
+Note: Be sure to include the `+` when necessary, this special character will add new fields to the current config. However if value already exists, this will result in error from hydra.
 
-Prior to the next section, make sure that the TSPP container is run with the following arguments from the TSPP directory.  We recommend an outputs_dir is created that can be used to mount the outputs directory and the multirun folder from multi-GPU runs.  
+Prior to the next section, make sure that the TSPP container is run with the following arguments from the TSPP directory.  We recommend an outputs_dir is created that can be used to mount the outputs directory and the multirun folder from multi-GPU runs. 
 ```
 docker run -it --rm --gpus all --ipc=host --network=host -v /your/datasets/:/workspace/datasets/  -v /your/outputs_dir/:/your/outputs_dir/ -v $(pwd):$(pwd) -v /your/outputs_dir/outputs/:/workspace/outputs/ -v /your/outputs_dir/multirun/:/workspace/multirun/ -v /var/run/docker.sock:/var/run/docker.sock tspp
 ```
 Note that `/your/outputs_dir/{outputs/multirun}` is equivalent to the python script `os.path.join(/your/outputs_dir/, outputs)`.
-In the previous command, note that six different directories are mounted.  The datasets are mounted to the usual location, but we have two different mount locations for outputs.  Mounting the outputs to /workspace/outputs/ allows usual training calls to be saved in your output directory. Similarly, mounting the multirun to /workspace/multirun/ allows multi-GPU to be saved.  The second output mount is mounted to the same path as the output directory is in the host.  This is essential due to the way we deploy to NVIDIA Triton. The directory of the output in the docker must match the directory of the output on the host machine.  Additionally, the mount for /var/run/docker.sock allows the tspp docker container to launch another container. In our case, this is the NVIDIA Triton server. In subsequent calls to launch_triton_configure.py, the /path/to/checkpoint/directory/ must be of the form /your/outputs_dir/{checkpoint_dir} instead of /workspace/{checkpoint_dir} and should be absolute paths. 
+In the previous command, note that six different directories are mounted.  The datasets are mounted to the usual location, but we have two different mount locations for outputs.  Mounting the outputs to /workspace/outputs/ allows usual training calls to be saved in your output directory. Similarly, mounting the multirun to /workspace/multirun/ allows multi-GPU to be saved.  The second output mount is mounted to the same path as the output directory is in the host.  This is essential due to the way we deploy to NVIDIA Triton. The directory of the output in the docker must match the directory of the output on the host machine.  Additionally, the mount for /var/run/docker.sock allows the tspp docker container to launch another container. In our case, this is the NVIDIA Triton server. In subsequent calls to launch_triton_configure.py, the /path/to/checkpoint/directory/ must be of the form /your/outputs_dir/{checkpoint_dir} instead of /workspace/{checkpoint_dir} and should be absolute paths.
 Remember  that multi-GPU runs are stored in `multirun` instead of `outputs`.
 
 To use deployment, the simplest way is to use the directories `multirun` and `outputs` directly inside the TSPP. This can be achieved by launching the docker as follows.
@@ -338,31 +637,31 @@ docker run -it --rm --gpus all --ipc=host --network=host -v /your/datasets/:/wor
 ```
 
 
-Finally, note that to run the deployment script, you must be in the same directory path in the container as the TSPP is stored on your machine. This means that being in /workspace in the container may not work for running the deployment.  If outside the container your TimeSeriesPredictionPlatform is at /home/user/TimeSeriesPredictionPlatform, you must be at the same path in your docker container (/home/user/TimeSeriesPredictionPlatform). This is the purpose of the `-v $(pwd):$(pwd)` in the run script. 
+Finally, note that to run the deployment script, you must be in the same directory path in the container as the TSPP is stored on your machine. This means that being in /workspace in the container may not work for running the deployment.  If outside the container your TimeSeriesPredictionPlatform is at /home/user/TimeSeriesPredictionPlatform, you must be at the same path in your docker container (/home/user/TimeSeriesPredictionPlatform). This is the purpose of the `-v $(pwd):$(pwd)` in the run script.
 
 
 To launch conversion and deployment, one must again have a checkpoint directory from a TSPP training call that includes a .hydra directory and a best_checkpoint.zip from a Neural Net training or a populated checkpoints directory from an XGBoost training.  Stats model, such as Arima, are not supported for deployment. In addition, the model that will be converted must already support conversion to the required format.  In the current version of the TSPP, we first export the model to either TorchScript-Script or TorchScript-Trace and subsequently convert it to TorchScript, Onnx, or TRT using the model-navigator package.  We also support export to Onnx and conversion to both Onnx and TRT.  For XGBoost models, we format the checkpoints and deploy using the FIL backend; there are no extra steps necessary.  To run export and conversion (for XGBoost, the deployment/export and deployment/convert fields can be ignored, and no other deployment options are functional):
 ```
 python launch_triton_configure.py deployment/export={ts-trace, ts-script, onnx} deployment/convert={torchscript, onnx, trt} checkpoint=/path/to/checkpoint/directory
 ```
-The format mapping is listed below
-TorchScript-Script: ts-script
-TorchScript-Trace: ts-trace
-TorchScript: torchscript
-Onnx: onnx
-TRT: trt
+The format mapping is listed below:
+
+- TorchScript-Script: ts-script
+- TorchScript-Trace: ts-trace
+- TorchScript: torchscript
+- Onnx: onnx
+- TRT: trt
 
-Note that some conversions do not support the apex FusedLayerNorm library.  To get around this, we set the operating system environment variable ‘TFT_SCRIPTING” to True when loading the model for deployment.  This changes the apex LayerNorm to vanilla torch LayerNorm.  In addition, one can select the batch size and precision of the conversion, using +inference.config.evaluator.config.batch_size and inference.config.precision=Choice[ fp32, fp16 ] respectively.
+Note that the conversions do not support the apex fused LayerNorm library.  In order to get around this, we set the os environ variable ‘TFT_SCRIPTING” to True when loading the model for deployment.  This changes the apex LayerNorm to vanilla torch LayerNorm.  In addition, one can select the batch size and precision of the conversion, using +inference.config.evaluator.config.batch_size and inference.config.precision=Choice[ fp32, fp16 ] respectively.
 Once export and conversion have been done, the results are stored in /path/to/checkpoint/directory/deployment.  Subsequently, the converted model’s NVIDIA Triton config is generated in the /path/to/checkpoint/directory/deployment/navigator_workspace/model-store/ directory.
 An additional option in running conversion is selecting whether to run the basics of conversion and NVIDIA Triton config creation or to run the full pipeline of conversion, NVIDIA Triton config creation, profiling, analysis, and helm chart creation.  Setting config.inference.optimize=True during launch switches to the full pipeline.  Another part of optimization is setting the backend accelerator for NVIDIA Triton config generation. Setting config.inference.accelerator=Choice[none, trt] changes the accelerator specified.  Note that this defaults to ‘none’ and ‘trt’ is only compatible with the Onnx conversion. If one wants to launch the NVIDIA Triton inference server using a specific GPU, the CUDA index can be specified with the config option config.inference.gpu, which defaults to 0.
 
-More information on the conversion is located here:
-https://github.com/triton-inference-server/model_navigator/blob/v0.2.7/docs/conversion.md
+More information on the conversion is located [here](https://github.com/triton-inference-server/model_navigator/blob/v0.2.7/docs/conversion.md)
 
-More information on the NVIDIA Triton config creation is located here: https://github.com/triton-inference-server/model_navigator/blob/v0.2.7/docs/triton_model_configurator.md
+More information on the NVIDIA Triton config creation is located [here](https://github.com/triton-inference-server/model_navigator/blob/v0.2.7/docs/triton_model_configurator.md)
 
-More information on the full pipeline is located here: 
-https://github.com/triton-inference-server/model_navigator/blob/v0.2.7/docs/run.md
+More information on the full pipeline is located [here](
+https://github.com/triton-inference-server/model_navigator/blob/v0.2.7/docs/run.md)
 
 
 After running `launch_triton_configure.py`, the directories are set up  for quick Triton deployment.  To start the server:
@@ -375,24 +674,24 @@ Once the script finishes running, the Triton server will run in the background w
 python launch_inference.py inference=triton checkpoint=/path/to/checkpoint/directory
 ```
 Similar  to the native inference, one can again override the evaluator configs.  The NVIDIA Triton model name is set as the second directory to the model.  For example, in the case of our TFT model, whose path is models.tft_pyt.TemporalFusionTransformer, the name of the NVIDIA Triton model is tft_pyt. In the case of XGBoost, there is a different model name for each model in the horizon length, specified as `xgb_{i}`.
-There is a config option +inference.config.model_name, which can be set to the NVIDIA Triton model name.  This does not set the name of the model but instead  selects which of the possible models in the model-store directory will be used for inference.  This is useful after a call using the optimize option, which can generate multiple different models in the model-store. 
+There is a config option +inference.config.model_name, which can be set to the NVIDIA Triton model name.  This does not set the name of the model but instead  selects which of the possible models in the model-store directory will be used for inference.  This is useful after a call using the optimize option, which can generate multiple different models in the model-store.
 
 
 
-For both the native and triton launch_inference, one can specify what dataset and target_scalers to use (if any) as long as the data shapes do not conflict with the already trained model. To specify a dataset directory use +inference.config.dataset_dir=/path/to/dataset. The dataset directory must contain a tspp_preprocess.bin file as well as either train.bin/valid.bin/test.bin or train.csv/valid.csv/test.csv, depending on the configuration option dataset.config.binarized (this option cannot be changed during deployment or inference).  Once the path has been set, deployment and inference both use the test dataset.  
+For both the native and triton launch_inference, one can specify what dataset and target_scalers to use (if any) as long as the data shapes do not conflict with the already trained model. To specify a dataset directory use +inference.config.dataset_dir=/path/to/dataset. The dataset directory must contain a tspp_preprocess.bin file as well as either train.bin/valid.bin/test.bin or train.csv/valid.csv/test.csv, depending on the configuration option dataset.config.binarized (this option cannot be changed during deployment or inference).  Once the path has been set, deployment and inference both use the test dataset. 
 
 #### Online Inference
 
 The TSPP also supports an online inference solution for both XGBoost models and Neural models.  Given raw data (not preprocessed by TSPP), both native and NVIDIA Triton inference can preprocess and pass the data through the models.  When running, specify `+inference.config.dataset_path=/path/to/raw/data/csv` and if applicable `+inference.config.preproc_state_path=/path/to/tspp_preprocess.bin` (if the preprocess state is saved elsewhere).  Note this is not yet supported on ARIMA models.
 
 As a final note, make sure to close the NVIDIA Triton Inference Server docker container when finished using `docker stop trt_server_cont`.
-Our TFT model supports export to TorchScript-Trace and conversion to all formats.  
+Our TFT model supports export to TorchScript-Trace and conversion to all formats. 
 
-If you encounter an error such as 
+If you encounter an error such as
 ```
 RuntimeError: Model tft_pyt:1 is not ready
 ```
-Or 
+Or
 ```
 ERROR root Exception in callback <function InferenceServerClient.async_infer.<locals>.wrapped_callback at 0x7f9437b469d0>: AttributeError("'InferenceServerException' object has no attribute 'get_response'")
 ```
@@ -408,17 +707,23 @@ Config structure reflects the internal design of the tool. Most components have
 ```
 With a few exceptions where components are strictly dependent (for example, optimizer can be used only during training, so its  configuration is stored in `/workspace/conf/trainer/optimizer/{optimizer_name}.yaml`)
 
-If a parameter does not exist in the config, you must prepend `+` to its reference in the command line call. For example, `+trainer.config.force_rerun=...` adds force_rerun to trainer.config, but trainer.config.force_rerun=... errors.
+If a parameter does not exist in the config, you must prepend `+` to its reference in the command line call. For example, `+trainer.config.force_rerun=...` adds force_rerun to trainer.config, but `trainer.config.force_rerun=...` errors.
 
 
 ## Release Notes
 
-We’re constantly refining and improving our performance on AI and HPC workloads with frequent updates to our software stack. For our latest performance data, refer to these pages for [AI](https://developer.nvidia.com/deep-learning-performance-training-inference) and [HPC](https://developer.nvidia.com/hpc-application-performance) benchmarks.
-
-
 ### Changelog
-November 2021
-- Initial release 
+
+March 2024
+- Added memory mapped datasets
+- Added ensembling module
+- Added wandb logging
+- Added postprocessor
+- Added timestamps to predictions
+- Added visialization and interpretability
+- Added custom hydra plugins
+- Added support for models from the [paper](#reference)
+- Added support for dataset from the [paper](#reference)
 
 July 2022
 - Reworked config structure
@@ -434,10 +739,26 @@ July 2022
 - Added example scripts
 - Criterions and optimizers no longer require dummy wrappers
 
+November 2021
+- Initial release
+
 ### Known issues
 
 If you encounter errors stating `srcIndex < value`, verify that your categorical cardinalities are the correct size, this indicates that the value of a categorical you are trying to embed is too large for its respective embedding table.
 
+## Reference
 
+### Cite
 
+Cite the following paper if you find this code useful or use it in your own work:
 
+```
+@misc{bączek2024tspp,
+      title={TSPP: A Unified Benchmarking Tool for Time-series Forecasting},
+      author={Jan Bączek and Dmytro Zhylko and Gilberto Titericz and Sajad Darabi and Jean-Francois Puget and Izzy Putterman and Dawid Majchrowski and Anmol Gupta and Kyle Kranen and Pawel Morkisz},
+      year={2024},
+      eprint={2312.17100},
+      archivePrefix={arXiv},
+      primaryClass={cs.LG}
+}
+```

+ 2 - 1
Tools/PyTorch/TimeSeriesPredictionPlatform/callbacks/callbacks.py

@@ -1,4 +1,4 @@
-# Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
+# Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# SPDX-License-Identifier: Apache-2.0
 class Callback(object):
     """
     Base class for building new callbacks.

+ 2 - 1
Tools/PyTorch/TimeSeriesPredictionPlatform/callbacks/ctl_callbacks.py

@@ -1,4 +1,4 @@
-# Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
+# Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# SPDX-License-Identifier: Apache-2.0
 import time
 
 import dllogger

+ 16 - 3
Tools/PyTorch/TimeSeriesPredictionPlatform/callbacks/hydra_callbacks.py

@@ -1,4 +1,4 @@
-# Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
+# Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -13,18 +13,20 @@
 # limitations under the License.
 
 import os
+import mlflow
 import pandas as pd
 
 from omegaconf import OmegaConf
 from hydra.experimental.callback import Callback
 
 from loggers.log_helper import jsonlog_2_df
+from mlflow.entities import Metric, Param
 
 class MergeLogs(Callback):
     def on_multirun_end(self, config, **kwargs):
         OmegaConf.resolve(config)
 
-        ALLOWED_KEYS=['timestamp', 'elapsed_time', 'step', 'loss', 'val_loss', 'MAE', 'MSE', 'RMSE', 'P50', 'P90']
+        ALLOWED_KEYS=['timestamp', 'elapsed_time', 'step', 'loss', 'val_loss', 'MAE', 'MSE', 'RMSE', 'P50', 'P90', 'SMAPE', 'TDI']
 
         dfs = []
         for p, sub_dirs, files in os.walk(config.hydra.sweep.dir):
@@ -32,7 +34,6 @@ class MergeLogs(Callback):
                 path = os.path.join(p, 'log.json')
                 df = jsonlog_2_df(path, ALLOWED_KEYS)
                 dfs.append(df)
-
         # Transpose dataframes
         plots = {}
         for c in dfs[0].columns:
@@ -49,3 +50,15 @@ class MergeLogs(Callback):
         timestamps = (timestamps * 1000).astype(int)
         if not timestamps.is_monotonic:
             raise ValueError('Timestamps are not monotonic')
+
+        metrics = [Metric('_'.join((k,name)), v, timestamp, step)
+                for k, df in plots.items()
+                for timestamp, (step, series) in zip(timestamps, df.iterrows())
+                for name, v in series.items()
+                ]
+        client = mlflow.tracking.MlflowClient(tracking_uri=config.trainer.config.mlflow_store)
+        exp = client.get_experiment_by_name(config.trainer.config.get('experiment_name', ''))
+        run = client.create_run(exp.experiment_id if exp else '0')
+        for i in range(0, len(metrics), 1000):
+            client.log_batch(run.info.run_id, metrics=metrics[i:i+1000])
+        client.set_terminated(run.info.run_id)

+ 7 - 3
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/conf_utils.py

@@ -1,4 +1,4 @@
-# Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
+# Copyright (c) 2021-2024, NVIDIA CORPORATION. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -14,8 +14,10 @@
 
 from omegaconf import OmegaConf
 from data.data_utils import InputTypes, DataTypes, FeatureSpec
+import functools
+from hydra.utils import get_method
 
-OmegaConf.register_new_resolver("and", lambda x, y: x and y, use_cache=True)
+OmegaConf.register_new_resolver("and", lambda x, y: bool(x and y), use_cache=True)
 OmegaConf.register_new_resolver("feature.selector",
         lambda x,feat_type,embed_type:
             OmegaConf.create([elem for elem in x if elem.feature_type == feat_type and elem.feature_embed_type == embed_type])
@@ -27,10 +29,12 @@ OmegaConf.register_new_resolver("len", len)
 OmegaConf.register_new_resolver("cmp", lambda x, y: x == y)
 OmegaConf.register_new_resolver("cont.lower", lambda x, y: y.lower() in x.lower())
 
-# XXX I don't know whether it is the best idea to allow user to sum over nested structure without checks
 def sum_nested(*args):
     if len(args) == 1 and isinstance(args[0], (int, float)):
         return args[0]
     return sum(arg if isinstance(arg, (int, float)) else sum_nested(*arg) for arg in args)
 
 OmegaConf.register_new_resolver("sum", sum_nested)
+
+def partial(func, *args, **kwargs):
+    return functools.partial(get_method(func), *args, **kwargs)

+ 2 - 15
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/converter_config.yaml

@@ -1,18 +1,5 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 defaults:
   - deployment: convert
 
-checkpoint: ???
+checkpoint: ???

+ 92 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/M5.yaml

@@ -0,0 +1,92 @@
+# SPDX-License-Identifier: MIT
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/M5/M5.csv
+    dest_path: /workspace/datasets/M5/
+    iterable: False
+    encoder_length: 28
+    input_length: 28
+    example_length: 56
+    valid_boundary: '2016-04-25'
+    train_samples: 1000000
+    time_series_count: 30490
+    drop_unseen: True
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 30490
+      - name: "date"
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: "weight"
+        feature_type: 'WEIGHT'
+        feature_embed_type: 'CONTINUOUS'
+      - name: "item_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3050
+      - name: "dept_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: "cat_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 4
+      - name: "store_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 11
+      - name: "state_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 4
+      - name: "items_sold"
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: data.data_utils.Log1pScaler
+      - name: "wday"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: "month"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 13
+      - name: "event_name_1"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 31
+      - name: "event_type_1"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: "event_type_2"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "event_name_2"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: "snap_CA"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "snap_TX"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "snap_WI"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "sell_price"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+    binarized: True

+ 99 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/M5_norm.yaml

@@ -0,0 +1,99 @@
+# SPDX-License-Identifier: MIT
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/M5/M5.csv
+    dest_path: /workspace/datasets/M5_norm/
+    iterable: False
+    encoder_length: 28
+    input_length: 28
+    example_length: 56
+    valid_boundary: '2016-04-25'
+    train_samples: 1000000
+    time_series_count: 30490
+    drop_unseen: True
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 30490
+      - name: "date"
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: "weight"
+        feature_type: 'WEIGHT'
+        feature_embed_type: 'CONTINUOUS'
+      - name: "item_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3050
+      - name: "dept_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: "cat_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 4
+      - name: "store_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 11
+      - name: "state_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 4
+      - name: "items_sold"
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.pipeline.Pipeline
+            steps:
+              - 
+                - 'log1p'
+                - _target_: data.data_utils.Log1pScaler
+              - 
+                - 'norm'
+                - _target_: sklearn.preprocessing.StandardScaler
+      - name: "wday"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: "month"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 13
+      - name: "event_name_1"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 31
+      - name: "event_type_1"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: "event_type_2"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "event_name_2"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: "snap_CA"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "snap_TX"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "snap_WI"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "sell_price"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+    binarized: True

+ 92 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/M5_xgb.yaml

@@ -0,0 +1,92 @@
+# SPDX-License-Identifier: MIT
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/M5/M5.csv
+    dest_path: /workspace/datasets/M5/
+    iterable: False
+    encoder_length: 28
+    input_length: 28
+    example_length: 56
+    valid_boundary: '2016-04-25'
+    train_samples: 1000000
+    time_series_count: 30490
+    drop_unseen: True
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 30490
+      - name: "date"
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: "weight"
+        feature_type: 'WEIGHT'
+        feature_embed_type: 'CONTINUOUS'
+      - name: "item_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3050
+      - name: "dept_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: "cat_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 4
+      - name: "store_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 11
+      - name: "state_id"
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 4
+      - name: "items_sold"
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: data.data_utils.Log1pScaler
+      - name: "wday"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: "month"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 13
+      - name: "event_name_1"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 31
+      - name: "event_type_1"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: "event_type_2"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "event_name_2"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: "snap_CA"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "snap_TX"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "snap_WI"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 3
+      - name: "sell_price"
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+    binarized: False

+ 7 - 20
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/electricity.yaml

@@ -1,35 +1,22 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: data.datasets.create_datasets
 config:
     graph: False
     source_path: /workspace/datasets/electricity/electricity.csv
     dest_path: /workspace/datasets/electricity/
-    time_ids: 'days_from_start'
     train_range:
       - 0
-      - 1315
+      - 31560
     valid_range:
-      - 1308
-      - 1339
+      - 31392
+      - 32136
     test_range:
-      - 1332
-      - 10000
+      - 31968
+      - 35000
     dataset_stride: 1
     scale_per_id: True
     encoder_length: 168
+    input_length: 168
     example_length: 192
     MultiID: False
     features:

+ 52 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/electricity_xgb.yaml

@@ -0,0 +1,52 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: data.datasets.create_datasets
+config:
+    graph: False
+    source_path: /workspace/datasets/electricity/electricity.csv
+    dest_path: /workspace/datasets/electricity_xgb/
+    train_range:
+      - 0
+      - 32136
+    valid_range:
+      - 31392
+      - 32136
+    test_range:
+      - 31968
+      - 35000
+    dataset_stride: 1
+    scale_per_id: True
+    encoder_length: 168
+    input_length: 168
+    example_length: 192
+    MultiID: False
+    features:
+      - name: 'categorical_id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 371
+      - name: 'hours_from_start'
+        feature_type: 'TIME'
+        feature_embed_type: 'CONTINUOUS'
+      - name: 'power_usage_weight'
+        feature_type: 'WEIGHT'
+        feature_embed_type: 'CONTINUOUS'
+      - name: 'power_usage'
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'hour'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 25
+      - name: 'day_of_week'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: 'categorical_id'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 371
+
+    binarized: False
+    time_series_count: 369

+ 90 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay.yaml

@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/pems_bay/pems_bay.csv
+    dest_path: /workspace/datasets/pems_bay/
+    binarized: False
+    graph: graph.bin
+    graph_partitions: 1
+    partition_joining_coef: 1
+    train_range:
+      - '2017-1-1'
+      - '2017-5-8'
+    valid_range:
+      - '2017-5-8'
+      - [2017,5,25,17,50]
+    test_range:
+      - [2017,5,25,17,50]
+      - '2017-7-01'
+    dataset_stride: 1
+    scale_per_id: True
+    encoder_length: 12
+    input_length: 12
+    example_length: 24
+    MultiID: True
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 325
+      - name: 'Timestamp'
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: 'Avg Speed'
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Station'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 326
+      - name: 'Freeway #'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 9
+      - name: 'Direction of Travel'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      #- name: 'Station Length'
+      #  feature_type: 'STATIC'
+      #  feature_embed_type: 'CONTINUOUS'
+      #  scaler:
+      #      _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Avg Occupancy'
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Total Flow' 
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day of week'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: 'Month'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Hour'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Minute'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+
+    time_series_count: 325

+ 95 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_enc24.yaml

@@ -0,0 +1,95 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/pems_bay/pems_bay.csv
+    dest_path: /workspace/datasets/pems_bay_enc24/
+    binarized: True
+    graph: graph.bin
+    graph_partitions: 1
+    partition_joining_coef: 1
+    time_ids: 'Timestamp'
+    train_range:
+      - '2017-1-1'
+      - '2017-5-8'
+    valid_range:
+      #- '2017-5-8'
+      #- [2017,5,25,17,50]
+      - [2017,5,7,22,00]
+      - [2017,5,25,16,50]
+    test_range:
+      #- [2017,5,25,17,50]
+      - [2017,5,25,16,50]
+      - '2017-7-01'
+    dataset_stride: 1
+    scale_per_id: False
+    encoder_length: 24
+    input_length: 24
+    example_length: 36
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 325
+      - name: 'Timestamp'
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: 'Avg Speed'
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Station'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 326
+      - name: 'Freeway #'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 9
+      - name: 'Direction of Travel'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      #- name: 'Station Length'
+      #  feature_type: 'STATIC'
+      #  feature_embed_type: 'CONTINUOUS'
+      #  scaler:
+      #      _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Avg Occupancy'
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Total Flow' 
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day of week'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: 'Month'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Hour'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Minute'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+
+    time_series_count: 325
+    train_samples: 1000000

+ 92 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_enc288.yaml

@@ -0,0 +1,92 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/pems_bay/pems_bay.csv
+    dest_path: /workspace/datasets/pems_bay_enc288/
+    binarized: True
+    graph: graph.bin
+    graph_partitions: 1
+    partition_joining_coef: 1
+    time_ids: 'Timestamp'
+    train_range:
+      - '2017-1-1'
+      - '2017-3-8'
+    valid_range:
+      - '2017-3-8'
+      - [2017,4,25,17,50]
+    test_range:
+      - [2017,4,25,17,50]
+      - '2017-7-01'
+    dataset_stride: 1
+    scale_per_id: False
+    encoder_length: 288
+    input_length: 288
+    example_length: 300
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 325
+      - name: 'Timestamp'
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: 'Avg Speed'
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Station'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 326
+      - name: 'Freeway #'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 9
+      - name: 'Direction of Travel'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      #- name: 'Station Length'
+      #  feature_type: 'STATIC'
+      #  feature_embed_type: 'CONTINUOUS'
+      #  scaler:
+      #      _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Avg Occupancy'
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Total Flow' 
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day of week'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: 'Month'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Hour'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Minute'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+
+    time_series_count: 325
+    train_samples: 1000000

+ 96 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_enc48.yaml

@@ -0,0 +1,96 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/pems_bay/pems_bay.csv
+    dest_path: /workspace/datasets/pems_bay_enc48/
+    binarized: True
+    graph: graph.bin
+    graph_partitions: 1
+    partition_joining_coef: 1
+    time_ids: 'Timestamp'
+    train_range:
+      - '2017-1-1'
+      #- '2017-5-8'
+      - [2017,5,7,18,00]
+    valid_range:
+      #- '2017-5-8'
+      #- [2017,5,25,17,50]
+      - [2017,5,7,18,00]
+      - [2017,5,25,14,50]
+    test_range:
+      #- [2017,5,25,17,50]
+      - [2017,5,25,14,50]
+      - '2017-7-01'
+    dataset_stride: 1
+    scale_per_id: False
+    encoder_length: 48
+    input_length: 48
+    example_length: 60
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 325
+      - name: 'Timestamp'
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: 'Avg Speed'
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Station'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 326
+      - name: 'Freeway #'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 9
+      - name: 'Direction of Travel'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      #- name: 'Station Length'
+      #  feature_type: 'STATIC'
+      #  feature_embed_type: 'CONTINUOUS'
+      #  scaler:
+      #      _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Avg Occupancy'
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Total Flow' 
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day of week'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: 'Month'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Hour'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Minute'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+
+    time_series_count: 325
+    train_samples: 1000000

+ 85 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/pems_bay_xgb.yaml

@@ -0,0 +1,85 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: data.datasets.create_datasets
+config:
+    source_path: /workspace/datasets/pems_bay/pems_bay.csv
+    dest_path: /workspace/datasets/pems_bay_xgb/
+    binarized: False
+    graph: graph.bin
+    graph_partitions: 1
+    partition_joining_coef: 1
+    train_range:
+      - '2017-1-1'
+      - '2017-5-8'
+    valid_range:
+      - '2017-5-8'
+      - [2017,5,25,17,50]
+    test_range:
+      - [2017,5,25,17,50]
+      - '2017-7-01'
+    dataset_stride: 1
+    scale_per_id: False
+    encoder_length: 12
+    input_length: 12
+    example_length: 24
+    MultiID: False
+    features:
+      - name: 'id'
+        feature_type: 'ID'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 325
+      - name: 'Timestamp'
+        feature_type: 'TIME'
+        feature_embed_type: 'DATE'
+      - name: 'Avg Speed'
+        feature_type: 'TARGET'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Station'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 326
+      - name: 'Freeway #'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 9
+      - name: 'Direction of Travel'
+        feature_type: 'STATIC'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 5
+      - name: 'Avg Occupancy'
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Total Flow' 
+        feature_type: 'OBSERVED'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day of week'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CATEGORICAL'
+        cardinality: 8
+      - name: 'Month'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Day'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Hour'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+      - name: 'Minute'
+        feature_type: 'KNOWN'
+        feature_embed_type: 'CONTINUOUS'
+        scaler:
+            _target_: sklearn.preprocessing.StandardScaler
+
+    time_series_count: 325

+ 7 - 20
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/dataset/traffic.yaml

@@ -1,34 +1,21 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: data.datasets.create_datasets
 config:
     source_path: /workspace/datasets/traffic/traffic.csv
     dest_path: /workspace/datasets/traffic/
-    time_ids: 'sensor_day'
     train_range:
       - 0
-      - 151
+      - 3624
     valid_range:
-      - 144
-      - 166
+      - 3456
+      - 3984
     test_range:
-      - 159
-      - 2000
+      - 3816
+      - 4200
     dataset_stride: 1
     scale_per_id: False
     encoder_length: 168
+    input_length: 168
     example_length: 192
     MultiID: False
     features:

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: inference.converter.run_converter
 defaults:
     - export: ts-trace

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert/onnx.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 config:
     type: onnx

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert/torchscript.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 config:
     type: torchscript

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/convert/trt.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 config:
     type: trt

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/deploy.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: inference.launch_inference_server.run_server_launch
 config:
     gpu: 0

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/export/onnx.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 config:
     type: onnx

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/export/ts-script.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 config:
     type: ts-script

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment/export/ts-trace.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 config:
     type: ts-trace

+ 2 - 15
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/deployment_config.yaml

@@ -1,18 +1,5 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 defaults:
   - deployment: deploy
 
-checkpoint: ???
+checkpoint: ???

+ 13 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/ensemble_conf.yaml

@@ -0,0 +1,13 @@
+defaults:
+  - logger
+
+model:
+  _target_: models.ensembling.ModelEnsemble
+  config:
+    model_list: ???
+
+# Used to override the defaults got from checkpoint
+evaluator:
+  config:
+    metrics: ['MAE', 'RMSE', 'SMAPE']
+    per_step_metrics: False

+ 4 - 13
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/ctlevaluator.yaml

@@ -1,16 +1,6 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+defaults:
+  - postprocessor:
 
 _target_: evaluators.evaluator.CTLMetricEvaluator
 config:
@@ -21,4 +11,5 @@ config:
       - MAE
       - RMSE
       - SMAPE
+      - TDI
       - ND

+ 8 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/postprocessor/clip_and_round.yaml

@@ -0,0 +1,8 @@
+_target_: evaluators.evaluator.Postprocessor
+transformations:
+  - _target_: conf.conf_utils.partial
+    func: numpy.clip
+    a_min: 0
+    a_max: .inf
+  - _target_: conf.conf_utils.partial
+    func: numpy.round

+ 6 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/postprocessor/clip_to_zero.yaml

@@ -0,0 +1,6 @@
+_target_: evaluators.evaluator.Postprocessor
+transformations:
+  - _target_: conf.conf_utils.partial
+    func: numpy.clip
+    a_min: 0
+    a_max: .inf

+ 3 - 13
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/statevaluator.yaml

@@ -1,16 +1,6 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+defaults:
+  - postprocessor:
 
 _target_: evaluators.evaluator.StatMetricEvaluator
 config:

+ 3 - 13
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/evaluator/xgbevaluator.yaml

@@ -1,16 +1,6 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+defaults:
+  - postprocessor:
 
 _target_: evaluators.evaluator.XGBMetricEvaluator
 config:

+ 0 - 13
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/hydra/callbacks/merge_logs.yaml

@@ -1,15 +1,2 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
 merge_logs:
     _target_: callbacks.hydra_callbacks.MergeLogs

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/hydra/job_logging/primary.yaml

@@ -1,18 +1,5 @@
 # @package _group_
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 version: 1
 formatters:
   simple:

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/hydra/job_logging/secondary.yaml

@@ -1,18 +1,5 @@
 # @package _group_
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 version: 1
 formatters:
   simple:

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference/native.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: inference.inference.run_inference
 config:
     checkpoint: ???

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference/triton.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: inference.inference_triton.run_inference_triton
 config:
     checkpoint: ???

+ 2 - 15
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference_config.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 defaults:
   - inference: native
-checkpoint: ???
+checkpoint: ???

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/inference_triton_config.yaml

@@ -1,16 +1,3 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 defaults:
   - inference: triton

+ 27 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/logger.yaml

@@ -0,0 +1,27 @@
+logger:
+  _target_: loggers.log_helper.setup_logger
+  backends:
+    - _target_: dllogger.JSONStreamBackend
+      verbosity: 1 #dllogger.Verbosity.VERBOSE
+      filename: log.json
+      append: true
+    - _target_: loggers.backends.AggregatorBackend
+      verbosity: 1 #dllogger.Verbosity.VERBOSE
+      agg_dict:
+        loss: 
+          _target_: loggers.backends.AverageMeter
+    - _target_: dllogger.StdOutBackend
+      verbosity: 0 #dllogger.Verbosity.DEFAULT
+      # The 3 following entries are hacks to prevent recursive instantiation
+      # and pass function as an argument to StdOutBackend
+      step_format:
+        _target_: hydra.utils.get_method
+        path: loggers.log_helper.empty_step_format
+      metric_format:
+        _target_: hydra.utils.get_method
+        path: loggers.log_helper.no_string_metric_format
+      prefix_format:
+        _target_: hydra.utils.get_method
+        path: loggers.log_helper.empty_prefix_format
+    #- _target_: loggers.backends.WandBBackend
+    #  verbosity: 1

+ 17 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/auto_arima.yaml

@@ -1,18 +1,21 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: models.stat_models.AutoARIMA
+config:
+    m: 1
+    start_p: 2
+    start_q: 2
+    max_p: 5
+    max_q: 5
+    max_d: 2
+    start_P: 1
+    start_Q: 1
+    max_P: 2
+    max_Q: 2
+    max_D: 1
+    information_criterion: aic
+    method: lbfgs
+    maxiter: 50
+
 
 defaults:
     - _self_

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/dask_xgboost.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: models.tspp_xgboost.TSPPDaskXGBoost
 config:
   max_depth: 10

+ 21 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/dcrnn.yaml

@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: models.dcrnn.DCRNN
+config:
+    cl_decay_steps: 2000
+    horizon: 12
+    use_embedding: True
+    include_static_data: True
+    input_dim: 2
+    max_diffusion_step: 2
+    num_nodes: 325
+    num_rnn_layers: 2
+    output_dim: 1
+    rnn_units: 64
+    encoder_length: 12
+    use_curriculum_learning: true 
+    activation: tanh
+    model_type: graph
+
+defaults:
+    - _self_
+    - /trainer@_global_/trainer: ctltrainer

+ 13 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/deepar.yaml

@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: models.deepar.DeepAR
+config:
+    model_type: autoregressive
+    num_layers: 3
+    hidden_size: 40
+    use_embedding: true
+    embedding_dim: 20
+    dropout: 0.1
+    quantiles: [0.5, 0.9]
+defaults:
+    - _self_
+    - /trainer@_global_/trainer: ctltrainer

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/lstm.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: models.lstm.LSTM
 config:
     hidden_size: 128

+ 23 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/mtgnn.yaml

@@ -0,0 +1,23 @@
+_target_: models.mtgnn.MTGNN
+config:
+  use_gcn: True
+  use_embedding: True
+  include_static_data: True
+  gcn_depth: 2
+  num_nodes: ${dataset.config.time_series_count} # this will depend on the nodes/ids in the input dataset
+  dropout: 0.3
+  subgraph_size: 20
+  node_dim: 40
+  dilation_exponential: 1
+  conv_channels: 32
+  residual_channels: 32
+  skip_channels: 64
+  end_channels: 128
+  in_dim: 2
+  out_channels: 12
+  num_layers: 3
+  propalpha: 0.05
+  tanhalpha: 3
+defaults:
+    - _self_
+    - /trainer@_global_/trainer: ctltrainer

+ 17 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/nbeats.yaml

@@ -0,0 +1,17 @@
+# SPDX-License-Identifier: MIT
+_target_: models.nbeats.NBeatsNet
+config:
+  stacks:
+      - type: "trend"
+        num_blocks: 3
+        theta_dim: 2
+        share_weights: True
+        hidden_size: 256
+      - type: "seasonality"
+        num_blocks: 3
+        theta_dim: null
+        share_weights: True
+        hidden_size: 2048
+defaults:
+    - _self_
+    - /trainer@_global_/trainer: ctltrainer

+ 15 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/nhits.yaml

@@ -0,0 +1,15 @@
+_target_: models.nhits.NHITS
+config:
+  n_blocks: [1, 1, 1]
+  n_mlp_layers: 3
+  hidden_size: 512
+  n_pool_kernel_size: [2, 2, 1]
+  n_freq_downsample: [4, 2, 1]
+  pooling_mode: 'MaxPool1d'
+  interpolation_mode: 'linear'
+  dropout_prob_theta: 0. #unused
+  activation: 'ReLU'
+
+defaults:
+    - _self_
+    - /trainer@_global_/trainer: ctltrainer

+ 3 - 16
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/tft.yaml

@@ -1,24 +1,11 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-_target_: models.tft_pyt.modeling.TemporalFusionTransformer
+# SPDX-License-Identifier: Apache-2.0
+_target_: models.tft.InterpretableTFT
 config:
         quantiles: [ .5 ]
         n_head: 4
         hidden_size: 160
         dropout: 0.1
-        attn_dropout: 0
+        attn_dropout: 0.0
         output_selector: 0
 defaults:
     - _self_

+ 9 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/toy_gnn.yaml

@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: Apache-2.0
+_target_: models.gnn.ToyModel
+config:
+    model_type: graph
+    hidden_size: 128
+    num_layers: 3
+defaults:
+    - _self_
+    - /trainer@_global_/trainer: ctltrainer

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/trivial.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: models.trivial_model.TrivialModel
 defaults:
     - _self_

+ 1 - 14
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model/xgboost.yaml

@@ -1,17 +1,4 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 _target_: models.tspp_xgboost.TSPPXGBoost
 config:
   max_depth: 10

+ 0 - 17
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/auto_arima_electricity.yaml

@@ -1,17 +0,0 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-dataset:
-  config:
-    stride: 400

+ 0 - 17
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/cuml_auto_arima_electricity.yaml

@@ -1,17 +0,0 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-dataset:
-  config:
-    stride: 400

+ 12 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/dcrnn_pems_bay.yaml

@@ -0,0 +1,12 @@
+trainer:
+  config:
+    batch_size: 64
+    num_epochs: 50
+
+dataset:
+  config:
+    binarized: False
+
+evaluator:
+  config:
+    batch_size: 64

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/deepar_M5.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/deepar_M5_norm.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 8 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/deepar_pems_bay.yaml

@@ -0,0 +1,8 @@
+dataset:
+  config:
+    train_samples: 1000000
+    MultiID: false
+    binarized: true
+trainer:
+  criterion:
+    _target_: criterion.GaussianLogLikelihood

+ 12 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/mtgnn_pems_bay.yaml

@@ -0,0 +1,12 @@
+trainer:
+  config:
+    batch_size: 64
+    num_epochs: 50
+
+dataset:
+  config:
+    binarized: False
+
+evaluator:
+  config:
+    batch_size: 64

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_M5.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_M5_norm.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True

+ 19 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_electricity.yaml

@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: MIT
+model:
+  config:
+    stacks:
+        - type: "generic"
+          num_blocks: 4
+          theta_dim: 8
+          share_weights: False
+          hidden_size: 1024
+        - type: "generic"
+          num_blocks: 4
+          theta_dim: 8
+          share_weights: False
+          hidden_size: 2048
+
+trainer:
+  config:
+    batch_size: 16384
+    num_epochs: 20

+ 9 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_pems_bay.yaml

@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: MIT
+trainer:
+  config:
+    batch_size: 16384
+    num_epochs: 20
+
+dataset:
+  config:
+    MultiID: false

+ 19 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nbeats_traffic.yaml

@@ -0,0 +1,19 @@
+# SPDX-License-Identifier: MIT
+model:
+  config:
+    stacks:
+        - type: "generic"
+          num_blocks: 8
+          theta_dim: 2
+          share_weights: True
+          hidden_size: 2048
+        - type: "generic"
+          num_blocks: 8
+          theta_dim: 2
+          share_weights: False
+          hidden_size: 1024
+
+trainer:
+  config:
+    batch_size: 16384
+    num_epochs: 20

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nhits_M5.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/nhits_M5_norm.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_M5.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 14 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_M5_norm.yaml

@@ -0,0 +1,14 @@
+# SPDX-License-Identifier: MIT
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 16 - 15
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_electricity.yaml

@@ -1,23 +1,13 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 model:
   config:
     n_head: 4
     hidden_size: 128
     dropout: 0.1
-    attn_dropout: 0
+    attn_dropout: 0.0
+    quantiles: [0.1, 0.5, 0.9]
+    output_selector: 1
+
 trainer:
   config:
     batch_size: 1024
@@ -25,4 +15,15 @@ trainer:
     gradient_norm: 1.0
   optimizer:
     lr: .001
+  criterion:
+    _target_: criterion.QuantileLoss
+    quantiles: [0.1, 0.5, 0.9]
 
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf

+ 13 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_favorita.yaml

@@ -0,0 +1,13 @@
+model:
+  config:
+    n_head: 4
+    hidden_size: 240
+    dropout: 0.1
+    attn_dropout: 0.0
+trainer:
+  config:
+    batch_size: 1024
+    num_epochs: 20
+    gradient_norm: 1.0
+  optimizer:
+    lr: .001

+ 13 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_pems_bay.yaml

@@ -0,0 +1,13 @@
+dataset:
+  config:
+    MultiID: false
+
+model:
+  config:
+    quantiles: [0.1, 0.5, 0.9]
+    output_selector: 1
+
+trainer:
+  criterion:
+    _target_: criterion.QuantileLoss
+    quantiles: [0.1, 0.5, 0.9]

+ 2 - 15
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/tft_traffic.yaml

@@ -1,23 +1,10 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
+# SPDX-License-Identifier: Apache-2.0
 model:
   config:
     n_head: 4
     hidden_size: 128
     dropout: 0.3
-    attn_dropout: 0
+    attn_dropout: 0.0
 trainer:
   config:
     batch_size: 1024

+ 15 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_M5.yaml

@@ -0,0 +1,15 @@
+dataset:
+  config:
+    lag_features:
+      - name: value
+        min_value: 1
+        max_value: 25
+model:
+  config:
+    max_depth: 6
+    learning_rate: 0.17
+    subsample: 1.0
+    colsample_bytree: 0.8
+    colsample_bylevel: 0.8
+    gamma: 0.1
+    n_rounds: 300

+ 59 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_M5_xgb.yaml

@@ -0,0 +1,59 @@
+dataset:
+  config:
+    lag_features:
+      - name: items_sold
+        min_value: 1
+        max_value: 15
+    moving_average_features:
+      - name: items_sold
+        window_size: 28
+        op: median
+      - name: items_sold
+        window_size: 28
+        op: mean
+      - name: items_sold
+        window_size: 28
+        op: max
+      - name: items_sold
+        window_size: 28
+        op: min
+      - name: items_sold
+        window_size: 28
+        op: std
+      - name: items_sold
+        window_size: 7
+        op: median
+      - name: items_sold
+        window_size: 7
+        op: mean
+      - name: items_sold
+        window_size: 7
+        op: max
+      - name: items_sold
+        window_size: 7
+        op: min
+      - name: items_sold
+        window_size: 7
+        op: std
+model:
+  config:
+    max_depth: 8
+    learning_rate: 0.04
+    eta: 0.04
+    subsample: 0.85
+    colsample_bytree: 0.95
+    objective: reg:absoluteerror
+    nthread: 28
+    n_rounds: 10000
+    eval_metric: mae
+
+evaluator:
+  postprocessor:
+    _target_: evaluators.evaluator.Postprocessor
+    transformations:
+      - _target_: conf.conf_utils.partial
+        func: numpy.clip
+        a_min: 0
+        a_max: .inf
+      - _target_: conf.conf_utils.partial
+        func: numpy.round

+ 8 - 22
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_electricity.yaml

@@ -1,29 +1,15 @@
-# Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#           http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
 dataset:
   config:
+    binarized: false
     lag_features:
       - name: power_usage
         min_value: 1
-        max_value: 96
+        max_value: 168
 model:
   config:
-    max_depth: 14
-    learning_rate: 0.017
-    subsample: 0.8
-    colsample_bytree: 1.0
-    colsample_bylevel: 0.4
-    gamma: 0.3
-    n_rounds: 250
+    max_depth: 8
+    learning_rate: 0.05 # alias: eta
+    subsample: 1.00
+    colsample_bytree: 0.90
+    objective: reg:absoluteerror
+    n_rounds: 1250

+ 20 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_electricity_xgb.yaml

@@ -0,0 +1,20 @@
+dataset:
+  config:
+    binarized: false
+    lag_features:
+      - name: power_usage
+        min_value: 1
+        max_value: 168
+model:
+  config:
+    max_depth: 8
+    learning_rate: 0.01 # alias: eta
+    subsample: 1.00
+    colsample_bytree: 0.90
+    objective: reg:absoluteerror
+    n_rounds: 1250
+
+trainer:
+  callbacks:
+    early_stopping:
+      patience: null

+ 20 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/model_dataset/xgboost_pems_bay_xgb.yaml

@@ -0,0 +1,20 @@
+dataset:
+  config:
+    binarized: false
+    lag_features:
+      - name: 'Avg Speed'
+        min_value: 1
+        max_value: 12
+model:
+  config:
+    max_depth: 7
+    learning_rate: 0.01 # alias: eta
+    subsample: 0.95
+    colsample_bytree: 0.95
+    objective: reg:absoluteerror
+    n_rounds: 5000
+
+trainer:
+  callbacks:
+    early_stopping:
+      patience: 100

+ 38 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_0.yaml

@@ -0,0 +1,38 @@
+trainer:
+  config:
+    ema_decay: 0.9898414465903542
+    batch_size: 16384
+    ema: True
+    num_epochs: 30
+  
+  optimizer:
+    lr: 0.007960833618894748
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.4874648950107958
+
+model:
+  config:
+    stacks:
+        - type: "trend"
+          num_blocks: 2
+          theta_dim: 2
+          share_weights: False
+          hidden_size: 2048
+        - type: "seasonality"
+          num_blocks: 2
+          theta_dim: 0
+          share_weights: False
+          hidden_size: 2048
+
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 37 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_1.yaml

@@ -0,0 +1,37 @@
+trainer:
+  config:
+    batch_size: 16384
+    ema: False
+    num_epochs: 30
+  
+  optimizer:
+    lr: 0.005938839698979487
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.6113852243885698
+
+model:
+  config:
+    stacks:
+        - type: "generic"
+          num_blocks: 8
+          theta_dim: 8
+          share_weights: False
+          hidden_size: 4096
+        - type: "seasonality"
+          num_blocks: 8
+          theta_dim: 8
+          share_weights: True
+          hidden_size: 256
+
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 38 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_2.yaml

@@ -0,0 +1,38 @@
+trainer:
+  config:
+    ema_decay: 0.9592185308032316
+    batch_size: 16384
+    ema: True
+    num_epochs: 30
+  
+  optimizer:
+    lr: 0.00018694983658104237
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.01229737216246
+
+model:
+  config:
+    stacks:
+        - type: "trend"
+          num_blocks: 8
+          theta_dim: 8
+          share_weights: False
+          hidden_size: 2048
+        - type: "seasonality"
+          num_blocks: 2
+          theta_dim: 0
+          share_weights: False
+          hidden_size: 512
+
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 37 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/best_3.yaml

@@ -0,0 +1,37 @@
+trainer:
+  config:
+    batch_size: 16384
+    ema: False
+    num_epochs: 30
+  
+  optimizer:
+    lr: 0.00018694983658104237
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.1348446229080165
+
+model:
+  config:
+    stacks:
+        - type: "trend"
+          num_blocks: 8
+          theta_dim: 2
+          share_weights: False
+          hidden_size: 2048
+        - type: "generic"
+          num_blocks: 2
+          theta_dim: 0
+          share_weights: False
+          hidden_size: 2048
+
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 28 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nbeats/hp_search.yaml

@@ -0,0 +1,28 @@
+hydra:
+  sweeper:
+    params:
+      model.config.stacks.0.type: choice(trend,generic)
+      model.config.stacks.1.type: choice(seasonality,generic)
+      model.config.stacks.0.num_blocks: choice(2,4,8)
+      model.config.stacks.1.num_blocks: choice(2,4,8)
+      model.config.stacks.0.theta_dim: choice(2,4,8,16)
+      model.config.stacks.1.theta_dim: choice(0,2,4,8,16)
+      model.config.stacks.0.share_weights: choice(True,False)
+      model.config.stacks.1.share_weights: choice(True,False)
+      model.config.stacks.0.hidden_size: choice(256,512,1024,2048,4096)
+      model.config.stacks.1.hidden_size: choice(256,512,1024,2048)
+      trainer.optimizer.lr: tag(log, interval(1e-5, 1e-2))
+      trainer.config.ema: choice(true, false)
+      +trainer.config.ema_decay: interval(0.9, 0.9999)
+      trainer/criterion: choice(tweedie)
+      trainer.criterion.p: interval(1.01, 1.9)
+
+trainer:
+  config:
+    batch_size: 16384
+    num_epochs: 30 
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 33 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_0.yaml

@@ -0,0 +1,33 @@
+trainer:
+  config:
+    ema_decay: 0.9101936248008481
+    batch_size: 16384
+    ema: True
+    num_epochs: 30
+  
+  optimizer:
+    lr: 0.0004632887748560879
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.033391495108709
+
+model:
+  config:
+    activation: ReLU
+    pooling_mode: MaxPool1d
+    hidden_size: 1024
+    n_blocks: [1,2,1]
+    n_freq_downsample: [4,2,1]
+    n_pool_kernel_size: [4,2,1]
+    n_mlp_layers: 4
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 32 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_1.yaml

@@ -0,0 +1,32 @@
+trainer:
+  config:
+    batch_size: 16384
+    ema: False
+    num_epochs: 30
+  
+  optimizer:
+    lr: 2.2641405995693264e-05
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.033391495108709
+
+model:
+  config:
+    activation: ReLU
+    pooling_mode: AvgPool1d
+    hidden_size: 2048
+    n_blocks: [1,1,2]
+    n_freq_downsample: [4,2,1]
+    n_pool_kernel_size: [2,2,1]
+    n_mlp_layers: 4
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 33 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_2.yaml

@@ -0,0 +1,33 @@
+trainer:
+  config:
+    ema_decay: 0.960244325551214
+    batch_size: 16384
+    ema: True
+    num_epochs: 30
+  
+  optimizer:
+    lr: 0.005050844709519404
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.474664464655759
+
+model:
+  config:
+    activation: SELU
+    pooling_mode: MaxPool1d
+    hidden_size: 2048
+    n_blocks: [1,1,2]
+    n_freq_downsample: [4,2,1]
+    n_pool_kernel_size: [6,3,1]
+    n_mlp_layers: 3
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 33 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/best_3.yaml

@@ -0,0 +1,33 @@
+trainer:
+  config:
+    ema_decay: 0.9722933574544365
+    batch_size: 16384
+    ema: True
+    num_epochs: 30
+  
+  optimizer:
+    lr: 3.848204675023239e-05
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.8099786820097208
+
+model:
+  config:
+    activation: Sigmoid
+    pooling_mode: MaxPool1d
+    hidden_size: 256
+    n_blocks: [2,2,2]
+    n_freq_downsample: [2,2,1]
+    n_pool_kernel_size: [3,3,1]
+    n_mlp_layers: 3
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True
+    batch_size: 16384

+ 27 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/nhits/hp_search.yaml

@@ -0,0 +1,27 @@
+hydra:
+  sweeper:
+    params:
+      model.config.n_mlp_layers: choice(2,3,4)
+      model.config.hidden_size: choice(256,512,1024,2048)
+      model.config.activation: choice(ReLU,Softplus,Tanh,SELU,LeakyReLU,PReLU,Sigmoid)
+      model.config.pooling_mode: choice(MaxPool1d,AvgPool1d)
+
+      model.config.n_blocks: choice([1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2])
+      model.config.n_pool_kernel_size: choice([6,3,1],[6,2,1],[4,2,1],[3,3,1],[2,2,1])
+      model.config.n_freq_downsample: choice([6,3,1],[6,2,1],[4,2,1],[3,3,1],[2,2,1])
+
+      trainer.optimizer.lr: tag(log, interval(1e-5, 1e-2))
+      trainer.config.ema: choice(true, false)
+      +trainer.config.ema_decay: interval(0.9, 0.9999)
+      trainer/criterion: choice(tweedie)
+      trainer.criterion.p: interval(1.01,1.9)
+
+trainer:
+  config:
+    batch_size: 16384
+    num_epochs: 15 
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 28 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/best_0.yaml

@@ -0,0 +1,28 @@
+trainer:
+  config:
+    ema_decay: 0.9412710347501564
+    batch_size: 1024
+    ema: True
+    num_epochs: 20
+  
+  optimizer:
+    lr: 0.0003946489348284673
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.1011198699619675
+
+model:
+  config:
+    dropout: 0.8065306916236111
+    hidden_size: 256
+    n_head: 1 
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True

+ 27 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/best_1.yaml

@@ -0,0 +1,27 @@
+trainer:
+  config:
+    batch_size: 1024
+    ema: False
+    num_epochs: 20
+  
+  optimizer:
+    lr: 0.0005273969385515224
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.2220328364966142
+
+model:
+  config:
+    dropout: 0.6037804765285399
+    hidden_size: 384
+    n_head: 1 
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True

+ 28 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/best_2.yaml

@@ -0,0 +1,28 @@
+trainer:
+  config:
+    batch_size: 1024
+    ema: True
+    ema_decay: 0.9797380207850296
+    num_epochs: 20
+  
+  optimizer:
+    lr: 0.008005401622327324
+  
+  criterion:
+    _target_: criterion.TweedieLoss
+    p: 1.271190112897211
+
+model:
+  config:
+    dropout: 0.23499650892965934
+    hidden_size: 384
+    n_head: 4 
+
+dataset:
+  config:
+    memory_mapped: True 
+    train_samples: 1000000
+
+evaluator:
+  config:
+    save_predictions: True

+ 21 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5/tft/hp_search.yaml

@@ -0,0 +1,21 @@
+hydra:
+  sweeper:
+    params:
+      model.config.n_head: choice(1,2,4)
+      model.config.hidden_size: choice(128,196,256,384)
+      model.config.dropout: interval(0.0, 0.9)
+      trainer.optimizer.lr: tag(log, interval(1e-5, 1e-2))
+      trainer.config.ema: choice(true, false)
+      +trainer.config.ema_decay: interval(0.9, 0.9999)
+      trainer.config.batch_size: choice(1024)
+      trainer/criterion: choice(tweedie)
+      trainer.criterion.p: interval(1.1,1.7)
+
+trainer:
+  config:
+    num_epochs: 10
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

+ 27 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/best_0.yaml

@@ -0,0 +1,27 @@
+trainer:
+  config:
+    ema_decay: 0.9602099240857632
+    ema: True
+    batch_size: 128
+    num_epochs: 20
+  optimizer:
+    lr: 0.000530089353065201
+  criterion:
+    _target_: torch.nn.L1Loss
+
+
+model:
+  config:
+    dropout: 0.31763710503690956 
+    embedding_dim: 8
+    hidden_size: 512 
+    num_layers: 4
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True
+
+evaluator:
+  config:
+    save_predictions: True

+ 26 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/best_1.yaml

@@ -0,0 +1,26 @@
+trainer:
+  config:
+    ema: False
+    batch_size: 128
+    num_epochs: 20
+  optimizer:
+    lr: 0.0050003507487785225
+  criterion:
+    _target_: torch.nn.L1Loss
+
+
+model:
+  config:
+    dropout: 0.6408337621928981 
+    embedding_dim: 32
+    hidden_size: 512 
+    num_layers: 4
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True
+
+evaluator:
+  config:
+    save_predictions: True

+ 27 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/best_2.yaml

@@ -0,0 +1,27 @@
+trainer:
+  config:
+    ema: True
+    ema_decay: 0.9801014862597447
+    batch_size: 128
+    num_epochs: 20
+  optimizer:
+    lr: 1.9813457277507318e-05
+  criterion:
+    _target_: torch.nn.L1Loss
+
+
+model:
+  config:
+    dropout: 0.6075438265717921
+    embedding_dim: 32
+    hidden_size: 512 
+    num_layers: 4
+
+dataset:
+  config:
+    train_samples: 1000000
+    memory_mapped: True
+
+evaluator:
+  config:
+    save_predictions: True

+ 25 - 0
Tools/PyTorch/TimeSeriesPredictionPlatform/conf/overrides/M5_norm/deepar/hp_search.yaml

@@ -0,0 +1,25 @@
+hydra:
+  sweeper:
+    params:
+      model.config.num_layers: choice(1,2,3,4,5)
+      model.config.hidden_size: choice(64, 128, 256, 384, 512)
+      model.config.embedding_dim: choice(8, 16, 32, 64)
+      model.config.dropout: interval(0, 1)
+      trainer.optimizer.lr: tag(log, interval(1e-5, 1e-2))
+      trainer.config.ema: choice(true, false)
+      +trainer.config.ema_decay: interval(0.9, 0.9999)
+      trainer.config.batch_size: choice(128)
+model:
+  config:
+    use_embedding: true
+
+trainer:
+  config:
+    num_epochs: 20
+  criterion:
+    _target_: torch.nn.L1Loss
+
+dataset:
+  config:
+    train_samples: 100000
+    memory_mapped: True

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio