{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "pdcMxVGEA9Cd" }, "source": [ "# **Fine-tuning for Image Classification with đ¤ Optimum Graphcore**\n", "\n", "This notebook shows how to fine-tune any pretrained Vision model for Image Classification on an IPU. The idea is to add a randomly initialized classification head on top of a pre-trained encoder, and fine-tune the model altogether on a labeled dataset.\n", "\n", "## ImageFolder\n", "\n", "This notebook leverages the [ImageFolder](https://huggingface.co/docs/datasets/v2.0.0/en/image_process#imagefolder) feature to easily run the notebook on a custom dataset (namely, [EuroSAT](https://github.com/phelber/EuroSAT) in this tutorial). You can either load a `Dataset` from local folders or from local/remote files, like zip or tar.\n", "\n", "## Any model\n", "\n", "This notebook is built to run on any image classification dataset with any vision model checkpoint from the [Model Hub](https://huggingface.co/) as long as that model has a version with a Image Classification head and is supported by [đ¤ Optimum Graphcore](https://github.com/huggingface/optimum-graphcore). The IPU config files of the supported models are available in Graphcore's [Hugging Face account](https://huggingface.co/Graphcore). You can also create your own IPU config file locally. \n", "Currently supported models:\n", "* [ViT](https://huggingface.co/docs/transformers/model_doc/vit#transformers.ViTForImageClassification)\n", "* [ConvNeXT](https://huggingface.co/docs/transformers/master/en/model_doc/convnext#transformers.ConvNextForImageClassification)\n", "\n", "---\n", "\n", "In this notebook, we are using both data parallelism and pipeline parallelism (see this [tutorial](https://github.com/graphcore/examples/tree/master/tutorials/tutorials/pytorch/efficient_data_loading) for more). Therefore the global batch size, which is the actual number of samples used for the weight update, is determined with three factors:\n", "- global batch size = micro batch size * gradient accumulation steps * replication factor\n", "\n", "and replication factor is determined by `pod_type`, which will be used as a key to select the replication factor from a dictionary defined in the IPU config file. For example, the dictionary in the IPU config file [Graphcore/roberta-base-ipu](https://huggingface.co/Graphcore/roberta-base-ipu/blob/main/ipu_config.json) looks like this:\n", "- \"replication_factor\": {\"pod4\": 1, \"pod8\": 2, \"pod16\": 4, \"pod32\": 8, \"pod64\": 16, \"default\": 1}\n", "\n", "Depending on you model and the pod machine you are using, you might need to adjust these three batch-size-related arguments.\n", "\n", "In this notebook, we'll fine-tune from the [google/vit-base-patch16-224-in21k](https://huggingface.co/google/vit-base-patch16-224-in21k) checkpoint, but note that there are many more available on the [hub](https://huggingface.co/models?other=vision).\n" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "execution": { "iopub.execute_input": "2023-06-21T22:59:29.826122Z", "iopub.status.busy": "2023-06-21T22:59:29.825859Z", "iopub.status.idle": "2023-06-21T22:59:29.829472Z", "shell.execute_reply": "2023-06-21T22:59:29.828874Z", "shell.execute_reply.started": "2023-06-21T22:59:29.826099Z" }, "id": "5WMEawzyCEyG" }, "outputs": [], "source": [ "model_checkpoint = \"internetoftim/dinov2-base\" # pre-trained model from which to fine-tune\n", "\n", "ipu_config_name = \"Graphcore/vit-base-ipu\" # config specific to the IPU\n", "micro_batch_size = 1 # micro batch size for training and evaluation\n", "gradient_accumulation_steps = 32" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Values for machine size and cache directories can be configured through environment variables or directly in the notebook:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "execution": { "iopub.execute_input": "2023-06-21T22:41:12.016450Z", "iopub.status.busy": "2023-06-21T22:41:12.016207Z", "iopub.status.idle": "2023-06-21T22:41:12.020103Z", "shell.execute_reply": "2023-06-21T22:41:12.019458Z", "shell.execute_reply.started": "2023-06-21T22:41:12.016431Z" } }, "outputs": [], "source": [ "import os\n", "\n", "pod_type = os.getenv(\"GRAPHCORE_POD_TYPE\", \"pod4\")\n", "executable_cache_dir = os.getenv(\"POPLAR_EXECUTABLE_CACHE_DIR\", \"/tmp/exe_cache/\") + \"/image_classification\"\n", "dataset_dir = os.getenv(\"DATASETS_DIR\", \"./\")" ] }, { "cell_type": "markdown", "metadata": { "id": "NlArTG8KChJf" }, "source": [ "First of all, make sure your environment has installed the latest version of [đ¤ Optimum Graphcore](https://github.com/huggingface/optimum-graphcore) and any packages we will need." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "In order to improve usability and support for future users, Graphcore would like to collect information about the\n", "applications and code being run in this notebook. The following information will be anonymised before being sent to Graphcore:\n", "\n", "- User progression through the notebook\n", "- Notebook details: number of cells, code being run and the output of the cells\n", "- Environment details\n", "\n", "You can disable logging at any time by running `%unload_ext gc_logger` from any cell.\n" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "execution": { "iopub.execute_input": "2023-06-21T22:41:17.677448Z", "iopub.status.busy": "2023-06-21T22:41:17.677193Z", "iopub.status.idle": "2023-06-21T22:41:33.660336Z", "shell.execute_reply": "2023-06-21T22:41:33.659538Z", "shell.execute_reply.started": "2023-06-21T22:41:17.677428Z" }, "id": "L1532RVbJgQV", "outputId": "1d92a15b-0efd-4b09-b006-56384c64943b" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", "Collecting examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable\n", " Cloning https://github.com/graphcore/examples-utils (to revision latest_stable) to /tmp/pip-install-680s9a9o/examples-utils_a25ea687dfad42019db5c7a45ac6126d\n", " Running command git clone --filter=blob:none --quiet https://github.com/graphcore/examples-utils /tmp/pip-install-680s9a9o/examples-utils_a25ea687dfad42019db5c7a45ac6126d\n", " Running command git checkout -q 40c62e6646db8f9d60d1707a61204c95a15c7ccb\n", " Resolved https://github.com/graphcore/examples-utils to commit 40c62e6646db8f9d60d1707a61204c95a15c7ccb\n", " Preparing metadata (setup.py) ... \u001b[?25ldone\n", "\u001b[?25hRequirement already satisfied: awscli>=1.24.10 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.27.143)\n", "Requirement already satisfied: boto3>=1.26 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.26.143)\n", "Requirement already satisfied: cppimport>=22.07.17 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (22.8.2)\n", "Requirement already satisfied: filelock>=3.9.0 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (3.12.2)\n", "Requirement already satisfied: gitpython>=3.1 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (3.1.31)\n", "Requirement already satisfied: ipynbname>=2021.3.2 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (2023.1.0.0)\n", "Requirement already satisfied: nbformat>=5.7.3 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.9.0)\n", "Requirement already satisfied: psutil>=5.7.0 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.9.5)\n", "Requirement already satisfied: pyyaml>=5.4.1 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.4.1)\n", "Requirement already satisfied: simple-parsing==0.0.19.post1 in /usr/local/lib/python3.8/dist-packages (from examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.0.19.post1)\n", "Requirement already satisfied: typing-inspect in /usr/local/lib/python3.8/dist-packages (from simple-parsing==0.0.19.post1->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.9.0)\n", "Requirement already satisfied: botocore==1.29.143 in /usr/local/lib/python3.8/dist-packages (from awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.29.143)\n", "Requirement already satisfied: docutils<0.17,>=0.10 in /usr/local/lib/python3.8/dist-packages (from awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.16)\n", "Requirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /usr/local/lib/python3.8/dist-packages (from awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.6.1)\n", "Requirement already satisfied: colorama<0.4.5,>=0.2.5 in /usr/local/lib/python3.8/dist-packages (from awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.4.4)\n", "Requirement already satisfied: rsa<4.8,>=3.1.2 in /usr/local/lib/python3.8/dist-packages (from awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (4.7.2)\n", "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /usr/local/lib/python3.8/dist-packages (from botocore==1.29.143->awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.0.1)\n", "Requirement already satisfied: python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python3.8/dist-packages (from botocore==1.29.143->awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (2.8.2)\n", "Requirement already satisfied: urllib3<1.27,>=1.25.4 in /usr/lib/python3/dist-packages (from botocore==1.29.143->awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.25.8)\n", "Requirement already satisfied: mako in /usr/local/lib/python3.8/dist-packages (from cppimport>=22.07.17->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.2.4)\n", "Requirement already satisfied: pybind11 in /usr/local/lib/python3.8/dist-packages (from cppimport>=22.07.17->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (2.10.4)\n", "Requirement already satisfied: gitdb<5,>=4.0.1 in /usr/local/lib/python3.8/dist-packages (from gitpython>=3.1->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (4.0.10)\n", "Requirement already satisfied: ipykernel in /usr/local/lib/python3.8/dist-packages (from ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.5.6)\n", "Requirement already satisfied: fastjsonschema in /usr/local/lib/python3.8/dist-packages (from nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (2.17.1)\n", "Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.8/dist-packages (from nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (4.17.3)\n", "Requirement already satisfied: jupyter-core in /usr/local/lib/python3.8/dist-packages (from nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.3.0)\n", "Requirement already satisfied: traitlets>=5.1 in /usr/local/lib/python3.8/dist-packages (from nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.9.0)\n", "Requirement already satisfied: smmap<6,>=3.0.1 in /usr/local/lib/python3.8/dist-packages (from gitdb<5,>=4.0.1->gitpython>=3.1->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.0.0)\n", "Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (23.1.0)\n", "Requirement already satisfied: importlib-resources>=1.4.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.12.0)\n", "Requirement already satisfied: pkgutil-resolve-name>=1.3.10 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.3.10)\n", "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.8/dist-packages (from jsonschema>=2.6->nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.19.3)\n", "Requirement already satisfied: pyasn1>=0.1.3 in /usr/local/lib/python3.8/dist-packages (from rsa<4.8,>=3.1.2->awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.5.0)\n", "Requirement already satisfied: ipython-genutils in /usr/local/lib/python3.8/dist-packages (from ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.2.0)\n", "Requirement already satisfied: ipython>=5.0.0 in /usr/local/lib/python3.8/dist-packages (from ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (7.16.3)\n", "Requirement already satisfied: jupyter-client in /usr/local/lib/python3.8/dist-packages (from ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (8.2.0)\n", "Requirement already satisfied: tornado>=4.2 in /usr/local/lib/python3.8/dist-packages (from ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (6.3.2)\n", "Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.8/dist-packages (from jupyter-core->nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (3.5.1)\n", "Requirement already satisfied: MarkupSafe>=0.9.2 in /usr/local/lib/python3.8/dist-packages (from mako->cppimport>=22.07.17->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (2.1.2)\n", "Requirement already satisfied: mypy-extensions>=0.3.0 in /usr/local/lib/python3.8/dist-packages (from typing-inspect->simple-parsing==0.0.19.post1->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.0.0)\n", "Requirement already satisfied: typing-extensions>=3.7.4 in /usr/local/lib/python3.8/dist-packages (from typing-inspect->simple-parsing==0.0.19.post1->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (4.6.2)\n", "Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.8/dist-packages (from importlib-resources>=1.4.0->jsonschema>=2.6->nbformat>=5.7.3->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (3.15.0)\n", "Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (67.8.0)\n", "Requirement already satisfied: jedi<=0.17.2,>=0.10 in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.17.2)\n", "Requirement already satisfied: decorator in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (5.1.1)\n", "Requirement already satisfied: pickleshare in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.7.5)\n", "Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (3.0.38)\n", "Requirement already satisfied: pygments in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (2.15.1)\n", "Requirement already satisfied: backcall in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.2.0)\n", "Requirement already satisfied: pexpect in /usr/local/lib/python3.8/dist-packages (from ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (4.8.0)\n", "Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil<3.0.0,>=2.1->botocore==1.29.143->awscli>=1.24.10->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (1.14.0)\n", "Requirement already satisfied: importlib-metadata>=4.8.3 in /usr/local/lib/python3.8/dist-packages (from jupyter-client->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (6.6.0)\n", "Requirement already satisfied: pyzmq>=23.0 in /usr/local/lib/python3.8/dist-packages (from jupyter-client->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (25.1.0)\n", "Requirement already satisfied: parso<0.8.0,>=0.7.0 in /usr/local/lib/python3.8/dist-packages (from jedi<=0.17.2,>=0.10->ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.7.1)\n", "Requirement already satisfied: wcwidth in /usr/local/lib/python3.8/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.2.6)\n", "Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.8/dist-packages (from pexpect->ipython>=5.0.0->ipykernel->ipynbname>=2021.3.2->examples-utils[common]@ git+https://github.com/graphcore/examples-utils@latest_stable) (0.7.0)\n", "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", "\u001b[0mNote: you may need to restart the kernel to use updated packages.\n", "The gc_logger extension is already loaded. To reload it, use:\n", " %reload_ext gc_logger\n" ] } ], "source": [ "%pip install -q \"optimum-graphcore==0.6.1\" scikit-learn torchvision==0.14.1+cpu -f https://download.pytorch.org/whl/torch_stable.html\n", "%pip install examples-utils[common]@git+https://github.com/graphcore/examples-utils@latest_stable\n", "from examples_utils import notebook_logging\n", "%load_ext gc_logger" ] }, { "cell_type": "markdown", "metadata": { "id": "snZ1tmaOC412" }, "source": [ "If you're opening this notebook locally, make sure your environment has an install from the last version of those libraries.\n", "\n", "To be able to share your model with the community and generate results like the one shown in the picture below via the inference API, there are a few more steps to follow.\n", "\n", "First you have to store your authentication token from the Hugging Face website (sign up [here](https://huggingface.co/join) if you haven't already!) then execute the following cell and input your token:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 386, "referenced_widgets": [ "f1760b8ccf9b4c32977a1e83f3a3af3d", "e276e653c187474dba7e1c4fede10b79", "a6d024d44a6c49eebef7966ef5a836f1", "344c041a34b5458eb1bbb3ea8fa5b315", "18f7dc9f5e6241138534b7cf9aa30adb", "d5e3a1de2a4645639c029a404d04dc1c", "e7e938eb6baf486e829ea5d4734087cf", "730378e114f944908aa06f42bb2faa3d", "f73b5464140d4723b1b3f46796d9b1ca", "16ffe85c44764fa9ad8a31fb21e6432f", "40db3808e98d424cacc5d0fed54b9eaa", "e9bad1a707f0442da6f117fdd2804f72", "a0bac01e342b4793b66d7d4f5bfac2e2", "b447ca05136342d0a167bfb133a353bd", "4dcbcf9b086f452d9d1bc07b4a4cc1d3", "724b578bac3f4b7cb6806ee3c45aff01", "6ca86c47e547426e8a0d4487a786c46c" ] }, "execution": { "iopub.execute_input": "2023-06-21T21:44:37.492165Z", "iopub.status.busy": "2023-06-21T21:44:37.491744Z", "iopub.status.idle": "2023-06-21T21:44:37.717449Z", "shell.execute_reply": "2023-06-21T21:44:37.716929Z", "shell.execute_reply.started": "2023-06-21T21:44:37.492146Z" }, "id": "Bkpk_JPlCww8", "outputId": "d80cb8c7-5382-427b-e90b-bfec7afdc052" }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "aa278fd06d734ba184bb23865fe22631", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HTML(value='