Last active
July 20, 2022 18:47
-
-
Save TalKachman/726638a8c8e28bcdf34cb39f67a338c0 to your computer and use it in GitHub Desktop.
minimal pl lightning
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "name": "minimal_lightning_example.ipynb", | |
| "provenance": [] | |
| }, | |
| "kernelspec": { | |
| "name": "python3", | |
| "display_name": "Python 3" | |
| }, | |
| "language_info": { | |
| "name": "python" | |
| }, | |
| "accelerator": "GPU", | |
| "gpuClass": "standard", | |
| "widgets": { | |
| "application/vnd.jupyter.widget-state+json": { | |
| "5f131142d6654b0089740dbdb6ce9e5c": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "HBoxModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_dom_classes": [], | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "HBoxModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/controls", | |
| "_view_module_version": "1.5.0", | |
| "_view_name": "HBoxView", | |
| "box_style": "", | |
| "children": [ | |
| "IPY_MODEL_731e4ef2838448a3ba3a1cf63272b4fb", | |
| "IPY_MODEL_07ab0906c93243df8e8f80f1024741cf", | |
| "IPY_MODEL_35d8d6bbb4af435bafe09b2036bf81b9" | |
| ], | |
| "layout": "IPY_MODEL_5739d36a647b41ff9864c370cc71080f" | |
| } | |
| }, | |
| "731e4ef2838448a3ba3a1cf63272b4fb": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "HTMLModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_dom_classes": [], | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "HTMLModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/controls", | |
| "_view_module_version": "1.5.0", | |
| "_view_name": "HTMLView", | |
| "description": "", | |
| "description_tooltip": null, | |
| "layout": "IPY_MODEL_cfad1b7a1bce42d9afcb18fc5b528d47", | |
| "placeholder": "", | |
| "style": "IPY_MODEL_96924bc6e6f142e99e943e5a105357f7", | |
| "value": "Sanity Checking DataLoader 0: 0%" | |
| } | |
| }, | |
| "07ab0906c93243df8e8f80f1024741cf": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "FloatProgressModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_dom_classes": [], | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "FloatProgressModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/controls", | |
| "_view_module_version": "1.5.0", | |
| "_view_name": "ProgressView", | |
| "bar_style": "", | |
| "description": "", | |
| "description_tooltip": null, | |
| "layout": "IPY_MODEL_1cd3e7f9222e4e4f82db0b61b0eacaa6", | |
| "max": 1, | |
| "min": 0, | |
| "orientation": "horizontal", | |
| "style": "IPY_MODEL_72342bd2f64e46e08aeec72be7530c7a", | |
| "value": 0 | |
| } | |
| }, | |
| "35d8d6bbb4af435bafe09b2036bf81b9": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "HTMLModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_dom_classes": [], | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "HTMLModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/controls", | |
| "_view_module_version": "1.5.0", | |
| "_view_name": "HTMLView", | |
| "description": "", | |
| "description_tooltip": null, | |
| "layout": "IPY_MODEL_f8c3c98233744499a2230cbf814ebcfc", | |
| "placeholder": "", | |
| "style": "IPY_MODEL_f981b2f3785d4715b55e9045405f2b9a", | |
| "value": " 0/1 [00:00<?, ?it/s]" | |
| } | |
| }, | |
| "5739d36a647b41ff9864c370cc71080f": { | |
| "model_module": "@jupyter-widgets/base", | |
| "model_name": "LayoutModel", | |
| "model_module_version": "1.2.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/base", | |
| "_model_module_version": "1.2.0", | |
| "_model_name": "LayoutModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "LayoutView", | |
| "align_content": null, | |
| "align_items": null, | |
| "align_self": null, | |
| "border": null, | |
| "bottom": null, | |
| "display": "inline-flex", | |
| "flex": null, | |
| "flex_flow": "row wrap", | |
| "grid_area": null, | |
| "grid_auto_columns": null, | |
| "grid_auto_flow": null, | |
| "grid_auto_rows": null, | |
| "grid_column": null, | |
| "grid_gap": null, | |
| "grid_row": null, | |
| "grid_template_areas": null, | |
| "grid_template_columns": null, | |
| "grid_template_rows": null, | |
| "height": null, | |
| "justify_content": null, | |
| "justify_items": null, | |
| "left": null, | |
| "margin": null, | |
| "max_height": null, | |
| "max_width": null, | |
| "min_height": null, | |
| "min_width": null, | |
| "object_fit": null, | |
| "object_position": null, | |
| "order": null, | |
| "overflow": null, | |
| "overflow_x": null, | |
| "overflow_y": null, | |
| "padding": null, | |
| "right": null, | |
| "top": null, | |
| "visibility": null, | |
| "width": "100%" | |
| } | |
| }, | |
| "cfad1b7a1bce42d9afcb18fc5b528d47": { | |
| "model_module": "@jupyter-widgets/base", | |
| "model_name": "LayoutModel", | |
| "model_module_version": "1.2.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/base", | |
| "_model_module_version": "1.2.0", | |
| "_model_name": "LayoutModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "LayoutView", | |
| "align_content": null, | |
| "align_items": null, | |
| "align_self": null, | |
| "border": null, | |
| "bottom": null, | |
| "display": null, | |
| "flex": null, | |
| "flex_flow": null, | |
| "grid_area": null, | |
| "grid_auto_columns": null, | |
| "grid_auto_flow": null, | |
| "grid_auto_rows": null, | |
| "grid_column": null, | |
| "grid_gap": null, | |
| "grid_row": null, | |
| "grid_template_areas": null, | |
| "grid_template_columns": null, | |
| "grid_template_rows": null, | |
| "height": null, | |
| "justify_content": null, | |
| "justify_items": null, | |
| "left": null, | |
| "margin": null, | |
| "max_height": null, | |
| "max_width": null, | |
| "min_height": null, | |
| "min_width": null, | |
| "object_fit": null, | |
| "object_position": null, | |
| "order": null, | |
| "overflow": null, | |
| "overflow_x": null, | |
| "overflow_y": null, | |
| "padding": null, | |
| "right": null, | |
| "top": null, | |
| "visibility": null, | |
| "width": null | |
| } | |
| }, | |
| "96924bc6e6f142e99e943e5a105357f7": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "DescriptionStyleModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "DescriptionStyleModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "StyleView", | |
| "description_width": "" | |
| } | |
| }, | |
| "1cd3e7f9222e4e4f82db0b61b0eacaa6": { | |
| "model_module": "@jupyter-widgets/base", | |
| "model_name": "LayoutModel", | |
| "model_module_version": "1.2.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/base", | |
| "_model_module_version": "1.2.0", | |
| "_model_name": "LayoutModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "LayoutView", | |
| "align_content": null, | |
| "align_items": null, | |
| "align_self": null, | |
| "border": null, | |
| "bottom": null, | |
| "display": null, | |
| "flex": "2", | |
| "flex_flow": null, | |
| "grid_area": null, | |
| "grid_auto_columns": null, | |
| "grid_auto_flow": null, | |
| "grid_auto_rows": null, | |
| "grid_column": null, | |
| "grid_gap": null, | |
| "grid_row": null, | |
| "grid_template_areas": null, | |
| "grid_template_columns": null, | |
| "grid_template_rows": null, | |
| "height": null, | |
| "justify_content": null, | |
| "justify_items": null, | |
| "left": null, | |
| "margin": null, | |
| "max_height": null, | |
| "max_width": null, | |
| "min_height": null, | |
| "min_width": null, | |
| "object_fit": null, | |
| "object_position": null, | |
| "order": null, | |
| "overflow": null, | |
| "overflow_x": null, | |
| "overflow_y": null, | |
| "padding": null, | |
| "right": null, | |
| "top": null, | |
| "visibility": null, | |
| "width": null | |
| } | |
| }, | |
| "72342bd2f64e46e08aeec72be7530c7a": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "ProgressStyleModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "ProgressStyleModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "StyleView", | |
| "bar_color": null, | |
| "description_width": "" | |
| } | |
| }, | |
| "f8c3c98233744499a2230cbf814ebcfc": { | |
| "model_module": "@jupyter-widgets/base", | |
| "model_name": "LayoutModel", | |
| "model_module_version": "1.2.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/base", | |
| "_model_module_version": "1.2.0", | |
| "_model_name": "LayoutModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "LayoutView", | |
| "align_content": null, | |
| "align_items": null, | |
| "align_self": null, | |
| "border": null, | |
| "bottom": null, | |
| "display": null, | |
| "flex": null, | |
| "flex_flow": null, | |
| "grid_area": null, | |
| "grid_auto_columns": null, | |
| "grid_auto_flow": null, | |
| "grid_auto_rows": null, | |
| "grid_column": null, | |
| "grid_gap": null, | |
| "grid_row": null, | |
| "grid_template_areas": null, | |
| "grid_template_columns": null, | |
| "grid_template_rows": null, | |
| "height": null, | |
| "justify_content": null, | |
| "justify_items": null, | |
| "left": null, | |
| "margin": null, | |
| "max_height": null, | |
| "max_width": null, | |
| "min_height": null, | |
| "min_width": null, | |
| "object_fit": null, | |
| "object_position": null, | |
| "order": null, | |
| "overflow": null, | |
| "overflow_x": null, | |
| "overflow_y": null, | |
| "padding": null, | |
| "right": null, | |
| "top": null, | |
| "visibility": null, | |
| "width": null | |
| } | |
| }, | |
| "f981b2f3785d4715b55e9045405f2b9a": { | |
| "model_module": "@jupyter-widgets/controls", | |
| "model_name": "DescriptionStyleModel", | |
| "model_module_version": "1.5.0", | |
| "state": { | |
| "_model_module": "@jupyter-widgets/controls", | |
| "_model_module_version": "1.5.0", | |
| "_model_name": "DescriptionStyleModel", | |
| "_view_count": null, | |
| "_view_module": "@jupyter-widgets/base", | |
| "_view_module_version": "1.2.0", | |
| "_view_name": "StyleView", | |
| "description_width": "" | |
| } | |
| } | |
| } | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "sw36Gqs2wIOZ", | |
| "outputId": "47921c37-ef8c-4bb0-eae7-e0ee265eadd4" | |
| }, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "Wed Jul 20 18:27:32 2022 \n", | |
| "+-----------------------------------------------------------------------------+\n", | |
| "| NVIDIA-SMI 460.32.03 Driver Version: 460.32.03 CUDA Version: 11.2 |\n", | |
| "|-------------------------------+----------------------+----------------------+\n", | |
| "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", | |
| "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", | |
| "| | | MIG M. |\n", | |
| "|===============================+======================+======================|\n", | |
| "| 0 Tesla V100-SXM2... Off | 00000000:00:04.0 Off | 0 |\n", | |
| "| N/A 36C P0 24W / 300W | 0MiB / 16160MiB | 0% Default |\n", | |
| "| | | N/A |\n", | |
| "+-------------------------------+----------------------+----------------------+\n", | |
| " \n", | |
| "+-----------------------------------------------------------------------------+\n", | |
| "| Processes: |\n", | |
| "| GPU GI CI PID Type Process name GPU Memory |\n", | |
| "| ID ID Usage |\n", | |
| "|=============================================================================|\n", | |
| "| No running processes found |\n", | |
| "+-----------------------------------------------------------------------------+\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "!nvidia-smi" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "!pip install -qqq wandb pytorch-lightning torchmetrics pytorch-forecasting" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "llDX8NNz00_B", | |
| "outputId": "6c4bb20b-e5c9-440a-ef65-78ac37d73fdd" | |
| }, | |
| "execution_count": 2, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "\u001b[K |████████████████████████████████| 1.8 MB 15.4 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 585 kB 64.3 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 419 kB 70.2 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 127 kB 75.8 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 181 kB 70.1 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 147 kB 69.1 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 63 kB 1.6 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 596 kB 69.1 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 140 kB 72.0 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 1.1 MB 63.4 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 308 kB 69.9 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 209 kB 71.1 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 81 kB 11.0 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 94 kB 4.4 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 271 kB 73.3 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 144 kB 77.3 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 78 kB 3.6 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 49 kB 6.2 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 112 kB 75.8 MB/s \n", | |
| "\u001b[K |████████████████████████████████| 147 kB 72.2 MB/s \n", | |
| "\u001b[?25h Building wheel for pyperclip (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
| " Building wheel for pathtools (setup.py) ... \u001b[?25l\u001b[?25hdone\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import wandb\n", | |
| "import pandas as pd\n", | |
| "import numpy as np" | |
| ], | |
| "metadata": { | |
| "id": "vhTVVzW73Xaq" | |
| }, | |
| "execution_count": 8, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "import pytorch_lightning as pl\n", | |
| "from pytorch_lightning.loggers import WandbLogger\n", | |
| "from pytorch_lightning.callbacks import EarlyStopping, LearningRateMonitor,ModelCheckpoint" | |
| ], | |
| "metadata": { | |
| "id": "Wn0W_Mol4cxx" | |
| }, | |
| "execution_count": 13, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from pytorch_forecasting import Baseline, TemporalFusionTransformer, TimeSeriesDataSet\n", | |
| "from pytorch_forecasting.metrics import RMSE" | |
| ], | |
| "metadata": { | |
| "id": "axi4WnAG4B75" | |
| }, | |
| "execution_count": 18, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "wandb.init()\n", | |
| "wandb_logger = WandbLogger(log_model='all')" | |
| ], | |
| "metadata": { | |
| "id": "eNpStYqf3dbp" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "Let's generate some data for now " | |
| ], | |
| "metadata": { | |
| "id": "Le52Nbbt30Sc" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "def generate_data(freq_list,num_obs,tpts):\n", | |
| " df = pd.DataFrame(index = range(num_obs))\n", | |
| " range_dex = range(num_obs)\n", | |
| " x_range = np.linspace(0,tpts*2*np.pi,num_obs)\n", | |
| " for i,_ in enumerate(freq_list):\n", | |
| " foo = pd.DataFrame(np.sin(x_range),index=range_dex,columns=['signal'])\n", | |
| " foo['grpid'] = str(i)\n", | |
| " df = df.append(foo)\n", | |
| " return foo" | |
| ], | |
| "metadata": { | |
| "id": "FPssurTa3me5" | |
| }, | |
| "execution_count": 9, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "df = generate_data([0.3],1000,30)\n", | |
| "df.head(3)\n", | |
| "# generate two features we known\n", | |
| "df['f1'] = np.ones(1000)\n", | |
| "df['f2'] = np.linspace(0,10,1000)\n", | |
| "df['tdex'] = range(1000)\n", | |
| "#forcasting and doing everything\n", | |
| "training = TimeSeriesDataSet(\n", | |
| "# resampled_df_ftx[resampled_df_ftx['date']<43800*5],\n", | |
| "df,\n", | |
| "time_idx = 'tdex',\n", | |
| "group_ids = ['grpid'],\n", | |
| "target = 'signal',\n", | |
| "max_encoder_length = 150,\n", | |
| "min_encoder_length = 15,\n", | |
| "min_prediction_length = 1,\n", | |
| "max_prediction_length = 100,\n", | |
| "static_categoricals = ['grpid'], \n", | |
| "time_varying_known_reals = ['f2','f1'],\n", | |
| "time_varying_unknown_reals = ['signal'],\n", | |
| "allow_missing_timesteps=True\n", | |
| ")" | |
| ], | |
| "metadata": { | |
| "id": "KucYFty_3mYP" | |
| }, | |
| "execution_count": 11, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "validation = TimeSeriesDataSet.from_dataset(training, df, predict=True, stop_randomization=True)\n", | |
| "\n", | |
| "# create dataloaders for model\n", | |
| "batch_size = 128 # set this between 32 to 128\n", | |
| "train_dataloader = training.to_dataloader(train=True, batch_size=batch_size, num_workers=0)\n", | |
| "val_dataloader = validation.to_dataloader(train=False, batch_size=batch_size * 10, num_workers=0)" | |
| ], | |
| "metadata": { | |
| "id": "VA549tIv44su" | |
| }, | |
| "execution_count": 21, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "early_stop_callback = EarlyStopping(monitor=\"val_loss\", min_delta=1e-4, patience=10, verbose=False, mode=\"min\")\n", | |
| "lr_logger = LearningRateMonitor() # log the learning rate" | |
| ], | |
| "metadata": { | |
| "id": "XMEbGbx04S-O" | |
| }, | |
| "execution_count": 15, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "trainer = pl.Trainer(\n", | |
| " max_epochs=7,\n", | |
| " gpus=0,\n", | |
| " weights_summary=\"top\",\n", | |
| " gradient_clip_val=0.1,\n", | |
| " limit_train_batches=10, # coment in for training, running valiation every 30 batches\n", | |
| " # fast_dev_run=True, # comment in to check that networkor dataset has no serious bugs\n", | |
| " callbacks=[lr_logger, early_stop_callback],\n", | |
| " logger=wandb_logger,\n", | |
| " )" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "Fo7S3QuN4Ekf", | |
| "outputId": "0619c63f-68fc-4406-9694-8686d3c2b3ca" | |
| }, | |
| "execution_count": 16, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stderr", | |
| "text": [ | |
| "GPU available: True, used: False\n", | |
| "TPU available: False, using: 0 TPU cores\n", | |
| "IPU available: False, using: 0 IPUs\n", | |
| "HPU available: False, using: 0 HPUs\n", | |
| "/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py:1817: PossibleUserWarning: GPU available but not used. Set `accelerator` and `devices` using `Trainer(accelerator='gpu', devices=1)`.\n", | |
| " category=PossibleUserWarning,\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "tft = TemporalFusionTransformer.from_dataset(\n", | |
| " training,\n", | |
| " learning_rate=0.03,\n", | |
| " hidden_size=16,\n", | |
| " attention_head_size=1,\n", | |
| " dropout=0.1,\n", | |
| " hidden_continuous_size=8,\n", | |
| " output_size=1, # 7 quantiles by default\n", | |
| " loss=RMSE(),\n", | |
| " log_interval=10, # uncomment for learning rate finder and otherwise, e.g. to 10 for logging every 10 batches\n", | |
| " reduce_on_plateau_patience=4,\n", | |
| ")" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "rJqCXAMz4ipy", | |
| "outputId": "bb00bfdb-56b0-46a1-f2e2-ce2080772487" | |
| }, | |
| "execution_count": 19, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stderr", | |
| "text": [ | |
| "/usr/local/lib/python3.7/dist-packages/torchmetrics/utilities/prints.py:36: UserWarning: Torchmetrics v0.9 introduced a new argument class property called `full_state_update` that has\n", | |
| " not been set for this class (RMSE). The property determines if `update` by\n", | |
| " default needs access to the full metric state. If this is not the case, significant speedups can be\n", | |
| " achieved and we recommend setting this to `False`.\n", | |
| " We provide an checking function\n", | |
| " `from torchmetrics.utilities import check_forward_no_full_state`\n", | |
| " that can be used to check if the `full_state_update=True` (old and potential slower behaviour,\n", | |
| " default for now) or if `full_state_update=False` can be used safely.\n", | |
| " \n", | |
| " warnings.warn(*args, **kwargs)\n", | |
| "/usr/local/lib/python3.7/dist-packages/torchmetrics/utilities/prints.py:36: UserWarning: Torchmetrics v0.9 introduced a new argument class property called `full_state_update` that has\n", | |
| " not been set for this class (QuantileLoss). The property determines if `update` by\n", | |
| " default needs access to the full metric state. If this is not the case, significant speedups can be\n", | |
| " achieved and we recommend setting this to `False`.\n", | |
| " We provide an checking function\n", | |
| " `from torchmetrics.utilities import check_forward_no_full_state`\n", | |
| " that can be used to check if the `full_state_update=True` (old and potential slower behaviour,\n", | |
| " default for now) or if `full_state_update=False` can be used safely.\n", | |
| " \n", | |
| " warnings.warn(*args, **kwargs)\n", | |
| "/usr/local/lib/python3.7/dist-packages/torchmetrics/utilities/prints.py:36: UserWarning: Torchmetrics v0.9 introduced a new argument class property called `full_state_update` that has\n", | |
| " not been set for this class (SMAPE). The property determines if `update` by\n", | |
| " default needs access to the full metric state. If this is not the case, significant speedups can be\n", | |
| " achieved and we recommend setting this to `False`.\n", | |
| " We provide an checking function\n", | |
| " `from torchmetrics.utilities import check_forward_no_full_state`\n", | |
| " that can be used to check if the `full_state_update=True` (old and potential slower behaviour,\n", | |
| " default for now) or if `full_state_update=False` can be used safely.\n", | |
| " \n", | |
| " warnings.warn(*args, **kwargs)\n", | |
| "/usr/local/lib/python3.7/dist-packages/torchmetrics/utilities/prints.py:36: UserWarning: Torchmetrics v0.9 introduced a new argument class property called `full_state_update` that has\n", | |
| " not been set for this class (MAE). The property determines if `update` by\n", | |
| " default needs access to the full metric state. If this is not the case, significant speedups can be\n", | |
| " achieved and we recommend setting this to `False`.\n", | |
| " We provide an checking function\n", | |
| " `from torchmetrics.utilities import check_forward_no_full_state`\n", | |
| " that can be used to check if the `full_state_update=True` (old and potential slower behaviour,\n", | |
| " default for now) or if `full_state_update=False` can be used safely.\n", | |
| " \n", | |
| " warnings.warn(*args, **kwargs)\n", | |
| "/usr/local/lib/python3.7/dist-packages/torchmetrics/utilities/prints.py:36: UserWarning: Torchmetrics v0.9 introduced a new argument class property called `full_state_update` that has\n", | |
| " not been set for this class (MAPE). The property determines if `update` by\n", | |
| " default needs access to the full metric state. If this is not the case, significant speedups can be\n", | |
| " achieved and we recommend setting this to `False`.\n", | |
| " We provide an checking function\n", | |
| " `from torchmetrics.utilities import check_forward_no_full_state`\n", | |
| " that can be used to check if the `full_state_update=True` (old and potential slower behaviour,\n", | |
| " default for now) or if `full_state_update=False` can be used safely.\n", | |
| " \n", | |
| " warnings.warn(*args, **kwargs)\n", | |
| "/usr/local/lib/python3.7/dist-packages/pytorch_lightning/utilities/parsing.py:262: UserWarning: Attribute 'loss' is an instance of `nn.Module` and is already saved during checkpointing. It is recommended to ignore them using `self.save_hyperparameters(ignore=['loss'])`.\n", | |
| " f\"Attribute {k!r} is an instance of `nn.Module` and is already saved during checkpointing.\"\n", | |
| "/usr/local/lib/python3.7/dist-packages/pytorch_lightning/utilities/parsing.py:262: UserWarning: Attribute 'logging_metrics' is an instance of `nn.Module` and is already saved during checkpointing. It is recommended to ignore them using `self.save_hyperparameters(ignore=['logging_metrics'])`.\n", | |
| " f\"Attribute {k!r} is an instance of `nn.Module` and is already saved during checkpointing.\"\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "trainer.fit(\n", | |
| " tft,\n", | |
| " train_dataloaders=train_dataloader,\n", | |
| " val_dataloaders=val_dataloader,\n", | |
| " )" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 1000, | |
| "referenced_widgets": [ | |
| "5f131142d6654b0089740dbdb6ce9e5c", | |
| "731e4ef2838448a3ba3a1cf63272b4fb", | |
| "07ab0906c93243df8e8f80f1024741cf", | |
| "35d8d6bbb4af435bafe09b2036bf81b9", | |
| "5739d36a647b41ff9864c370cc71080f", | |
| "cfad1b7a1bce42d9afcb18fc5b528d47", | |
| "96924bc6e6f142e99e943e5a105357f7", | |
| "1cd3e7f9222e4e4f82db0b61b0eacaa6", | |
| "72342bd2f64e46e08aeec72be7530c7a", | |
| "f8c3c98233744499a2230cbf814ebcfc", | |
| "f981b2f3785d4715b55e9045405f2b9a" | |
| ] | |
| }, | |
| "id": "oRvGtgba4qkK", | |
| "outputId": "1e94b125-72bb-4fbf-8736-4a4c62b17084" | |
| }, | |
| "execution_count": 22, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stderr", | |
| "text": [ | |
| "\n", | |
| " | Name | Type | Params\n", | |
| "----------------------------------------------------------------------------------------\n", | |
| "0 | loss | RMSE | 0 \n", | |
| "1 | logging_metrics | ModuleList | 0 \n", | |
| "2 | input_embeddings | MultiEmbedding | 1 \n", | |
| "3 | prescalers | ModuleDict | 64 \n", | |
| "4 | static_variable_selection | VariableSelectionNetwork | 624 \n", | |
| "5 | encoder_variable_selection | VariableSelectionNetwork | 1.8 K \n", | |
| "6 | decoder_variable_selection | VariableSelectionNetwork | 1.2 K \n", | |
| "7 | static_context_variable_selection | GatedResidualNetwork | 1.1 K \n", | |
| "8 | static_context_initial_hidden_lstm | GatedResidualNetwork | 1.1 K \n", | |
| "9 | static_context_initial_cell_lstm | GatedResidualNetwork | 1.1 K \n", | |
| "10 | static_context_enrichment | GatedResidualNetwork | 1.1 K \n", | |
| "11 | lstm_encoder | LSTM | 2.2 K \n", | |
| "12 | lstm_decoder | LSTM | 2.2 K \n", | |
| "13 | post_lstm_gate_encoder | GatedLinearUnit | 544 \n", | |
| "14 | post_lstm_add_norm_encoder | AddNorm | 32 \n", | |
| "15 | static_enrichment | GatedResidualNetwork | 1.4 K \n", | |
| "16 | multihead_attn | InterpretableMultiHeadAttention | 1.1 K \n", | |
| "17 | post_attn_gate_norm | GateAddNorm | 576 \n", | |
| "18 | pos_wise_ff | GatedResidualNetwork | 1.1 K \n", | |
| "19 | pre_output_gate_norm | GateAddNorm | 576 \n", | |
| "20 | output_layer | Linear | 17 \n", | |
| "----------------------------------------------------------------------------------------\n", | |
| "17.6 K Trainable params\n", | |
| "0 Non-trainable params\n", | |
| "17.6 K Total params\n", | |
| "0.071 Total estimated model params size (MB)\n" | |
| ] | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "Sanity Checking: 0it [00:00, ?it/s]" | |
| ], | |
| "application/vnd.jupyter.widget-view+json": { | |
| "version_major": 2, | |
| "version_minor": 0, | |
| "model_id": "5f131142d6654b0089740dbdb6ce9e5c" | |
| } | |
| }, | |
| "metadata": {} | |
| }, | |
| { | |
| "output_type": "error", | |
| "ename": "AttributeError", | |
| "evalue": "ignored", | |
| "traceback": [ | |
| "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", | |
| "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", | |
| "\u001b[0;32m<ipython-input-22-5bd935e00a5e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mtft\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mtrain_dataloaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain_dataloader\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mval_dataloaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mval_dataloader\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m )\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path)\u001b[0m\n\u001b[1;32m 769\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrategy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 770\u001b[0m self._call_and_handle_interrupt(\n\u001b[0;32m--> 771\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit_impl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrain_dataloaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mval_dataloaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdatamodule\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mckpt_path\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 772\u001b[0m )\n\u001b[1;32m 773\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_call_and_handle_interrupt\u001b[0;34m(self, trainer_fn, *args, **kwargs)\u001b[0m\n\u001b[1;32m 721\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrategy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlauncher\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlaunch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrainer_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrainer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 722\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 723\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mtrainer_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 724\u001b[0m \u001b[0;31m# TODO: treat KeyboardInterrupt as BaseException (delete the code below) in v1.7\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 725\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mexception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_fit_impl\u001b[0;34m(self, model, train_dataloaders, val_dataloaders, datamodule, ckpt_path)\u001b[0m\n\u001b[1;32m 809\u001b[0m \u001b[0mckpt_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel_provided\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel_connected\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlightning_module\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 810\u001b[0m )\n\u001b[0;32m--> 811\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mckpt_path\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mckpt_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 812\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 813\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstopped\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, model, ckpt_path)\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_checkpoint_connector\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresume_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1235\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1236\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_stage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1237\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1238\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdetail\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"{self.__class__.__name__}: trainer tearing down\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_run_stage\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1321\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredicting\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1322\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_predict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1323\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_train\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1324\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1325\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_pre_training_routine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_run_train\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1343\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1344\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0misolate_rng\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1345\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_sanity_check\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1346\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1347\u001b[0m \u001b[0;31m# enable train mode\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_run_sanity_check\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1411\u001b[0m \u001b[0;31m# run eval step\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1412\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mno_grad\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1413\u001b[0;31m \u001b[0mval_loop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1414\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1415\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_callback_hooks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"on_sanity_check_end\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/loops/base.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_advance_start\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 204\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madvance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 205\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_advance_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_restarting\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/loops/dataloader/evaluation_loop.py\u001b[0m in \u001b[0;36madvance\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 153\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnum_dataloaders\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"dataloader_idx\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdataloader_idx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 155\u001b[0;31m \u001b[0mdl_outputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mepoch_loop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_data_fetcher\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdl_max_batches\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 156\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[0;31m# store batch level output per dataloader\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/loops/base.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 202\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_advance_start\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 204\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madvance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 205\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_advance_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 206\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_restarting\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/loops/epoch/evaluation_epoch_loop.py\u001b[0m in \u001b[0;36madvance\u001b[0;34m(self, data_fetcher, dl_max_batches, kwargs)\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0;31m# lightning module methods\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 128\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_evaluation_step\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 129\u001b[0m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_evaluation_step_end\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutput\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/loops/epoch/evaluation_epoch_loop.py\u001b[0m in \u001b[0;36m_evaluation_step\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 224\u001b[0m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrainer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_strategy_hook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"test_step\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 225\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 226\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrainer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call_strategy_hook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"validation_step\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 227\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0moutput\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/trainer/trainer.py\u001b[0m in \u001b[0;36m_call_strategy_hook\u001b[0;34m(self, hook_name, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1763\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1764\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprofiler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprofile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"[Strategy]{self.strategy.__class__.__name__}.{hook_name}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1765\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1766\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1767\u001b[0m \u001b[0;31m# restore current_fx when nested context\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_lightning/strategies/strategy.py\u001b[0m in \u001b[0;36mvalidation_step\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 342\u001b[0m \"\"\"\n\u001b[1;32m 343\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprecision_plugin\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mval_step_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 344\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalidation_step\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 345\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 346\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtest_step\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mOptional\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mSTEP_OUTPUT\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_forecasting/models/base_model.py\u001b[0m in \u001b[0;36mvalidation_step\u001b[0;34m(self, batch, batch_idx)\u001b[0m\n\u001b[1;32m 412\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 413\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_idx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 414\u001b[0;31m \u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate_log\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_idx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 415\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_forecasting/models/temporal_fusion_transformer/__init__.py\u001b[0m in \u001b[0;36mcreate_log\u001b[0;34m(self, x, y, out, batch_idx, **kwargs)\u001b[0m\n\u001b[1;32m 516\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 517\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mcreate_log\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_idx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 518\u001b[0;31m \u001b[0mlog\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate_log\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_idx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 519\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog_interval\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 520\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"interpretation\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_log_interpretation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_forecasting/models/base_model.py\u001b[0m in \u001b[0;36mcreate_log\u001b[0;34m(self, x, y, out, batch_idx, prediction_kwargs, quantiles_kwargs)\u001b[0m\n\u001b[1;32m 456\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog_interval\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 457\u001b[0m self.log_prediction(\n\u001b[0;32m--> 458\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_idx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprediction_kwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mprediction_kwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquantiles_kwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquantiles_kwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 459\u001b[0m )\n\u001b[1;32m 460\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/pytorch_forecasting/models/base_model.py\u001b[0m in \u001b[0;36mlog_prediction\u001b[0;34m(self, x, out, batch_idx, **kwargs)\u001b[0m\n\u001b[1;32m 717\u001b[0m )\n\u001b[1;32m 718\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 719\u001b[0;31m self.logger.experiment.add_figure(\n\u001b[0m\u001b[1;32m 720\u001b[0m \u001b[0mtag\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 721\u001b[0m \u001b[0mfig\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
| "\u001b[0;31mAttributeError\u001b[0m: 'Run' object has no attribute 'add_figure'" | |
| ] | |
| }, | |
| { | |
| "output_type": "display_data", | |
| "data": { | |
| "text/plain": [ | |
| "<Figure size 432x288 with 2 Axes>" | |
| ], | |
| "image/png": "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7OD1119/FsDhw4cDr3/968/evHnz8ObNm4fvvfferj/+4z9edfjw4fCWLVuG3/Oe96wC+OhHP7r0nHPO2bpp06bhP/qjPyqmyvzJn/zJsrVr156zY8eOzXv37g1X+928IrseHh4ejeT//f5qTj1tdFkThoaneePfL1i8t9wSJgCDg4O5p59++pnjx48HrrzyyrMfeOCB53p7ewsf+chHln3sYx9beuutt5543/vet/bee+/ds23btvQVV1yxvlz7733ve8965StfGb/lllv253I5otGo/1Of+tSRK664ouPZZ599GuDuu+/u3bdvX+Txxx9/RinF6173ug3f//73u7u7uwv/8i//suiJJ554OpvNcv755w9fcMEFVVWJPy0Fl8/nUx0dFWs9enh4eLSUu+++m3w+vwZgVSxJRzpvtP1kLNl95JFHhgqFAjt37ny40nGlS5h89rOfHQJrGRKA+++/v2v//v2Rl770pVsAstms7NixY+pXv/pVZNWqVelzzz03DXDttdeO3X777XP8Vg8++GDPXXfd9TxAIBBgcHAwr9fy0vzgBz/ofeCBB3qHh4eHAaanp33PPvtsJB6P+97whjdM9vT0FAAuueSSyWq//2kpuDo6OkgkaqrJ6OHh4dE0nnnmGbZutYu0vOQO4+33YOWcPPzww5XyJYHyS5gAaGGhlOKiiy6Kfe9735tVomu+KvC1opTiD//wD49/8IMfnBVlqVdkrgfPx+Xh4eHxIqXcEibO/a9+9asTu3fv7n7yySfDALFYzPf444+Hzz///NTRo0dDTz31VBjgm9/85qJy7V944YVxbX7M5XKMjY35+/r68olEoihbLr/88tjXv/71xdp39vzzzwePHj0aeM1rXjO1a9eu/qmpKZmYmPDde++9/eU+oxye4PLw8PB4kVJuCRPn/hUrVuS++MUvHnzHO96xftOmTcM7d+7c8sQTT0Q6OzvV5z73uUNXXHHFhuHh4a2LFy8uG3542223vfCjH/2oZ9OmTcPnnHPO8KOPPhpZtmxZfseOHVMbN27c9p73vGfVm9/85tg111wz/mu/9mtbNm3aNPymN73p7MnJSf9FF100/aY3vWn8nHPO2fa6171u43nnnVe1Ge20TEDu6upSnqnQw8OjXZllKmwgDz/8cGHHjh2Pltu3Z8+e0BVXXLFx7969C9UCbXu8BGQP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\n" | |
| }, | |
| "metadata": { | |
| "needs_background": "light" | |
| } | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Copyright The PyTorch Lightning team.\n", | |
| "#\n", | |
| "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", | |
| "# you may not use this file except in compliance with the License.\n", | |
| "# You may obtain a copy of the License at\n", | |
| "#\n", | |
| "# http://www.apache.org/licenses/LICENSE-2.0\n", | |
| "#\n", | |
| "# Unless required by applicable law or agreed to in writing, software\n", | |
| "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", | |
| "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", | |
| "# See the License for the specific language governing permissions and\n", | |
| "# limitations under the License.\n", | |
| "\"\"\"Diagnose your system and show basic information.\n", | |
| "\n", | |
| "This server mainly to get detail info for better bug reporting.\n", | |
| "\"\"\"\n", | |
| "\n", | |
| "import os\n", | |
| "import platform\n", | |
| "import sys\n", | |
| "\n", | |
| "import numpy\n", | |
| "import torch\n", | |
| "import tqdm\n", | |
| "\n", | |
| "sys.path += [os.path.abspath(\"..\"), os.path.abspath(\"\")]\n", | |
| "import pytorch_lightning # noqa: E402\n", | |
| "\n", | |
| "LEVEL_OFFSET = \"\\t\"\n", | |
| "KEY_PADDING = 20\n", | |
| "\n", | |
| "\n", | |
| "def info_system():\n", | |
| " return {\n", | |
| " \"OS\": platform.system(),\n", | |
| " \"architecture\": platform.architecture(),\n", | |
| " \"version\": platform.version(),\n", | |
| " \"processor\": platform.processor(),\n", | |
| " \"python\": platform.python_version(),\n", | |
| " }\n", | |
| "\n", | |
| "\n", | |
| "def info_cuda():\n", | |
| " return {\n", | |
| " \"GPU\": [torch.cuda.get_device_name(i) for i in range(torch.cuda.device_count())],\n", | |
| " # 'nvidia_driver': get_nvidia_driver_version(run_lambda),\n", | |
| " \"available\": torch.cuda.is_available(),\n", | |
| " \"version\": torch.version.cuda,\n", | |
| " }\n", | |
| "\n", | |
| "\n", | |
| "def info_packages():\n", | |
| " return {\n", | |
| " \"numpy\": numpy.__version__,\n", | |
| " \"pyTorch_version\": torch.__version__,\n", | |
| " \"pyTorch_debug\": torch.version.debug,\n", | |
| " \"pytorch-lightning\": pytorch_lightning.__version__,\n", | |
| " \"tqdm\": tqdm.__version__,\n", | |
| " }\n", | |
| "\n", | |
| "\n", | |
| "def nice_print(details, level=0):\n", | |
| " lines = []\n", | |
| " for k in sorted(details):\n", | |
| " key = f\"* {k}:\" if level == 0 else f\"- {k}:\"\n", | |
| " if isinstance(details[k], dict):\n", | |
| " lines += [level * LEVEL_OFFSET + key]\n", | |
| " lines += nice_print(details[k], level + 1)\n", | |
| " elif isinstance(details[k], (set, list, tuple)):\n", | |
| " lines += [level * LEVEL_OFFSET + key]\n", | |
| " lines += [(level + 1) * LEVEL_OFFSET + \"- \" + v for v in details[k]]\n", | |
| " else:\n", | |
| " template = \"{:%is} {}\" % KEY_PADDING\n", | |
| " key_val = template.format(key, details[k])\n", | |
| " lines += [(level * LEVEL_OFFSET) + key_val]\n", | |
| " return lines\n", | |
| "\n", | |
| "\n", | |
| "def main():\n", | |
| " details = {\"System\": info_system(), \"CUDA\": info_cuda(), \"Packages\": info_packages()}\n", | |
| " lines = nice_print(details)\n", | |
| " text = os.linesep.join(lines)\n", | |
| " print(text)\n", | |
| "\n", | |
| "\n", | |
| "if __name__ == \"__main__\":\n", | |
| " main()" | |
| ], | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "r-ZWOyYe5Fy_", | |
| "outputId": "ed04a5d8-c8ad-44a9-a121-983a57546801" | |
| }, | |
| "execution_count": 23, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "* CUDA:\n", | |
| "\t- GPU:\n", | |
| "\t\t- Tesla V100-SXM2-16GB\n", | |
| "\t- available: True\n", | |
| "\t- version: 11.3\n", | |
| "* Packages:\n", | |
| "\t- numpy: 1.21.6\n", | |
| "\t- pyTorch_debug: False\n", | |
| "\t- pyTorch_version: 1.12.0+cu113\n", | |
| "\t- pytorch-lightning: 1.6.5\n", | |
| "\t- tqdm: 4.64.0\n", | |
| "* System:\n", | |
| "\t- OS: Linux\n", | |
| "\t- architecture:\n", | |
| "\t\t- 64bit\n", | |
| "\t\t- \n", | |
| "\t- processor: x86_64\n", | |
| "\t- python: 3.7.13\n", | |
| "\t- version: #1 SMP Sun Apr 24 10:03:06 PDT 2022\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "" | |
| ], | |
| "metadata": { | |
| "id": "rGHOtzhg7jyI" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment