{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "CIvuWrG5KDRk" }, "source": [ "# Qwen2.5-1.5B-coder Fine-Tuning\n", "### Fine-tuning `unsloth/Qwen2.5-Coder-1.5B-Instruct-bnb-4bit` on Custom coding assistant dataset using LoRA + Unsloth" ] }, { "cell_type": "markdown", "metadata": { "id": "CZZXqZrOKDRm" }, "source": [ "## 1. Install Dependencies" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "collapsed": true, "id": "lCCZi0XzKDRn", "outputId": "1c3a0596-8e21-4e30-f94a-b6c30b61241e" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Requirement already satisfied: torch in /usr/local/lib/python3.12/dist-packages (2.10.0+cu128)\n", "Requirement already satisfied: transformers in /usr/local/lib/python3.12/dist-packages (5.0.0)\n", "Requirement already satisfied: datasets in /usr/local/lib/python3.12/dist-packages (4.0.0)\n", "Requirement already satisfied: accelerate in /usr/local/lib/python3.12/dist-packages (1.13.0)\n", "Requirement already satisfied: peft in /usr/local/lib/python3.12/dist-packages (0.19.1)\n", "Collecting bitsandbytes\n", " Downloading bitsandbytes-0.49.2-py3-none-manylinux_2_24_x86_64.whl.metadata (10 kB)\n", "Requirement already satisfied: huggingface_hub in /usr/local/lib/python3.12/dist-packages (1.11.0)\n", "Collecting evaluate\n", " Downloading evaluate-0.4.6-py3-none-any.whl.metadata (9.5 kB)\n", "Requirement already satisfied: safetensors in /usr/local/lib/python3.12/dist-packages (0.7.0)\n", "Requirement already satisfied: sentence-transformers in /usr/local/lib/python3.12/dist-packages (5.4.1)\n", "Collecting unsloth_zoo\n", " Downloading unsloth_zoo-2026.5.1-py3-none-any.whl.metadata (32 kB)\n", "Collecting sacrebleu\n", " Downloading sacrebleu-2.6.0-py3-none-any.whl.metadata (39 kB)\n", "Collecting rouge-score\n", " Downloading rouge_score-0.1.2.tar.gz (17 kB)\n", " Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch) (3.29.0)\n", "Requirement already satisfied: typing-extensions>=4.10.0 in /usr/local/lib/python3.12/dist-packages (from torch) (4.15.0)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch) (75.2.0)\n", "Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch) (1.14.0)\n", "Requirement already satisfied: networkx>=2.5.1 in /usr/local/lib/python3.12/dist-packages (from torch) (3.6.1)\n", "Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch) (3.1.6)\n", "Requirement already satisfied: fsspec>=0.8.5 in /usr/local/lib/python3.12/dist-packages (from torch) (2025.3.0)\n", "Requirement already satisfied: cuda-bindings==12.9.4 in /usr/local/lib/python3.12/dist-packages (from torch) (12.9.4)\n", "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.93)\n", "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.90)\n", "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.90)\n", "Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch) (9.10.2.21)\n", "Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.4.1)\n", "Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83 in /usr/local/lib/python3.12/dist-packages (from torch) (11.3.3.83)\n", "Requirement already satisfied: nvidia-curand-cu12==10.3.9.90 in /usr/local/lib/python3.12/dist-packages (from torch) (10.3.9.90)\n", "Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90 in /usr/local/lib/python3.12/dist-packages (from torch) (11.7.3.90)\n", "Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93 in /usr/local/lib/python3.12/dist-packages (from torch) (12.5.8.93)\n", "Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch) (0.7.1)\n", "Requirement already satisfied: nvidia-nccl-cu12==2.27.5 in /usr/local/lib/python3.12/dist-packages (from torch) (2.27.5)\n", "Requirement already satisfied: nvidia-nvshmem-cu12==3.4.5 in /usr/local/lib/python3.12/dist-packages (from torch) (3.4.5)\n", "Requirement already satisfied: nvidia-nvtx-cu12==12.8.90 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.90)\n", "Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93 in /usr/local/lib/python3.12/dist-packages (from torch) (12.8.93)\n", "Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3 in /usr/local/lib/python3.12/dist-packages (from torch) (1.13.1.3)\n", "Requirement already satisfied: triton==3.6.0 in /usr/local/lib/python3.12/dist-packages (from torch) (3.6.0)\n", "Requirement already satisfied: cuda-pathfinder~=1.1 in /usr/local/lib/python3.12/dist-packages (from cuda-bindings==12.9.4->torch) (1.5.3)\n", "Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.12/dist-packages (from transformers) (2.0.2)\n", "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from transformers) (26.1)\n", "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.12/dist-packages (from transformers) (6.0.3)\n", "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.12/dist-packages (from transformers) (2025.11.3)\n", "Requirement already satisfied: tokenizers<=0.23.0,>=0.22.0 in /usr/local/lib/python3.12/dist-packages (from transformers) (0.22.2)\n", "Requirement already satisfied: typer-slim in /usr/local/lib/python3.12/dist-packages (from transformers) (0.24.0)\n", "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.12/dist-packages (from transformers) (4.67.3)\n", "Requirement already satisfied: pyarrow>=15.0.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (18.1.0)\n", "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /usr/local/lib/python3.12/dist-packages (from datasets) (0.3.8)\n", "Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (from datasets) (2.2.2)\n", "Requirement already satisfied: requests>=2.32.2 in /usr/local/lib/python3.12/dist-packages (from datasets) (2.32.4)\n", "Requirement already satisfied: xxhash in /usr/local/lib/python3.12/dist-packages (from datasets) (3.6.0)\n", "Requirement already satisfied: multiprocess<0.70.17 in /usr/local/lib/python3.12/dist-packages (from datasets) (0.70.16)\n", "Requirement already satisfied: psutil in /usr/local/lib/python3.12/dist-packages (from accelerate) (5.9.5)\n", "Requirement already satisfied: hf-xet<2.0.0,>=1.4.3 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (1.4.3)\n", "Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (0.28.1)\n", "Requirement already satisfied: typer in /usr/local/lib/python3.12/dist-packages (from huggingface_hub) (0.24.2)\n", "Requirement already satisfied: scikit-learn>=0.22.0 in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (1.6.1)\n", "Requirement already satisfied: scipy>=1.0.0 in /usr/local/lib/python3.12/dist-packages (from sentence-transformers) (1.16.3)\n", "Collecting torchao>=0.13.0 (from unsloth_zoo)\n", " Downloading torchao-0.17.0-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (20 kB)\n", "Collecting tyro (from unsloth_zoo)\n", " Downloading tyro-1.0.13-py3-none-any.whl.metadata (12 kB)\n", "Collecting transformers\n", " Downloading transformers-5.5.0-py3-none-any.whl.metadata (32 kB)\n", "Collecting datasets\n", " Downloading datasets-4.3.0-py3-none-any.whl.metadata (18 kB)\n", "Requirement already satisfied: sentencepiece>=0.2.0 in /usr/local/lib/python3.12/dist-packages (from unsloth_zoo) (0.2.1)\n", "Requirement already satisfied: wheel>=0.42.0 in /usr/local/lib/python3.12/dist-packages (from unsloth_zoo) (0.47.0)\n", "Collecting trl!=0.19.0,<=0.24.0,>=0.18.2 (from unsloth_zoo)\n", " Downloading trl-0.24.0-py3-none-any.whl.metadata (11 kB)\n", "Requirement already satisfied: protobuf in /usr/local/lib/python3.12/dist-packages (from unsloth_zoo) (5.29.6)\n", "Collecting hf_transfer (from unsloth_zoo)\n", " Downloading hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.7 kB)\n", "Collecting cut_cross_entropy (from unsloth_zoo)\n", " Downloading cut_cross_entropy-25.1.1-py3-none-any.whl.metadata (9.3 kB)\n", "Requirement already satisfied: pillow in /usr/local/lib/python3.12/dist-packages (from unsloth_zoo) (11.3.0)\n", "Collecting msgspec (from unsloth_zoo)\n", " Downloading msgspec-0.21.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (5.8 kB)\n", "Collecting pyarrow>=21.0.0 (from datasets)\n", " Downloading pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl.metadata (3.0 kB)\n", "Collecting portalocker (from sacrebleu)\n", " Downloading portalocker-3.2.0-py3-none-any.whl.metadata (8.7 kB)\n", "Requirement already satisfied: tabulate>=0.8.9 in /usr/local/lib/python3.12/dist-packages (from sacrebleu) (0.9.0)\n", "Collecting colorama (from sacrebleu)\n", " Downloading colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)\n", "Requirement already satisfied: lxml in /usr/local/lib/python3.12/dist-packages (from sacrebleu) (6.1.0)\n", "Requirement already satisfied: absl-py in /usr/local/lib/python3.12/dist-packages (from rouge-score) (1.4.0)\n", "Requirement already satisfied: nltk in /usr/local/lib/python3.12/dist-packages (from rouge-score) (3.9.1)\n", "Requirement already satisfied: six>=1.14.0 in /usr/local/lib/python3.12/dist-packages (from rouge-score) (1.17.0)\n", "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /usr/local/lib/python3.12/dist-packages (from fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (3.13.5)\n", "Requirement already satisfied: anyio in /usr/local/lib/python3.12/dist-packages (from httpx<1,>=0.23.0->huggingface_hub) (4.13.0)\n", "Requirement already satisfied: certifi in /usr/local/lib/python3.12/dist-packages (from httpx<1,>=0.23.0->huggingface_hub) (2026.4.22)\n", "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.12/dist-packages (from httpx<1,>=0.23.0->huggingface_hub) (1.0.9)\n", "Requirement already satisfied: idna in /usr/local/lib/python3.12/dist-packages (from httpx<1,>=0.23.0->huggingface_hub) (3.13)\n", "Requirement already satisfied: h11>=0.16 in /usr/local/lib/python3.12/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->huggingface_hub) (0.16.0)\n", "Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (3.4.7)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests>=2.32.2->datasets) (2.5.0)\n", "Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn>=0.22.0->sentence-transformers) (1.5.3)\n", "Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn>=0.22.0->sentence-transformers) (3.6.0)\n", "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch) (1.3.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch) (3.0.3)\n", "Requirement already satisfied: click in /usr/local/lib/python3.12/dist-packages (from nltk->rouge-score) (8.3.3)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas->datasets) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas->datasets) (2025.2)\n", "Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas->datasets) (2026.1)\n", "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface_hub) (1.5.4)\n", "Requirement already satisfied: rich>=12.3.0 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface_hub) (13.9.4)\n", "Requirement already satisfied: annotated-doc>=0.0.2 in /usr/local/lib/python3.12/dist-packages (from typer->huggingface_hub) (0.0.4)\n", "Requirement already satisfied: docstring-parser>=0.15 in /usr/local/lib/python3.12/dist-packages (from tyro->unsloth_zoo) (0.18.0)\n", "Requirement already satisfied: typeguard>=4.0.0 in /usr/local/lib/python3.12/dist-packages (from tyro->unsloth_zoo) (4.5.1)\n", "Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (2.6.1)\n", "Requirement already satisfied: aiosignal>=1.4.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.4.0)\n", "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (26.1.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.8.0)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (6.7.1)\n", "Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (0.4.1)\n", "Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<=2025.3.0,>=2023.1.0->datasets) (1.23.0)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer->huggingface_hub) (4.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer->huggingface_hub) (2.20.0)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich>=12.3.0->typer->huggingface_hub) (0.1.2)\n", "Downloading bitsandbytes-0.49.2-py3-none-manylinux_2_24_x86_64.whl (60.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m60.7/60.7 MB\u001b[0m \u001b[31m14.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading evaluate-0.4.6-py3-none-any.whl (84 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m84.1/84.1 kB\u001b[0m \u001b[31m9.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading unsloth_zoo-2026.5.1-py3-none-any.whl (427 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m428.0/428.0 kB\u001b[0m \u001b[31m34.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading transformers-5.5.0-py3-none-any.whl (10.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m10.2/10.2 MB\u001b[0m \u001b[31m127.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading datasets-4.3.0-py3-none-any.whl (506 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m506.8/506.8 kB\u001b[0m \u001b[31m45.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading sacrebleu-2.6.0-py3-none-any.whl (100 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m100.8/100.8 kB\u001b[0m \u001b[31m12.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading pyarrow-24.0.0-cp312-cp312-manylinux_2_28_x86_64.whl (48.9 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m48.9/48.9 MB\u001b[0m \u001b[31m18.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading torchao-0.17.0-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (3.2 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.2/3.2 MB\u001b[0m \u001b[31m84.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading trl-0.24.0-py3-none-any.whl (423 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m423.1/423.1 kB\u001b[0m \u001b[31m37.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading colorama-0.4.6-py2.py3-none-any.whl (25 kB)\n", "Downloading cut_cross_entropy-25.1.1-py3-none-any.whl (22 kB)\n", "Downloading hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.6/3.6 MB\u001b[0m \u001b[31m89.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading msgspec-0.21.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (225 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m225.0/225.0 kB\u001b[0m \u001b[31m23.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading portalocker-3.2.0-py3-none-any.whl (22 kB)\n", "Downloading tyro-1.0.13-py3-none-any.whl (185 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m185.2/185.2 kB\u001b[0m \u001b[31m22.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hBuilding wheels for collected packages: rouge-score\n", " Building wheel for rouge-score (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24934 sha256=94fde4bd87ffc344283390ca0626103489b1153f41136a1a03c210835275c745\n", " Stored in directory: /root/.cache/pip/wheels/85/9d/af/01feefbe7d55ef5468796f0c68225b6788e85d9d0a281e7a70\n", "Successfully built rouge-score\n", "Installing collected packages: torchao, pyarrow, portalocker, msgspec, hf_transfer, colorama, tyro, sacrebleu, rouge-score, cut_cross_entropy, bitsandbytes, datasets, transformers, evaluate, trl, unsloth_zoo\n", " Attempting uninstall: torchao\n", " Found existing installation: torchao 0.10.0\n", " Uninstalling torchao-0.10.0:\n", " Successfully uninstalled torchao-0.10.0\n", " Attempting uninstall: pyarrow\n", " Found existing installation: pyarrow 18.1.0\n", " Uninstalling pyarrow-18.1.0:\n", " Successfully uninstalled pyarrow-18.1.0\n", " Attempting uninstall: datasets\n", " Found existing installation: datasets 4.0.0\n", " Uninstalling datasets-4.0.0:\n", " Successfully uninstalled datasets-4.0.0\n", " Attempting uninstall: transformers\n", " Found existing installation: transformers 5.0.0\n", " Uninstalling transformers-5.0.0:\n", " Successfully uninstalled transformers-5.0.0\n", "Successfully installed bitsandbytes-0.49.2 colorama-0.4.6 cut_cross_entropy-25.1.1 datasets-4.3.0 evaluate-0.4.6 hf_transfer-0.1.9 msgspec-0.21.1 portalocker-3.2.0 pyarrow-24.0.0 rouge-score-0.1.2 sacrebleu-2.6.0 torchao-0.17.0 transformers-5.5.0 trl-0.24.0 tyro-1.0.13 unsloth_zoo-2026.5.1\n" ] } ], "source": [ "!pip install torch transformers datasets accelerate peft bitsandbytes \\\n", " huggingface_hub evaluate safetensors sentence-transformers \\\n", " unsloth_zoo sacrebleu rouge-score" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "collapsed": true, "id": "ogJEmayhKDRo", "outputId": "6295b1d8-efc2-4691-c7b2-2784670a95c6" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting git+https://github.com/unslothai/unsloth.git\n", " Cloning https://github.com/unslothai/unsloth.git to /tmp/pip-req-build-e4i3xptp\n", " Running command git clone --filter=blob:none --quiet https://github.com/unslothai/unsloth.git /tmp/pip-req-build-e4i3xptp\n", " Resolved https://github.com/unslothai/unsloth.git to commit e20bbeff9afdb0cc1f96093e558aac7e434278c4\n", " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", " Getting requirements to build wheel ... \u001b[?25l\u001b[?25hdone\n", " Preparing metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", "Requirement already satisfied: typer in /usr/local/lib/python3.12/dist-packages (from unsloth==2026.5.2) (0.24.2)\n", "Requirement already satisfied: pydantic in /usr/local/lib/python3.12/dist-packages (from unsloth==2026.5.2) (2.12.3)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.12/dist-packages (from unsloth==2026.5.2) (6.0.3)\n", "Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.12/dist-packages (from unsloth==2026.5.2) (1.6.0)\n", "Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.12/dist-packages (from pydantic->unsloth==2026.5.2) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.41.4 in /usr/local/lib/python3.12/dist-packages (from pydantic->unsloth==2026.5.2) (2.41.4)\n", "Requirement already satisfied: typing-extensions>=4.14.1 in /usr/local/lib/python3.12/dist-packages (from pydantic->unsloth==2026.5.2) (4.15.0)\n", "Requirement already satisfied: typing-inspection>=0.4.2 in /usr/local/lib/python3.12/dist-packages (from pydantic->unsloth==2026.5.2) (0.4.2)\n", "Requirement already satisfied: click>=8.2.1 in /usr/local/lib/python3.12/dist-packages (from typer->unsloth==2026.5.2) (8.3.3)\n", "Requirement already satisfied: shellingham>=1.3.0 in /usr/local/lib/python3.12/dist-packages (from typer->unsloth==2026.5.2) (1.5.4)\n", "Requirement already satisfied: rich>=12.3.0 in /usr/local/lib/python3.12/dist-packages (from typer->unsloth==2026.5.2) (13.9.4)\n", "Requirement already satisfied: annotated-doc>=0.0.2 in /usr/local/lib/python3.12/dist-packages (from typer->unsloth==2026.5.2) (0.0.4)\n", "Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer->unsloth==2026.5.2) (4.0.0)\n", "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich>=12.3.0->typer->unsloth==2026.5.2) (2.20.0)\n", "Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich>=12.3.0->typer->unsloth==2026.5.2) (0.1.2)\n", "Building wheels for collected packages: unsloth\n", " Building wheel for unsloth (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for unsloth: filename=unsloth-2026.5.2-py3-none-any.whl size=34206602 sha256=9df740567eb02825c7d6533712c01ae39d7ee18183f8d7482654062c776d1ecb\n", " Stored in directory: /tmp/pip-ephem-wheel-cache-8dbwtprz/wheels/60/3e/1f/e576c07051d90cf64b6a41434d87ccf4db33fafd5343bf5de0\n", "Successfully built unsloth\n", "Installing collected packages: unsloth\n", "Successfully installed unsloth-2026.5.2\n" ] } ], "source": [ "!pip install git+https://github.com/unslothai/unsloth.git" ] }, { "cell_type": "markdown", "metadata": { "id": "Jkwa4G4rKDRq" }, "source": [ "## 2. Import Libraries" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Yv5ISmflKDRr", "outputId": "9d68a76d-4a77-409b-91c3-2725e001250c" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", "🦥 Unsloth Zoo will now patch everything to make training faster!\n" ] } ], "source": [ "import torch\n", "import numpy as np\n", "from unsloth import FastLanguageModel, is_bfloat16_supported\n", "from datasets import load_dataset\n", "from trl import SFTTrainer\n", "from transformers import TrainingArguments\n", "from sacrebleu.metrics import BLEU\n", "from rouge_score import rouge_scorer\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import random" ] }, { "cell_type": "markdown", "metadata": { "id": "uFU6AGhNKDRr" }, "source": [ "## 3. Load Base Model & Tokenizer" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 441, "referenced_widgets": [ "39b2dd3d28ce46b6b655de18c81dd3b9", "7240f7a7ba52413cacbb9e6c3c2ac395", "7620f87bfc6d4d9f97bdc4d6277adde4", "06ed878de1e94abab76cf53dc35b26ac", "1f1f7dd45b2b479b97502959b1d4ff44", "e58ceb61b41d426ba726f56503ff1081", "18b6c92ec07b4823891af8a0456b43c4", "11e53f7045894291a256510d9d2e42ce", "ddc301e27b504815b3b8d7e0e561edfd", "8d2fd0f640a24f77933b127de5bd4e23", "bde1492732604cdd9998e56dbd6cb826", "53bb5329330f40ceba8a9e5f60937af5", "c923870080fc4273b9129d6e86d9b8a7", "7bb64615f25d4cd9bfa89d865c61ec1f", "7c66af83858247b3a5cef8de69a4283a", "8ba9b0482aee40cd81aea05d065ad3a1", "d45a5539a1e54eeb9394cbaa5db00ae2", "ea9bd1f7c44d4cb586ca62ad55ff93f7", "c9d1d2aeae7643aca19c7ce8e1563016", "d12ca79f364846e08661c4ff58fc7d02", "fb25f596f463465a8ae5527ef0286429", "3dccecac136c4617ade4dbdc272a04c4", "e1d3526b4ccb4878a5dba6986a88cebb", "392e4202e97a4028bd8b8954bafddde5", "3b8d0694cdab455bbd636bef26cd133e", "f7688da2e7a04353831af24cc0969d17", "3d1d0e5397464895b08cc624f8711901", "757eda468eb64cbb8046e9ad0bde3e2d", "8ee03c956ec941e6a0bad764fd705a10", "b8b6fe9c5ef541b395e4c35eb04754fd", "4e16e6dafa204bc49755e5c2f989700f", "53ff3b2c14e44930b816843ca0467f90", "382fbda7df1b4a679d1d06a136562bc9", "19b461692a2a4ba69b1a1fa2aed3d6c4", "e76960584aa64f199daf22b2b206131b", "96ddbeb1064f4e518f74425f6e168ace", "758afccd657d48babf1694e2478cbf46", "7b0b0dd518504a5da18d343df73dc7f6", "0f9fba6808794b5a9fda050cf1113b59", "93f24d647aee464583b806da3c8837e4", "297f6972a81e46199077cb9cd005dc76", "fdf206965ce4440498631661b6e2428f", "7080781abaa2482990207ce755f8fce0", "172e1689f27d4b329f459442c0392e69", "ccb458891b4441578db2d3c18d85abb8", "3b16f4d2931d48fc88cf08ec47501340", "db65f1d5bc79440abd42ebec63ef1abb", "92230e602abc4441a914cfc61913de8b", "e75f7d5ba6694d8fa9fba3ce3cb749b9", "238e033bcba14a93a65d4e0b3508daff", "e134ea99e57548d095cdbbc2a0261d15", "af6df0d705d34b1789ee6bbf905b966e", "fd01a283677b4fd6b4eda7422de863fd", "3308ad58fc1f4d119b538675635c1dbc", "c38cf45f9314431ebda9220b9a03b069", "74f74f4ee51a44b79e9c37c4af272c34", "683caf2dccfc4b27945333b63d10e2bf", "19ccddc73df1409d9ffac03de569536a", "e90d133659e64ae9ba85a5af4579036f", "e540801b1a7c4aacb6fe1909ffdfe71c", "08c164fbc58143e8886c5f175c0f8b43", "ca8d7bc3b46e43789a798c74a8759ef9", "f703033f7bb648a9849e91c80c0b1db1", "ce5530388a66478ba999076937d6fd93", "0fc552daebef4adb9a767345d00bb884", "29569bd1fa9a4ca1b668cd55edc05a3d", "cd7cb87ef9cc4453b91aa7eb30cf78bf", "2cbba14253714770a0bf6a5e04587438", "cdddcd9fd6e44fa3990ea08873a12cf9", "716cde951fc845a79ab9ea1437fa3c97", "66aeb13c650f4b9f8d35a66e4274feef", "69a0dfe963d84993ae699a99089c070c", "5b2d31c5352644f8b395f46c9601f5ef", "4d5304a0061247c29610bfe1255a7b9b", "c683e24289254359af6675df049321c4", "2b8487a06b264fc2b08b26d77c54786e", "52fa739045484fc787be651d3ae18c45", "e68149ce52db44fbb145286297d20fec", "0be4a71a33a04da49cc33de8b62d7b94", "7eafe39660304526bd9f23271758dc0b", "491d34c913944caa939abeededf62ce4", "4a50428828d946e896cace03377ea5b0", "89a86514bb064026b1018cc617501660", "22e29ed52f664e269560c5245283bba1", "6b12cbc02b5a47c2b132b83a2e86c711", "0e21907d1b4c49f8a274a25233f9b500", "85b5416f16804384865ed9ba1c066658", "2bf0b3208c364b77ac550dc519eeb4ba", "8ebb431c3a6a459c9d56015c05a7d66c", "a911274a2eaa4631b8b056fcc48911da", "d50bfa24dc8544859596942e7a0f51fa", "b8bcb6537f994aca91d84f4c5651133b", "9ab5cefb248e41ffaf669380a62fe6fb", "c5c45431c8ba45b085f47da88ebd23cd", "fb51c468ab9742f89fb5b917d7f5526f", "7a93eb2494774bfdb72cdf4ff1a32752", "f19362908420453e92c957573cf67167", "29db5207dd874f8b9d84486046baf9b8", "95877785a41d4d4487d262faad2e9b6a", "3c92bac05034413cb0e0312316c5e164", "4fe81dd32cd64a928c0baac38837687a", "24de400cb3774b078f7045a37f9ed979", "d8a124a3a8274edb84482a4fe84d3862", "8c544fb37e40446d9b713f3d273e0295", "1bfe755fbac6479a92342304b72fab65", "76813b1e182e4af8967e4627882e941a", "628e119b9c37484d8406b493e8a2afd2", "f65cb55ba4774391bdf05df0fd63dedf", "7b894f2d0c9743b5b69dda5b9d2b57b0", "06070d268b1f4c12bb7567ab7ab1813b" ] }, "id": "swuAgQHyKDRt", "outputId": "71b9b17e-f8a6-4364-9f43-82ae306789bf" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "==((====))== Unsloth 2026.5.2: Fast Qwen2 patching. Transformers: 5.5.0.\n", " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", "\\ / Bfloat16 = FALSE. FA [Xformers = None. FA2 = False]\n", " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "model.safetensors: 0%| | 0.00/1.14G [00:00\\n#include \\n#include \\n#include \\n\\nnamespace lmdb {\\n\\nclass env {\\npublic:\\n class deleter;\\n class factory;\\n enum class flags : unsigned int {\\n',\n", " 'openai_fingerprint': 'fp_eeff13170a',\n", " 'problem': 'You are tasked with implementing a simplified version of a key-value store using the LMDB (Lightning Memory-Mapped Database) library. The LMDB library provides a high-performance embedded transactional key-value store, and in this problem, we will focus on creating a basic key-value store using LMDB.\\n\\nYour task is to implement a C++ class called `KeyValueStore` that provides methods to store and retrieve key-value pairs using LMDB. The class should have the following public methods:\\n1. `open(const std::string& path)`: Opens or creates an LMDB environment at the specified `path`.\\n2. `put(const std::string& key, const std::string& value)`: Inserts a key-value pair into the LMDB database.\\n3. `get(const std::string& key) -> std::optional`: Retrieves the value associated with the given `key` from the LMDB database. If the key is not found, it should return an empty `std::optional`.\\n\\nYou should use the LMDB C API to interact with the database. The LMDB environment should be opened with default options, and the database should be created if it does not already exist.\\n\\nYou are provided with the LMDB C++ header file `lmdb.h` and are expected to use it in your implementation.\\n\\nYour implementation should handle error cases appropriately and ensure proper resource management.',\n", " 'solution': '```cpp\\n#include \\n#include \\n#include \\n#include \\n#include \\n\\nclass KeyValueStore {\\npublic:\\n KeyValueStore() : env_(nullptr), dbi_(0) {}\\n\\n bool open(const std::string& path) {\\n int rc = mdb_env_create(&env_);\\n if (rc != 0) {\\n std::cerr << \"Failed to create LMDB environment\" << std::endl;\\n return false;\\n }\\n\\n rc = mdb_env_open(env_, path.c_str(), 0, 0664);\\n if (rc != 0) {\\n std::cerr << \"Failed to open LMDB environment\" << std::endl;\\n mdb_env_close(env_);\\n env_ = nullptr;\\n return false;\\n }\\n\\n rc = mdb_txn_begin(env_, nullptr, 0, &txn_);\\n if (rc != 0) {\\n std::cerr << \"Failed to begin transaction\" << std::endl;\\n mdb_env_close(env_);\\n env_ = nullptr;\\n return false;\\n }\\n\\n rc = mdb_dbi_open(txn_, nullptr, 0, &dbi_);\\n if (rc != 0) {\\n std::cerr << \"Failed to open database\" << std::endl;\\n mdb_txn_abort(txn_);\\n mdb_env_close(env_);\\n env_ = nullptr;\\n return false;\\n }\\n\\n return true;\\n }\\n\\n bool put(const std::string& key, const std::string& value) {\\n MDB_val k, v;\\n k.mv_size = key.size();\\n k.mv_data = const_cast(key.c_str());\\n v.mv_size = value.size();\\n v.mv_data = const_cast(value.c_str());\\n\\n int rc = mdb_put(txn_, dbi_, &k, &v, 0);\\n if (rc != 0) {\\n std::cerr << \"Failed to put key-value pair\" << std::endl;\\n return false;\\n }\\n\\n rc = mdb_txn_commit(txn_);\\n if (rc != 0) {\\n std::cerr << \"Failed to commit transaction\" << std::endl;\\n return false;\\n }\\n\\n return true;\\n }\\n\\n std::optional get(const std::string& key) {\\n MDB_val k, v;\\n k.mv_size = key.size();\\n k.mv_data = const_cast(key.c_str());\\n\\n int rc = mdb_txn_begin(env_, nullptr, MDB_RDONLY, &txn_);\\n if (rc != 0) {\\n std::cerr << \"Failed to begin read-only transaction\" << std::endl;\\n return std::nullopt;\\n }\\n\\n rc = mdb_get(txn_, dbi_, &k, &v);\\n if (rc != 0) {\\n mdb_txn_abort(txn_);\\n std::cerr << \"Failed to get value for key\" << std::endl;\\n return std::nullopt;\\n }\\n\\n mdb_txn_commit(txn_);\\n\\n return std::string(static_cast(v.mv_data), v.mv_size);\\n }\\n\\n ~KeyValueStore() {\\n if (env_ != nullptr) {\\n mdb_dbi_close(env_, dbi_);\\n mdb_env_close(env_);\\n }\\n }\\n\\nprivate:\\n MDB_env* env_;\\n MDB_dbi dbi_;\\n MDB_txn* txn_;\\n};\\n```'}" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "id": "7hAQWLDrKDRv" }, "source": [ "## 7. Apply Chat Template to Train & Eval Datasets" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 896, "referenced_widgets": [ "b076751cb34844d6920c5aa2907460a6", "9fb620d44cf4475e9bbf2469eae254f4", "2fd2d1effd9347b6b43157086702641e", "8828e438f54d4921bfd938271f696f70", "65254bbc634c44cdb44996c6e9400bfc", "0bd1984b9a4340d78d124bc849fe2412", "42fd14e682344f41b67db40255b6d990", "e3c769b7fe694420988cb0228da0f026", "06e33a84691647c583dfe97c26f3bba3", "ddc7bf53a72c4cbfb16667c2a6d0ecf1", "66eab1e538294dcf9cffb29ccd039794", "7872f5ccd653403382d6f9e9105e0c28", "3e5007956a2a470d987dd068ae8c5812", "f56cbb78a3c84a4b9d07970ef7685e54", "1d284f3e7f13465fb3b7dfd077bba5ed", "5018caff55834be882bc0beb8bb8ed10", "dcde235a183d4be1a9d2f349ca45ffbf", "35aa75cb855e4740b331bec0cfb09412", "5308fd01f3f34b43a4654d9944bf3ada", "db93632d734b415a9f7c761c157fb0f5", "3e48132b3c2a490288945aaf380ccb36", "3b0bc686af3d448181a82c610d7f1806", "fd697e738aee485ead7f5216a6ed9df0", "a8527c050169498e9b58e831f6c81c66", "6daf3dd8605541a8b747386b4416388e", "a1189a8c23094c4f9bd32dba5b040f62", "ecd1fd9e9e5842e984d40f9c1b94b5a2", "90d76df929a74ec399faf06c4ec3805b", "07515636ccbb41b08fda84c5cdd5f82c", "f7354e5fe4ed44ff9c81b3b417df1744", "e9a4ad01fe9c4497a483c43fb72a8493", "2760dc0213de4ea2935b03983ede0cd4", "856a11862f1c4857b2f45c38fb09d371" ] }, "id": "MZZOTO17KDRw", "outputId": "ed3ea267-056d-4fc7-bcac-f7982e9b5a5b" }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "Map: 0%| | 0/70000 [00:00system\n", "I am cortex your coding assistant made by junaid<|im_end|>\n", "<|im_start|>user\n", "You are tasked with creating a program that generates a simple line plot using the matplotlib library in Python. The plot should represent a sine wave with a specific frequency and amplitude. Your program should allow the user to input the frequency and amplitude of the sine wave and then display the plot with appropriate labels and grid lines.\n", "\n", "Your program should follow these requirements:\n", "- Prompt the user to input the frequency and amplitude of the sine wave.\n", "- Use the matplotlib library to create a line plot of a sine wave with the given frequency and amplitude.\n", "- Label the x-axis as \"Tempo\" and the y-axis as \"Amplitude\".\n", "- Display grid lines on the plot.\n", "- Present the plot to the user.\n", "\n", "Your program should not require any additional input once the frequency and amplitude are provided.<|im_end|>\n", "<|im_start|>assistant\n", "```python\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# Prompt user for frequency and amplitude\n", "frequency = float(input(\"Enter the frequency of the sine wave: \"))\n", "amplitude = float(input(\"Enter the amplitude of the sine wave: \"))\n", "\n", "# Generate x values from 0 to 2*pi with a step of 0.01\n", "x = np.arange(0, 2*np.pi, 0.01)\n", "\n", "# Calculate y values using the sine function\n", "y = amplitude * np.sin(frequency * x)\n", "\n", "# Create the line plot\n", "plt.plot(x, y)\n", "\n", "# Set labels for x and y axes\n", "plt.xlabel('Tempo')\n", "plt.ylabel('Amplitude')\n", "\n", "# Display grid lines\n", "plt.grid(True)\n", "\n", "# Show the plot\n", "plt.show()\n", "```\n", "\n", "This program first prompts the user to input the frequency and amplitude of the sine wave. It then uses numpy to generate x values from 0 to 2π with a step of 0.01 and calculates the corresponding y values using the sine function. The program then creates a line plot using matplotlib, sets labels for the x and y axes, displays grid lines, and finally shows the plot to the user.<|im_end|>\n", "\n" ] } ], "source": [ "custom_system_message = \"I am cortex your coding assistant made by junaid\"\n", "\n", "def format_chat(example):\n", " messages = [\n", " {\"role\": \"system\", \"content\": custom_system_message},\n", " {\"role\": \"user\", \"content\": example[\"problem\"]},\n", " {\"role\": \"assistant\", \"content\": example[\"solution\"]},\n", " ]\n", "\n", " text = tokenizer.apply_chat_template(\n", " messages,\n", " tokenize=False,\n", " add_generation_prompt=False,\n", " )\n", "\n", " return {\"text\": text}\n", "\n", "\n", "train_dataset = train_dataset.map(format_chat)\n", "eval_dataset = eval_dataset.map(format_chat)\n", "test_dataset = test_dataset.map(format_chat)\n", "\n", "\n", "print(train_dataset[0][\"text\"])" ] }, { "cell_type": "markdown", "metadata": { "id": "RtPirvCCKDRw" }, "source": [ "## 8. Configure SFTTrainer & Training Arguments" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 116, "referenced_widgets": [ "9dc534066e134726ac208abbea4d29a8", "9c91f9a2c352437581b044a1610a5199", "658a71c24b7d43ecbb743bb8cb01cfc2", "5bdfff814fd3450b9d8a468190e78411", "d9fe07f52c1b40f4852850245f4a06a1", "0f979129fe804caeaac6adda3334dda5", "b6bfed685a5e46a3acb40b8ff3d38719", "c9b814c15b4948a689b6483d45157f9d", "aeb7a776505f4b1cb805b9a3f79952fa", "376d1ad19de949b0bddaf5066b8174a4", "9c165d79db3d454f8058689de32b2658", "fe16aaca94034c8493578820e0dadd1d", "9d379afe05bb4395928221f8e1df3bdc", "b4b9f175b4ae4738a7b77b7fe8acd2c4", "a10f96ff8b064c2ea7871bb25a1430ae", "1dbd82b7174843cdb112cb99610b514a", "ceac12c091b54833ae8cd2355b1e1569", "26f8214406df4a2797d58dd0548b8129", "c33ea25852e747829bc2dd1d04d4bb84", "f0a9c87f0a574a32b16962b2061a96be", "040ec2461ce84746853cb204222eecaa", "66eacd83263a44e0a7273a078c8c1935" ] }, "id": "cze_cn7qKDRw", "outputId": "c820ecfb-1a7b-4e26-daae-d71cae80527d" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n", "warmup_ratio is deprecated and will be removed in v5.2. Use `warmup_steps` instead.\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "Unsloth: Tokenizing [\"text\"] (num_proc=6): 0%| | 0/70000 [00:00" ], "text/html": [ "\n", "
\n", " \n", " \n", " [120/120 03:54, Epoch 0/1]\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StepTraining Loss
50.955692
100.777234
150.622456
200.574857
250.570743
300.472080
350.545482
400.470952
450.471117
500.565618
550.484839
600.555313
650.465147
700.504524
750.488757
800.584364
850.508135
900.570066
950.564485
1000.522994
1050.510270
1100.560045
1150.522424
1200.595545

" ] }, "metadata": {} }, { "output_type": "stream", "name": "stderr", "text": [ "Unsloth: Restored added_tokens_decoder metadata in outputs/checkpoint-120/tokenizer_config.json.\n" ] } ], "source": [ "trainer_stats = trainer.train()" ] }, { "cell_type": "markdown", "metadata": { "id": "5nZFbvLdKDRw" }, "source": [ "## 10. Save LoRA Adapter" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6aTYoeq2KDRw", "outputId": "2f00d1f7-36a4-475a-fe8e-f0cc4a1dc633" }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Unsloth: Restored added_tokens_decoder metadata in lora_model/tokenizer_config.json.\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "('lora_model/tokenizer_config.json',\n", " 'lora_model/chat_template.jinja',\n", " 'lora_model/tokenizer.json')" ] }, "metadata": {}, "execution_count": 12 } ], "source": [ "model.save_pretrained(\"lora_model\")\n", "tokenizer.save_pretrained(\"lora_model\")" ] }, { "cell_type": "markdown", "metadata": { "id": "S_fMRKMzKDRw" }, "source": [ "## 11. Evaluation\n", "### Comparing Base Model vs Fine-Tuned Model using Perplexity, BLEU, and ROUGE\n", "\n", "We evaluate on `test_dataset` (raw, unformatted) which the model has never seen during training." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000, "referenced_widgets": [ "420ac39c0a4645f9bc1267c7afeb7591", "8f0d927fac4d4c8c88bea7da5e4a3d37", "d4791046e5f642d68336250f2539692f", "640024073c9d46a29be6b25586e9487a", "720f2892d01f49219881f0c1f5ecfd09", "55d15bf6ad744ca9ac6500eb80121b7f", "7a72dce673ca4de2a793d59d55d56b83", "8cbf3d73357e4f92875373ab8a8ef6cc", "8cf99767e8d44685b5285466a4dfbd09", "f5354f6ec1da4c0aa1bbaa062c3dfc79", "c348624cdbab4a94999d9b4bbc687620", "7e2166eaa58c4e7b813a6fb5dc83e5dd", "76486583503e4336be3f4d3ad4a2bd9a", "98faad20c7f6440f99cf4c8544e58ae3", "f87ca267f0b34b50a6af7997565a12c3", "a9a83449a33240d4ad29537ebaf22451", "05814c662eb9449bb599f55f857c8008", "434cefccfd964982811d89376da6c4ff", "5dd89cd178214faebf6aa012b46890e6", "40932be921ca48a6ad7dc3ae4c8b21ba", "517460bb3b07423797257db598436959", "7ee22debb4424103b773b7560912d37c" ] }, "id": "9yxheKaDKDRw", "outputId": "4052366a-cfd7-43e4-9538-e1386988348f", "collapsed": true }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "==((====))== Unsloth 2026.5.2: Fast Qwen2 patching. Transformers: 5.5.0.\n", " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", "\\ / Bfloat16 = FALSE. FA [Xformers = None. FA2 = False]\n", " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "Loading weights: 0%| | 0/338 [00:00system\n", "I am cortex your coding assistant made by junaid<|im_end|>\n", "<|im_start|>user\n", "You are tasked with creating a Python class to manage employees in an organization. The class should have the following functionalities:\n", "\n", "1. Initialize the employee with their details.\n", "2. Allow the manager to input a list of employees under them.\n", "3. Display the details of the manager and the employees under them.\n", "\n", "You are provided with a partial code snippet for the `Employee` class, which includes an `__init__` method and a `display2` method. Your task is to complete the `Employee` class by implementing the missing methods and ensuring that the class functions as described.\n", "\n", "Complete the `Employee` class by adding the following methods:\n", "- `__init__`: Initialize the employee with their name, ID, and department.\n", "- `display`: Display the details of the manager, including their name, ID, and department.\n", "- `input_emp_under`: Allow the manager to input a list of employees under them.\n", "- `display_em\n", "\n", "── Sample Reference ──\n", "\n", "```python\n", "class Employee:\n", " def __init__(self, name, emp_id, department):\n", " self.name = name\n", " self.emp_id = emp_id\n", " self.department = department\n", " self.emp_under = []\n", "\n", " def display(self):\n", " print(\"Manager Name:\", self.name)\n", " print(\"Manager ID:\", self.emp_id)\n", " print(\"Department:\", self.department)\n", "\n", " def input_emp_under(self):\n", " emp_list = input(\"Enter employees under the manager in the form of a list:\")\n", " self.emp_under = emp_list\n", "\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "zQtOngmtKDRw" }, "source": [ "### 12. Perplexity" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QdzPqPCYKDRw", "outputId": "8c1cd673-3de4-455e-e499-63b5045570bc", "collapsed": true }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:71: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:281: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:71: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:281: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Base model PPL : 2.76\n", "Fine-tuned PPL : 1.73\n", "Improvement : 37.3%\n" ] } ], "source": [ "def compute_perplexity(model, tokenizer, texts, max_len=2048):\n", "\n", " model.eval()\n", "\n", " losses = []\n", "\n", " with torch.no_grad():\n", "\n", " for text in texts:\n", "\n", " enc = tokenizer(\n", " text,\n", " return_tensors=\"pt\",\n", " truncation=True,\n", " max_length=max_len\n", " ).to(model.device)\n", "\n", " outputs = model(\n", " **enc,\n", " labels=enc[\"input_ids\"]\n", " )\n", "\n", " losses.append(outputs.loss.item())\n", "\n", " ppl = np.exp(np.mean(losses))\n", "\n", " return round(float(ppl), 2)\n", "\n", "\n", "base_ppl = compute_perplexity(\n", " base_model,\n", " tokenizer,\n", " ppl_texts\n", ")\n", "\n", "ft_ppl = compute_perplexity(\n", " ft_model,\n", " tokenizer,\n", " ppl_texts\n", ")\n", "\n", "print(f\"Base model PPL : {base_ppl}\")\n", "print(f\"Fine-tuned PPL : {ft_ppl}\")\n", "\n", "print(\n", " f\"Improvement : \"\n", " f\"{round((base_ppl - ft_ppl) / base_ppl * 100, 1)}%\"\n", ")" ] }, { "cell_type": "markdown", "metadata": { "id": "fy9HksHHKDRw" }, "source": [ "### 13. BLEU & ROUGE" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "OsyGJGr3KDRw", "outputId": "62fb32f6-a93b-4d6f-dc36-398f41a47f7c", "collapsed": true }, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Generating base model predictions...\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:71: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:281: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:71: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:281: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Generating fine-tuned model predictions...\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] } ], "source": [ "def generate(model, tokenizer, prompt, max_new=128):\n", "\n", " inputs = tokenizer(\n", " prompt,\n", " return_tensors=\"pt\"\n", " ).to(model.device)\n", "\n", " with torch.no_grad():\n", "\n", " outputs = model.generate(\n", " **inputs,\n", " max_new_tokens=max_new,\n", " do_sample=False,\n", " pad_token_id=tokenizer.eos_token_id,\n", " )\n", "\n", " prediction = tokenizer.decode(\n", " outputs[0][inputs.input_ids.shape[1]:],\n", " skip_special_tokens=True\n", " )\n", "\n", " return prediction.strip()\n", "\n", "print(\"Generating base model predictions...\")\n", "base_preds = [\n", " generate(base_model, tokenizer, p)\n", " for p in prompts\n", "]\n", "\n", "print(\"Generating fine-tuned model predictions...\")\n", "ft_preds = [\n", " generate(ft_model, tokenizer, p)\n", " for p in prompts\n", "]" ] }, { "cell_type": "code", "source": [ "bleu = BLEU()\n", "\n", "base_bleu = bleu.corpus_score(\n", " base_preds,\n", " [references]\n", ").score\n", "\n", "ft_bleu = bleu.corpus_score(\n", " ft_preds,\n", " [references]\n", ").score\n", "\n", "print(f\"\\nBLEU base={base_bleu:.2f}\")\n", "print(f\"BLEU fine-tuned={ft_bleu:.2f}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5Z9HKSFUtWKA", "outputId": "16dd13ff-bbe4-4097-f5e0-ef60885661d3" }, "execution_count": 17, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "BLEU base=21.95\n", "BLEU fine-tuned=24.48\n" ] } ] }, { "cell_type": "code", "source": [ "rouge = rouge_scorer.RougeScorer(\n", " [\"rouge1\", \"rougeL\"],\n", " use_stemmer=True\n", ")\n", "\n", "def avg_rouge(preds, refs):\n", "\n", " r1_scores = []\n", " rL_scores = []\n", "\n", " for pred, ref in zip(preds, refs):\n", "\n", " scores = rouge.score(ref, pred)\n", "\n", " r1_scores.append(\n", " scores[\"rouge1\"].fmeasure\n", " )\n", "\n", " rL_scores.append(\n", " scores[\"rougeL\"].fmeasure\n", " )\n", "\n", " return (\n", " round(sum(r1_scores) / len(r1_scores), 4),\n", " round(sum(rL_scores) / len(rL_scores), 4),\n", " )\n", "\n", "base_r1, base_rL = avg_rouge(\n", " base_preds,\n", " references\n", ")\n", "\n", "ft_r1, ft_rL = avg_rouge(\n", " ft_preds,\n", " references\n", ")\n", "\n", "print(f\"ROUGE-1 base={base_r1}\")\n", "print(f\"ROUGE-1 fine-tuned={ft_r1}\")\n", "\n", "print(f\"ROUGE-L base={base_rL}\")\n", "print(f\"ROUGE-L fine-tuned={ft_rL}\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "dXp3DsPMtgxG", "outputId": "313b562f-6c76-469b-e7fa-6920cc6de7da" }, "execution_count": 18, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "ROUGE-1 base=0.5039\n", "ROUGE-1 fine-tuned=0.5221\n", "ROUGE-L base=0.4188\n", "ROUGE-L fine-tuned=0.4468\n" ] } ] }, { "cell_type": "markdown", "source": [ "# Final Summary Table" ], "metadata": { "id": "TG5RUV8yti6C" } }, { "cell_type": "code", "source": [ "print(\"\\n\" + \"─\" * 60)\n", "\n", "print(\n", " f\"{'Metric':<15}\"\n", " f\"{'Base':>12}\"\n", " f\"{'Fine-tuned':>15}\"\n", " f\"{'Result':>15}\"\n", ")\n", "\n", "print(\"─\" * 60)\n", "\n", "metrics = [\n", " (\"PPL ↓\", base_ppl, ft_ppl, True),\n", " (\"BLEU ↑\", base_bleu, ft_bleu, False),\n", " (\"ROUGE-1 ↑\", base_r1, ft_r1, False),\n", " (\"ROUGE-L ↑\", base_rL, ft_rL, False),\n", "]\n", "\n", "for metric, base_v, ft_v, lower_better in metrics:\n", "\n", " improved = (\n", " ft_v < base_v\n", " if lower_better\n", " else ft_v > base_v\n", " )\n", "\n", " result = (\n", " \"✓ improved\"\n", " if improved\n", " else \"✗ regressed\"\n", " )\n", "\n", " print(\n", " f\"{metric:<15}\"\n", " f\"{base_v:>12.4f}\"\n", " f\"{ft_v:>15.4f}\"\n", " f\"{result:>15}\"\n", " )\n", "\n", "print(\"─\" * 60)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8HnIE9cdtmdC", "outputId": "6e51e676-de80-4780-aaee-9f3456898d18" }, "execution_count": 19, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "────────────────────────────────────────────────────────────\n", "Metric Base Fine-tuned Result\n", "────────────────────────────────────────────────────────────\n", "PPL ↓ 2.7600 1.7300 ✓ improved\n", "BLEU ↑ 21.9468 24.4804 ✓ improved\n", "ROUGE-1 ↑ 0.5039 0.5221 ✓ improved\n", "ROUGE-L ↑ 0.4188 0.4468 ✓ improved\n", "────────────────────────────────────────────────────────────\n" ] } ] }, { "cell_type": "code", "source": [ "def generate_k_samples(model, tokenizer, prompt, k=3, max_new=128, temperature=0.7, top_k=50):\n", " inputs = tokenizer(\n", " prompt,\n", " return_tensors=\"pt\"\n", " ).to(model.device)\n", "\n", " # Generate k samples using sampling\n", " with torch.no_grad():\n", " outputs = model.generate(\n", " **inputs,\n", " max_new_tokens=max_new,\n", " do_sample=True, # Enable sampling\n", " temperature=temperature, # Set temperature for creativity\n", " top_k=top_k, # Use top_k sampling\n", " num_return_sequences=k,\n", " pad_token_id=tokenizer.eos_token_id,\n", " )\n", "\n", " # Decode all k generated predictions\n", " k_predictions = []\n", " for i in range(k):\n", " prediction = tokenizer.decode(\n", " outputs[i][inputs.input_ids.shape[1]:],\n", " skip_special_tokens=True\n", " )\n", " k_predictions.append(prediction.strip())\n", " return k_predictions\n", "\n", "# Define k and a ROUGE-L threshold for a \"pass\"\n", "K_SAMPLES = 3 # Number of samples to generate for each prompt\n", "ROUGE_L_PASS_THRESHOLD = 0.5 # ROUGE-L F1 score threshold to consider a sample \"passing\"\n", "MAX_NEW_TOKENS_FOR_PASS_AT_K = 256 # Increase max_new_tokens for potentially longer code responses\n", "\n", "print(f\"Running Pass@{K_SAMPLES} evaluation with ROUGE-L F1 threshold of {ROUGE_L_PASS_THRESHOLD}...\")\n", "\n", "base_passes = 0\n", "ft_passes = 0\n", "\n", "# The 'rouge' scorer is already initialized from previous cells\n", "\n", "for i, prompt in enumerate(prompts):\n", " reference = references[i]\n", "\n", " # Evaluate Base Model\n", " base_k_preds = generate_k_samples(base_model, tokenizer, prompt, k=K_SAMPLES, max_new=MAX_NEW_TOKENS_FOR_PASS_AT_K)\n", " for pred in base_k_preds:\n", " scores = rouge.score(reference, pred)\n", " if scores[\"rougeL\"].fmeasure >= ROUGE_L_PASS_THRESHOLD:\n", " base_passes += 1\n", " break # If at least one passes, this problem counts as a pass for the base model\n", "\n", " # Evaluate Fine-tuned Model\n", " ft_k_preds = generate_k_samples(ft_model, tokenizer, prompt, k=K_SAMPLES, max_new=MAX_NEW_TOKENS_FOR_PASS_AT_K)\n", " for pred in ft_k_preds:\n", " scores = rouge.score(reference, pred)\n", " if scores[\"rougeL\"].fmeasure >= ROUGE_L_PASS_THRESHOLD:\n", " ft_passes += 1\n", " break # If at least one passes, this problem counts as a pass for the fine-tuned model\n", "\n", "num_problems = len(prompts)\n", "base_pass_at_k = (base_passes / num_problems) * 100\n", "ft_pass_at_k = (ft_passes / num_problems) * 100\n", "\n", "print(f\"\\nBase Model Pass@{K_SAMPLES}: {base_pass_at_k:.2f}% ({base_passes}/{num_problems} problems passed)\")\n", "print(f\"Fine-tuned Model Pass@{K_SAMPLES}: {ft_pass_at_k:.2f}% ({ft_passes}/{num_problems} problems passed)\")\n", "\n", "print(\n", " f\"\\nPass@{K_SAMPLES} Improvement: \"\n", " f\"{round(ft_pass_at_k - base_pass_at_k, 2)}% points\"\n", ")\n", "\n", "print(\"\\n\" + \"─\" * 60)\n", "\n", "print(\n", " f\"{'Metric':<15}\"\n", " f\"{'Base':>12}\"\n", " f\"{'Fine-tuned':>15}\"\n", " f\"{'Result':>15}\"\n", ")\n", "\n", "print(\"─\" * 60)\n", "\n", "metrics.append((\"Pass@K ↑\", base_pass_at_k / 100, ft_pass_at_k / 100, False)) # Convert to ratio for consistent display\n", "\n", "for metric_name, base_v, ft_v, lower_better in metrics:\n", "\n", " improved = (\n", " ft_v < base_v\n", " if lower_better\n", " else ft_v > base_v\n", " )\n", "\n", " result = (\n", " \"✓ improved\"\n", " if improved\n", " else \"✗ regressed\"\n", " )\n", "\n", " # Special formatting for percentage if it's Pass@K\n", " if \"Pass@K\" in metric_name:\n", " print(\n", " f\"{metric_name:<15}\"\n", " f\"{base_v:>11.2%}\"\n", " f\"{ft_v:>14.2%}\"\n", " f\"{result:>15}\"\n", " )\n", " else:\n", " print(\n", " f\"{metric_name:<15}\"\n", " f\"{base_v:>12.4f}\"\n", " f\"{ft_v:>15.4f}\"\n", " f\"{result:>15}\"\n", " )\n", "\n", "print(\"─\" * 60)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Hp8C5TjbcY0a", "outputId": "27158181-8e97-43d9-e3ca-18093790c120" }, "execution_count": 20, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Running Pass@3 evaluation with ROUGE-L F1 threshold of 0.5...\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n", "Both `max_new_tokens` (=256) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "\n", "Base Model Pass@3: 57.14% (40/70 problems passed)\n", "Fine-tuned Model Pass@3: 65.71% (46/70 problems passed)\n", "\n", "Pass@3 Improvement: 8.57% points\n", "\n", "────────────────────────────────────────────────────────────\n", "Metric Base Fine-tuned Result\n", "────────────────────────────────────────────────────────────\n", "PPL ↓ 2.7600 1.7300 ✓ improved\n", "BLEU ↑ 21.9468 24.4804 ✓ improved\n", "ROUGE-1 ↑ 0.5039 0.5221 ✓ improved\n", "ROUGE-L ↑ 0.4188 0.4468 ✓ improved\n", "Pass@K ↑ 57.14% 65.71% ✓ improved\n", "────────────────────────────────────────────────────────────\n" ] } ] }, { "cell_type": "code", "source": [ "# Metrics data\n", "metrics = [\"PPL ↓\", \"BLEU ↑\", \"ROUGE-1 ↑\", \"ROUGE-L ↑\", \"Pass@3 ↑\"]\n", "base_values = [2.7600, 21.9468, 0.5039, 0.4188, 52.86]\n", "finetuned_values = [1.7300, 24.4804, 0.5221, 0.4468, 67.14]\n", "\n", "# Plot style\n", "sns.set(style=\"whitegrid\", font_scale=1.2)\n", "\n", "x = range(len(metrics))\n", "width = 0.35\n", "\n", "plt.figure(figsize=(10,6))\n", "plt.bar([i - width/2 for i in x], base_values, width, label=\"Base Model\", color=\"skyblue\")\n", "plt.bar([i + width/2 for i in x], finetuned_values, width, label=\"Fine-tuned Model\", color=\"orange\")\n", "\n", "# Labels and formatting\n", "plt.xticks(x, metrics)\n", "plt.ylabel(\"Score / Value\")\n", "plt.title(\"Base vs Fine-tuned Model Performance\")\n", "plt.legend()\n", "\n", "# Annotate improvements\n", "for i, (b, f) in enumerate(zip(base_values, finetuned_values)):\n", " plt.text(i - width/2, b + 0.01, f\"{b:.2f}\", ha=\"center\", va=\"bottom\", fontsize=10)\n", " plt.text(i + width/2, f + 0.01, f\"{f:.2f}\", ha=\"center\", va=\"bottom\", fontsize=10)\n", "\n", "plt.tight_layout()\n", "plt.show()\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 593 }, "id": "6c9fKUIzoxF1", "outputId": "e21d5645-3a0d-4378-90ba-470ca330ad3a" }, "execution_count": 21, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "

" ], "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9AAAAJACAYAAABlv44fAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAkvtJREFUeJzs3Xd8jff///HnSUQGIUFixBZJbLFnlVBqxR6fmtWi1ofq0q39tHTR1qoiNkVEENVaVVWrRlF7BUmJGRIJWef3R385X6dJOI6MEx73282NvK/39b5e75Mrbnle02A0Go0CAAAAAAAPZJfTBQAAAAAAkBsQoAEAAAAAsAABGgAAAAAACxCgAQAAAACwAAEaAAAAAAALEKABAAAAALAAARoAAAAAAAsQoAEAAAAAsAABGgAAAAAACxCgAQA5bvfu3fL19dWUKVNyupQnXkhIiHx9fRUSEpLTpVjtrbfekq+vryIiIh5rnL59+8rX1zeTqsoe27dvV69evVSnTh35+vpq2LBhOV0SADxV8uR0AQBga9L7hdrBwUGenp6qW7euBg8erAoVKuRAZblPRESEAgICHthnwYIF2VTNowsJCdG4ceM0YcIEdenSJafLyRGpn4Ek1alTR4sXL063X0REhFq2bCmj0ShJOnHiRLbVmF369u2rPXv2mLW5uLioXLlyeu655zRgwAA5OTll2fYjIiI0bNgwFShQQF27dlX+/PlVvnz5LNseACAtAjQAZGDEiBGmf8fExOjQoUMKDQ3Vhg0btGTJElWqVCkHq8tdXF1d1b9//3SXeXl5qXDhwvrxxx/l7u6ezZXBUnny5NHevXt19uzZdEPbihUrZDQalSdPHiUlJeVAhdmnc+fO8vLyktFo1OXLl7Vx40ZNnjxZmzdv1pIlS+Tg4JAl2925c6fu3bunN998Ux06dMiSbQAAHowADQAZGDlyZJq2jz/+WIsWLdL8+fM1ceLEHKgqdypQoEC6n+f9OKtv25599llt2rRJK1as0Jtvvmm2LDk5WSEhIapWrZquXLmiqKioHKoye3Tu3Fn169c3fT169Gh17txZhw4dUlhYmDp37pwl2039XD09PbNkfADAw3EPNAA8gsaNG0uSbty4YdYeExOj2bNnq1+/fnrmmWdUtWpVNWjQQEOHDtWBAwfSHWvv3r0aOnSoqX/jxo3Vo0cPTZ06NU3f+Ph4zZw5U4GBgapZs6b8/f3Vs2dPhYWFWVT3vXv3VKdOHTVs2DDDs4MffPCBfH199csvv1hV4+PI6B7o1HtUk5KS9N133+m5555T1apV1axZM33xxRdKSEhId7wzZ87orbfeUrNmzVS1alU1atRIY8eO1dmzZy2uqW/fvqZLl8eNGydfX1/Tn9R7bx90L25Oz+n8+fMaNWqU6tatq5o1a6pXr17aunWrxfP/N29vb/n7+ys0NFSJiYlmy7Zu3aorV66oR48eDxzjxx9/1AsvvKDatWurevXq6tChg2bOnJnhnHfs2KH//Oc/qlmzpurVq6dhw4bpzJkzD9zGwYMHNWrUKDVu3Nj0ub7//vtZGuo9PT3VqlUrSdKhQ4dM7Y/yc3v//nLo0CENHjxY9erVM92vfv++1K9fP9O+uHv3btMY4eHheuONN9S0aVNVrVpVTZo00RtvvKHw8PA025syZYpp/bVr16p79+7y9/dXixYt0iwPCwtTly5dVKNGDTVp0kQTJkwwfc927typvn37qlatWqpbt65ef/113bx5M832du3apffee09t27ZVrVq1VL16dbVv315Tp07VvXv3HljfTz/9pG7duqlGjRqqV6+exowZk+H3Mzo6WpMnT1b79u1Vo0YN1a5dWx07dtSXX36puLi4NH2/+uorPf/886pevbpq166t/v37a/v27emODQASZ6AB4JHs2LFDklS1alWz9jNnzujrr79WnTp19Oyzz6pAgQK6dOmStmzZot9++00zZszQM888Y+q/bds2DRkyRPnz51eLFi1UtGhRRUdH6+zZs1qyZInZ5eO3b99W//79dfToUVWpUkVdu3ZVSkqKtm/frrFjx+rUqVMaM2bMA+t2dHRU27ZttWzZMm3bts30S3KqhIQErV+/XkWKFFHTpk0fucasNnbsWO3bt09NmzZVs2bNtG3bNs2ePVs3btzQhAkTzPpu27ZNI0eOVFJSkpo3b67SpUsrKipKGzZs0NatW7VgwQJVqVLlodvs3LmzXF1dtXnzZgUEBJhdsl+gQAGbnlN4eLh69uyp6OhoPfPMM6pUqZLOnz+v4cOHm76/1ujevbvefvttbd68WW3atDG1r1ixQi4uLmrXrl2GB1cmTZqkmTNnyt3dXe3bt5eLi4t+++03TZo0Sdu3b9ecOXOUN29eU/+ffvpJY8aM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\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "metric_labels = [\n", " \"PPL\",\n", " \"BLEU\",\n", " \"ROUGE-1\",\n", " \"ROUGE-L\",\n", " \"Pass@K\"\n", "]\n", "\n", "# Using the variables computed in previous cells for consistency\n", "plot_data = [\n", " (\"PPL\", base_ppl, ft_ppl, True),\n", " (\"BLEU\", base_bleu, ft_bleu, False),\n", " (\"ROUGE-1\", base_r1, ft_r1, False),\n", " (\"ROUGE-L\", base_rL, ft_rL, False),\n", " (\"Pass@K\", base_pass_at_k, ft_pass_at_k, False)\n", "]\n", "\n", "improvement_percentages = []\n", "\n", "for name, base_val, ft_val, lower_is_better in plot_data:\n", " if base_val == 0: # Avoid division by zero, though unlikely for these metrics\n", " improvement_percentages.append(0.0)\n", " else:\n", " if lower_is_better:\n", " # For metrics where lower is better (e.g., PPL), improvement means base_val is higher than ft_val\n", " improvement = ((base_val - ft_val) / base_val) * 100\n", " else:\n", " # For metrics where higher is better, improvement means ft_val is higher than base_val\n", " improvement = ((ft_val - base_val) / base_val) * 100\n", " improvement_percentages.append(improvement)\n", "\n", "\n", "plt.figure(figsize=(12, 7))\n", "sns.barplot(x=metric_labels, y=improvement_percentages, palette=\"viridis\")\n", "\n", "plt.ylabel(\"Percentage Improvement (%)\")\n", "plt.title(\"Percentage Improvement: Fine-tuned vs. Base Model\")\n", "plt.axhline(0, color='gray', linestyle='--', linewidth=0.8) # Add a zero line for reference\n", "\n", "# Annotate bars with their percentage values\n", "for index, value in enumerate(improvement_percentages):\n", " plt.text(\n", " index,\n", " value + (1 if value >= 0 else -1) * 0.5, # Adjust text position slightly above/below bar\n", " f'{value:.2f}%',\n", " ha='center',\n", " va='bottom' if value >= 0 else 'top'\n", " )\n", "\n", "plt.tight_layout()\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 780 }, "id": "lN4kfI5nppCd", "outputId": "f60ce840-a511-4fd2-a7a2-1065c6024d80" }, "execution_count": 22, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "/tmp/ipykernel_1977/2658127671.py:34: FutureWarning: \n", "\n", "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n", "\n", " sns.barplot(x=metric_labels, y=improvement_percentages, palette=\"viridis\")\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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OnVK//3vf62ufezYMX399deqWrWqOnfurCtXrmjr1q3q27ev1q5dqxdeeEHSn6HS9u3bFR4eruDgYBUqVMhqrG3btmnZsmWqXbu2qlWrJhcXF506dUorVqzQzp07tWrVKuXPn9/i9XvjjTf0ww8/qHjx4urZs6cePnyoNWvW6PTp06m+5klJSXr99de1e/dulShRQm3atFH27Nm1b98+ffrppzp8+LC++OKL9PwxPtZbb72lw4cPq1GjRnJ2dtb333+vkSNHytnZWSdPntTatWvVuHFj1alTRzt27ND06dPl5uamgQMHWo0VFRWlrl27yt/fX126dNGNGze0efNmvfbaa5o4caJatWpldc7333+vXbt2qWHDhuratauuXLki6c8/627duun06dOqVKmS+vTpo1u3bum7775T//799fHHH6tr166SpMDAQHl6emrjxo1699135exs+U+MsLAwxcbGqn///hbHQkJCtHr1avn5+alFixby8vLSb7/9psmTJ+vnn3/WvHnzrMZKqStHjhxq3bq17ty5o82bN2vAgAH69ttvNWrUKN25c0eNGzfWw4cPzbMvChQooKpVq1qMZc/1XV1dFRQUpMTERG3ZskXvv/++nJycFBwcbH5NJGnNmjUWy48kWbyvmzZtqsuXL2v79u3PdYbI22+/rV9//VUNGjRQo0aN9NNPP+nrr79WTEyMPv/8c4u+P/30k9544w09fPhQTZo0UdGiRXXt2jVt3bpVP/zwgxYuXKgKFSo89ZrBwcHy9PTU9u3b1axZM5UrV858zMvLK1Pf0/nz59WlSxfdvn1bDRs2VLly5XThwgUNGTJEDRo0SHONwcHB+vbbb7Vu3Trze+Sv1qxZY+4n/Rnod+vWTRcvXlT9+vXNewlduXJF27dvV1BQkIoUKWLLy/VUV69e1blz55QjRw7z9+gUX331lc6dO6eAgAA1atRIiYmJOnjwoKZOnap9+/Zp/vz55sDGMAy9+uqrOnTokAICAtS5c2dly5ZN165d0759+1SjRg1VrFjRPPbKlSs1atQoubq6qmnTpvLz89OFCxe0YsUK7dixQ8uXL1fBggXTdS+dO3fWxo0btWbNGg0YMMDcvmLFCplMJr388ssKDw9P9dxly5bp448/lru7u1566SXlzp1b4eHh+uqrr7Rz504tXbrU4v178OBB9evXT0lJ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P/6Yap9Dhw4pISEhTePlypVLrVq10o0bNzR+/HirUOfevXsWy0Patm2rY8eOafr06an+oHXx4kVdunQpnXdlKWXPnytXrlgdS9lz6O8/6N27d08ffvhhqsvGUmYE/L//9/8slm3ExcVpxowZVv2dnZ3Vs2dP3bhxQ2PGjNH9+/et+ly/fj1TbrgaFxen6dOnW7QdPXpUGzZskKenZ6o/EKbG1dVVbdu21b179zR58mSLYxcvXtSiRYvk4uJi3hvsr1LCpJUrV2rTpk3y9fVV48aNrfr17dtXSUlJev/991MNse7cuaPjx4+nqV5bPI/rp7yXUwtLUly8eFFnzpzJtGFmx44d5eXlpWnTpqW6IX9ycnKqP3w/jq+vr6THvyYpe4KtWLHCov3kyZNauHBhmq/zJOm9Jz8/P9WvX19RUVFavHixRd+wsDCbAiY3Nze1bNlS165d0/z583XixAk1bNjQahneqVOnUp31ktL2942zz5w5k+reYbZITEzUN998I0kWG5mnfB/++31funTJvPzt7+2p/b1w584dJSUlWdxDjx495OLios8//1znzp1LtSZ7wicnJydNnTpV06dPNy/5e5J27drJxcVFixcv1oULFyyOTZ48WXfv3lW7du3My+yqVaumEiVKaP/+/VYb7i9evNhq/yXJ8Z8xAMgoLJEDgCzGxcVFU6dO1auvvqqBAwcqICBA5cqVk5ubm6Kjo3X06FFdunRJu3fvlru7e5rGHDVqlE6dOqVly5YpPDxcL774olxcXBQVFaXdu3dr5syZql27trnvhQsXNGXKFK1fv17VqlVTnjx5dP36dZ05c0ZHjx7Vl19+mepGy2lVp04dOTk56csvv9SpU6fMy/gGDx6svHnzqnXr1tq0aZM6dOig+vXrKy4uTnv37pWrq6vKlStn9bSwDh06aNOmTdq1a5fatm2rpk2bKikpSVu3blWlSpV07tw5q2VigwcP1okTJ7Rs2TLt3LlTderUUf78+fXHH3/owoULOnjwoP773/9mug1Xa9asqZUrV+rIkSOqVq2abty4oc2bNys5OVmjR49O15KTt99+WwcOHNDixYt19OhR1a5dW7du3dJ3332ne/fuaeTIkan+OTdv3lw5c+bUwoULlZSUpF69eqW6R8zLL7+s48eP65tvvlHz5s314osvqkCBArpz546ioqK0f/9+dezYMU0/BNrieVy/RIkSyp8/vzZt2iRnZ2cVLFhQJpNJ7du3N/+Q3rdvX12+fFnbt29X4cKFHXV7DuPr66spU6ZoyJAheuWVV1S3bl2VKlVKJpNJ0dHROnTokG7fvp3m2UVVq1aVu7u7FixYoNu3b5v3pOnVq5c8PT3VrFkzFS9eXBs3blR0dLQqV66sq1evavv27WrWrJm+++67DLmnUaNGqUuXLho7dqz27NmjsmXL6sKFCwoLC1OTJk20c+fOdNfRoUMHrVixQl9++aUk65l+krRnzx598cUXqlq1qooXL67cuXMrOjpa27dvl5OTkwYMGGDRv1WrVpKevp/f34WHh5s3mDYMQzdu3NBPP/2k6OhoFSlSRP/5z3/MfZs0aaJixYpp3rx5+v3331WuXDldvXpVO3fuVOPGja3+c+DkyZMaOnSoKlWqpJIlSypfvnyKiYnR9u3blZSUZPFU0pIlS+qzzz7TBx98oDZt2qhBgwYqXry4Hj58qCtXrujXX3+Vr6/vU/chfJIKFSqoQoUKaepbuHBhhYSEaPTo0QoODlbLli2VK1cu7d+/X4cOHdILL7ygd955x9zfZDLps88+U//+/TVs2DA1b95cxYoVU2RkpH7++Wc1aNDA6gl7jv6MAUBGIWACgCyobNmyWrdunebNm6cffvhBq1evlpOTk/Lmzavy5cvrjTfeMM8SSAtvb28tW7ZMCxYs0ObNm7V8+XI5OTmpQIEC6tSpk0WIkjNnTi1atEjLly/Xxo0btXXrVj148EB58uRRsWLFFBISonr16tl1fyVLltS4ceMUGhqqb775Rg8ePJD0Z+gjSZ999pmKFCmizZs3a8mSJcqVK5eaNm2qYcOGadiwYVbjmUwmTZ8+XbNmzdK6deu0aNEi5cuXT8HBwerevbvCwsKsghcXFxfNmDFD69at05o1a/TDDz8oPj5evr6+Kly4sN58880nLmXJKIULF9Ynn3yiCRMmaNmyZUpMTFT58uU1ZMgQNWjQIF1j+fj46Ntvv9Xs2bO1bds2zZs3T25ubqpcubIGDBigF198MdXz3N3d9dJLL2nlypWSlOqeMik++ugjNWzYUMuWLdPevXvNG7IXKFBAAwYMULt27dJVc3o96+tny5ZN06ZN08SJE7Vlyxbzk7aqV69u9QTAzKxu3bpav369QkNDtXv3bh04cEAuLi7Kly+f6tSpo6CgoDSP5e3trSlTpmj69Olas2aNeWluu3bt5OnpqezZs2v+/PkaP3689u7dq6NHj6p06dKaOHGivL29HRIw2XJPxYsX1/LlyzVx4kTt3btX4eHhKlOmjKZPn66YmBibAqYaNWqoWLFiunDhgnx8fFKd6degQQNdvXpV+/fv1/bt23X37l3ly5dP9evXV9++fVWtWjVbXwIL4eHhFjOS3N3dVbRoUXXo0EEDBgyw2EDdw8NDCxYs0IQJExQeHq4DBw6oSJEiGjx4sPr166fNmzdbjF2xYkUNHDhQ4eHh2rVrl+7cuaNcuXKpQoUK6tWrl9UTT9u3b6+yZctq3rx52rdvn3bv3i0PDw/ly5dPQUFBatmypUPuOa169OihYsWKKTQ0VFu3blVCQoL5e8Trr79utbl89erVtWTJEk2aNEk//fSTpD+XwS1atEi7d++2Cpgkx37GACCjmIy/Pk8UAIB/mT179qh///4aOHCg3n777Ywux2ZRUVFq1qyZgoODNW7cuIwuBwAAAP8y7MEEAPhXSO0pebdu3dLEiRMlpb5ZLQAAAIC0YYkcAOBfYdy4cTpx4oQCAgKUK1cuRUdHa9euXbp9+7a6dOli3lgYAAAAQPoRMAEA/hWaN2+umzdvaufOnYqLi5Orq6tKly6tl19+WS+//HJGlwcAAABkaezBBAAAAAAAALuwBxMAAAAAAADsQsAEAAAAAAAAu7AH02McOnRIhmHIxcUlo0sBAAAAAADIEElJSTKZTAoICHhiPwKmxzAMQ2xPBQAAAAAA/s3Smo0QMD1GysylSpUqZXAlAAAAAAAAGePo0aNp6sceTAAAAAAAALALM5hgty+++ELHjh3T+fPndevWLbm5ualgwYIKDAxUjx495Ovra+47YsQIrVmz5onj1alTRwsWLHjqda9evarZs2fr+PHjunLliu7cuSMfHx8VLVpUnTp1Urt27az20Pr111+1fft27du3T5cvX9bdu3eVL18+1a1bVwMHDlSxYsWsrnP06FGNHz9eERER8vX1Vbt27fSf//xHrq6uFv0Mw1DPnj2VmJioZcuWKVu2bE+9BwAAAAAA/glMBhsNpSplChhL5J6uYsWKKl++vEqWLKncuXMrISFBv/32m44dO6Z8+fJp+fLlKlCggCQpLCxMkZGRqY6zbt06Xbp0Se+++64GDBjw1Ovu27dPgwcPVpUqVVS4cGH5+Pjo9u3b+umnn3T16lXVrl1boaGhcnb+vxy1fv36iomJUUBAgCpUqCBnZ2cdOnRIhw4dkoeHh0JDQy02Lrt27Zpatmwpb29vBQUF6ffff9eePXvUv39/vffeexb1LF68WOPGjdPatWtVqlQpW15KAAAAAAAylbTmIwRMj0HAlHYPHjxQ9uzZrdonTZqkWbNmqVu3bvr444+fOEZsbKwaNGigR48e6aefflKuXLmeet3ExEQ5OzvLyclypWdSUpL69++v8PBwTZo0Sa1atTIfmzNnjtq3b6/8+fNbnDNr1ixNmjRJ/v7+2rBhg0X/SZMmaevWrSpSpIgkqXfv3jpy5IgOHTokk8kkSYqKilLbtm312muvafDgwU+tHQAAAACArCCt+Qh7MMFuqYVLktSyZUtJ0oULF546xrp163T//n21aNEiTeGSJLm6ulqFS9KfG7QHBgameu2BAwdahUuS9Nprr8nNzU2///67bt26ZW6/cuWKcuXKZQ6XpD8/VAkJCRb9Ro4cqWLFimngwIFpqh0AAAAAgH8S9mDCM7Njxw5JUpkyZZ7ad/ny5ZKkV155xe7rpsyCSuu1JclkMpn3TPrr3kkFCxZUTEyMrly5ooIFC0qSjh07Jnd3d/PeUitWrFB4eLhWrFhhsRwPAAAAAIB/C34ahsPMnTtX8fHxiouL07Fjx/Trr7+qTJkyT53Vc+jQIf3+++8qXry46tSpk+7rxsTEaMmSJTIMQzExMdq7d68uXLigNm3aqGnTpmkaY8uWLbp3756qVq0qLy8vc3u7du00c+ZM9ezZ07wH0y+//KJ+/frJZDLp2rVrGj9+vF599VWVL18+3bUDAAAAAPBPQMAEhwkNDdXNmzfNXzdo0EDjxo176pI3e2cv3bp1S9OmTTN/bTKZ1L9/f7311ltpOv/SpUv69NNP5ezsrBEjRlgc8/Pz0/z58zV+/HgtW7ZMvr6+ev311zVkyBBJ0kcffaT8+fNryJAhOnHihD777DPzhuHt2rXTu+++a/W0OQAAAAAA/mkImOAwe/bskSTdvHlThw4d0oQJE9ShQwfNnj1bFSpUSPWcuLg4fffdd3JxcVFwcLBN1y1ZsqROnjypR48e6dq1a9q2bZumTJmigwcPavbs2fLx8XnsuX/88Ydee+01xcTEaNSoURZPkEtRpUoVffPNN1bt69at048//qhly5bp0aNHeu211+Tt7a3p06fr4sWLGj9+vFxcXKyeNgcAAAAAwD8Nm3zD4fLkyaPmzZsrNDRUt2/ffmLAsn79eiUkJKRrc+/HyZYtmwoWLKg+ffpo9OjR+u233zRlypTH9v/jjz/Up08fnTt3Th988IF69OiR5mvdvHlTY8eOVd++fVWlShVt2LBB169f18cff6xGjRqpV69eateunRYvXqyEhAS77gsAAAAAgMyOgAnPTKFChVSqVCmdOnVKMTExqfZJWR7XpUsXh167YcOGkqTw8PBUj1+/fl29evXS6dOnNWrUKPXu3Ttd448ePVo+Pj568803JUlnzpyRJIuZWhUqVFBiYqIuXrxoyy0AAAAAAJBlsEQOz9T169clWT6ZLcXhw4d14sQJFS9eXLVr13boda9du/bY60ZHR6tPnz66cOGCPvnkk3SHW1u2bNHWrVu1ePFiubm5WRxLTEyUu7u7+fcAAAAAAPwbMIMJdjl37pzi4uKs2pOTkzVp0iT98ccfCggIkLe3t1Wfb7/9VtLTZy/FxcXpzJkz5rAqxfHjx/Xo0SOr/vfu3dNnn30mSWrcuLHFscuXL6tHjx66ePGixo4dm+5w6fbt2/r000/VvXt31ahRw9xeqlQpSdLOnTvNbTt37pSrq6uKFi2armsAAAAAAJDVMIMJdvnxxx/15Zdfqnr16ipcuLB8fHx08+ZN7d+/X5cuXVLevHk1ZswYq/Pu3r2r7777Tq6ururQocMTr7Ft2zaFhIQoODhY48aNM7dPnz5dBw8eVEBAgAoWLCg3NzdFR0frp59+UmxsrAICAjRw4ECLsXr16qXLly+rQoUKunz5sqZOnWp1veDgYBUuXDjVWsaMGaPs2bPr7bfftmhv27atpk6dqo8//liHDx/WxYsXtW/fPg0YMMA8owkAAAAAgH8qAibYpV69erp48aJ+/fVXRUREKC4uTu7u7ipevLjat2+vXr16pfoUt/Xr1ys+Pl6tW7e2eXPvV155RR4eHjp69KjCw8N1//59eXl5qUKFCmrZsqU6deokZ2fLt/jly5cl/Tn76fjx46mOW6tWrVQDph9++EEbNmzQvHnzlCNHDotjbm5u+vrrr/XZZ59p1apV8vDwUJ8+fTR8+HCb7g0AAAAAgKzEZBiGkdFFZEZHjx6VJFWqVCmDKwEAAAAAAMgYac1H2IMJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImDJA8qPkjC4BsAnvXQAAAABAapwzuoB/I6dsTpow9ltdungjo0sB0qxI0bx65/0uGV0GAAAAACATImDKIJcu3tCZU1cyugwAAAAAAAC7sUQOAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYhYAJAAAAAAAAdiFgAgAAAAAAgF0ImAAAAAAAAGAXAiYAAAAAAADYxTmjC/i7mJgYffHFFzp+/LiuXbum+Ph45c2bV1WqVNGrr76qChUqmPvu27dPvXv3TnUcHx8f7du373mVDQAAAAAA8K+V6QKmuLg4nTt3TvXq1VPBggXl7u6uy5cva82aNXrllVc0a9YsNWjQwOKcLl26qHr16hZt2bNnf55lAwAAAAAA/GtluoCpWLFiWrZsmVV7t27d1KRJE3311VdWAVPVqlXVvn3751UiAAAAAAAA/iLL7MGUJ08eZc+eXXFxcakeT0hI0P37959zVQAAAAAAAMh0M5hSJCUlKS4uTo8ePdLVq1cVGhqq+Ph4NW7c2KrvZ599ppCQEEmSn5+f2rVrp8GDB8vd3d2uGgzDUHx8vF1j/J3JZLK7LiAjJSQkyDCMjC4DAAAAAPAcGIYhk8n01H6ZNmA6ePCgxQbenp6eeu211zRkyBBzm7Ozsxo3bqyGDRuqQIECiomJUVhYmObMmaO9e/dq8eLFdoU5SUlJioyMtOs+/s7d3V3ly5d36JjA83Tu3DklJCRkdBkAAAAAgOfE1dX1qX0ybcBUtmxZzZs3T4mJiTp//rzWrVune/fuKTExUc7Of5ZdvXp1zZ492+K8l19+WRMmTNBXX32lRYsWaeDAgTbX4OLiolKlStl1H3+XltQPyMxKlCjBDCYAAAAA+Jc4ffp0mvpl2oDJ29tb9erVM38dHBys9u3b69KlS/r666+feO7gwYM1d+5c7dy5066AyWQyycPDw+bzgX8ilngCAAAAwL9HWifKZJlNvr29vdW0aVPt2rVLUVFRT+zr4eGh3LlzKyYm5jlVBwAAAAAA8O+VZQImSeanxMXGxj6x3927d3Xz5k3lyZPneZQFAAAAAADwr5bpAqabN2+m2h4VFaXt27fL09NTJUuWlCTdunXLqp9hGPrf//4nwzAUGBj4TGsFAAAAAABAJtyDafbs2dq7d68aNmyowoULS5LOnj2rtWvXKj4+XuPGjVP27NklSa+++qry5MmjihUrys/PTzExMdq+fbsOHz6smjVrqkePHhl5KwAAAAAAAP8KmS5gatKkia5du6bvv/9eMTExevjwofLly6fGjRurT58+qly5srlvUFCQdu7cqaVLlyo2NlYuLi4qWbKkQkJC1KNHD7m4uGTgnQAAAAAAAPw7ZLqAqV69ehZPj3uSgQMH2vWUOAAAAAAAANgv0+3BBAAAAAAAgKyFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXQiYAAAAAAAAYBcCJgAAAAAAANiFgAkAAAAAAAB2IWACAAAAAACAXZwzuoC/i4mJ0RdffKHjx4/r2rVrio+PV968eVWlShW9+uqrqlChgkX/hw8fKjQ0VKtWrdLly5fl4+OjZs2aafjw4fL19c2guwAAAAAAAPj3yHQBU1xcnM6dO6d69eqpYMGCcnd31+XLl7VmzRq98sormjVrlho0aGDuHxISovXr16tJkyYaMGCAoqKitGDBAh08eFDffvutPDw8MvBuAAAAAAAA/vkyXcBUrFgxLVu2zKq9W7duatKkib766itzwPTzzz9r/fr1atq0qWbOnGnuW6FCBQ0bNkyhoaEaOnToc6sdAAAAAADg3yjL7MGUJ08eZc+eXXFxcea2devWSZL69etn0TcoKEiFChUyHwcAAAAAAMCzk+lmMKVISkpSXFycHj16pKtXryo0NFTx8fFq3Lixuc/hw4fl5OSkqlWrWp0fEBCgjRs36vbt2/Lx8bGpBsMwFB8fb9sNPIbJZJK7u7tDxwSep4SEBBmGkdFlAAAAAACeA8MwZDKZntov0wZMBw8eVO/evc1fe3p66rXXXtOQIUPMbdHR0fL19ZWrq6vV+fnz5zf3sTVgSkpKUmRkpE3nPo67u7vKly/v0DGB5+ncuXNKSEjI6DIAAAAAAM9JarnL32XagKls2bKaN2+eEhMTdf78ea1bt0737t1TYmKinJ3/LPv+/fvy9vZO9fzs2bOb+9jKxcVFpUqVsvn81KQl9QMysxIlSjCDCQAAAAD+JU6fPp2mfpk2YPL29la9evXMXwcHB6t9+/a6dOmSvv76a0mSm5ubEhMTUz3/wYMH5j62MplMPIUO+BuWeAIAAADAv0daJ8pkmU2+vb291bRpU+3atUtRUVGSJD8/P926dSvVkOnatWvmPgAAAAAAAHh2skzAJP3fcrfY2FhJUuXKlZWcnKzDhw9b9T106JCKFi1q8/5LAAAAAAAASJtMFzDdvHkz1faoqCht375dnp6eKlmypCSpffv2kqTQ0FCLvlu3btXly5fNxwEAAAAAAPDsZLo9mGbPnq29e/eqYcOGKly4sCTp7NmzWrt2reLj4zVu3DjzBt716tVTmzZttHHjRr3++utq1qyZoqKiNH/+fJUqVUr9+vXLyFsBAAAAAAD4V8h0AVOTJk107do1ff/994qJidHDhw+VL18+NW7cWH369FHlypUt+o8bN07+/v5avXq1PvnkE/n4+Kh9+/YaPny4cuTIkUF3AQAAAAAA8O+R6QKmevXqWTw97mlcXFw0aNAgDRo06BlWBQAAAAAAgMfJdHswAQAAAAAAIGshYAIAAAAAAIBdCJgAAAAAAABgFwImAAAAAAAA2IWACQAAAAAAAHaxO2BKTEzUtWvXdOfOHUfUAwAAAAAAgCzGOb0n3L17V5s3b9aePXt04MABxcTEmI9ly5ZNZcqUUZ06ddSiRQtVqVLFocUCAAAAAAAg80lzwHTt2jVNnz5dGzduVHx8vCTJy8tLJUqUkLe3tx48eKDbt2/rxIkTOn78uEJDQ1WuXDn1799fbdq0eWY3AAAAAAAAgIyVpoBp8uTJmj9/vhITE1WvXj21bt1a1apVU9GiRa36xsfH6+jRo9q9e7c2bNigd955RwsXLtTo0aNVtmxZh98AAAAAAAAAMlaaAqbQ0FB17dpVAwYMUL58+Z7Y18PDQ7Vr11bt2rX11ltvaefOnZo2bZrCwsIImAAAAAAAAP6B0hQwbd26Vfnz50/34CaTSU2bNlXTpk1148aNdJ8PAAAAAACAzC9NT5GzJVz6u7x589o9BgAAAAAAADKfNAVMAAAAAAAAwOOk+SlyT/Ljjz/q66+/1qlTpyRJpUuX1sCBA9WgQQNHDA8AAAAAAIBMzO4ZTMuXL9egQYN0/fp11alTRwEBATp58qQGDhyoVatWOaJGAAAAAAAAZGJ2z2CaNWuWevTooZEjR5rb4uLi1L17d82ePVudOnWy9xIAAAAAAADIxNI8g+l///ufEhMTrdqjo6PVvHlzizZPT0/Vr19fV69etb9CAAAAAAAAZGppDphWr16t9u3b6+DBgxbtxYoV07fffqv79++b26KiorR161YVL17cYYUCAAAAAAAgc0pzwLRp0yaVLl1aPXv21JgxY5SQkCBJGj58uLZs2aIGDRrolVdeUYcOHfTSSy8pOjpaw4cPf1Z1AwAAAAAAIJNIc8CUO3duTZkyRV9++aW2bNmitm3b6pdfflFQUJBWrlyphg0b6uHDh3JyclLLli21evVqNWvW7FnWDgAAAAAAgEwg3Zt8v/TSS6pbt64+/fRT9evXT507d9a7776riRMnPov6AAAAAAAAkMmleQbTX3l7e2vChAmaOXOmfvzxR7Vp00Y//vijo2sDAAAAAABAFmBTwJSicePG2rRpk+rXr69Bgwbpvffe0507dxxVGwAAAAAAALKAdAVMP/74owYNGqS2bdtq0KBB+vHHH5UzZ0599tlnCg0N1YEDB9S6dWtt27btWdULAAAAAACATCbNAdPmzZs1aNAgHTp0SO7u7jp06JBef/11bdy4UZJUr149bdiwQS1atNCwYcM0fPhwxcTEPLPCAQAAAAAAkDmkOWCaNWuWSpcurR07dmj58uXasWOHSpYsqTlz5pj7eHh4aNSoUVq0aJEiIyPVqlWrZ1I0AAAAAAAAMo80B0yXLl1SgwYNlDNnTklSzpw51bBhQ126dMmqb40aNbR+/XoFBwc7rlIAAAAAAABkSmkOmAoXLqyDBw8qOTnZ3Hbo0CEVLlw41f7Zs2fXe++9Z3+FAAAAAAAAyNSc09rxtdde07vvvqtWrVqpQoUKioyM1NmzZzVu3LhnWR8AAAAAAAAyuTQHTO3atVOOHDm0bNkynThxQgULFtRbb72lwMDAZ1kfAAAAAAAAMrk0B0yS1KxZMzVr1uxZ1QIAAAAAAIAsKM17MAEAAAAAAACpSVPAdO3aNbsvdP36dbvHAAAAAAAAQOaTpoCpefPmGjt2bLqDJsMwFBYWpg4dOmj58uU2FQgAAAAAAIDMLU17ML366qsKDQ3VkiVLVLduXbVs2VLVq1dX8eLFrfreu3dPR44c0e7du7VhwwbduHFDlStXVosWLRxdOwAAAAAAADKBNAVMw4YN0yuvvKLp06dr48aN2rNnjyQpZ86cyp07t7y9vfXgwQPdvn1bN27cUHJysgzDULly5fTee++pdevWz/QmAAAAAAAAkHHS/BQ5Pz8/ffrpp3rvvfe0YcMG/fzzzzp48KDOnz9v7uPi4qKyZcuqVq1aCgoKUtWqVZ9ByQAAAAAAAMhM0hwwpciZM6e6deumbt26SZKSkpJ0+/Ztubm5ydPT0+EFAgAAAAAAIHNLd8D0dy4uLsqbN68jagEAAAAAAEAWlKanyAEAAAAAAACPQ8AEAAAAAAAAuxAwAQAAAAAAwC4ETAAAAAAAALALARMAAAAAAADsQsAEAAAAAAAAu9gUMO3fv19Xrlx5Yp+rV69q//79NhUFAAAAAACArMOmgKl3795avXr1E/usXbtWvXv3tqkoAAAAAAAAZB02BUyGYaSpj8lksmV4AAAAAAAAZCHPbA+mK1euKEeOHM9qeAAAAAAAAGQSzmntOG3aNIuvw8PDrdokKTk5WVevXtWmTZtUvXp1+ysEAAAAAABApmZTwGQymRQeHq7w8PDH9s+fP7/efvtt+6oDAAAAAABAppfmgGnhwoWS/txbqU+fPgoODlZwcLBVPycnJ/n6+qpEiRJycnpmK/AAAAAAAACQSaQ5YKpVq5b598HBwQoMDLRoAwAAAAAAwL9TmgOmv/r8888dXQcAAAAAAACyKJsCpr9KSEhQbGysHj16lOrxggUL2nsJAAAAAAAAZGI2B0xr167V119/rTNnzjy2j8lkUkREhK2XAAAAAAAAQBZgU8C0evVqvf/++8qWLZtq1KghPz8/OTvbPRkKAAAAAAAAWZBNqVBoaKi8vb31zTffqGTJko6uCQAAAAAAAFmIky0nXbhwQUFBQYRLAAAAAAAAsC1g8vb2lqurq6NrAQAAAAAAQBZkU8DUpEkThYeHyzAMR9cDAAAAAACALMamgOmtt95SYmKiPvroI927d8/RNQEAAAAAACALsWmT7zfffFPu7u5asWKFNmzYoOLFi8vT09Oqn8lk0oIFC9I19vnz57Vhwwbt2bNHly5d0r1791SwYEHVq1dPAwcOVL58+cx99+3bp969e6c6jo+Pj/bt25e+GwMAAAAAAEC62RQwhYeHm3+fkJCgyMjIVPuZTKZ0j71y5UotWbJETZo0UcuWLeXm5qbffvtN33zzjdavX6+lS5dabS7epUsXVa9e3aIte/bs6b42AAAAAAAA0s+mgOnEiROOrsMsKChIAwcOlJeXl7mtS5cuqlq1qkaNGqUpU6Zo8uTJFudUrVpV7du3f2Y1AQAAAAAA4PFs2oPpWapUqZJFuJSidevWkqSTJ0+mel5CQoLu37//TGsDAAAAAACAtUwXMD3OtWvXJEl58uSxOvbZZ5+patWqqlKliho1aqSJEycqISHheZcIAAAAAADwr2TTEjlJSk5O1pIlS7RhwwadOXNGCQkJioiIkCRFRERo+fLl6tOnj0qUKOGQQlOWxXXs2NHc5uzsrMaNG6thw4YqUKCAYmJiFBYWpjlz5mjv3r1avHix3N3dbb6mYRiKj4+3u/a/MplMdtUEZLSEhAQZhpHRZQAAAAAAngPDMNK0x7ZNAVNiYqJee+01hYeHy9vbWzly5LAIYgoXLqxVq1YpV65cGjZsmC2XsDBr1ix9//33CgwMVHBwsLm9evXqmj17tkXfl19+WRMmTNBXX32lRYsWaeDAgTZfNykp6bEbmNvK3d1d5cuXd+iYwPN07tw5ZggCAAAAwL+Iq6vrU/vYFDDNnTtX+/bt09ChQzV48GBNnz5dM2bMMB/38vJSzZo1tXv3brsDpgULFmjSpEmqVauWJkyYkKbUbPDgwZo7d6527txpV8Dk4uKiUqVK2Xx+amx5sh6QmZQoUYIZTAAAAADwL3H69Ok09bMpYNqwYYOqVaumoUOHSko9NClcuLB27Nhhy/Bm8+bN07hx41S3bl3NnDkzzUvLPDw8lDt3bsXExNh1fZPJJA8PD7vGAP5pWOIJAAAAAP8eaZ0oY9Mm31FRUapSpcoT+3h7e+vOnTu2DC9JmjNnjsaNG6cGDRpo9uzZ6fqh9u7du7p582aqG4IDAAAAAADAsWwKmLJnz664uLgn9rly5Yq8vLxsKmrWrFmaOHGimjRpohkzZih79uyp9rt165ZVm2EY+t///ifDMBQYGGjT9QEAAAAAAJB2Ni2RK1u2rPbs2aPExMRUN3qKi4vT7t27FRAQkO6xlyxZokmTJilPnjxq3ry5vvvuO4vjOXLkMAdHr776qvLkyaOKFSvKz89PMTEx2r59uw4fPqyaNWuqR48ettweAAAAAAAA0sGmgKlLly5655139M4772js2LEWx2JjYxUSEqLY2Fh169Yt3WMfPXpUknTz5k29//77VscLFSpkDpiCgoK0c+dOLV26VLGxsXJxcVHJkiUVEhKiHj16yMXFxYa7AwAAAAAAQHqYDBsfBxUSEqI1a9bI2dlZ3t7eiomJUbly5XT69GklJiaqR48eGjlypKPrfW5Sgq5KlSo9k/HffH2azpy68kzGBp6FkqULavKsoRldBgAAAADgOUprPmLTDCZJ+vzzz1WzZk0tXLhQJ0+elGEYioiIUOnSpdW3b1916tTJ1qEBAAAAAACQhdgcMElSx44d1bFjR92/f1937tyRp6enPDw8HFUbAAAAAAAAsgC7AqYUbm5ucnNzc8RQAAAAAAAAyGKcMroAAAAAAAAAZG02z2A6cuSIvvrqK0VGRio6OlqPHj2y6mMymRQREWFXgQAAAAAAAMjcbAqYtmzZorfeekvJyckqVKiQKleurGzZsjm6NgAAAAAAAGQBNgVM06ZNk7u7u2bPnq0aNWo4uiYAAAAAAABkITbtwXThwgW1bt2acAkAAAAAAAC2BUx58+aVi4uLo2sBAAAAAABAFmRTwBQUFKQ9e/YoMTHR0fUAAAAAAAAgi7EpYBo2bJi8vLw0fPhwXb582dE1AQAAAAAAIAuxaZNvd3d3jR49Wn369FFgYKC8vLyUM2dOq34mk0lhYWF2FwkAAAAAAIDMy6YZTAcOHFC3bt10584dZcuWTW5ubjIMw+pXcnKyo+sFAAAAAABAJmPTDKYJEyYoKSlJ48ePV9u2beXkZFNOBQAAAAAAgH8AmwKmkydPqk2bNmrfvr2j6wEAAAAAAEAWY9PUIw8PD3l7ezu6FgAAAAAAAGRBNgVMDRs21P79+x1dCwAAAAAAALIgmwKmd955R3fv3tUnn3yi+Ph4R9cEAAAAAACALMSmPZj++9//KkeOHFq2bJnWrl2rEiVKKGfOnFb9TCaTFixYYHeRAAAAAAAAyLxsCpjCw8PNv09ISFBERESq/Uwmk21VAQAAAAAAIMuwKWA6ceKEo+sAAAAAAABAFmXTHkwAAAAAAABACgImAAAAAAAA2MXmgCk5OVmLFi3SK6+8ourVq6t8+fLmYxEREfr444917tw5hxQJAAAAAACAzMumPZgSExP12muvKTw8XN7e3sqRI4fi4+PNxwsXLqxVq1YpV65cGjZsmMOKBQAAAAAAQOZj0wymuXPnat++fRoyZIj27t2rzp07Wxz38vJSzZo1tXv3bocUCQAAAAAAgMzLpoBpw4YNqlatmoYOHSonJyeZTCarPoULF9aVK1fsLhAAAAAAAACZm00BU1RUlKpUqfLEPt7e3rpz545NRQEAAAAAACDrsClgyp49u+Li4p7Y58qVK/Ly8rKpKAAAAAAAAGQdNgVMZcuW1Z49e5SYmJjq8bi4OO3evVuVKlWyqzgAAAAAAABkfjYFTF26dNHVq1f1zjvv6O7duxbHYmNjNWLECMXGxqpbt24OKRIAAAAAAACZl7MtJ7Vp00Z79uzRmjVrtGPHDnl7e0uSOnbsqNOnTysxMVE9evRQo0aNHFosAAAAAAAAMh+bAiZJ+vzzz1WzZk0tXLhQJ0+elGEYioiIUOnSpdW3b1916tTJkXUCAAAAAAAgk7I5YJL+nLHUsWNH3b9/X3fu3JGnp6c8PDwcVRsAAAAAAACyAJsCpuTkZDk5/d/2TW5ubnJzc3NYUQAAAAAAAMg6bNrku1GjRvriiy906tQpR9cDAAAAAACALMamgOn+/fuaO3eu2rVrp06dOmnJkiW6ffu2g0sDAAAAAABAVmBTwLRnzx59+eWXatCggU6cOKExY8aoQYMGeuONN7R9+3Y9evTI0XUCAAAAAAAgk7JpDyZXV1e1atVKrVq10s2bN7V+/XqtWbNG27ZtU1hYmHx9fdWmTRt16NBB5cuXd3TNAAAAAAAAyERsmsH0V3ny5FH//v21YcMGrV69Wj179pTJZNLChQv18ssvO6JGAAAAAAAAZGI2zWB6nPLly8vDw0Ourq5asGABS+UAAAAAAAD+BRwSMMXFxWnTpk1au3atDh8+LEnKkSOHXnrpJUcMDwAAAAAAgEzM5oApOTlZu3bt0po1a7Rz504lJibKZDKpbt26Cg4OVvPmzeXm5ubIWgEAAAAAAJAJ2RQwjRs3Ths3btQff/whwzBUvHhxBQcHq3379vLz83N0jQAAAAAAAMjEbAqY5s+fL09PT3Xu3FnBwcEKCAhwdF0AAAAAAADIImwKmL788ksFBgbK1dXV0fUAAAAAAAAgi7EpYGrVqpWj6wAAAAAAAEAWZddT5K5cuaK1a9cqMjJSsbGx8vT0VIUKFdSuXTsVKlTIUTUCAAAAAAAgE7M5YFq+fLnGjBmjpKQkGYZhbg8LC9OMGTP0wQcfqGvXrg4pEgAAAAAAAJmXTQHTzz//rI8++kg5cuTQgAEDVKdOHeXNm1c3btzQL7/8okWLFmn06NEqVqyY6tat6+iaAQAAAAAAkInYFDB9/fXXypEjh1avXq2iRYua21944QXVrl1bwcHB6tixo77++msCJgAAAAAAgH84J1tOOnr0qFq2bGkRLv1V0aJF9dJLL+no0aN2FQcAAAAAAIDMz6aA6f79+/L19X1in1y5cun+/fs2FQUAAAAAAICsw6aAqWDBgvrll1+e2Gffvn0qUKCATUUBAAAAAAAg67ApYGrevLmOHj2qjz/+WLGxsRbH7t69qzFjxujIkSNq0aKFQ4oEAAAAAABA5mXTJt+DBg3Sjh07tGzZMm3YsEFly5ZV3rx5dfPmTZ04cUJ3797VCy+8oEGDBjm6XgAAAAAAAGQyNs1gypkzp5YtW6ZXXnlFycnJ+vXXX7VlyxYdOHBAjx490iuvvKKlS5cqZ86cjq4XAAAAAAAAmYxNM5gkydPTU6NHj9bIkSN17tw5xcXFydPTUyVKlJCLi4sjawQAAAAAAEAmZlPAVK5cObVq1UoTJ06Ui4uL/P39HV0XAAAAAAAAsgiblsjlyJFDBQsWdHQtAAAAAAAAyIJsCpjKlSun06dPO7oWAAAAAAAAZEE2BUyvvfaafvrpJ+3Zs8fR9QAAAAAAACCLsWkPppiYGDVo0ECvvfaaAgMDVbFiReXNm1cmk8mqb4cOHeytEQAAAAAAAJmYTQHTiBEjZDKZZBiGtm7dqq1bt0qSRcBkGIZMJlO6A6bz589rw4YN2rNnjy5duqR79+6pYMGCqlevngYOHKh8+fJZ9H/48KFCQ0O1atUqXb58WT4+PmrWrJmGDx8uX19fW24PAAAAAAAA6WBTwPT55587ug6zlStXasmSJWrSpIlatmwpNzc3/fbbb/rmm2+0fv16LV26VCVLljT3DwkJ0fr169WkSRMNGDBAUVFRWrBggQ4ePKhvv/1WHh4ez6xWAAAAAAAA2BgwBQcHO7oOs6CgIA0cOFBeXl7mti5duqhq1aoaNWqUpkyZosmTJ0uSfv75Z61fv15NmzbVzJkzzf0rVKigYcOGKTQ0VEOHDn1mtQIAAAAAAMDGTb6fpUqVKlmESylat24tSTp58qS5bd26dZKkfv36WfQNCgpSoUKFzMcBAAAAAADw7Ng0gynFvXv3tG3bNkVGRiouLk6enp4qV66cmjdvrhw5cjiqRknStWvXJEl58uQxtx0+fFhOTk6qWrWqVf+AgABt3LhRt2/flo+Pj03XNAxD8fHxNp37OCaTSe7u7g4dE3ieEhISZBhGRpcBAAAAAHgOUvbYfhqbA6bvvvtOH3/8sWJjYy1+2DSZTPr888/1ySef6KWXXrJ1eCspy+I6duxobouOjpavr69cXV2t+ufPn9/cx9aAKSkpSZGRkTad+zju7u4qX768Q8cEnqdz584pISEho8sAAAAAADwnqeUuf2dTwLRnzx69/fbbcnJyUocOHVSrVi3lyZNHN2/e1L59+7Rx40a9/fbb8vLyUr169Wy5hIVZs2bp+++/V2BgoMX+T/fv35e3t3eq52TPnt3cx1YuLi4qVaqUzeenJi2pH5CZlShRghlMAAAAAPAvcfr06TT1sylgmj59ulxdXbVkyRJVqFDB4lhwcLB69Oihnj17avr06XYHTAsWLNCkSZNUq1YtTZgwwSKgcXNzU2JiYqrnPXjwwNzHViaTiafQAX/DEk8AAAAA+PdI60QZmzb5joyMVMuWLa3CpRSVKlVSy5YtFRERYcvwZvPmzdPYsWNVt25dzZkzx+oHWz8/P926dSvVkCllzyY/Pz+7agAAAAAAAMCT2RQwubq6Kl++fE/sky9fvjSt0XucOXPmaNy4cWrQoIFmz56d6qyJypUrKzk5WYcPH7Y6dujQIRUtWtTm/ZcAAAAAAACQNjYFTNWrV9fBgwef2OfgwYOqUaOGTUXNmjVLEydOVJMmTTRjxgzzfkp/1759e0lSaGioRfvWrVt1+fJl83EAAAAAAAA8OzbtwfTOO++oa9eumjBhggYPHmyxT1F8fLymTZumU6dOaenSpekee8mSJZo0aZLy5Mmj5s2b67vvvrM4niNHDgUGBkqS6tWrpzZt2mjjxo16/fXX1axZM0VFRWn+/PkqVaqU+vXrZ8vtAQAAAAAAIB1sCpi++uorlSlTRnPnztXy5ctVvnx55c6dW3/88YciIiIUFxenGjVq6KuvvrI4z2QyaezYsU8c++jRo5Kkmzdv6v3337c6XqhQIXPAJEnjxo2Tv7+/Vq9erU8++UQ+Pj5q3769hg8frhw5cthyewAAAAAAAEgHk2HD88bLli1r28VMJkVGRtp07vOWEnRVqlTpmYz/5uvTdObUlWcyNvAslCxdUJNnDc3oMgAAAAAAz1Fa8xGbZjBt377dltMAAAAAAADwD2RTwFSoUCFH1wEAAAAAAIAsyqanyAEAAAAAAAApbJrBlCI5OVnXrl1TdHS0Hj58mGqfmjVr2nMJAAAAAAAAZHI2B0xff/21QkNDdevWrSf2yyqbegMAAAAAAMA2NgVMU6dO1fTp0+Xj46MOHToof/78cna2azIUAAAAAAAAsiibUqGVK1eqSJEiWr16tTw9PR1dEwAAAAAAALIQmzb5vn37tpo2bUq4BAAAAAAAANsCpqJFiyo2NtbRtQAAAAAAACALsilg6t69u3bu3KkbN244uh4AAAAAAABkMTbtwdStWzedP39e3bp105AhQ1S+fPnHLpcrWLCgXQUCAAAAAAAgc7P50W9ly5bVmjVr9P777z+2j8lkUkREhK2XAAAAAAAAQBZgU8C0YsUKjRo1StmyZVOtWrWUL18+OTvbnFUBAAAAAAAgC7MpFZo7d65y586tpUuXqkiRIo6uCQAAAAAAAFmITZt8X7lyRUFBQYRLAAAAAAAAsC1gyp8/v5KSkhxdCwAAAAAAALIgmwKm9u3b66efftLdu3cdXQ8AAAAAAACyGJsCptdff12VK1dWv379tG/fPoImAAAAAACAfzGbNvmuVKmSJMkwDPXt2/ex/UwmkyIiImwqDAAAAAAAAFmDTQFTjRo1HF0HAAAAAAAAsiibAqZFixY5ug4AAAAAAABkUTbtwQQAAAAAAACkIGACAAAAAACAXdK8RG7t2rU2XaBDhw42nQcAAAAAAICsIc0B04gRI2QymdJ9AQImAAAAAACAf7Y0B0wdOnSwKWACAAAAAADAP1uaA6Zx48Y9yzoAAAAAAACQRbHJNwAAAAAAAOxCwAQAAAAAAAC7EDABAAAAAADALgRMAAAAAAAAsAsBEwAAAAAAAOxCwAQAAAAAAAC7EDABAAAAAADALgRMAAAAAAAAsIuzPSfv2LFDGzZs0JkzZ5SQkKBt27ZJks6cOaMdO3aoXbt2yp8/v0MKBQAAAAAAQOZkU8BkGIZGjBih9evXS5Lc3Nx0//5983EvLy9NmjRJhmFo4MCBjqkUAAAAAAAAmZJNS+S++eYbrVu3Th07dlR4eLj69+9vcTxv3ryqVq2afvzxR4cUCQAAAAAAgMzLpoBp5cqVKlu2rMaMGSNPT0+ZTCarPsWKFVNUVJTdBQIAAAAAACBzsylgOnfunGrXrp1qsJQid+7ciomJsbkwAAAAAAAAZA02BUzZsmXTgwcPntjn2rVr8vDwsKkoAAAAAAAAZB02BUylSpVSeHi4DMNI9fiDBw/0yy+/qHz58nYVBwAAAAAAgMzPpoCpXbt2Onv2rMaOHavk5GSLY48ePdLnn3+u69evKzg42CFFAgAAAAAAIPNytuWkrl27aseOHVq0aJG2bNmiHDlySJKGDRum3377TdevX1ezZs3Url07hxYLAAAAAADSbsuWLdq/f78iIyN14sQJ3bt3T23bttWECROs+kZFRalZs2aPHatVq1aaNGlSuq5/8OBBzZw5U4cPH9b9+/dVrFgxderUSb169VK2bNlSPWfnzp0KDQ1VRESEkpOTVapUKXXv3j3VSSw3btzQuHHjtHfvXplMJtWrV08hISHKnTu3Vd9JkyZpyZIl2rRpk/Lnz5+u+8DT2RQwZcuWTbNnz9bMmTO1ePFi3bhxQ5K0detWeXl5afDgwRo8eLBDCwUAAAAAAOkzc+ZMnThxQh4eHvLz89PZs2efek7ZsmUVGBho1V66dOl0XTssLEzDhg1T9uzZ1bJlS3l7e2vnzp36/PPPdfDgQU2ZMsXqnMWLF+vTTz+Vj4+P2rVrJxcXF33//fcaMWKEfv/9d7333nvmvsnJyXr99dd1+vRpBQcH6/79+1q/fr0uXryoZcuWycnp/xZtRUZG6uuvv9bHH39MuPSM2BQwSZKzs7PeeOMNDR06VOfOndPt27fl6empF1544bEpJAAAAAAAeH5CQkLk5+enYsWKKTw8XL17937qOeXKldMbb7xh13Xv3r2rkSNHysnJSQsXLlSlSpUkScOHD1efPn30/fffa9OmTWrdurX5nKioKI0fP14+Pj5atWqVChcuLEkaMmSIXn75ZYWGhqpFixYKCAiQJB09elTHjh3T+PHj1aFDB0lS4cKFNXXqVB07dkyVK1eWJD18+FAhISGqVauWOnfubNd94fFs2oPpr0wmk1544QVVq1ZNpUuXJlwCAAAAACCTqFOnjooXLy6TyfRcr7tlyxbFxMSodevW5nBJkrJnz64333xTkrR06VKLc1atWqXExET16NHDHC5Jkre3twYNGiRJWrZsmbn98uXLkmQxfsrvU45J0pw5c3ThwgV9+umnjro9pMLmGUwAAAAAAOCf5/r161q2bJlu374tHx8fVa1aVWXLlk3XGL/88oskqUGDBlbHatasKXd3dx06dEiJiYlydXV96jkNGza06CNJBQsWlCQdP35cJUuWlCQdO3ZMklSoUCFJ0unTpzVjxgyNGDHCIrSC49kUMKVlSp2Tk5Ny5sypkiVLKjAw0CJRBAAAAAAAmdOePXu0Z88ei7ZatWpp/Pjx5lDnac6dOydJKl68uNUxZ2dnFS5cWKdOndKlS5fM4dCTzsmXL588PDwUHR2thIQEubu7q1KlSqpQoYI++ugjHTp0yLwHU6VKlVSxYkU9evRI77//vqpUqaIePXqk4xWALWwKmMLDwyX9uTzOMAyr439tDwsL05w5c9S1a1d99NFHdpQKAAAAAACeFXd3dw0ePFiBgYEqUqSIJOnkyZOaOnWq9u3bp759+2rt2rXy8PB46lh3796VJHl6eqZ6PGfOnJKk2NjYdJ0THx+vuLg4ubu7K1u2bJo5c6Y+//xzfffddzKZTAoKClJISIicnJw0d+5cnTx5UuvWrVNsbKw+/fRTbd++XQ8fPlT9+vX1ySefsOG3A9kUMB05ckRvvfWWzpw5o8GDB6t69erKkyePbt68qQMHDmjmzJkqVaqUPvzwQ50+fVoTJ07UsmXLVLFiRXXq1MnR9wAAAAAAAOyUO3du8/5IKWrWrKnQ0FB1795dhw8f1ooVK9SnT58MqtBa/vz59f/+3/+zaj9//rymTJmiYcOGqXjx4ho8eLDCw8P10UcfKWfOnBo9erSGDh2q5cuXP/f9qf6pbNrke8aMGTp27JhWrFihtm3bqmDBgnJ1dVXBggXVrl07LV++XEeOHNGyZctUv359zZ07V15eXlqxYoWj6wcAAAAAAM+Qs7Oz+elrBw4cSNM5KTOU4uLiUj2eMlvJy8sr3ec8boZTCsMw9MEHH8jf3199+/bV+fPntX37dvXv318dOnRQYGCg3nrrLR05csRiTyfYx6aAacOGDWrevLn5D//vPD091aJFC61fv16S5Ovrq4YNG+r06dO2VwoAAAAAADKEr6+vJCk+Pj5N/UuUKCHpz5lEf/fw4UNFRUXJ2dnZvBTvaedcv35d8fHx8vPzk7u7+xOvvWTJEh0+fFiff/65smXLpjNnzkiSKlSoYO5TsWJFSSKncCCbAqbr16/L2fnJq+ucnZ1148YN89d+fn568OCBLZcDAAAAAAAZ6PDhw5JkEQg9SZ06dSRJu3btsjq2f/9+JSQkKCAgwPwEuaed89NPP1n0eZyoqChNnDhRgwcPVqlSpSyOJSYmmn9PPuF4NgVM+fPn186dO/Xw4cNUjyclJWnHjh3Kly+fuS0mJsZi6hsAAAAAAMg8jh8/ruTkZKv2n3/+WfPnz5cktWvXzuJYXFyczpw5o+vXr1u0v/TSS/L19dWmTZt09OhRc/uDBw80efJkSVK3bt0szunYsaNcXV21ZMkSRUVFmdvv3Lmj2bNnS5K6du36xHsYOXKkihUrpoEDB5rbUoKmHTt2mNt27txpcQz2s2mT7/bt22v69Onq16+fhg8froCAADk5OSk5OVkHDx7U5MmTdfHiRQ0ePNh8zqFDh/iDAwAAAADgOQoLC1NYWJgkmVcZ/fbbbxoxYoSkP5e+vffee5KkcePG6fz58woICJCfn5+kP58il7JP0Ztvvqlq1apZjL9t2zaFhIQoODhY48aNM7fnzJlTY8aM0bBhw9S7d2+1atVK3t7e2rFjh86dO6egoCC1atXKYqwiRYro3Xff1ZgxY9SpUye1atVKLi4u+v777xUdHa3+/fsrICDgsfe6YsUKhYeHa8WKFRarrooVK6bmzZtr9erVio+PV86cObVmzRpVrlz5qTOikHY2BUyDBg3SsWPH9OOPP6pnz55ycnKSt7e37ty5o+TkZBmGoQYNGmjQoEGS/lxSV7ZsWbVo0cKhxQMAAAAAgMeLjIzUmjVrLNouXbqkS5cuSZIKFSpkDpjatWunsLAwHTt2TLt27VJSUpLy5Mmjli1bqmfPnqpRo0a6rh0YGKhFixZp1qxZ2rp1qx48eKBixYopJCREvXr1SvXpbb169VKhQoUUGhqqtWvXyjAMlSxZUsOHD1dwcPBjr3Xt2jWNHz9er776qsqXL291fOzYscqRI4e2b9+uhw8fqnHjxvroo494gpwDmQzDMGw9ee3atVq7dq0iIyN19+5d5cyZU+XKlVOHDh3UoUMHB5b5/KVM4atUqdIzGf/N16fpzKkrz2Rs4FkoWbqgJs8amtFlAAAAAACeo7TmIzbNYErxTwiSAAAAAAAAYB+bNvkGAAAAAAAAUhAwAQAAAAAAwC42L5G7fv26Zs6cqd27d+vatWtKSkqy6mMymRQREWFXgQAAAAAAAMjcbAqYrl27ppdffll//PGHSpUqpcTERBUsWFCurq6KiorSw4cPVa5cOeXMmdPR9QIAAAAAACCTsSlgmj59um7evKm5c+eqXr16Klu2rDp27KihQ4cqOjpaH374oS5fvqz58+fbVNScOXMUERGhiIgIXbx4UU5OTo+dCbVv3z717t071WM+Pj7at2+fTTUAAAAAAAAgbWwKmHbv3q0GDRqoXr16Vsf8/Pw0efJktW3bVlOnTtWHH36Y7vEnTpwoLy8vlStXTvHx8YqJiXnqOV26dFH16tUt2rJnz57uawMAAAAAACB9bAqYbty4oZdeesn8dbZs2fTgwQPz1zly5FC9evW0fft2mwKmbdu2qWjRopKkXr16pSlgqlq1qtq3b5/uawEAAAAAAMA+Nj1FLmfOnBabent5eenatWsWfTw9PdMUDKUmJVxKr4SEBN2/f9+mcwEAAAAAAGAbm2YwFSxYUNHR0eavy5Ytq19++UUJCQlyd3dXcnKydu/eLT8/P4cV+jSfffaZQkJCJP25TK9du3YaPHiw3N3dbR7TMAzFx8c7qkRJfz5Zz56agIyWkJAgwzAyugwAAADgmTGZTBldAmAzR/+8ZhhGmj4TNgVMdevW1fLly5WUlCQXFxd16NBB7733nrp27ap69erp4MGDOn36tAYNGmTL8Oni7Oysxo0bq2HDhipQoIBiYmIUFhamOXPmaO/evVq8eLHNgU5SUpIiIyMdWq+7u7vKly/v0DGB5+ncuXNKSEjI6DIAAACAZ8LFxUUVKpRXtmw2/bgMZKhHjx7q+PEIi1VnjuDq6vrUPjZ9Yl5++WV5eXnp1q1bypcvn9q3b6/jx49r8eLFOnnypCSpdevW+s9//mPL8OlSvXp1zZ4926q+CRMm6KuvvtKiRYs0cOBAm8Z2cXFRqVKlHFGmGUk4sroSJUowgwkAAAD/WCaTSdmyOeu736cqJv5yRpcDpFkuj0Jq6f+GSpcu7dCf2U6fPp2mfjYFTMWLF7cKbd5//329/vrrunTpkgoVKqQ8efLYMrTDDB48WHPnztXOnTttDphMJpM8PDwcXBmQtbHEEwAAAP8GMfGXdePeuYwuA0g3R//MltaJMg6d85crVy7lypXLkUPazMPDQ7lz57Z5o3EAAAAAAACkjU1PkStXrpymT5/+xD4zZ87M0L2G7t69q5s3b2b4TCoAAAAAAIB/OpsCJsMw0rSe73ns03Lr1q1Ur/u///1PhmEoMDDwmdcAAAAAAADwb/bMtsWPjY1V9uzZbTp37dq1unLliiTp8uXLMgxDM2bMMB8fPHiw+fevvvqq8uTJo4oVK8rPz08xMTHavn27Dh8+rJo1a6pHjx723QgAAAAAAACeKM0B0/79+y2+vnz5slWbJD169EhXr17Vhg0bVKJECZuKWrVqlcLDwy3aJk+ebP79XwOmoKAg7dy5U0uXLlVsbKxcXFxUsmRJhYSEqEePHnJxcbGpBgAAAAAAAKRNmgOmXr16mXcON5lMWrt2rdauXZtqX8Mw5OTkpPfee8+mohYtWpTmvgMHDrT5KXEAAAAAAACwX5oDpiFDhshkMskwDE2fPl21atVSrVq1rPo5OTnJx8dHtWvXVsmSJR1aLAAAAAAAADKfNAdMb7zxhvn3a9asUWBgoHr37v1MigIAAAAAAEDWYdMm3zt27HB0HQAAAAAAAMiinDK6AAAAAAAAAGRtNs1gkqTz589r4cKFOnLkiGJjY/Xo0SOrPiaTSWFhYXYVCAAAAAAAgMzNpoDp0KFD6tevn+7fvy9nZ2flzp1b2bJls+pnGIbdBQIAAAAAACBzsylg+vLLL5WYmKhPPvlEnTp1krOzzROhAAAAAAAAkMXZlAwdPXpUQUFB6tKli6PrAQAAAAAAQBZj0ybfLi4uKlCggKNrAQAAAAAAQBZkU8AUEBCgyMhIR9cCAAAAAACALMimgOmtt97SoUOHtHbtWgeXAwAAAAAAgKzGpj2YwsLCVKdOHYWEhGjlypWqUKGCPD09rfqZTCYNGTLE7iIBAAAAAACQedkUME2bNs38+wMHDujAgQOp9iNgAgAAAAAA+OezKWBauHCho+sAAAAAAABAFmVTwFSrVi1H1wEAAAAAAIAsyqZNvgEAAAAAAIAUNs1gSnHixAlt3LhRZ86cUUJCgubPny9JioqK0pEjR1S/fn15e3s7ok4AAAAAAABkUjYHTJMnT9bs2bOVnJws6c8NvVMYhqG3335b77//vnr16mV/lQAAAAAAAMi0bFoit2nTJs2cOVP16tXT2rVrNWjQIIvjRYoUUcWKFbVjxw6HFAkAAAAAAIDMy6YZTIsWLVKxYsU0Y8YMubq6KiwszKpPyZIlFR4ebneBAIA/bdmyRfv371dkZKROnDihe/fuqW3btpowYYJV36SkJH3zzTc6ceKEIiIidObMGSUlJWnMmDHq3Llzuq4bFRWlZs2aPfZ4q1atNGnSpCeOkZiYqI4dO+rUqVPKnz+/fvrpJ6s+u3fv1qRJk3T27Fnlz59f3bt3V69evSxmyErS/fv31b59e5UpU0ZTpkxJ170AAAAAeDZsCphOnjypjh07ytXV9bF98uXLp5s3b9pcGADA0syZM3XixAl5eHjIz89PZ8+efWzfhIQEjR07VpKUJ08e5cmTR1evXrXr+mXLllVgYKBVe+nSpZ967pdffqnLly8/9nhERIQGDhyoEiVKqGvXrvr111/12WefKVu2bOrRo4dF38mTJ+v27dsaNWpU+m8CAAAAwDNh8x5Mf/8f5b+7efOmsmfPbuvwAIC/CQkJkZ+fn4oVK6bw8HD17t37sX3d3Nw0Z84clStXTvny5dPUqVM1bdo0u65frlw5vfHGG+k+b9++fZo/f74++ugjffzxx6n2+fbbb5UjRw4tW7ZMnp6eevjwoVq3bq0lS5ZYBExHjhzRggUL9PnnnytPnjy23goAAAAAB7NpD6ZixYrp0KFDjz2enJysX3/9VaVKlbK5MACApTp16qh48eJPDfglydXVVY0aNVK+fPmeQ2WPd/fuXYWEhKhu3brq1q3bY/tduXJFJUqUkKenpyTJ2dlZ5cqV05UrV8x9EhMTFRISogYNGqh9+/bPvHYAAAAAaWdTwNSyZUtFREQoNDQ01eOzZs3SxYsX1aZNG7uKAwBkHtevX9eyZcs0a9YsLVu2TCdOnHjqOWPGjNGdO3f02WefPbFfgQIFdP78ed27d0+S9OjRI0VGRqpgwYLmPtOnT9e1a9c0evRo+24EAAAAgMPZtESuT58+2rJli7744gt999135v9NHz9+vA4cOKBjx46pSpUq6tKli0OLBQBknD179mjPnj0WbbVq1dL48eMtgqAU27Zt05o1azRmzJhUj//VK6+8ohUrVqhr165q0KCBfv31V50/f14ffvihJCkyMlJff/21Pv74Y+XPn99xNwUAAADAIWyaweTm5qaFCxeqffv2ioiI0JEjR2QYhubNm6fjx4+rXbt2+vrrr+XsbPMWTwCATMLd3V2DBw/W6tWrtX//fu3fv1+LFy9W7dq1FR4err59+yo+Pt7inJs3b2rkyJFq2LBhmp5aV7FiRc2aNUsuLi5aunSpbt++rZCQEPXo0UMPHz5USEiIatWqpc6dOys8PFwdO3ZU+fLl9eKLL2rGjBkyDONZ3T4AAACANLA5AfL09NS4ceM0YsQIHT16VLdv35anp6cqV66sXLlyObJGAEAGyp07t958802Ltpo1ayo0NFTdu3fX4cOHtWLFCvXp08d8/MMPP9SjR480ZsyYNF+nUaNGatSokVX7rFmzdOHCBU2bNk3Xrl3TwIEDValSJX311Vc6dOiQJk+eLG9vb6unzQEAAAB4fmyawfRXPj4+atCggdq2bavGjRsTLgHAv4Szs7N5dtKBAwfM7WvXrtXOnTv1wQcf2L2c7fTp05oxY4befvttFS5cWN98843u37+v//3vf6pfv76GDh2qOnXq6KuvvrLrOgAAAADsY1PAFBMTo/379+vu3bupHr97967279+vmJgYu4oDAGRuvr6+kmSxRO748eOSpPfee09lypSx+CVJ165dM38dGxv72LEfPXqk999/X1WqVDHPTjpz5ox8fX1VoEABc78KFSro6tWrj/07CQAAAMCzZ9MSuRkzZmjNmjXavXt3qsednJz0+uuvq3PnzhoxYoRdBQIAMq/Dhw9LkooUKWJuCwgIsNqTKcXKlSvl7u6u1q1bS5JcXV0fO/b8+fN18uRJrVu3zvwwCUlKTEy06Pf3rwEAAAA8fzYFTHv37lX9+vXl7u6e6nEPDw/Vr1//sQEUACDziYuL0/Xr1+Xp6al8+fKZ248fP65y5crJycly0uvPP/+s+fPnS5LatWtnbm/VqpVatWqV6jVWrlwpLy8vffbZZ0+s5fz585oyZYqGDRum4sWLm9tLliypbdu2af/+/apZs6YePnyoXbt2qUCBAsqZM2c67xgAAACAo9gUMF29elVNmjR5Yp8iRYpYPc4aAGC7sLAwhYWFSZJu3LghSfrtt9/MM0V9fX313nvvmfvPmTNHZ8+elSRFRkZKklatWqVff/1VklS9enWLJ7xt27ZNISEhCg4O1rhx48zt48aN0/nz5xUQECA/Pz9J0smTJ/XLL79Ikt58801Vq1bNYfdpGIY++OAD+fv7q2/fvhbHevTooYULF+qNN95QmzZtdOzYMZ0/f16jRo1y2PUBAAAApJ9NAZPJZFJSUtIT+yQlJSk5OdmmogAA1iIjI7VmzRqLtkuXLunSpUuSpEKFClkETLt27VJ4eLhF/0OHDunQoUPmr/8aMD1Ou3btFBYWpmPHjmnXrl1KSkpSnjx51LJlS/Xs2VM1atSw57asLFmyRIcPH9batWuVLVs2i2P58uXTV199pXHjxmnZsmXy9fXV8OHD1b17d4fWAAAAACB9TIZhGOk9qVOnTkpISNDmzZtTPW4Yhlq3bi0XFxetW7fO7iIzwtGjRyVJlSpVeibjv/n6NJ05deWZjA08CyVLF9TkWUMzugwAAADguVjy2wjduHcuo8sA0ixvjhLqUXXc0zumU1rzEZueIhcUFKSzZ89q9OjRun//vsWx+/fva/To0Tp37txj9+AAAAAAAADAP4dNS+R69+6tTZs2aenSpQoLC1PNmjWVL18+Xb9+Xfv379f169dVtmxZ9enTx9H1AgAAAAAAIJOxKWByc3PTokWL9Mknn+i7777Tpk2bzMecnJzUpk0bjRo1Sm5ubg4rFAAAAAAAAJmTTQGTJHl5eWnixIn64IMPdPToUcXGxsrLy0uVKlVSrly5HFkjAAAAAAAAMjGbAqZmzZqpYcOG+uijj5QrVy41atTI0XUBAAAAAAAgi7Bpk++YmBh5eno6uhYAAAAAAABkQTYFTKVLl9bFixcdXQsAAAAAAACyIJsCpl69emnnzp06ceKEo+sBAAAAAABAFmPTHkx+fn6qW7euunXrpq5du6pSpUrKkyePTCaTVd+aNWvaXSQAAAAAAAAyL5sCpl69eslkMskwDM2bNy/VYClFZGSkzcUBAAAAAAAg87MpYBoyZMgTQyUAyAweJScrm5NNK4GBDMf7FwAAAFmJTQHTG2+84eg6AMDhsjk5afTcNbpw9WZGlwKkS7ECeTRqQHBGlwEAAACkmU0BEwBkFReu3tTvl6IzugwAAAAA+EezK2BKSkrSzz//rLNnz+revXsaMmSIJOnBgwe6e/eufH195cT0fgAAAAAAgH80m9Ofn376SU2bNtWgQYM0btw4TZs2zXwsMjJSL774ojZv3uyQIgEAAAAAAJB52RQwHT161LzRd0hIiNq0aWNxvGrVqipcuLC2bdvmkCIBAAAAAACQedkUMM2YMUPu7u5atWqVevfureLFi1v1qVSpkk6cOGFvfQAAAAAAAMjkbAqYDh48qGbNmilv3ryP7ePn56cbN27YXBgAAAAAAACyBpsCpvj4ePn6+j6xz/3792UYhk1FAQAAAAAAIOuwKWDKnz+/Tp8+/cQ+kZGRKly4sE1FAQAAAAAAIOuwKWBq2LChdu/erQMHDqR6/Mcff9ShQ4fUpEkTu4oDAAAAAABA5udsy0mDBg3Spk2bNGDAAPXs2VOXL1+WJP3www/av3+/vvnmG+XNm1d9+/Z1ZK0AAAAAAADIhGwKmPLnz6/Q0FANHz5cc+fONbf/5z//kWEYKlq0qKZOnapcuXI5rFAAAAAAAABkTjYFTJJUoUIFbdmyRTt37tThw4d1+/Zt5cyZU1WrVlWzZs3k7Gzz0AAAAAAAAMhC0p0CXblyRUePHpXJZFKlSpUUGBiowMDAZ1EbAAAAAAAAsoB0BUzjx4/XggULZBiGJMlkMqlPnz567733nklxAAAAAAAAyPzS/BS5jRs3at68eTIMQy+88IJKlCghwzA0f/58bdy48VnWCAAAAAAAgEwszQHTihUr5OzsrHnz5mnTpk3avHmz5s6dKycnJ61cufJZ1ggAAAAAAIBMLM0B08mTJ9W0aVPVqVPH3FavXj01a9ZMkZGRz6Q4AAAAAAAAZH5p3oMpNjZWL7zwglV7iRIlFBYW5tCi5syZo4iICEVEROjixYtycnJSRETEY/s/fPhQoaGhWrVqlS5fviwfHx81a9ZMw4cPl6+vr0NrAwAAAAAAgKU0B0zJyclydrbu7uLiYt7021EmTpwoLy8vlStXTvHx8YqJiXli/5CQEK1fv15NmjTRgAEDFBUVpQULFujgwYP69ttv5eHh4dD6AAAAAAAA8H/S9RQ5k8n0rOqwsG3bNhUtWlSS1KtXrycGTD///LPWr1+vpk2baubMmeb2ChUqaNiwYQoNDdXQoUOfec0AAAAAAAD/VukKmKZNm6Zp06aleqxcuXJWbSaT6YlL2x4nJVxKi3Xr1kmS+vXrZ9EeFBSkQoUKad26dQRMAAAAAAAAz1C6Aqb0LoVz9NK51Bw+fFhOTk6qWrWq1bGAgABt3LhRt2/flo+PT7rHNgxD8fHx9hf5FyaTSe7u7g4dE3ieEhISnstn21581vBPkFU+bwAA/JPw70hkdY7+N6RhGGla0ZbmgOnEiRN2FfSsREdHy9fXV66urlbH8ufPb+5jS8CUlJTk8Cfkubu7q3z58g4dE3iezp07p4SEhIwu46n4rOGfIKt83gAA+Cfh35HI6p7FvyFTy1z+Ll0zmDKj+/fvy9vbO9Vj2bNnN/exhYuLi0qVKmVzbal5XvtYAc9KiRIlssSMCj5r+CfIKp83AAD+Sfh3JLI6R/8b8vTp02nql+UDJjc3NyUmJqZ67MGDB+Y+tjCZTDyBDvgbpgsDzw+fNwAAAKSXo/8NmdbQ1cmhV80Afn5+unXrVqoh07Vr18x9AAAAAAAA8Gxk+YCpcuXKSk5O1uHDh62OHTp0SEWLFrVp/yUAAAAAAACkTZYPmNq3by9JCg0NtWjfunWrLl++bD4OAAAAAACAZyNT7sG0du1aXblyRZJ0+fJlGYahGTNmmI8PHjzY/Pt69eqpTZs22rhxo15//XU1a9ZMUVFRmj9/vkqVKqV+/fo99/oBAAAAAAD+TTJlwLRq1SqFh4dbtE2ePNn8+78GTJI0btw4+fv7a/Xq1frkk0/k4+Oj9u3ba/jw4cqRI8dzqRkAAAAAAODfKlMGTIsWLUpXfxcXFw0aNEiDBg16RhUBAAAAAADgcbL8HkwAAAAAAADIWARMAAAAAAAAsAsBEwAAAAAAAOxCwAQAAAAAAAC7EDABAAAAAADALgRMAAAAAAAAsAsBEwAAAAAAAOxCwAQAAAAAAAC7EDABAAAAAADALgRMAAAAAAAAsAsBEwAAAAAAAOxCwAQAAAAAAAC7EDABAAAAAADALgRMAAAAAAAAsAsBEwAAAAAAAOxCwAQAAAAAAAC7EDABAAAAAADALs4ZXQAAAAAApObnn3/W4sWL9dtvv+nOnTvy8fFRmTJl1Lt3bzVq1OiZjHP37l199dVX+v7773X58mW5ubmpcuXKevXVV1W3bl2rsc+fP6+xY8fqt99+k7u7u5o1a6a33npLOXPmtOr7zjvv6ODBg9qwYYNy5MiR/hcEADIxAiYAAAAAmc7//vc/zZ07V35+fmratKl8fX0VExOj48ePa9++fWkOmNIzzp07d9S9e3edPn1apUuXVteuXRUfH6/t27erb9++GjNmjDp37mzuHx8fr759+yohIUHt27fXtWvXtGTJEt28eVNTpkyxqOOHH37Qhg0bNG/ePMIlAP9IBEwAAAAAMpXly5dr7ty5Cg4O1ujRo+Xq6mpxPCkp6ZmMM3XqVJ0+fVotWrTQpEmT5Oz8549Lb731ljp16qQxY8aoQYMG8vPzk/RnaHT16lUtXrxYNWvWlCSFhIRo9erV+uOPP5Q7d25JUlxcnEaNGqWXX35Z9erVS/8LAgBZAHswAQAAAMg0EhMTNWnSJBUsWDDVUEiSXFxcnsk4YWFhkqRhw4aZwyVJyp07t/r27av79+9r5cqV5vbLly9LkipXrmxuq1SpksUxSRo3bpwkacSIEU+tGwCyKmYwAQAAAMg09uzZo5iYGPXp00dOTk764Ycf9Pvvvyt79uyqXLmyAgICntk4N2/elCQVKVLE6lhK2y+//KKhQ4dKkgoWLChJOnbsmKpXr27+vSQVKlRIkrR3716tXLlSs2bNkqenZ3peCgDIUgiYAAAAAGQaR48elSRlz55dwcHB+v333y2O16xZU1OmTFGuXLkcPo6Pj49u3LihqKgolSpVyqL/pUuXJEnnzp0ztzVu3Fh+fn4aMmSI2rVrp+joaH3//fdq0aKFcufOrXv37unDDz9U27Zt1aRJk3S+EgCQtbBEDgAAAECm8ccff0iS5s6dK0lasmSJDh78/9u787gqysWP498DIhJKqCAYaCS5o2WSuaa4hNkiWpY308zMzFtX69pNrqFWXElN01RScxet1NyqW9xcKHHJBcqN1FBzQS2FTGSH8/vDHyeP56DAoCx+3q+Xr1c888wzz5x4ODPfmXkmTuvWrVP79u21c+dODR8+/Ia006lTJ0nShx9+qNzcXEt5cnKyFi1aJOnyROD5XF1dtWDBAgUEBGj16tWKj49X3759FRERIUmaPHmyMjMzNXr0aCUlJWno0KGWu6f+9a9/KTU1tTgfEQCUSdzBBAAAAKDMMJvNkiRHR0d99NFH8vX1lSQ1bNhQM2bMUPfu3bVjxw7Fx8df83G54rTzj3/8Q7GxsYqOjlZISIhat26t9PR0bdiwQV5eXkpKSpKDg/U1+nr16mnu3Lk229+1a5eWLVumqVOnyt3dXYMGDdL58+c1efJkXbp0SeHh4crIyLB52xwAlFfcwQQAAACgzMifp6hJkyaWUCifi4uL2rdvL0nas2dPibdTq1YtrVy5Uv369dOlS5f0ySefKCYmRj169NC0adMkyfJmuGvJyMjQ6NGj9dBDD6l79+7aunWrDhw4oH/+85/q1q2bQkJC9Pzzzys6OlrHjx+/bnsAUB5wBxMAAACAMuOuu+6SpAInxHZzc5MkZWZm3pB2PDw8NGbMGI0ZM8aqfNu2bZL+ekvctUybNk1//PGHpY3ExERJUtOmTS11AgICJEm//PKL6tate902AaCs4w4mAAAAAGVGmzZtZDKZlJiYqLy8PJvlhw8fliSbu5JuVDv51q5dK0l69NFHr1lvz549WrRokf7973/Lw8PDallWVpblv68XkAFAeUPABAAAAKDM8PHxUVBQkJKSkrR48WKrZbGxsYqNjZWbm5s6dOggScrOzlZiYqLNo2ZFbUeS8vLydOnSJZs+rVmzRmvWrFGLFi3UtWvXAvuelZWl0NBQdejQQT179rSU57+RbuPGjZayTZs2WS0DgPKOR+QAAAAAlCljx45VQkKCIiIiFBMTo8aNG+vUqVNav369HB0dFR4ebnn07ezZs+rRo4d8fHysApyitiNJ6enpateundq2bau6devKZDIpPj5e8fHx8vf317Rp02wm+b7SzJkzdfbsWc2fP9+qvE2bNmratKkiIyOVlJSktLQ0ff311+revTuPxwGoMAiYAAAAAJQp3t7eWrVqlWbOnKmNGzdq165dcnV1VVBQkF566SU1b978hrRTuXJl9ejRQ7t379bWrVslSXfeeadee+01Pffcc3JxcSlwWwkJCZo7d67GjRsnLy8vq2Umk0mRkZF655139PXXX8vR0VG9evXSW2+9VcRPBgDKLgImAAAAAGVOjRo1FBYWprCwsGvW8/X11cGDBw23I0lOTk4aP358kfsqSY0bN9b+/fsLXO7t7a3IyMhitQ0A5QFzMAEAAAAAAMAQAiYAAAAAAAAYQsAEAAAAAAAAQwiYAAAAAAAAYAgBEwAAAAAAAAwhYAIAAAAAAIAhBEwAAAAAAAAwhIAJAAAAAAAAhhAwAQAAAAAAwBACJgAAAAAAABhCwAQAAACUA7nmvNLuAlBs/P4CFV+l0u4AAAAAgOtzNDnovW2f6fifv5V2V4AiqetWS6PaPF3a3QBwgxEwAQAAAOXE8T9/0y8pSaXdDQAAbPCIHAAAAAAAAAwhYAIAAAAAAIAhBEwAAAAAAAAwhIAJAAAAAAAAhhAwAQAAAAAAwBACJgAAAAAAABhCwAQAAAAAAABDCJgAAAAAAABgCAETAAAAAAAADCFgAgAAAAAAgCEETAAAAAAAADCEgAkAAAAAAACGEDABAAAAAADAEAImAAAAAAAAGELABAAAAAAAAEMImAAAAAAAAGAIARMAAAAAAAAMIWACAAAAAACAIZVKuwMloWHDhgUu++KLL9SgQYOb2BsAAAAAAIBbS4UImCQpMDBQTz31lE157dq1S6E3AACgIpo0aZL27dunY8eOKSUlRVWqVNEdd9yhrl27ql+/fqpevXqR2tu2bZuioqL0448/6sKFC3J3d1fDhg01YMAAdezY0VIvOztby5Yt088//6wDBw4oMTFR2dnZCg8PV58+fey2/fvvv+u9997T1q1bZTKZ1LZtW4WGhqpmzZo2dT/44AMtXbpUX331lby8vIr2oQAAAKgCBUx16tRRz549S7sbAACgAlu0aJGaNGmitm3bqmbNmkpPT9ePP/6o6dOn67PPPtPy5csLfXFr4sSJmjdvnry9vdW5c2dVr15dycnJ2r9/v3744QergCk9PV3jx4+XJHl4eMjDw0OnT58usO28vDwNHTpUv/zyi3r16qWMjAytW7dOx48f16effioHh79mSUhISNDcuXM1btw4wiUAAFBsFSZgki5f3cvMzFTVqlVLuysAAKAC2r17t5ydnW3KP/jgA82aNUuzZ8/WuHHjrtvO8uXLNW/ePPXq1UvvvPOOKleubLU8Ozvb6ucqVapozpw5aty4sWrVqqXp06drxowZBba/d+9e7du3TxMmTFBISIgkydfXV9OnT9e+ffvUvHlzSVJOTo5CQ0PVqlWrAu+EAgAAKIwKEzBFR0dr3bp1ys3NVbVq1dSpUyeNGDFCvr6+xW7TbDYrLS2tBHspmUwmubi4lGibwM2Unp4us9lc2t24LsYaKoLyMt5uNfaODTp16qRZs2bpyJEj1z12yMrK0pQpU+Tt7a3Q0FDl5OQoJyfHpt7VIdP9999v2X7+sszMTLvbO3r0qCSpfv36luX5c1IePXpUd999tyTp448/1q+//qr333+/xI95ULL4XkNFUF6+1xhvKO9KeqyZzWaZTKbr1qsQAVNAQICCg4Pl5+enrKws7d69WytWrNDmzZu1bNky+fv7F6vd7OxsJSQklGhfXVxc1KRJkxJtE7iZjh49qvT09NLuxnUx1lARlJfxBmn16tWSpJo1a1732CEuLk4pKSl6+OGHdfDgQe3Zs0cnTpyQk5OT/P39C/Vykt9//12SdObMGbvby8jIkCStX79e7du3lyR99913lmUJCQk6efKk5syZo379+unChQu6cOFC4XcYNx3fa6gIysv3GuMN5d2NGGtX321tT4UImD7//HOrnx999FF16tRJQ4YM0fjx4zVv3rxitevk5GS5wldSCpP6AWXZXXfdVW6uPAHlXXkZb7eixYsXKy0tTampqTpw4IDi4+NVv359/fOf/1SNGjWuuW5MTIwkydvbW2+//bZ++eUXq+X33XefJk2adM12PD09LW00btzYZnmDBg306aefasGCBTp37pwyMjL03//+V02bNtUjjzwis9msiIgINWvWTMOHD+dvZjnA/yNUBOXle43xhvKupMfa1ccqBakQAZM9HTt21D333KPt27crMzPT7nwJ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\n" }, "metadata": {} } ] }, { "cell_type": "markdown", "metadata": { "id": "215031c4" }, "source": [ "### Compare Base vs Fine-Tuned Model for a specific question" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "2740fb89", "outputId": "e65fe48c-0943-4648-cad9-d644c2f380a6" }, "source": [ "question = \"who are you\"\n", "\n", "# Prepare the prompt for the base model\n", "base_prompt_messages = [\n", " {\"role\": \"user\", \"content\": question}\n", "]\n", "base_prompt = tokenizer.apply_chat_template(\n", " base_prompt_messages,\n", " tokenize=False,\n", " add_generation_prompt=True\n", ")\n", "\n", "# Prepare the prompt for the fine-tuned model (including custom system message)\n", "ft_prompt_messages = [\n", " {\"role\": \"user\", \"content\": question}\n", "]\n", "ft_prompt = tokenizer.apply_chat_template(\n", " ft_prompt_messages,\n", " tokenize=False,\n", " add_generation_prompt=True\n", ")\n", "\n", "print(\"Generating base model response...\")\n", "base_model_response = generate(base_model, tokenizer, base_prompt)\n", "\n", "print(\"Generating fine-tuned model response...\")\n", "ft_model_response = generate(ft_model, tokenizer, ft_prompt)\n", "\n", "print(\"\\n--- Question ---\\n\")\n", "print(question)\n", "\n", "print(\"\\n--- Base Model Response ---\\n\")\n", "print(base_model_response)\n", "\n", "print(\"\\n--- Fine-tuned Model Response ---\\n\")\n", "print(ft_model_response)\n" ], "execution_count": 23, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Generating base model response...\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:71: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "/usr/local/lib/python3.12/dist-packages/transformers/modeling_attn_mask_utils.py:281: FutureWarning: The attention mask API under `transformers.modeling_attn_mask_utils` (`AttentionMaskConverter`) is deprecated and will be removed in Transformers v5.10. Please use the new API in `transformers.masking_utils`.\n", " warnings.warn(DEPRECATION_MESSAGE, FutureWarning)\n", "Both `max_new_tokens` (=128) and `max_length`(=32768) seem to have been set. `max_new_tokens` will take precedence. Please refer to the documentation for more information. (https://huggingface.co/docs/transformers/main/en/main_classes/text_generation)\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "Generating fine-tuned model response...\n", "\n", "--- Question ---\n", "\n", "who are you\n", "\n", "--- Base Model Response ---\n", "\n", "I am Qwen, an AI language model developed by Alibaba Cloud. I am designed to assist with a wide range of tasks and provide information on various topics. How can I help you today?\n", "\n", "--- Fine-tuned Model Response ---\n", "\n", "I am cortex your coding assistant made by junaid\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "CzTCy0wDKDRx" }, "source": [ "## 14. Convert Model to gguf" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 324, "referenced_widgets": [ "804c0204501042b3ac44a4986d8fd774", "bfd721fcc12d4f0ba1fc092480f44b63", "52bce7507b874096aae31033f0f1490e", "f98b3c0dc0544deab3297445199ebe6c", "e4c1ec7520d14bcd8f4a354c9c14f6ce", "f82428bd11bd44408f4c809d76603e16", "64ac53fd9b1f43cd8d83c6bfb6b5026d", "889a34cebd4d428cb683cf7af7566f35", "ee8b47112e9e439f9e77bbdd90f3102a", "fe0683300fca42bdac5150e913ae621b", "85e711e6f5894a2486e64e3903d1b720", "b26f524c7cb84bafbd33b3f9c95f58af", "5e50f194789149fe99ad1a18401240ae", "2b65a1eba56d4ce29e878ccaca82ce48", "246ca9e6953b4962a69467e7bf650f03", "cfb6b594d0d84ac5b3851da9479d62a3", "be59dd8f3b4f47e8abdd68397b1ae4bb", "77efdf0cb96f4fd4ac453260cadb5828", "bc2c0609aeac40c4a0a46170c9386cde", "f47056da172b4d90a551b71ce07da790", "1430428dafdf4d0ea9d7c351f27bc1c8", "d13429a1815b4625aa87dafd8f20de47" ] }, "id": "jMup94dfKDRx", "outputId": "4b1fe90b-3371-41c5-9eee-143eb75e9c7a", "collapsed": true }, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "config.json: 0%| | 0.00/765 [00:00 HF Bucket fallback)\u001b[0m\n", "-- UI: building from source in /content/llama.cpp/tools/ui\n", "-- UI: running npm install (first time)\n", "[ 2%] Built target xxhash\n", "[ 2%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/llama-llava-cli.dir/deprecation-warning.cpp.o\u001b[0m\n", "[ 2%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-llava-cli\u001b[0m\n", "[ 2%] Built target llama-llava-cli\n", "[ 2%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/llama-gemma3-cli.dir/deprecation-warning.cpp.o\u001b[0m\n", "[ 3%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-gemma3-cli\u001b[0m\n", "[ 3%] Built target llama-gemma3-cli\n", "[ 4%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/llama-minicpmv-cli.dir/deprecation-warning.cpp.o\u001b[0m\n", "[ 4%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-minicpmv-cli\u001b[0m\n", "[ 4%] Built target llama-minicpmv-cli\n", "[ 4%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/llama-qwen2vl-cli.dir/deprecation-warning.cpp.o\u001b[0m\n", "[ 4%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-base.dir/ggml-opt.cpp.o\u001b[0m\n", "[ 4%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-qwen2vl-cli\u001b[0m\n", "[ 4%] Built target llama-qwen2vl-cli\n", "[ 4%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-base.dir/ggml-threading.cpp.o\u001b[0m\n", "[ 4%] \u001b[32mBuilding C object ggml/src/CMakeFiles/ggml-base.dir/ggml-quants.c.o\u001b[0m\n", "[ 5%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-base.dir/gguf.cpp.o\u001b[0m\n", "[ 5%] \u001b[32m\u001b[1mLinking CXX shared library ../../bin/libggml-base.so\u001b[0m\n", "[ 5%] Built target ggml-base\n", "[ 5%] \u001b[32mBuilding C object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/ggml-cpu.c.o\u001b[0m\n", "[ 5%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/ggml-cpu.cpp.o\u001b[0m\n", "[ 5%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/repack.cpp.o\u001b[0m\n", "[ 6%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/hbm.cpp.o\u001b[0m\n", "[ 6%] \u001b[32mBuilding C object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/quants.c.o\u001b[0m\n", "[ 6%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/traits.cpp.o\u001b[0m\n", "[ 6%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/amx/amx.cpp.o\u001b[0m\n", "[ 6%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/amx/mmq.cpp.o\u001b[0m\n", "[ 7%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/binary-ops.cpp.o\u001b[0m\n", "[ 7%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/unary-ops.cpp.o\u001b[0m\n", "[ 7%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/vec.cpp.o\u001b[0m\n", "[ 7%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/ops.cpp.o\u001b[0m\n", "[ 7%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/llamafile/sgemm.cpp.o\u001b[0m\n", "[ 7%] \u001b[32m\u001b[1mLinking CXX static library libcpp-httplib.a\u001b[0m\n", "[ 7%] Built target cpp-httplib\n", "[ 8%] \u001b[32mBuilding C object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/arch/x86/quants.c.o\u001b[0m\n", "[ 8%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml-cpu.dir/ggml-cpu/arch/x86/repack.cpp.o\u001b[0m\n", "[ 8%] \u001b[32m\u001b[1mLinking CXX shared library ../../bin/libggml-cpu.so\u001b[0m\n", "[ 8%] Built target ggml-cpu\n", "[ 8%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml.dir/ggml-backend-dl.cpp.o\u001b[0m\n", "[ 9%] \u001b[32mBuilding CXX object ggml/src/CMakeFiles/ggml.dir/ggml-backend-reg.cpp.o\u001b[0m\n", "[ 9%] \u001b[32m\u001b[1mLinking CXX shared library ../../bin/libggml.so\u001b[0m\n", "[ 9%] Built target ggml\n", "[ 9%] \u001b[32mBuilding CXX object examples/gguf/CMakeFiles/llama-gguf.dir/gguf.cpp.o\u001b[0m\n", "[ 10%] \u001b[32mBuilding CXX object examples/gguf-hash/CMakeFiles/llama-gguf-hash.dir/gguf-hash.cpp.o\u001b[0m\n", "[ 11%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama.cpp.o\u001b[0m\n", "[ 11%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-gguf\u001b[0m\n", "[ 11%] Built target llama-gguf\n", "[ 11%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-adapter.cpp.o\u001b[0m\n", "[ 11%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-gguf-hash\u001b[0m\n", "[ 11%] Built target llama-gguf-hash\n", "[ 11%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-arch.cpp.o\u001b[0m\n", "[ 11%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-batch.cpp.o\u001b[0m\n", "[ 11%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-chat.cpp.o\u001b[0m\n", "[ 12%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-context.cpp.o\u001b[0m\n", "[ 12%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-cparams.cpp.o\u001b[0m\n", "[ 12%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-grammar.cpp.o\u001b[0m\n", "[ 12%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-graph.cpp.o\u001b[0m\n", "[ 12%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-hparams.cpp.o\u001b[0m\n", "[ 13%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-impl.cpp.o\u001b[0m\n", "[ 13%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-io.cpp.o\u001b[0m\n", "[ 13%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-kv-cache.cpp.o\u001b[0m\n", "[ 13%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-kv-cache-iswa.cpp.o\u001b[0m\n", "[ 13%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-memory.cpp.o\u001b[0m\n", "[ 14%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-memory-hybrid.cpp.o\u001b[0m\n", "[ 14%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-memory-hybrid-iswa.cpp.o\u001b[0m\n", "[ 14%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-memory-recurrent.cpp.o\u001b[0m\n", "[ 14%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-mmap.cpp.o\u001b[0m\n", "[ 14%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-model-loader.cpp.o\u001b[0m\n", "[ 15%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-model-saver.cpp.o\u001b[0m\n", "[ 15%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-model.cpp.o\u001b[0m\n", "[ 15%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-quant.cpp.o\u001b[0m\n", "[ 15%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-sampler.cpp.o\u001b[0m\n", "[ 15%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/llama-vocab.cpp.o\u001b[0m\n", "[ 16%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/unicode-data.cpp.o\u001b[0m\n", "[ 16%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/unicode.cpp.o\u001b[0m\n", "[ 16%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/afmoe.cpp.o\u001b[0m\n", "[ 16%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/apertus.cpp.o\u001b[0m\n", "[ 16%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/arcee.cpp.o\u001b[0m\n", "[ 17%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/arctic.cpp.o\u001b[0m\n", "[ 17%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/arwkv7.cpp.o\u001b[0m\n", "[ 17%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/baichuan.cpp.o\u001b[0m\n", "[ 17%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/bailingmoe.cpp.o\u001b[0m\n", "[ 17%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/bailingmoe2.cpp.o\u001b[0m\n", "[ 18%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/bert.cpp.o\u001b[0m\n", "[ 18%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/bitnet.cpp.o\u001b[0m\n", "[ 18%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/bloom.cpp.o\u001b[0m\n", "[ 18%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/chameleon.cpp.o\u001b[0m\n", "[ 18%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/chatglm.cpp.o\u001b[0m\n", "[ 19%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/codeshell.cpp.o\u001b[0m\n", "[ 19%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/cogvlm.cpp.o\u001b[0m\n", "[ 19%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/cohere2.cpp.o\u001b[0m\n", "[ 19%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/command-r.cpp.o\u001b[0m\n", "[ 19%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/dbrx.cpp.o\u001b[0m\n", "[ 20%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/deci.cpp.o\u001b[0m\n", "[ 20%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/deepseek.cpp.o\u001b[0m\n", "[ 20%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/deepseek2.cpp.o\u001b[0m\n", "[ 20%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/deepseek2ocr.cpp.o\u001b[0m\n", "[ 20%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/delta-net-base.cpp.o\u001b[0m\n", "[ 21%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/dots1.cpp.o\u001b[0m\n", "[ 21%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/dream.cpp.o\u001b[0m\n", "[ 21%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/ernie4-5-moe.cpp.o\u001b[0m\n", "[ 21%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/ernie4-5.cpp.o\u001b[0m\n", "[ 21%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/eurobert.cpp.o\u001b[0m\n", "[ 22%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/exaone-moe.cpp.o\u001b[0m\n", "[ 22%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/exaone.cpp.o\u001b[0m\n", "[ 22%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/exaone4.cpp.o\u001b[0m\n", "[ 22%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/falcon-h1.cpp.o\u001b[0m\n", "[ 22%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/falcon.cpp.o\u001b[0m\n", "-- UI: local npm build succeeded\n", "[ 23%] \u001b[34m\u001b[1mGenerating loading.html.hpp\u001b[0m\n", "[ 23%] \u001b[34m\u001b[1mGenerating bundle.css.hpp\u001b[0m\n", "[ 24%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gemma-embedding.cpp.o\u001b[0m\n", "[ 24%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gemma.cpp.o\u001b[0m\n", "[ 24%] \u001b[34m\u001b[1mGenerating bundle.js.hpp\u001b[0m\n", "[ 24%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gemma2.cpp.o\u001b[0m\n", "[ 24%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gemma3.cpp.o\u001b[0m\n", "[ 24%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gemma3n.cpp.o\u001b[0m\n", "[ 25%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gemma4.cpp.o\u001b[0m\n", "[ 25%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/glm-dsa.cpp.o\u001b[0m\n", "[ 25%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/glm4-moe.cpp.o\u001b[0m\n", "[ 25%] \u001b[34m\u001b[1mGenerating index.html.hpp\u001b[0m\n", "[ 25%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/glm4.cpp.o\u001b[0m\n", "[ 25%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gpt2.cpp.o\u001b[0m\n", "[ 26%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/gptneox.cpp.o\u001b[0m\n", "[ 26%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/granite-hybrid.cpp.o\u001b[0m\n", "[ 26%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/granite-moe.cpp.o\u001b[0m\n", "[ 26%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/granite.cpp.o\u001b[0m\n", "[ 26%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/grok.cpp.o\u001b[0m\n", "[ 27%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/grovemoe.cpp.o\u001b[0m\n", "[ 27%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/hunyuan-dense.cpp.o\u001b[0m\n", "[ 27%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/hunyuan-moe.cpp.o\u001b[0m\n", "[ 27%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/hunyuan-vl.cpp.o\u001b[0m\n", "[ 27%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/internlm2.cpp.o\u001b[0m\n", "[ 28%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/jais.cpp.o\u001b[0m\n", "[ 28%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/jais2.cpp.o\u001b[0m\n", "[ 28%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/jamba.cpp.o\u001b[0m\n", "[ 28%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/jina-bert-v2.cpp.o\u001b[0m\n", "[ 28%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/jina-bert-v3.cpp.o\u001b[0m\n", "[ 29%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/kimi-linear.cpp.o\u001b[0m\n", "[ 29%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/lfm2.cpp.o\u001b[0m\n", "[ 29%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/lfm2moe.cpp.o\u001b[0m\n", "[ 29%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/llada-moe.cpp.o\u001b[0m\n", "[ 29%] \u001b[32mBuilding CXX object tools/ui/CMakeFiles/llama-ui.dir/ui.cpp.o\u001b[0m\n", "[ 29%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/llada.cpp.o\u001b[0m\n", "[ 30%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/llama-embed.cpp.o\u001b[0m\n", "[ 30%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/llama.cpp.o\u001b[0m\n", "[ 30%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/llama4.cpp.o\u001b[0m\n", "[ 30%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/maincoder.cpp.o\u001b[0m\n", "[ 30%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mamba-base.cpp.o\u001b[0m\n", "[ 31%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mamba.cpp.o\u001b[0m\n", "[ 31%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mamba2.cpp.o\u001b[0m\n", "[ 31%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mimo2.cpp.o\u001b[0m\n", "[ 31%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/minicpm.cpp.o\u001b[0m\n", "[ 31%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/minicpm3.cpp.o\u001b[0m\n", "[ 32%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/minimax-m2.cpp.o\u001b[0m\n", "[ 32%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mistral3.cpp.o\u001b[0m\n", "[ 32%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mistral4.cpp.o\u001b[0m\n", "[ 32%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/modern-bert.cpp.o\u001b[0m\n", "[ 32%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/mpt.cpp.o\u001b[0m\n", "[ 33%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/nemotron-h-moe.cpp.o\u001b[0m\n", "[ 33%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/nemotron-h.cpp.o\u001b[0m\n", "[ 33%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/nemotron.cpp.o\u001b[0m\n", "[ 33%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/neo-bert.cpp.o\u001b[0m\n", "[ 33%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/nomic-bert-moe.cpp.o\u001b[0m\n", "[ 34%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/nomic-bert.cpp.o\u001b[0m\n", "[ 34%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/olmo.cpp.o\u001b[0m\n", "[ 34%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/olmo2.cpp.o\u001b[0m\n", "[ 34%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/olmoe.cpp.o\u001b[0m\n", "[ 34%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/openai-moe.cpp.o\u001b[0m\n", "[ 35%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/openelm.cpp.o\u001b[0m\n", "[ 35%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/orion.cpp.o\u001b[0m\n", "[ 35%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/paddleocr.cpp.o\u001b[0m\n", "[ 35%] \u001b[32m\u001b[1mLinking CXX static library libllama-ui.a\u001b[0m\n", "[ 35%] Built target llama-ui\n", "[ 35%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/pangu-embed.cpp.o\u001b[0m\n", "[ 35%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/phi2.cpp.o\u001b[0m\n", "[ 36%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/phi3.cpp.o\u001b[0m\n", "[ 36%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/phimoe.cpp.o\u001b[0m\n", "[ 36%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/plamo.cpp.o\u001b[0m\n", "[ 36%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/plamo2.cpp.o\u001b[0m\n", "[ 36%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/plamo3.cpp.o\u001b[0m\n", "[ 37%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/plm.cpp.o\u001b[0m\n", "[ 37%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen.cpp.o\u001b[0m\n", "[ 37%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen2.cpp.o\u001b[0m\n", "[ 37%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen2moe.cpp.o\u001b[0m\n", "[ 37%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen2vl.cpp.o\u001b[0m\n", "[ 38%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen3.cpp.o\u001b[0m\n", "[ 38%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen35.cpp.o\u001b[0m\n", "[ 38%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen35moe.cpp.o\u001b[0m\n", "[ 38%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen3moe.cpp.o\u001b[0m\n", "[ 38%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen3next.cpp.o\u001b[0m\n", "[ 39%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen3vl.cpp.o\u001b[0m\n", "[ 39%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/qwen3vlmoe.cpp.o\u001b[0m\n", "[ 39%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/refact.cpp.o\u001b[0m\n", "[ 39%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/rnd1.cpp.o\u001b[0m\n", "[ 39%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/rwkv6-base.cpp.o\u001b[0m\n", "[ 40%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/rwkv6.cpp.o\u001b[0m\n", "[ 40%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/rwkv6qwen2.cpp.o\u001b[0m\n", "[ 40%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/rwkv7-base.cpp.o\u001b[0m\n", "[ 40%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/rwkv7.cpp.o\u001b[0m\n", "[ 40%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/seed-oss.cpp.o\u001b[0m\n", "[ 41%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/smallthinker.cpp.o\u001b[0m\n", "[ 41%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/smollm3.cpp.o\u001b[0m\n", "[ 41%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/stablelm.cpp.o\u001b[0m\n", "[ 41%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/starcoder.cpp.o\u001b[0m\n", "[ 41%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/starcoder2.cpp.o\u001b[0m\n", "[ 42%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/step35.cpp.o\u001b[0m\n", "[ 42%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/t5.cpp.o\u001b[0m\n", "[ 42%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/t5encoder.cpp.o\u001b[0m\n", "[ 42%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/wavtokenizer-dec.cpp.o\u001b[0m\n", "[ 42%] \u001b[32mBuilding CXX object src/CMakeFiles/llama.dir/models/xverse.cpp.o\u001b[0m\n", "[ 43%] \u001b[32m\u001b[1mLinking CXX shared library ../bin/libllama.so\u001b[0m\n", "[ 43%] Built target llama\n", "[ 43%] \u001b[32mBuilding C object tests/CMakeFiles/test-c.dir/test-c.c.o\u001b[0m\n", "[ 43%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/arg.cpp.o\u001b[0m\n", "[ 43%] \u001b[32mBuilding CXX object examples/simple/CMakeFiles/llama-simple.dir/simple.cpp.o\u001b[0m\n", "[ 43%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/mtmd.cpp.o\u001b[0m\n", "[ 43%] \u001b[32m\u001b[1mLinking C executable ../bin/test-c\u001b[0m\n", "[ 43%] Built target test-c\n", "[ 44%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/chat-auto-parser-generator.cpp.o\u001b[0m\n", "[ 44%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-simple\u001b[0m\n", "[ 44%] Built target llama-simple\n", "[ 45%] \u001b[32mBuilding CXX object examples/simple-chat/CMakeFiles/llama-simple-chat.dir/simple-chat.cpp.o\u001b[0m\n", "[ 45%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-simple-chat\u001b[0m\n", "[ 45%] Built target llama-simple-chat\n", "[ 45%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/mtmd-audio.cpp.o\u001b[0m\n", "[ 45%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/mtmd-image.cpp.o\u001b[0m\n", "[ 45%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/mtmd-helper.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/clip.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/chat-auto-parser-helpers.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/chat-diff-analyzer.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/chat-peg-parser.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/cogvlm.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/conformer.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/dotsocr.cpp.o\u001b[0m\n", "[ 46%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/gemma4a.cpp.o\u001b[0m\n", "[ 47%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/gemma4v.cpp.o\u001b[0m\n", "[ 47%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/chat.cpp.o\u001b[0m\n", "[ 47%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/glm4v.cpp.o\u001b[0m\n", "[ 47%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/granite-speech.cpp.o\u001b[0m\n", "[ 48%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/common.cpp.o\u001b[0m\n", "[ 48%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/hunyuanocr.cpp.o\u001b[0m\n", "[ 48%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/internvl.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/kimivl.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/console.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/kimik25.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/debug.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/nemotron-v2-vl.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/llama4.cpp.o\u001b[0m\n", "[ 49%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/llava.cpp.o\u001b[0m\n", "[ 50%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/minicpmv.cpp.o\u001b[0m\n", "[ 50%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/download.cpp.o\u001b[0m\n", "[ 50%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/fit.cpp.o\u001b[0m\n", "[ 50%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/paddleocr.cpp.o\u001b[0m\n", "[ 50%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/pixtral.cpp.o\u001b[0m\n", "[ 50%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/qwen2vl.cpp.o\u001b[0m\n", "[ 51%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/hf-cache.cpp.o\u001b[0m\n", "[ 51%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/qwen3vl.cpp.o\u001b[0m\n", "[ 52%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/mimovl.cpp.o\u001b[0m\n", "[ 52%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/qwen3a.cpp.o\u001b[0m\n", "[ 52%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/step3vl.cpp.o\u001b[0m\n", "[ 52%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/siglip.cpp.o\u001b[0m\n", "[ 52%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/json-partial.cpp.o\u001b[0m\n", "[ 52%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/whisper-enc.cpp.o\u001b[0m\n", "[ 53%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/deepseekocr.cpp.o\u001b[0m\n", "[ 53%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/mobilenetv5.cpp.o\u001b[0m\n", "[ 53%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/youtuvl.cpp.o\u001b[0m\n", "[ 53%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/json-schema-to-grammar.cpp.o\u001b[0m\n", "[ 53%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/mtmd.dir/models/yasa2.cpp.o\u001b[0m\n", "[ 53%] \u001b[32m\u001b[1mLinking CXX shared library ../../bin/libmtmd.so\u001b[0m\n", "[ 53%] Built target mtmd\n", "[ 53%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/llguidance.cpp.o\u001b[0m\n", "[ 53%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/log.cpp.o\u001b[0m\n", "[ 54%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/ngram-cache.cpp.o\u001b[0m\n", "[ 54%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/ngram-map.cpp.o\u001b[0m\n", "[ 54%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/ngram-mod.cpp.o\u001b[0m\n", "[ 54%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/peg-parser.cpp.o\u001b[0m\n", "[ 54%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/preset.cpp.o\u001b[0m\n", "[ 55%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/regex-partial.cpp.o\u001b[0m\n", "[ 55%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/reasoning-budget.cpp.o\u001b[0m\n", "[ 55%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/sampling.cpp.o\u001b[0m\n", "[ 55%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/speculative.cpp.o\u001b[0m\n", "[ 55%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/unicode.cpp.o\u001b[0m\n", "[ 56%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/jinja/lexer.cpp.o\u001b[0m\n", "[ 56%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/jinja/parser.cpp.o\u001b[0m\n", "[ 56%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/jinja/runtime.cpp.o\u001b[0m\n", "[ 56%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/jinja/value.cpp.o\u001b[0m\n", "[ 56%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/jinja/string.cpp.o\u001b[0m\n", "[ 57%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/jinja/caps.cpp.o\u001b[0m\n", "[ 57%] \u001b[32mBuilding CXX object common/CMakeFiles/llama-common.dir/__/license.cpp.o\u001b[0m\n", "[ 57%] \u001b[32m\u001b[1mLinking CXX shared library ../bin/libllama-common.so\u001b[0m\n", "[ 57%] Built target llama-common\n", "[ 58%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-sampling.dir/test-sampling.cpp.o\u001b[0m\n", "[ 58%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-tokenizer-0.dir/test-tokenizer-0.cpp.o\u001b[0m\n", "[ 58%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-grammar-parser.dir/test-grammar-parser.cpp.o\u001b[0m\n", "[ 58%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-reasoning-budget.dir/test-reasoning-budget.cpp.o\u001b[0m\n", "[ 58%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-reasoning-budget.dir/get-model.cpp.o\u001b[0m\n", "[ 59%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-reasoning-budget\u001b[0m\n", "[ 59%] Built target test-reasoning-budget\n", "[ 59%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-grammar-parser.dir/get-model.cpp.o\u001b[0m\n", "[ 59%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-sampling.dir/get-model.cpp.o\u001b[0m\n", "[ 59%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-grammar-integration.dir/test-grammar-integration.cpp.o\u001b[0m\n", "[ 59%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-grammar-parser\u001b[0m\n", "[ 59%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-sampling\u001b[0m\n", "[ 59%] Built target test-grammar-parser\n", "[ 59%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-llama-grammar.dir/test-llama-grammar.cpp.o\u001b[0m\n", "[ 59%] Built target test-sampling\n", "[ 59%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-llama-grammar.dir/get-model.cpp.o\u001b[0m\n", "[ 60%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-grammar-integration.dir/get-model.cpp.o\u001b[0m\n", "[ 61%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-tokenizer-0\u001b[0m\n", "[ 62%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/server-context.dir/server-chat.cpp.o\u001b[0m\n", "[ 62%] Built target test-tokenizer-0\n", "[ 62%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/server-context.dir/server-task.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-llama-grammar\u001b[0m\n", "[ 62%] Built target test-llama-grammar\n", "[ 62%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/server-context.dir/server-queue.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-grammar-integration\u001b[0m\n", "[ 62%] Built target test-grammar-integration\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-json-schema-to-grammar.dir/test-json-schema-to-grammar.cpp.o\u001b[0m\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quantize-stats.dir/test-quantize-stats.cpp.o\u001b[0m\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-gbnf-validator.dir/test-gbnf-validator.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-gbnf-validator\u001b[0m\n", "[ 62%] Built target test-gbnf-validator\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-tokenizer-1-bpe.dir/test-tokenizer-1-bpe.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-tokenizer-1-bpe\u001b[0m\n", "[ 62%] Built target test-tokenizer-1-bpe\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-tokenizer-1-spm.dir/test-tokenizer-1-spm.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-tokenizer-1-spm\u001b[0m\n", "[ 62%] Built target test-tokenizer-1-spm\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-json-schema-to-grammar.dir/get-model.cpp.o\u001b[0m\n", "[ 62%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/server-context.dir/server-common.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-quantize-stats\u001b[0m\n", "[ 62%] Built target test-quantize-stats\n", "[ 62%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/server-context.dir/server-context.cpp.o\u001b[0m\n", "[ 62%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-json-schema-to-grammar\u001b[0m\n", "[ 62%] Built target test-json-schema-to-grammar\n", "[ 62%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-llama-archs.dir/test-llama-archs.cpp.o\u001b[0m\n", "[ 63%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-llama-archs.dir/get-model.cpp.o\u001b[0m\n", "[ 63%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-llama-archs\u001b[0m\n", "[ 63%] Built target test-llama-archs\n", "[ 64%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-peg-parser.dir/test-chat-peg-parser.cpp.o\u001b[0m\n", "[ 65%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/server-context.dir/server-tools.cpp.o\u001b[0m\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-jinja.dir/test-jinja.cpp.o\u001b[0m\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-peg-parser.dir/peg-parser/simple-tokenize.cpp.o\u001b[0m\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-auto-parser.dir/test-chat-auto-parser.cpp.o\u001b[0m\n", "[ 66%] \u001b[32m\u001b[1mLinking CXX static library libserver-context.a\u001b[0m\n", "[ 66%] Built target server-context\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-template.dir/test-chat-template.cpp.o\u001b[0m\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-peg-parser.dir/get-model.cpp.o\u001b[0m\n", "[ 66%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-chat-peg-parser\u001b[0m\n", "[ 66%] Built target test-chat-peg-parser\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-json-partial.dir/test-json-partial.cpp.o\u001b[0m\n", "[ 66%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-json-partial.dir/get-model.cpp.o\u001b[0m\n", "[ 67%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-json-partial\u001b[0m\n", "[ 67%] Built target test-json-partial\n", "[ 68%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-log.dir/test-log.cpp.o\u001b[0m\n", "[ 68%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-log.dir/get-model.cpp.o\u001b[0m\n", "[ 68%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-log\u001b[0m\n", "[ 68%] Built target test-log\n", "[ 68%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/test-peg-parser.cpp.o\u001b[0m\n", "[ 69%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-template.dir/get-model.cpp.o\u001b[0m\n", "[ 69%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-chat-template\u001b[0m\n", "[ 69%] Built target test-chat-template\n", "[ 69%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-jinja.dir/get-model.cpp.o\u001b[0m\n", "[ 69%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat-auto-parser.dir/get-model.cpp.o\u001b[0m\n", "[ 69%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/simple-tokenize.cpp.o\u001b[0m\n", "[ 69%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-jinja\u001b[0m\n", "[ 69%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-regex-partial.dir/test-regex-partial.cpp.o\u001b[0m\n", "[ 69%] Built target test-jinja\n", "[ 70%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-regex-partial.dir/get-model.cpp.o\u001b[0m\n", "[ 70%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/test-basic.cpp.o\u001b[0m\n", "[ 70%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-regex-partial\u001b[0m\n", "[ 70%] Built target test-regex-partial\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/test-gbnf-generation.cpp.o\u001b[0m\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-thread-safety.dir/test-thread-safety.cpp.o\u001b[0m\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-thread-safety.dir/get-model.cpp.o\u001b[0m\n", "[ 71%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-thread-safety\u001b[0m\n", "[ 71%] Built target test-thread-safety\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/test-json-parser.cpp.o\u001b[0m\n", "[ 71%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-chat-auto-parser\u001b[0m\n", "[ 71%] Built target test-chat-auto-parser\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-arg-parser.dir/test-arg-parser.cpp.o\u001b[0m\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/test-json-serialization.cpp.o\u001b[0m\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-opt.dir/test-opt.cpp.o\u001b[0m\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-arg-parser.dir/get-model.cpp.o\u001b[0m\n", "[ 71%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-arg-parser\u001b[0m\n", "[ 71%] Built target test-arg-parser\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-gguf.dir/test-gguf.cpp.o\u001b[0m\n", "[ 71%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/test-python-dict-parser.cpp.o\u001b[0m\n", "[ 72%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-opt.dir/get-model.cpp.o\u001b[0m\n", "[ 72%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-opt\u001b[0m\n", "[ 72%] Built target test-opt\n", "[ 72%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/peg-parser/test-unicode.cpp.o\u001b[0m\n", "[ 73%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-gguf.dir/get-model.cpp.o\u001b[0m\n", "[ 73%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-gguf\u001b[0m\n", "[ 73%] Built target test-gguf\n", "[ 73%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-backend-ops.dir/test-backend-ops.cpp.o\u001b[0m\n", "[ 74%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-peg-parser.dir/get-model.cpp.o\u001b[0m\n", "[ 74%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-backend-ops.dir/get-model.cpp.o\u001b[0m\n", "[ 74%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-model-load-cancel.dir/test-model-load-cancel.cpp.o\u001b[0m\n", "[ 74%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-model-load-cancel.dir/get-model.cpp.o\u001b[0m\n", "[ 75%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-model-load-cancel\u001b[0m\n", "[ 75%] Built target test-model-load-cancel\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-autorelease.dir/test-autorelease.cpp.o\u001b[0m\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-autorelease.dir/get-model.cpp.o\u001b[0m\n", "[ 76%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-autorelease\u001b[0m\n", "[ 76%] Built target test-autorelease\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-backend-sampler.dir/test-backend-sampler.cpp.o\u001b[0m\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-state-restore-fragmented.dir/test-state-restore-fragmented.cpp.o\u001b[0m\n", "[ 76%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-peg-parser\u001b[0m\n", "[ 76%] Built target test-peg-parser\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-backend-sampler.dir/get-model.cpp.o\u001b[0m\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-state-restore-fragmented.dir/get-model.cpp.o\u001b[0m\n", "[ 76%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-recurrent-state-rollback.dir/test-recurrent-state-rollback.cpp.o\u001b[0m\n", "[ 77%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-state-restore-fragmented\u001b[0m\n", "[ 77%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-backend-sampler\u001b[0m\n", "[ 77%] Built target test-state-restore-fragmented\n", "[ 77%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-recurrent-state-rollback.dir/get-model.cpp.o\u001b[0m\n", "[ 77%] Built target test-backend-sampler\n", "[ 77%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-barrier.dir/test-barrier.cpp.o\u001b[0m\n", "[ 78%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-barrier.dir/get-model.cpp.o\u001b[0m\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quantize-fns.dir/test-quantize-fns.cpp.o\u001b[0m\n", "[ 79%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-recurrent-state-rollback\u001b[0m\n", "[ 79%] Built target test-recurrent-state-rollback\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quantize-fns.dir/get-model.cpp.o\u001b[0m\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quantize-perf.dir/test-quantize-perf.cpp.o\u001b[0m\n", "[ 79%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-barrier\u001b[0m\n", "[ 79%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-quantize-fns\u001b[0m\n", "[ 79%] Built target test-barrier\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-rope.dir/test-rope.cpp.o\u001b[0m\n", "[ 79%] Built target test-quantize-fns\n", "[ 79%] \u001b[32mBuilding C object tests/CMakeFiles/test-mtmd-c-api.dir/test-mtmd-c-api.c.o\u001b[0m\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-mtmd-c-api.dir/get-model.cpp.o\u001b[0m\n", "[ 79%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-mtmd-c-api\u001b[0m\n", "[ 79%] Built target test-mtmd-c-api\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/gguf-model-data.dir/gguf-model-data.cpp.o\u001b[0m\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-rope.dir/get-model.cpp.o\u001b[0m\n", "[ 79%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-rope\u001b[0m\n", "[ 79%] Built target test-rope\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quantize-perf.dir/get-model.cpp.o\u001b[0m\n", "[ 79%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-alloc.dir/test-alloc.cpp.o\u001b[0m\n", "[ 80%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-quantize-perf\u001b[0m\n", "[ 80%] Built target test-quantize-perf\n", "[ 80%] \u001b[32mBuilding CXX object examples/batched/CMakeFiles/llama-batched.dir/batched.cpp.o\u001b[0m\n", "[ 81%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-alloc.dir/get-model.cpp.o\u001b[0m\n", "[ 81%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-alloc\u001b[0m\n", "[ 81%] Built target test-alloc\n", "[ 81%] \u001b[32mBuilding CXX object examples/debug/CMakeFiles/llama-debug.dir/debug.cpp.o\u001b[0m\n", "[ 81%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-batched\u001b[0m\n", "[ 81%] Built target llama-batched\n", "[ 81%] \u001b[32mBuilding CXX object examples/embedding/CMakeFiles/llama-embedding.dir/embedding.cpp.o\u001b[0m\n", "[ 82%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-embedding\u001b[0m\n", "[ 82%] Built target llama-embedding\n", "[ 82%] \u001b[32mBuilding CXX object examples/eval-callback/CMakeFiles/llama-eval-callback.dir/eval-callback.cpp.o\u001b[0m\n", "[ 82%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-eval-callback\u001b[0m\n", "[ 82%] Built target llama-eval-callback\n", "[ 82%] \u001b[32mBuilding CXX object examples/idle/CMakeFiles/llama-idle.dir/idle.cpp.o\u001b[0m\n", "[ 82%] \u001b[32m\u001b[1mLinking CXX static library libgguf-model-data.a\u001b[0m\n", "[ 82%] Built target gguf-model-data\n", "[ 83%] \u001b[32mBuilding CXX object examples/lookahead/CMakeFiles/llama-lookahead.dir/lookahead.cpp.o\u001b[0m\n", "[ 83%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-debug\u001b[0m\n", "[ 83%] Built target llama-debug\n", "[ 83%] \u001b[32mBuilding CXX object examples/lookup/CMakeFiles/llama-lookup.dir/lookup.cpp.o\u001b[0m\n", "[ 84%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-idle\u001b[0m\n", "[ 84%] Built target llama-idle\n", "[ 84%] \u001b[32mBuilding CXX object examples/lookup/CMakeFiles/llama-lookup-create.dir/lookup-create.cpp.o\u001b[0m\n", "[ 84%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-lookahead\u001b[0m\n", "[ 84%] Built target llama-lookahead\n", "[ 84%] \u001b[32mBuilding CXX object examples/lookup/CMakeFiles/llama-lookup-merge.dir/lookup-merge.cpp.o\u001b[0m\n", "[ 84%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-lookup\u001b[0m\n", "[ 84%] Built target llama-lookup\n", "[ 84%] \u001b[32mBuilding CXX object examples/lookup/CMakeFiles/llama-lookup-stats.dir/lookup-stats.cpp.o\u001b[0m\n", "[ 85%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-lookup-create\u001b[0m\n", "[ 85%] Built target llama-lookup-create\n", "[ 85%] \u001b[32mBuilding CXX object examples/parallel/CMakeFiles/llama-parallel.dir/parallel.cpp.o\u001b[0m\n", "[ 85%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-lookup-merge\u001b[0m\n", "[ 85%] Built target llama-lookup-merge\n", "[ 85%] \u001b[32mBuilding CXX object examples/passkey/CMakeFiles/llama-passkey.dir/passkey.cpp.o\u001b[0m\n", "[ 85%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-lookup-stats\u001b[0m\n", "[ 85%] Built target llama-lookup-stats\n", "[ 86%] \u001b[32mBuilding CXX object examples/retrieval/CMakeFiles/llama-retrieval.dir/retrieval.cpp.o\u001b[0m\n", "[ 86%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-parallel\u001b[0m\n", "[ 86%] Built target llama-parallel\n", "[ 86%] \u001b[32mBuilding CXX object examples/save-load-state/CMakeFiles/llama-save-load-state.dir/save-load-state.cpp.o\u001b[0m\n", "[ 86%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-passkey\u001b[0m\n", "[ 86%] Built target llama-passkey\n", "[ 86%] \u001b[32mBuilding CXX object examples/speculative/CMakeFiles/llama-speculative.dir/speculative.cpp.o\u001b[0m\n", "[ 86%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-save-load-state\u001b[0m\n", "[ 86%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-retrieval\u001b[0m\n", "[ 86%] Built target llama-save-load-state\n", "[ 86%] \u001b[32mBuilding CXX object examples/speculative-simple/CMakeFiles/llama-speculative-simple.dir/speculative-simple.cpp.o\u001b[0m\n", "[ 86%] Built target llama-retrieval\n", "[ 86%] \u001b[32mBuilding CXX object examples/gen-docs/CMakeFiles/llama-gen-docs.dir/gen-docs.cpp.o\u001b[0m\n", "[ 86%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-speculative\u001b[0m\n", "[ 86%] Built target llama-speculative\n", "[ 87%] \u001b[32mBuilding CXX object examples/training/CMakeFiles/llama-finetune.dir/finetune.cpp.o\u001b[0m\n", "[ 87%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-gen-docs\u001b[0m\n", "[ 87%] Built target llama-gen-docs\n", "[ 88%] \u001b[32mBuilding CXX object examples/diffusion/CMakeFiles/llama-diffusion.dir/diffusion.cpp.o\u001b[0m\n", "[ 89%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-speculative-simple\u001b[0m\n", "[ 89%] Built target llama-speculative-simple\n", "[ 89%] \u001b[32mBuilding CXX object examples/convert-llama2c-to-ggml/CMakeFiles/llama-convert-llama2c-to-ggml.dir/convert-llama2c-to-ggml.cpp.o\u001b[0m\n", "[ 89%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-finetune\u001b[0m\n", "[ 89%] Built target llama-finetune\n", "[ 89%] \u001b[32mBuilding CXX object pocs/vdot/CMakeFiles/llama-vdot.dir/vdot.cpp.o\u001b[0m\n", "[ 89%] \u001b[32m\u001b[1mLinking CXX static library libllama-diffusion.a\u001b[0m\n", "[ 89%] Built target llama-diffusion\n", "[ 89%] \u001b[32mBuilding CXX object pocs/vdot/CMakeFiles/llama-q8dot.dir/q8dot.cpp.o\u001b[0m\n", "[ 90%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-vdot\u001b[0m\n", "[ 90%] Built target llama-vdot\n", "[ 90%] \u001b[32mBuilding CXX object tools/batched-bench/CMakeFiles/llama-batched-bench.dir/batched-bench.cpp.o\u001b[0m\n", "[ 90%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-q8dot\u001b[0m\n", "[ 90%] Built target llama-q8dot\n", "[ 90%] \u001b[32mBuilding CXX object tools/gguf-split/CMakeFiles/llama-gguf-split.dir/gguf-split.cpp.o\u001b[0m\n", "[ 90%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-convert-llama2c-to-ggml\u001b[0m\n", "[ 90%] Built target llama-convert-llama2c-to-ggml\n", "[ 90%] \u001b[32mBuilding CXX object tools/imatrix/CMakeFiles/llama-imatrix.dir/imatrix.cpp.o\u001b[0m\n", "[ 90%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-gguf-split\u001b[0m\n", "[ 90%] Built target llama-gguf-split\n", "[ 91%] \u001b[32mBuilding CXX object tools/llama-bench/CMakeFiles/llama-bench.dir/llama-bench.cpp.o\u001b[0m\n", "[ 91%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-batched-bench\u001b[0m\n", "[ 91%] Built target llama-batched-bench\n", "[ 92%] \u001b[32mBuilding CXX object tools/completion/CMakeFiles/llama-completion.dir/completion.cpp.o\u001b[0m\n", "[ 93%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-backend-ops\u001b[0m\n", "[ 93%] Built target test-backend-ops\n", "[ 94%] \u001b[32mBuilding CXX object tools/perplexity/CMakeFiles/llama-perplexity.dir/perplexity.cpp.o\u001b[0m\n", "[ 94%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-completion\u001b[0m\n", "[ 94%] Built target llama-completion\n", "[ 94%] \u001b[32mBuilding CXX object tools/quantize/CMakeFiles/llama-quantize.dir/quantize.cpp.o\u001b[0m\n", "[ 94%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-perplexity\u001b[0m\n", "[ 94%] Built target llama-perplexity\n", "[ 94%] \u001b[32mBuilding CXX object tools/cli/CMakeFiles/llama-cli.dir/cli.cpp.o\u001b[0m\n", "[ 95%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-quantize\u001b[0m\n", "[ 95%] Built target llama-quantize\n", "[ 95%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/llama-server.dir/server.cpp.o\u001b[0m\n", "[ 95%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-imatrix\u001b[0m\n", "[ 95%] Built target llama-imatrix\n", "[ 95%] \u001b[32mBuilding CXX object tools/tokenize/CMakeFiles/llama-tokenize.dir/tokenize.cpp.o\u001b[0m\n", "[ 95%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-tokenize\u001b[0m\n", "[ 95%] Built target llama-tokenize\n", "[ 96%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/llama-server.dir/server-http.cpp.o\u001b[0m\n", "[ 96%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-bench\u001b[0m\n", "[ 96%] Built target llama-bench\n", "[ 96%] \u001b[32mBuilding CXX object tools/parser/CMakeFiles/llama-debug-template-parser.dir/debug-template-parser.cpp.o\u001b[0m\n", "[ 96%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-cli\u001b[0m\n", "[ 96%] Built target llama-cli\n", "[ 96%] \u001b[32mBuilding CXX object tools/parser/CMakeFiles/llama-template-analysis.dir/template-analysis.cpp.o\u001b[0m\n", "[ 96%] \u001b[32mBuilding CXX object tools/server/CMakeFiles/llama-server.dir/server-models.cpp.o\u001b[0m\n", "[ 96%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-debug-template-parser\u001b[0m\n", "[ 96%] Built target llama-debug-template-parser\n", "[ 97%] \u001b[32mBuilding CXX object tools/tts/CMakeFiles/llama-tts.dir/tts.cpp.o\u001b[0m\n", "[ 97%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/llama-mtmd-cli.dir/mtmd-cli.cpp.o\u001b[0m\n", "[ 97%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-template-analysis\u001b[0m\n", "[ 97%] Built target llama-template-analysis\n", "[ 97%] \u001b[32mBuilding CXX object tools/mtmd/CMakeFiles/llama-mtmd-debug.dir/debug/mtmd-debug.cpp.o\u001b[0m\n", "[ 97%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-mtmd-cli\u001b[0m\n", "[ 97%] Built target llama-mtmd-cli\n", "[ 97%] \u001b[32mBuilding CXX object tools/cvector-generator/CMakeFiles/llama-cvector-generator.dir/cvector-generator.cpp.o\u001b[0m\n", "[ 98%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-mtmd-debug\u001b[0m\n", "[ 98%] Built target llama-mtmd-debug\n", "[ 98%] \u001b[32mBuilding CXX object tools/export-lora/CMakeFiles/llama-export-lora.dir/export-lora.cpp.o\u001b[0m\n", "[ 99%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-cvector-generator\u001b[0m\n", "[ 99%] Built target llama-cvector-generator\n", "[ 99%] \u001b[32mBuilding CXX object tools/fit-params/CMakeFiles/llama-fit-params.dir/fit-params.cpp.o\u001b[0m\n", "[ 99%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-export-lora\u001b[0m\n", "[ 99%] Built target llama-export-lora\n", "[ 99%] \u001b[32mBuilding CXX object tools/results/CMakeFiles/llama-results.dir/results.cpp.o\u001b[0m\n", "[ 99%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-fit-params\u001b[0m\n", "[ 99%] Built target llama-fit-params\n", "[ 99%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat.dir/test-chat.cpp.o\u001b[0m\n", "[ 99%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-results\u001b[0m\n", "[ 99%] Built target llama-results\n", "[ 99%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-gguf-model-data.dir/test-gguf-model-data.cpp.o\u001b[0m\n", "[ 99%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-tts\u001b[0m\n", "[ 99%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-gguf-model-data\u001b[0m\n", "[ 99%] Built target llama-tts\n", "[100%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-chat.dir/get-model.cpp.o\u001b[0m\n", "[100%] Built target test-gguf-model-data\n", "[100%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quant-type-selection.dir/test-quant-type-selection.cpp.o\u001b[0m\n", "[100%] \u001b[32mBuilding CXX object tests/CMakeFiles/test-quant-type-selection.dir/get-model.cpp.o\u001b[0m\n", "[100%] \u001b[32mBuilding CXX object tests/CMakeFiles/export-graph-ops.dir/export-graph-ops.cpp.o\u001b[0m\n", "[100%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-quant-type-selection\u001b[0m\n", "[100%] Built target test-quant-type-selection\n", "[100%] \u001b[32mBuilding CXX object examples/diffusion/CMakeFiles/llama-diffusion-cli.dir/diffusion-cli.cpp.o\u001b[0m\n", "[100%] \u001b[32m\u001b[1mLinking CXX executable ../bin/export-graph-ops\u001b[0m\n", "[100%] Built target export-graph-ops\n", "[100%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-server\u001b[0m\n", "[100%] Built target llama-server\n", "[100%] \u001b[32m\u001b[1mLinking CXX executable ../../bin/llama-diffusion-cli\u001b[0m\n", "[100%] Built target llama-diffusion-cli\n", "[100%] \u001b[32m\u001b[1mLinking CXX executable ../bin/test-chat\u001b[0m\n", "[100%] Built target test-chat\n" ] } ] }, { "cell_type": "code", "source": [ "!python /content/llama.cpp/convert_hf_to_gguf.py \\\n", " /content/qwen2.5-coding-assistant-merged \\\n", " --outfile /content/qwen2.5-coding-assistant-f16.gguf \\\n", " --outtype f16" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "QGvCe_5eSN_7", "outputId": "5d77a61f-4511-46c9-e9e1-809b56cf52e3" }, "execution_count": 26, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "INFO:hf-to-gguf:Loading model: qwen2.5-coding-assistant-merged\n", "INFO:numexpr.utils:NumExpr defaulting to 2 threads.\n", "INFO:hf-to-gguf:Model architecture: Qwen2ForCausalLM\n", "INFO:hf-to-gguf:gguf: indexing model part 'model.safetensors'\n", "INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only\n", "INFO:hf-to-gguf:Exporting model...\n", "INFO:hf-to-gguf:token_embd.weight, torch.bfloat16 --> F16, shape = {1536, 151936}\n", "INFO:hf-to-gguf:blk.0.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.0.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.0.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.0.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.0.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.0.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.0.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.0.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.0.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.0.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.0.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.0.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.1.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.1.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.1.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.1.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.1.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.1.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.1.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.1.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.1.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.1.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.1.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.1.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.10.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.10.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.10.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.10.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.10.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.10.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.10.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.10.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.10.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.10.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.10.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.10.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.11.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.11.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.11.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.11.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.11.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.11.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.11.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.11.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.11.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.11.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.11.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.11.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.12.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.12.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.12.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.12.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.12.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.12.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.12.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.12.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.12.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.12.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.12.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.12.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.13.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.13.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.13.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.13.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.13.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.13.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.13.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.13.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.13.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.13.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.13.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.13.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.14.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.14.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.14.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.14.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.14.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.14.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.14.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.14.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.14.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.14.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.14.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.14.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.15.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.15.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.15.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.15.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.15.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.15.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.15.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.15.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.15.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.15.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.15.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.15.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.16.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.16.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.16.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.16.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.16.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.16.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.16.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.16.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.16.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.16.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.16.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.16.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.17.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.17.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.17.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.17.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.17.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.17.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.17.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.17.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.17.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.17.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.17.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.17.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.18.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.18.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.18.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.18.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.18.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.18.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.18.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.18.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.18.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.18.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.18.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.18.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.19.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.19.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.19.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.19.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.19.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.19.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.19.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.19.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.19.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.19.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.19.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.19.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.2.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.2.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.2.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.2.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.2.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.2.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.2.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.2.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.2.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.2.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.2.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.2.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.20.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.20.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.20.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.20.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.20.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.20.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.20.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.20.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.20.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.20.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.20.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.20.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.21.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.21.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.21.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.21.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.21.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.21.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.21.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.21.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.21.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.21.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.21.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.21.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.22.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.22.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.22.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.22.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.22.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.22.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.22.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.22.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.22.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.22.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.22.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.22.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.23.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.23.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.23.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.23.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.23.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.23.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.23.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.23.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.23.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.23.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.23.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.23.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.24.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.24.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.24.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.24.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.24.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.24.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.24.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.24.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.24.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.24.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.24.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.24.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.25.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.25.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.25.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.25.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.25.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.25.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.25.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.25.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.25.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.25.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.25.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.25.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.26.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.26.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.26.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.26.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.26.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.26.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.26.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.26.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.26.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.26.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.26.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.26.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.27.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.27.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.27.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.27.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.27.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.27.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.27.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.27.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.27.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.27.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.27.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.27.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.3.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.3.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.3.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.3.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.3.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.3.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.3.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.3.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.3.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.3.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.3.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.3.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.4.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.4.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.4.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.4.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.4.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.4.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.4.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.4.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.4.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.4.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.4.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.4.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.5.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.5.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.5.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.5.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.5.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.5.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.5.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.5.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.5.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.5.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.5.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.5.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.6.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.6.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.6.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.6.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.6.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.6.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.6.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.6.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.6.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.6.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.6.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.6.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.7.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.7.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.7.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.7.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.7.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.7.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.7.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.7.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.7.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.7.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.7.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.7.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.8.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.8.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.8.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.8.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.8.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.8.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.8.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.8.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.8.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.8.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.8.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.8.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.9.attn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.9.ffn_down.weight, torch.bfloat16 --> F16, shape = {8960, 1536}\n", "INFO:hf-to-gguf:blk.9.ffn_gate.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.9.ffn_up.weight, torch.bfloat16 --> F16, shape = {1536, 8960}\n", "INFO:hf-to-gguf:blk.9.ffn_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.9.attn_k.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.9.attn_k.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:blk.9.attn_output.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.9.attn_q.bias, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:blk.9.attn_q.weight, torch.bfloat16 --> F16, shape = {1536, 1536}\n", "INFO:hf-to-gguf:blk.9.attn_v.bias, torch.bfloat16 --> F32, shape = {256}\n", "INFO:hf-to-gguf:blk.9.attn_v.weight, torch.bfloat16 --> F16, shape = {1536, 256}\n", "INFO:hf-to-gguf:output_norm.weight, torch.bfloat16 --> F32, shape = {1536}\n", "INFO:hf-to-gguf:Set meta model\n", "INFO:hf-to-gguf:Set model parameters\n", "INFO:hf-to-gguf:gguf: context length = 32768\n", "INFO:hf-to-gguf:gguf: embedding length = 1536\n", "INFO:hf-to-gguf:gguf: feed forward length = 8960\n", "INFO:hf-to-gguf:gguf: head count = 12\n", "INFO:hf-to-gguf:gguf: key-value head count = 2\n", "WARNING:hf-to-gguf:Unknown RoPE type: default\n", "INFO:hf-to-gguf:gguf: rope scaling type = NONE\n", "INFO:hf-to-gguf:gguf: rope theta = 1000000.0\n", "INFO:hf-to-gguf:gguf: rms norm epsilon = 1e-06\n", "INFO:hf-to-gguf:gguf: file type = 1\n", "INFO:hf-to-gguf:Set model quantization version\n", "INFO:hf-to-gguf:Set model tokenizer\n", "The tokenizer you are loading from '/content/qwen2.5-coding-assistant-merged' with an incorrect regex pattern: https://huggingface.co/mistralai/Mistral-Small-3.1-24B-Instruct-2503/discussions/84#69121093e8b480e709447d5e. This will lead to incorrect tokenization. You should set the `fix_mistral_regex=True` flag when loading this tokenizer to fix this issue.\n", "INFO:gguf.vocab:Adding 151387 merge(s).\n", "INFO:gguf.vocab:Setting special token type eos to 151645\n", "INFO:gguf.vocab:Setting special token type pad to 151665\n", "INFO:gguf.vocab:Setting chat_template to {%- if tools %}\n", " {{- '<|im_start|>system\\n' }}\n", " {%- if messages[0]['role'] == 'system' %}\n", " {{- messages[0]['content'] }}\n", " {%- else %}\n", " {{- 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.' }}\n", " {%- endif %}\n", " {{- \"\\n\\n# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within XML tags:\\n\" }}\n", " {%- for tool in tools %}\n", " {{- \"\\n\" }}\n", " {{- tool | tojson }}\n", " {%- endfor %}\n", " {{- \"\\n\\n\\nFor each function call, return a json object with function name and arguments within XML tags:\\n\\n{\\\"name\\\": , \\\"arguments\\\": }\\n<|im_end|>\\n\" }}\n", "{%- else %}\n", " {%- if messages[0]['role'] == 'system' %}\n", " {{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}\n", " {%- else %}\n", " {{- '<|im_start|>system\\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>\\n' }}\n", " {%- endif %}\n", "{%- endif %}\n", "{%- for message in messages %}\n", " {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) or (message.role == \"assistant\" and not message.tool_calls) %}\n", " {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n", " {%- elif message.role == \"assistant\" %}\n", " {{- '<|im_start|>' + message.role }}\n", " {%- if message.content %}\n", " {{- '\\n' + message.content }}\n", " {%- endif %}\n", " {%- for tool_call in message.tool_calls %}\n", " {%- if tool_call.function is defined %}\n", " {%- set tool_call = tool_call.function %}\n", " {%- endif %}\n", " {{- '\\n\\n{\"name\": \"' }}\n", " {{- tool_call.name }}\n", " {{- '\", \"arguments\": ' }}\n", " {{- tool_call.arguments | tojson }}\n", " {{- '}\\n' }}\n", " {%- endfor %}\n", " {{- '<|im_end|>\\n' }}\n", " {%- elif message.role == \"tool\" %}\n", " {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != \"tool\") %}\n", " {{- '<|im_start|>user' }}\n", " {%- endif %}\n", " {{- '\\n\\n' }}\n", " {{- message.content }}\n", " {{- '\\n' }}\n", " {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n", " {{- '<|im_end|>\\n' }}\n", " {%- endif %}\n", " {%- endif %}\n", "{%- endfor %}\n", "{%- if add_generation_prompt %}\n", " {{- '<|im_start|>assistant\\n' }}\n", "{%- endif %}\n", "\n", "INFO:gguf.gguf_writer:Writing the following files:\n", "INFO:gguf.gguf_writer:/content/qwen2.5-coding-assistant-f16.gguf: n_tensors = 338, total_size = 3.1G\n", "Writing: 100% 3.09G/3.09G [01:03<00:00, 48.9Mbyte/s]\n", "INFO:hf-to-gguf:Model successfully exported to /content/qwen2.5-coding-assistant-f16.gguf\n" ] } ] }, { "cell_type": "code", "source": [ "!/content/llama.cpp/build/bin/llama-quantize \\\n", " /content/qwen2.5-coding-assistant-f16.gguf \\\n", " /content/qwen2.5-coding-assistant-q4_k_m.gguf \\\n", " q4_k_m" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EHk5UufvSPU_", "outputId": "28d01e75-16f8-4f8d-8066-bc2de0491618" }, "execution_count": 27, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "llama_print_build_info: build = 9197 (fcae601e4)\n", "llama_print_build_info: built with GNU 11.4.0 for Linux x86_64\n", "main: quantizing '/content/qwen2.5-coding-assistant-f16.gguf' to '/content/qwen2.5-coding-assistant-q4_k_m.gguf' as Q4_K_M\n", "llama_model_loader: loaded meta data with 22 key-value pairs and 338 tensors from /content/qwen2.5-coding-assistant-f16.gguf (version GGUF V3 (latest))\n", "llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.\n", "llama_model_loader: - kv 0: general.architecture str = qwen2\n", "llama_model_loader: - kv 1: general.type str = model\n", "llama_model_loader: - kv 2: general.name str = Qwen2.5 Coding Assistant Merged\n", "llama_model_loader: - kv 3: general.size_label str = 1.5B\n", "llama_model_loader: - kv 4: qwen2.block_count u32 = 28\n", "llama_model_loader: - kv 5: qwen2.context_length u32 = 32768\n", "llama_model_loader: - kv 6: qwen2.embedding_length u32 = 1536\n", "llama_model_loader: - kv 7: qwen2.feed_forward_length u32 = 8960\n", "llama_model_loader: - kv 8: qwen2.attention.head_count u32 = 12\n", "llama_model_loader: - kv 9: qwen2.attention.head_count_kv u32 = 2\n", "llama_model_loader: - kv 10: qwen2.rope.freq_base f32 = 1000000.000000\n", "llama_model_loader: - kv 11: qwen2.attention.layer_norm_rms_epsilon f32 = 0.000001\n", "llama_model_loader: - kv 12: general.file_type u32 = 1\n", "llama_model_loader: - kv 13: general.quantization_version u32 = 2\n", "llama_model_loader: - kv 14: tokenizer.ggml.model str = gpt2\n", "llama_model_loader: - kv 15: tokenizer.ggml.pre str = qwen2\n", "llama_model_loader: - kv 16: tokenizer.ggml.tokens arr[str,151936] = [\"!\", \"\\\"\", \"#\", \"$\", \"%\", \"&\", \"'\", ...\n", "llama_model_loader: - kv 17: tokenizer.ggml.token_type arr[i32,151936] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...\n", "llama_model_loader: - kv 18: tokenizer.ggml.merges arr[str,151387] = [\"Ġ Ġ\", \"ĠĠ ĠĠ\", \"i n\", \"Ġ t\",...\n", "llama_model_loader: - kv 19: tokenizer.ggml.eos_token_id u32 = 151645\n", "llama_model_loader: - kv 20: tokenizer.ggml.padding_token_id u32 = 151665\n", "llama_model_loader: - kv 21: tokenizer.chat_template str = {%- if tools %}\\n {{- '<|im_start|>...\n", "llama_model_loader: - type f32: 141 tensors\n", "llama_model_loader: - type f16: 197 tensors\n", "[ 1/ 338] output_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 2/ 338] token_embd.weight - [ 1536, 151936, 1, 1], type = f16, converting to q6_K .. size = 445.12 MiB -> 182.57 MiB\n", "[ 3/ 338] blk.0.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 4/ 338] blk.0.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 5/ 338] blk.0.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 6/ 338] blk.0.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 7/ 338] blk.0.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 8/ 338] blk.0.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 9/ 338] blk.0.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 10/ 338] blk.0.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 11/ 338] blk.0.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 12/ 338] blk.0.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 13/ 338] blk.0.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 14/ 338] blk.0.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 15/ 338] blk.1.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 16/ 338] blk.1.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 17/ 338] blk.1.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 18/ 338] blk.1.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 19/ 338] blk.1.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 20/ 338] blk.1.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 21/ 338] blk.1.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 22/ 338] blk.1.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 23/ 338] blk.1.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 24/ 338] blk.1.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 25/ 338] blk.1.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 26/ 338] blk.1.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 27/ 338] blk.2.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 28/ 338] blk.2.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 29/ 338] blk.2.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 30/ 338] blk.2.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 31/ 338] blk.2.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 32/ 338] blk.2.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 33/ 338] blk.2.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 34/ 338] blk.2.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 35/ 338] blk.2.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 36/ 338] blk.2.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 37/ 338] blk.2.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 38/ 338] blk.2.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 39/ 338] blk.3.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 40/ 338] blk.3.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 41/ 338] blk.3.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 42/ 338] blk.3.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 43/ 338] blk.3.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 44/ 338] blk.3.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 45/ 338] blk.3.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 46/ 338] blk.3.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 47/ 338] blk.3.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 48/ 338] blk.3.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 49/ 338] blk.3.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 50/ 338] blk.3.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 51/ 338] blk.4.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 52/ 338] blk.4.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 53/ 338] blk.4.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 54/ 338] blk.4.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 55/ 338] blk.4.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 56/ 338] blk.4.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 57/ 338] blk.4.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 58/ 338] blk.4.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 59/ 338] blk.4.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 60/ 338] blk.4.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 61/ 338] blk.4.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 62/ 338] blk.4.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 63/ 338] blk.5.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 64/ 338] blk.5.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 65/ 338] blk.5.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 66/ 338] blk.5.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 67/ 338] blk.5.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 68/ 338] blk.5.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 69/ 338] blk.5.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 70/ 338] blk.5.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 71/ 338] blk.5.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 72/ 338] blk.5.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 73/ 338] blk.5.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 74/ 338] blk.5.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 75/ 338] blk.6.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 76/ 338] blk.6.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 77/ 338] blk.6.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 78/ 338] blk.6.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 79/ 338] blk.6.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 80/ 338] blk.6.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 81/ 338] blk.6.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 82/ 338] blk.6.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 83/ 338] blk.6.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 84/ 338] blk.6.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 85/ 338] blk.6.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 86/ 338] blk.6.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 87/ 338] blk.7.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 88/ 338] blk.7.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 89/ 338] blk.7.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 90/ 338] blk.7.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 91/ 338] blk.7.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 92/ 338] blk.7.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 93/ 338] blk.7.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 94/ 338] blk.7.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 95/ 338] blk.7.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 96/ 338] blk.7.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 97/ 338] blk.7.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 98/ 338] blk.7.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 99/ 338] blk.8.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 100/ 338] blk.8.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 101/ 338] blk.8.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 102/ 338] blk.8.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 103/ 338] blk.8.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 104/ 338] blk.8.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 105/ 338] blk.8.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 106/ 338] blk.8.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 107/ 338] blk.8.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 108/ 338] blk.8.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 109/ 338] blk.8.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 110/ 338] blk.8.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 111/ 338] blk.9.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 112/ 338] blk.9.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 113/ 338] blk.9.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 114/ 338] blk.9.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 115/ 338] blk.9.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 116/ 338] blk.9.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 117/ 338] blk.9.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 118/ 338] blk.9.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 119/ 338] blk.9.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 120/ 338] blk.9.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 121/ 338] blk.9.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 122/ 338] blk.9.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 123/ 338] blk.10.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 124/ 338] blk.10.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 125/ 338] blk.10.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 126/ 338] blk.10.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 127/ 338] blk.10.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 128/ 338] blk.10.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 129/ 338] blk.10.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 130/ 338] blk.10.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 131/ 338] blk.10.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 132/ 338] blk.10.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 133/ 338] blk.10.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 134/ 338] blk.10.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 135/ 338] blk.11.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 136/ 338] blk.11.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 137/ 338] blk.11.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 138/ 338] blk.11.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 139/ 338] blk.11.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 140/ 338] blk.11.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 141/ 338] blk.11.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 142/ 338] blk.11.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 143/ 338] blk.11.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 144/ 338] blk.11.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 145/ 338] blk.11.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 146/ 338] blk.11.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 147/ 338] blk.12.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 148/ 338] blk.12.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 149/ 338] blk.12.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 150/ 338] blk.12.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 151/ 338] blk.12.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 152/ 338] blk.12.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 153/ 338] blk.12.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 154/ 338] blk.12.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 155/ 338] blk.12.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 156/ 338] blk.12.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 157/ 338] blk.12.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 158/ 338] blk.12.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 159/ 338] blk.13.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 160/ 338] blk.13.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 161/ 338] blk.13.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 162/ 338] blk.13.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 163/ 338] blk.13.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 164/ 338] blk.13.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 165/ 338] blk.13.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 166/ 338] blk.13.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 167/ 338] blk.13.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 168/ 338] blk.13.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 169/ 338] blk.13.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 170/ 338] blk.13.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 171/ 338] blk.14.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 172/ 338] blk.14.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 173/ 338] blk.14.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 174/ 338] blk.14.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 175/ 338] blk.14.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 176/ 338] blk.14.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 177/ 338] blk.14.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 178/ 338] blk.14.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 179/ 338] blk.14.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 180/ 338] blk.14.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 181/ 338] blk.14.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 182/ 338] blk.14.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 183/ 338] blk.15.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 184/ 338] blk.15.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 185/ 338] blk.15.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 186/ 338] blk.15.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 187/ 338] blk.15.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 188/ 338] blk.15.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 189/ 338] blk.15.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 190/ 338] blk.15.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 191/ 338] blk.15.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 192/ 338] blk.15.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 193/ 338] blk.15.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 194/ 338] blk.15.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 195/ 338] blk.16.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 196/ 338] blk.16.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 197/ 338] blk.16.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 198/ 338] blk.16.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 199/ 338] blk.16.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 200/ 338] blk.16.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 201/ 338] blk.16.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 202/ 338] blk.16.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 203/ 338] blk.16.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 204/ 338] blk.16.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 205/ 338] blk.16.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 206/ 338] blk.16.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 207/ 338] blk.17.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 208/ 338] blk.17.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 209/ 338] blk.17.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 210/ 338] blk.17.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 211/ 338] blk.17.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 212/ 338] blk.17.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 213/ 338] blk.17.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 214/ 338] blk.17.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 215/ 338] blk.17.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 216/ 338] blk.17.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 217/ 338] blk.17.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 218/ 338] blk.17.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 219/ 338] blk.18.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 220/ 338] blk.18.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 221/ 338] blk.18.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 222/ 338] blk.18.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 223/ 338] blk.18.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 224/ 338] blk.18.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 225/ 338] blk.18.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 226/ 338] blk.18.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 227/ 338] blk.18.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 228/ 338] blk.18.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 229/ 338] blk.18.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 230/ 338] blk.18.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 231/ 338] blk.19.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 232/ 338] blk.19.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 233/ 338] blk.19.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 234/ 338] blk.19.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 235/ 338] blk.19.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 236/ 338] blk.19.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 237/ 338] blk.19.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 238/ 338] blk.19.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 239/ 338] blk.19.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 240/ 338] blk.19.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 241/ 338] blk.19.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 242/ 338] blk.19.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 243/ 338] blk.20.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 244/ 338] blk.20.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 245/ 338] blk.20.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 246/ 338] blk.20.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 247/ 338] blk.20.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 248/ 338] blk.20.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 249/ 338] blk.20.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 250/ 338] blk.20.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 251/ 338] blk.20.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 252/ 338] blk.20.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 253/ 338] blk.20.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 254/ 338] blk.20.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 255/ 338] blk.21.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 256/ 338] blk.21.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 257/ 338] blk.21.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 258/ 338] blk.21.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 259/ 338] blk.21.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 260/ 338] blk.21.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 261/ 338] blk.21.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 262/ 338] blk.21.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 263/ 338] blk.21.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 264/ 338] blk.21.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 265/ 338] blk.21.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 266/ 338] blk.21.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 267/ 338] blk.22.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 268/ 338] blk.22.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 269/ 338] blk.22.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 270/ 338] blk.22.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 271/ 338] blk.22.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 272/ 338] blk.22.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 273/ 338] blk.22.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 274/ 338] blk.22.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 275/ 338] blk.22.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 276/ 338] blk.22.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 277/ 338] blk.22.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 278/ 338] blk.22.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 279/ 338] blk.23.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 280/ 338] blk.23.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 281/ 338] blk.23.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 282/ 338] blk.23.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 283/ 338] blk.23.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 284/ 338] blk.23.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 285/ 338] blk.23.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 286/ 338] blk.23.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 287/ 338] blk.23.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 288/ 338] blk.23.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 289/ 338] blk.23.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 290/ 338] blk.23.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 291/ 338] blk.24.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 292/ 338] blk.24.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 293/ 338] blk.24.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 294/ 338] blk.24.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 295/ 338] blk.24.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 296/ 338] blk.24.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 297/ 338] blk.24.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 298/ 338] blk.24.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 299/ 338] blk.24.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 300/ 338] blk.24.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 301/ 338] blk.24.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 302/ 338] blk.24.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 303/ 338] blk.25.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 304/ 338] blk.25.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 305/ 338] blk.25.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 306/ 338] blk.25.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 307/ 338] blk.25.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 308/ 338] blk.25.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 309/ 338] blk.25.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 310/ 338] blk.25.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 311/ 338] blk.25.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 312/ 338] blk.25.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 313/ 338] blk.25.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 314/ 338] blk.25.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 315/ 338] blk.26.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 316/ 338] blk.26.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 317/ 338] blk.26.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 318/ 338] blk.26.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 319/ 338] blk.26.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 320/ 338] blk.26.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 321/ 338] blk.26.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 322/ 338] blk.26.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 323/ 338] blk.26.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 324/ 338] blk.26.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 325/ 338] blk.26.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 326/ 338] blk.26.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 327/ 338] blk.27.attn_k.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 328/ 338] blk.27.attn_k.weight - [ 1536, 256, 1, 1], type = f16, converting to q4_K .. size = 0.75 MiB -> 0.21 MiB\n", "[ 329/ 338] blk.27.attn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 330/ 338] blk.27.attn_output.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 331/ 338] blk.27.attn_q.bias - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 332/ 338] blk.27.attn_q.weight - [ 1536, 1536, 1, 1], type = f16, converting to q4_K .. size = 4.50 MiB -> 1.27 MiB\n", "[ 333/ 338] blk.27.attn_v.bias - [ 256, 1, 1, 1], type = f32, size = 0.001 MiB\n", "[ 334/ 338] blk.27.attn_v.weight - [ 1536, 256, 1, 1], type = f16, converting to q6_K .. size = 0.75 MiB -> 0.31 MiB\n", "[ 335/ 338] blk.27.ffn_down.weight - [ 8960, 1536, 1, 1], type = f16, converting to q6_K .. size = 26.25 MiB -> 10.77 MiB\n", "[ 336/ 338] blk.27.ffn_gate.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "[ 337/ 338] blk.27.ffn_norm.weight - [ 1536, 1, 1, 1], type = f32, size = 0.006 MiB\n", "[ 338/ 338] blk.27.ffn_up.weight - [ 1536, 8960, 1, 1], type = f16, converting to q4_K .. size = 26.25 MiB -> 7.38 MiB\n", "llama_model_quantize_impl: model size = 2944.68 MiB (16.00 BPW)\n", "llama_model_quantize_impl: quant size = 934.69 MiB (5.08 BPW)\n", "\n", "main: quantize time = 157618.06 ms\n", "main: total time = 157618.06 ms\n" ] } ] }, { "cell_type": "code", "source": [ "import os\n", "\n", "files = [\n", " \"/content/qwen2.5-coding-assistant-f16.gguf\",\n", " \"/content/qwen2.5-coding-assistant-q4_k_m.gguf\"\n", "]\n", "\n", "for f in files:\n", " if os.path.exists(f):\n", " print(f\"{f} -> {round(os.path.getsize(f)/(1024**3), 2)} GB\")\n", " else:\n", " print(f\"{f} NOT FOUND\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "NBK_yyo6SRIG", "outputId": "07c3e29b-4362-4cb5-c27a-001e84428e95" }, "execution_count": 28, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "/content/qwen2.5-coding-assistant-f16.gguf -> 2.88 GB\n", "/content/qwen2.5-coding-assistant-q4_k_m.gguf -> 0.92 GB\n" ] } ] }, { "cell_type": "code", "source": [ "from google.colab import files\n", "files.download(\"/content/qwen2.5-coding-assistant-q4_k_m.gguf\")" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 17 }, "id": "zJREyVV1STZx", "outputId": "b8fd144b-4e0f-4725-dabe-bb790f904950" }, "execution_count": 29, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "" ], "application/javascript": [ "\n", " async function download(id, filename, size) {\n", " if (!google.colab.kernel.accessAllowed) {\n", " return;\n", " }\n", " const div = document.createElement('div');\n", " const label = document.createElement('label');\n", " label.textContent = `Downloading \"${filename}\": `;\n", " div.appendChild(label);\n", " const progress = document.createElement('progress');\n", " progress.max = size;\n", " div.appendChild(progress);\n", " document.body.appendChild(div);\n", "\n", " const buffers = [];\n", " let downloaded = 0;\n", "\n", " const channel = await google.colab.kernel.comms.open(id);\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", "\n", " for await (const message of channel.messages) {\n", " // Send a message to notify the kernel that we're ready.\n", " channel.send({})\n", " if (message.buffers) {\n", " for (const buffer of message.buffers) {\n", " buffers.push(buffer);\n", " downloaded += buffer.byteLength;\n", " progress.value = downloaded;\n", " }\n", " }\n", " }\n", " const blob = new Blob(buffers, {type: 'application/binary'});\n", " const a = document.createElement('a');\n", " a.href = window.URL.createObjectURL(blob);\n", " a.download = filename;\n", " div.appendChild(a);\n", " a.click();\n", " div.remove();\n", " }\n", " " ] }, "metadata": {} }, { "output_type": "display_data", "data": { "text/plain": [ "" ], "application/javascript": [ "download(\"download_69e36533-4740-4d96-a798-c285c2c2e736\", \"qwen2.5-coding-assistant-q4_k_m.gguf\", 986047808)" ] }, "metadata": {} } ] }, { "cell_type": "markdown", "metadata": { "id": "Hq-nx2WyKDRx" }, "source": [ "## 15. Push to Hugging Face Hub" ] }, { "cell_type": "code", "source": [ "from huggingface_hub import HfApi, logout, notebook_login\n", "\n", "# Log out from any existing Hugging Face session\n", "logout()\n", "\n", "# Prompt for a new token and log in\n", "notebook_login()\n", "\n", "api = HfApi()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 17, "referenced_widgets": [ "de45980af46c49ac95061d690f9f434e", "49b9b8431af8472e80af88d8a12fc940", "a820153ed4e24de4be77dab75db80c3d", "6c82aef9872b4cca8e4b13e6c7e05e8c", "6a9574880e914211aaae8aa5d40aa947", "4100c78e2b28419396a188508865fdb7", "38845ae848344553ba06b479358a3e97", "1741451e2a8a4f8babe150a67f938f01", "17b0ca0fbaf44a3b8d2520af4cde8372", "18bfd473238c461999be5109741372d7", "764251d82ea84363b14edb1bdc788195", "6874fb6da45e47ec95dfeae1ff18e56d", "e44cfe55dfd644bf816cd82a68700f31", "cbdce0419d33457f895b5d6c6fdabcb2", "1f2bbbc2733a481a8133a89f937b14db", "954ebe0fdd0e4a2c984351e2085b5b05", "341694b8642d47cb958fc68dd310d94c", "e90ad59221b34eac97e88b0a929ad3c7", "c8e149c64f1a46549443dc8b6ba4f534", "a6bfc57353af4cda98a333d151643d1f" ] }, "id": "STAsJHn-pW2f", "outputId": "64abe8f5-36ea-4876-bfe7-bb36e87c029a" }, "execution_count": 34, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "VBox(children=(HTML(value='

Copy a token from your Hugging Face\ntokens page and paste it below.
Immediately click login after copying\nyour token or it might be stored in plain text in this notebook file.
" } }, "a820153ed4e24de4be77dab75db80c3d": { "model_module": "@jupyter-widgets/controls", "model_name": "PasswordModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "PasswordModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "PasswordView", "continuous_update": true, "description": "Token:", "description_tooltip": null, "disabled": false, "layout": "IPY_MODEL_18bfd473238c461999be5109741372d7", "placeholder": "​", "style": "IPY_MODEL_764251d82ea84363b14edb1bdc788195", "value": "" } }, "6c82aef9872b4cca8e4b13e6c7e05e8c": { "model_module": "@jupyter-widgets/controls", "model_name": "CheckboxModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "CheckboxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "CheckboxView", "description": "Add token as git credential?", "description_tooltip": null, "disabled": false, "indent": true, "layout": "IPY_MODEL_6874fb6da45e47ec95dfeae1ff18e56d", "style": "IPY_MODEL_e44cfe55dfd644bf816cd82a68700f31", "value": true } }, "6a9574880e914211aaae8aa5d40aa947": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ButtonModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ButtonView", "button_style": "", "description": "Login", "disabled": false, "icon": "", "layout": "IPY_MODEL_cbdce0419d33457f895b5d6c6fdabcb2", "style": "IPY_MODEL_1f2bbbc2733a481a8133a89f937b14db", "tooltip": "" } }, "4100c78e2b28419396a188508865fdb7": { "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_954ebe0fdd0e4a2c984351e2085b5b05", "placeholder": "​", "style": "IPY_MODEL_341694b8642d47cb958fc68dd310d94c", "value": "\nPro Tip: If you don't already have one, you can create a dedicated\n'notebooks' token with 'write' access, that you can then easily reuse for all\nnotebooks. " } }, "38845ae848344553ba06b479358a3e97": { "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": "center", "align_self": null, "border": null, "bottom": null, "display": "flex", "flex": null, "flex_flow": "column", "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": "50%" } }, "1741451e2a8a4f8babe150a67f938f01": { "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 } }, "17b0ca0fbaf44a3b8d2520af4cde8372": { "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": "" } }, "18bfd473238c461999be5109741372d7": { "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 } }, "764251d82ea84363b14edb1bdc788195": { "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": "" } }, "6874fb6da45e47ec95dfeae1ff18e56d": { "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 } }, "e44cfe55dfd644bf816cd82a68700f31": { "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": "" } }, "cbdce0419d33457f895b5d6c6fdabcb2": { "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 } }, "1f2bbbc2733a481a8133a89f937b14db": { "model_module": "@jupyter-widgets/controls", "model_name": "ButtonStyleModel", "model_module_version": "1.5.0", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ButtonStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "button_color": null, "font_weight": "" } }, "954ebe0fdd0e4a2c984351e2085b5b05": { "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 } }, "341694b8642d47cb958fc68dd310d94c": { "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": "" } }, "e90ad59221b34eac97e88b0a929ad3c7": { "model_module": "@jupyter-widgets/controls", "model_name": "LabelModel", "model_module_version": "1.5.0", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "LabelModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "LabelView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_c8e149c64f1a46549443dc8b6ba4f534", "placeholder": "​", "style": "IPY_MODEL_a6bfc57353af4cda98a333d151643d1f", "value": "Connecting..." } }, "c8e149c64f1a46549443dc8b6ba4f534": { "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 } }, "a6bfc57353af4cda98a333d151643d1f": { "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": "" } }, "1cc14e5cd5b144bc8f7f9be200977e58": { "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_259451503c2d4d5e908826c4299367d7", "IPY_MODEL_40afd5733d41490db320dae1924724d6", "IPY_MODEL_17fe444a21904ceea8a4ed02c8547aee" ], "layout": "IPY_MODEL_ca551dbda8f143479d2201aafab6ecb2" } }, "259451503c2d4d5e908826c4299367d7": { "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_8a267988e6df478696c7419f27ce36b5", "placeholder": "​", "style": "IPY_MODEL_9ee6bc8cf3354db1a762a1e9fb0a1991", "value": "Processing Files (0 / 1)      : 100%" } }, "40afd5733d41490db320dae1924724d6": { "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": "danger", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_683888c8a9b1410d91acb0206ed6ceaf", "max": 1, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_85f638f565b4434189b1a53a40c2f2b5", "value": 1 } }, "17fe444a21904ceea8a4ed02c8547aee": { "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_953bc5b1593d4b53a8b9504b36f1608c", "placeholder": "​", "style": "IPY_MODEL_80ff1bd676a946a5b6b3d895e97ccff2", "value": "  986MB /  986MB, 53.4MB/s  " } }, "ca551dbda8f143479d2201aafab6ecb2": { "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 } }, "8a267988e6df478696c7419f27ce36b5": { "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 } }, "9ee6bc8cf3354db1a762a1e9fb0a1991": { "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": "" } }, "683888c8a9b1410d91acb0206ed6ceaf": { "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": "20px" } }, "85f638f565b4434189b1a53a40c2f2b5": { "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": "" } }, "953bc5b1593d4b53a8b9504b36f1608c": { "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 } }, "80ff1bd676a946a5b6b3d895e97ccff2": { "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": "" } }, "20b064da6bc64ea1b0e2951fc855619a": { "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_1a5a494f80bd49c1908e222e65421053", "IPY_MODEL_4b1ecb2b8a024c1598998b77143bae23", "IPY_MODEL_e8725418e1a34d51a8b3ab8bca8a088a" ], "layout": "IPY_MODEL_2bbb2a8b37084615b69c1c6120a55216" } }, "1a5a494f80bd49c1908e222e65421053": { "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_061578cb51c64a57bbc474fa7b383e25", "placeholder": "​", "style": "IPY_MODEL_0bbe7a8bfb7f4c969c93ab3ce96e43b0", "value": "New Data Upload               : 100%" } }, "4b1ecb2b8a024c1598998b77143bae23": { "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": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_a423bde5a16d4c988451b9a39a3bdd1b", "max": 1, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_7bd54906eb9b41fb8e5fa204e44f4d64", "value": 1 } }, "e8725418e1a34d51a8b3ab8bca8a088a": { "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_8b0d4805e04945e59af2ddbaa20d55ea", "placeholder": "​", "style": "IPY_MODEL_1bc1d938a62e4314ae6142ad93dc962e", "value": "  860MB /  860MB, 53.4MB/s  " } }, "2bbb2a8b37084615b69c1c6120a55216": { "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 } }, "061578cb51c64a57bbc474fa7b383e25": { "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 } }, "0bbe7a8bfb7f4c969c93ab3ce96e43b0": { "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": "" } }, "a423bde5a16d4c988451b9a39a3bdd1b": { "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": "20px" } }, "7bd54906eb9b41fb8e5fa204e44f4d64": { "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": "" } }, "8b0d4805e04945e59af2ddbaa20d55ea": { "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 } }, "1bc1d938a62e4314ae6142ad93dc962e": { "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": "" } }, "f7d277dc0dfc4d82a62d2895b7def427": { "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_23d8b7e00ab8461bb72913eb2a1de011", "IPY_MODEL_af7ffc6be4b4403b83f1ac5258a4f019", "IPY_MODEL_80f41a3837bd49949b3f82068f17e6e2" ], "layout": "IPY_MODEL_1071e062bbb5475896c226bf031dd1fb" } }, "23d8b7e00ab8461bb72913eb2a1de011": { "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_aca69022352340b4890da6e2b5ea2eac", "placeholder": "​", "style": "IPY_MODEL_a9b96acedae2400cb286be03df198d3b", "value": "  ...ing-assistant-q4_k_m.gguf: 100%" } }, "af7ffc6be4b4403b83f1ac5258a4f019": { "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": "danger", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_6a84002fd8eb4ea2ae5a4c4493fc7283", "max": 986047808, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_82e887659644463f926bba8c1659cb59", "value": 985654592 } }, "80f41a3837bd49949b3f82068f17e6e2": { "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_9ea61e1cc11e48d5a10ff31fef2197ab", "placeholder": "​", "style": "IPY_MODEL_5ceab12b5d4e4b33936928bf366375e7", "value": "  986MB /  986MB            " } }, "1071e062bbb5475896c226bf031dd1fb": { "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 } }, "aca69022352340b4890da6e2b5ea2eac": { "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 } }, "a9b96acedae2400cb286be03df198d3b": { "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": "" } }, "6a84002fd8eb4ea2ae5a4c4493fc7283": { "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 } }, "82e887659644463f926bba8c1659cb59": { "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": "" } }, "9ea61e1cc11e48d5a10ff31fef2197ab": { "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 } }, "5ceab12b5d4e4b33936928bf366375e7": { "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": "" } } } } }, "nbformat": 4, "nbformat_minor": 0 }