From 18161495f3701f9d00fae7bae3ea3959d2cc8fc3 Mon Sep 17 00:00:00 2001 From: Krzysztof Kudrynski Date: Mon, 6 Feb 2023 20:27:11 +0100 Subject: [PATCH] Adding NVIDIA TFT model --- images/tft_architecture.png | Bin 0 -> 60056 bytes nvidia_deeplearningexamples_tft.md | 170 +++++++++++++++++++++++++++++ scripts/tags.py | 1 + 3 files changed, 171 insertions(+) create mode 100644 images/tft_architecture.png create mode 100644 nvidia_deeplearningexamples_tft.md diff --git a/images/tft_architecture.png b/images/tft_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..89ca2096eee28b35b04abd88f1449bc9b9b3e1ed GIT binary patch literal 60056 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

buDhb3I^T*EvZaTCAm{7!f2(xud)xWTC6V3~@F z9?wR;LCBR6nE74iK9XK0B-8vi6AwyBph&9tJPPmMWs;=FGeJvvi9kkViUr(7l72Zf zolLnw9B3^_zyHM3U=kDe%_!Hkjury?KXdZZgzw&UVty)1o<5KO(F(@DF}MX!m)u0s zLoBLE>GML;+S6Ouqk03k6Pfg=!c0XPH~@YYjRQ^w59 zT9T#lxWB5lU@1$s{+H}-sr4J9dw+jF{E2I*$N#l6l`|UF*DYmiue)P+XR4h8gF5Ws z5Eg*p-FC9N39D1l@b;3f&F>~&ZGTGbN*>k)`GwsWxTI#ayAO$nIa?H$ffzV}_# zzFpdx%E4*Kx;6Ms;T30!2q{F#C>DuA1c{y3XHg%UlIW(G;_W*fgN?3TjX*JH$_wC{ zba_nIHnzLY6wWeEw3YVG6wWpYqgnB^UCg%gozin}_VAzzMQFezEvX)0Xb7? zxc$`fW*le2^{0AmV>|ZD6gyI!%|m|M&iv(I;BCCr=2y;C&gfKKArOy14P$$qGu3|D zsfGE)Gf}2S4SrL?H|0!~;ajbyAuzkVylfC`7;C2Sv~Ja@#Y+as_NS+(Iyao)U1}TK zoS8y8n?tGmBcyay>E@Xt#~F^030b64A!jNTx%_(YPQgJgmAKa%zxk}Fg77!>vI{V_{V!RJI@+aGdvCYQ;VH6e-RtcDtgv^_< zy$yah@yB6x9O~G-BYnq&H-7u#qU)xMKn-KNjUJ1b%wbao-UhOs=6NlC$H1$NB~Scr zWByF>p0m%-&*tIb;m?-&6gxX)pLoF#GIo7^9i*34(h#`1x(bI#J%pJuW;lQK`1qIx z)(+MZzdJ~p9$5%PB7lsym*WB+-{aypazf~GcL>ayrfEp-NzCdh`EqxN^z1OoL1bpv zu2fIJ)?9XbdmE(g+nMb1S{!d}LInv+SuU63eaL~I%p1S#@Za3r42+_h69VH#K=XXu z{Nz5J_{~L7^{0+NaHiED!7Y3g9~=^t>B==JdMaBs0#^r@n2HX!i+{=WD6 z`WnJar@TAGxFIa`^z<~yt$Qir*9+6?r)LDb&GWOfvmi#~rFi0(^VH|(=dSqmGLB33 z^T(OuChSmse0+rS1nd-$^lr)qZeL(AggI-$&H}lI5GBx#RA2P|f8EQ=OUUKKxI-LZ zN@LE>XEAR0`0^3ZG2#?@bs2zZ(2EQYZt=Bbi~ z{tgE{y%$6Z4h{}NSl{vSvCc>p7!a&{y}i8!`Eko=U*I;?n`A+P{8aP#+|`a$7w9ST zdvtWPcXD##n&0XZOE(-P0-EQeq-C&&62F5%sfH$oz&}Pi!?8uf!mR)R002ovPDHLk FV1nkLIXnOW literal 0 HcmV?d00001 diff --git a/nvidia_deeplearningexamples_tft.md b/nvidia_deeplearningexamples_tft.md new file mode 100644 index 00000000..9dceccea --- /dev/null +++ b/nvidia_deeplearningexamples_tft.md @@ -0,0 +1,170 @@ +--- +layout: hub_detail +background-class: hub-background +body-class: hub +title: Temporal Fusion Transformer +summary: The Temporal Fusion Transformer (TFT) model is a state-of-the-art architecture for interpretable, multi-horizon time-series prediction. +category: researchers +image: nvidia_logo.png +author: NVIDIA +tags: [forecasting] +github-link: https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Forecasting/TFT +github-id: NVIDIA/DeepLearningExamples +featured_image_1: tft_architecture.png +featured_image_2: no-image +accelerator: cuda +--- + + +# Model Description +The Temporal Fusion Transformer [TFT](https://arxiv.org/abs/1912.09363) model is a state-of-the-art architecture for interpretable, multi-horizon time-series prediction. The model was first developed and [implemented by Google](https://github.com/google-research/google-research/tree/master/tft) with the collaboration with the University of Oxford. +[This implementation](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Forecasting/TFT) differs from the reference implementation by addressing the issue of missing data, which is common in production datasets, by either masking their values in attention matrices or embedding them as a special value in the latent space. +This model enables the prediction of confidence intervals for future values of time series for multiple future timesteps. +# Example +In the following example, we will use the pretrained ***TFT*** model to perform inference on some preprocessed samples from the ***Electricity*** dataset. To run the example, you need some extra python packages installed for loading and visualization. +```python +!pip install scikit-learn==1.2.1 +!pip install pandas==1.5.3 +!pip install matplotlib==3.6.3 +``` + +```python +import torch +import os +import numpy as np +import matplotlib.pyplot as plt +import pickle +from mpl_toolkits.axes_grid1 import make_axes_locatable +import warnings +warnings.filterwarnings('ignore') +os.environ["TFT_SCRIPTING"] = "True" +if torch.cuda.is_available(): + device = torch.device("cuda") + !nvidia-smi +else: + device = torch.device("cpu") +print(f'Using {device} for inference') +``` + +Load the model pretrained on the ***Electricity*** dataset. +```python +tft_model = torch.hub.load("../../../../public", "nvidia_tft", dataset="electricity", pretrained=True, source="local") +utils = torch.hub.load("../../../../public", "nvidia_tft_data_utils", source="local") +``` + +Download and preprocess the data. This can take a few minutes. +```python +utils.download_data(torch.hub._get_torch_home()) +``` + +```python +utils.preprocess(torch.hub._get_torch_home()) +``` + +Initialize functions used to get interpretable attention graphs. +```python +activations = {} +def get_attention_heatmap_fig(heads, max_size=16, min_size=4): + row_size = max(min_size, max_size / len(heads)) + fig, axes = plt.subplots(1, len(heads), figsize=(max_size, row_size)) + for i, (head, ax) in enumerate(zip(heads, axes), 1): + im = ax.imshow(head, cmap='hot', interpolation='nearest') + if i < len(heads): + ax.set_title(f'HEAD {i}') + else: + ax.set_title(f'MEAN') + divider = make_axes_locatable(ax) + cax = divider.append_axes('right', size='5%', pad=0.05) + fig.colorbar(im, cax=cax, orientation='vertical') + return fig + +def get_attn_heads(activations, sample_number): + heads = [] + _, attn_prob = activations + sample_attn_prob = attn_prob[sample_number] + n_heads = sample_attn_prob.shape[0] + for head_index in range(n_heads): + head = sample_attn_prob[head_index] * 255 + heads.append(head.detach().cpu()) + mean_head = torch.mean(sample_attn_prob, dim=0) * 255 + heads.append(mean_head.detach().cpu()) + fig = get_attention_heatmap_fig(heads) + return fig + +def _get_activation(name): + def hook(model, input, output): + activations[name] = output + + return hook +``` + +Register the hook on the model to save the data. +```python +tft_model.attention.register_forward_hook(_get_activation('attention')) +``` + +Load the sample preprocessed batch of data. +```python +batch = utils.get_batch(torch.hub._get_torch_home()) +``` + +```python +batch = {key: tensor.to(device) if tensor.numel() else None for key, tensor in batch.items()} +``` + +Run inference on the ***TFT***. +```python +tft_model.to(device) +tft_model.eval() +with torch.no_grad(): + output= tft_model(batch) +``` + +```python +output.shape +``` + +```python +batch['target'].shape +``` + +Plot the full 192 timestep window of the ***Electricity*** dataset. We use the previous week of data to predict the following day of power usage. Since our data is organized by hour, this means we use 168 previous time points to predict the following 24. +```python +index = 9 +fig, ax = plt.subplots() +ax.plot(batch['target'][index].cpu().numpy(), label="Ground Truth") +ax.plot(np.arange(168, 192), output[index].detach().cpu().numpy(), label=["10th Quantile", "50th Quantile", "90th Quantile"]) +ax.legend(loc='upper left') + +ax.set_xlabel('Timestep') +ax.set_ylabel('Power Usage') + + +``` + +Below is the same graph as above, but only focusing on the prediction window, which is the last 24 values. +```python +fig, ax = plt.subplots() +ax.plot(np.arange(168, 192), batch['target'][index][-24:].cpu().numpy(), label="Ground Truth") +ax.plot(np.arange(168, 192), output[index].detach().cpu().numpy(), label=["10th Quantile", "50th Quantile", "90th Quantile"]) +ax.legend(loc='upper left') + +ax.set_xlabel('Timestep') +ax.set_ylabel('Power Usage') +``` + +Using the hook we defined earlier we can generate plots of the attention heads. There is a clear trend that more recent values are given more weight. In addition, the striations in the graphs are every 24 hours, which indicates that there is some correlation between data on the same hour of different days. Indeed, looking back on the graphs above there is a cyclical pattern to the power usage that repeats every 24 hours. +```python +attn_graphs = get_attn_heads(activations['attention'], index) +``` + +### Details + +For detailed information on model input and output, training recipies, inference and performance visit: +[Deep Learning Examples](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Forecasting/TFT) +### References + + - [Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting](https://arxiv.org/abs/1912.09363) + - [model on github](https://github.com/NVIDIA/DeepLearningExamples/tree/master/PyTorch/Forecasting/TFT) + - [pretrained model on NGC (Electricity)](https://catalog.ngc.nvidia.com/orgs/nvidia/models/tft_pyt_ckpt_base_eletricity_amp) + - [pretrained model on NGC (Traffic)](https://catalog.ngc.nvidia.com/orgs/nvidia/models/tft_pyt_ckpt_base_traffic_amp) \ No newline at end of file diff --git a/scripts/tags.py b/scripts/tags.py index 817b4d42..a4cfe959 100644 --- a/scripts/tags.py +++ b/scripts/tags.py @@ -3,4 +3,5 @@ 'generative', 'audio', 'scriptable', + 'forecasting' ]