diff --git "a/FineTuneAndEvaluationscores.ipynb" "b/FineTuneAndEvaluationscores.ipynb"
new file mode 100644--- /dev/null
+++ "b/FineTuneAndEvaluationscores.ipynb"
@@ -0,0 +1,5086 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "0gF2VQ_f96of",
+ "outputId": "fa2f63cc-d47d-45f2-9c07-f418c7c8f5f5"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
+ "google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.2.3 which is incompatible.\n",
+ "torchvision 0.21.0+cu124 requires torch==2.6.0, but you have torch 2.4.1 which is incompatible.\n",
+ "torchaudio 2.6.0+cu124 requires torch==2.6.0, but you have torch 2.4.1 which is incompatible.\n",
+ "gcsfs 2025.3.2 requires fsspec==2025.3.2, but you have fsspec 2024.6.1 which is incompatible.\u001b[0m\u001b[31m\n",
+ "\u001b[0m"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install torch==2.4.1 transformers==4.44.2 datasets==3.0.1 nltk==3.9.1 pandas==2.2.3 matplotlib==3.8.4 evaluate==0.4.5 rouge_score>=0.1.2 sentence-transformers==2.7.0 -q"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "WSRNnxX7_N3f",
+ "outputId": "f4cd0003-bb29-47d8-8a18-2c9fb88eb863"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m91.2/91.2 kB\u001b[0m \u001b[31m8.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m821.2/821.2 MB\u001b[0m \u001b[31m1.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m393.1/393.1 MB\u001b[0m \u001b[31m1.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m8.9/8.9 MB\u001b[0m \u001b[31m121.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m23.7/23.7 MB\u001b[0m \u001b[31m95.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m897.7/897.7 kB\u001b[0m \u001b[31m60.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m571.0/571.0 MB\u001b[0m \u001b[31m1.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m200.2/200.2 MB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.1/1.1 MB\u001b[0m \u001b[31m64.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m12.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m158.2/158.2 MB\u001b[0m \u001b[31m7.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m216.6/216.6 MB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m156.8/156.8 MB\u001b[0m \u001b[31m6.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m201.3/201.3 MB\u001b[0m \u001b[31m6.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m19.7/19.7 MB\u001b[0m \u001b[31m96.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m89.3/89.3 kB\u001b[0m \u001b[31m8.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m155.7/155.7 MB\u001b[0m \u001b[31m6.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m7.5/7.5 MB\u001b[0m \u001b[31m122.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.5/3.5 MB\u001b[0m \u001b[31m100.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.4/12.4 MB\u001b[0m \u001b[31m115.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m6.3/6.3 MB\u001b[0m \u001b[31m116.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[?25h\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
+ "bigframes 2.8.0 requires gcsfs!=2025.5.0,>=2023.3.0, which is not installed.\n",
+ "google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.3.1 which is incompatible.\n",
+ "fastai 2.7.19 requires torch<2.7,>=1.10, but you have torch 2.7.1 which is incompatible.\n",
+ "dask-cudf-cu12 25.2.2 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\n",
+ "cudf-cu12 25.2.1 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\u001b[0m\u001b[31m\n",
+ "\u001b[0m"
+ ]
+ }
+ ],
+ "source": [
+ "# Uninstall conflicting packages\n",
+ "!pip uninstall -y torch torchvision torchaudio pandas fsspec gcsfs -q\n",
+ "# Install compatible versions\n",
+ "!pip install torch torchvision torchaudio pandas transformers datasets nltk matplotlib evaluate rouge_score sentence-transformers -q"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "xnr7STny-GO1",
+ "outputId": "66f22759-c2b7-43ac-a98e-b7682c21123f"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "--2025-07-13 18:15:03-- https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json\n",
+ "Resolving rajpurkar.github.io (rajpurkar.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...\n",
+ "Connecting to rajpurkar.github.io (rajpurkar.github.io)|185.199.108.153|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 30288272 (29M) [application/json]\n",
+ "Saving to: ‘train-v1.1.json’\n",
+ "\n",
+ "train-v1.1.json 100%[===================>] 28.88M --.-KB/s in 0.08s \n",
+ "\n",
+ "2025-07-13 18:15:06 (345 MB/s) - ‘train-v1.1.json’ saved [30288272/30288272]\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "!wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json -O train-v1.1.json"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ZGvxD7Aq_7r3",
+ "outputId": "aa48116f-e19c-47c9-8f4a-5cc7b3c13e6b"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Sample data: {'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend \"Venite Ad Me Omnes\". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.', 'qas': [{'answers': [{'answer_start': 515, 'text': 'Saint Bernadette Soubirous'}], 'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?', 'id': '5733be284776f41900661182'}, {'answers': [{'answer_start': 188, 'text': 'a copper statue of Christ'}], 'question': 'What is in front of the Notre Dame Main Building?', 'id': '5733be284776f4190066117f'}, {'answers': [{'answer_start': 279, 'text': 'the Main Building'}], 'question': 'The Basilica of the Sacred heart at Notre Dame is beside to which structure?', 'id': '5733be284776f41900661180'}, {'answers': [{'answer_start': 381, 'text': 'a Marian place of prayer and reflection'}], 'question': 'What is the Grotto at Notre Dame?', 'id': '5733be284776f41900661181'}, {'answers': [{'answer_start': 92, 'text': 'a golden statue of the Virgin Mary'}], 'question': 'What sits on top of the Main Building at Notre Dame?', 'id': '5733be284776f4190066117e'}]}\n"
+ ]
+ }
+ ],
+ "source": [
+ "import json\n",
+ "\n",
+ "with open('train-v1.1.json', 'r', encoding='utf-8') as f:\n",
+ " squad_data = json.load(f)\n",
+ "\n",
+ "# Print the first paragraph to inspect\n",
+ "print(\"Sample data:\", squad_data['data'][0]['paragraphs'][0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "4jUus8rH_-zw",
+ "outputId": "d9c06937-6bc4-4ba1-f232-398c59585f1b"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train size: 80 | Eval size: 20\n",
+ "First train example: {'context': \"In 1919 Father James Burns became president of Notre Dame, and in three years he produced an academic revolution that brought the school up to national standards by adopting the elective system and moving away from the university's traditional scholastic and classical emphasis. By contrast, the Jesuit colleges, bastions of academic conservatism, were reluctant to move to a system of electives. Their graduates were shut out of Harvard Law School for that reason. Notre Dame continued to grow over the years, adding more colleges, programs, and sports teams. By 1921, with the addition of the College of Commerce, Notre Dame had grown from a small college to a university with five colleges and a professional law school. The university continued to expand and add new residence halls and buildings with each subsequent president.\", 'question': 'Which college did Notre Dame add in 1921?', 'answer': 'College of Commerce'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "from datasets import Dataset, Features, Value\n",
+ "\n",
+ "data = []\n",
+ "for article in squad_data['data']:\n",
+ " for paragraph in article['paragraphs']:\n",
+ " context = paragraph['context'].strip()\n",
+ " for qa in paragraph['qas']:\n",
+ " question = qa['question'].strip()\n",
+ " answer = qa['answers'][0]['text'].strip() if qa['answers'] else \"\"\n",
+ " if context and question and answer: # Basic cleaning\n",
+ " data.append({\"context\": context, \"question\": question, \"answer\": answer})\n",
+ "\n",
+ "# Limit to 100 samples for quick testing\n",
+ "data = data[:100]\n",
+ "\n",
+ "# Create DataFrame and Dataset\n",
+ "df = pd.DataFrame(data)\n",
+ "features = Features({\n",
+ " \"context\": Value(\"string\"),\n",
+ " \"question\": Value(\"string\"),\n",
+ " \"answer\": Value(\"string\")\n",
+ "})\n",
+ "dataset = Dataset.from_pandas(df, features=features)\n",
+ "train_test_split = dataset.train_test_split(test_size=0.2, seed=42)\n",
+ "train_dataset = train_test_split[\"train\"]\n",
+ "eval_dataset = train_test_split[\"test\"]\n",
+ "\n",
+ "print(f\"Train size: {len(train_dataset)} | Eval size: {len(eval_dataset)}\")\n",
+ "print(\"First train example:\", train_dataset[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Wv0WZbb5C9jE"
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "81a01ed73ad14c0bb242e92fcee3691d",
+ "6c78eed341cc4b24989af6ab2978d68d",
+ "5f6f845632a146d58278487c851d94ca",
+ "43643ae87f094acaacb88aa65e23b7da",
+ "4ee01fa61c584fb891b2cecd3c5b68f9",
+ "e79873a3ce284af0b1cebc1f386db911",
+ "33f6bfbdba6542ca9767180f762ca167",
+ "5eb911a19df549478f4738a2d59421cc",
+ "272d26b935df4a66bcd567935be2a8e0",
+ "960769ad013f469db9e875d72f685c06",
+ "cb84cd598dce48ea959fcf2589423154",
+ "453ccc0077d341a7b11cb485b2593da5",
+ "a8c772a788dd46f88516694b2e2d8c5e",
+ "8b957ad3c1414d2697fa053434c57c7a",
+ "3112299bc9f746e08ceea5b06bedcdd1",
+ "30404b359d6f4eae88c88dda321fdf3e",
+ "6c725916bffe47248bfb56ccab26fff2",
+ "a87e71276e7c41868048650764e7c89c",
+ "19cf035ddf7e4c6ea3feaee497397b78",
+ "bc064df8f4ad43a39b6643b6dc91a08c",
+ "ad1ea7e2aff7420d9db6915d900cbcfb",
+ "faf0cadc32d547e5a15d7ecbb157a0c7"
+ ]
+ },
+ "id": "Duks_ZMrDBJu",
+ "outputId": "5b931687-284a-4765-d80e-287e4db9e916"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[33mWARNING: Skipping gcsfs as it is not installed.\u001b[0m\u001b[33m\n",
+ "\u001b[0m\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
+ "bigframes 2.8.0 requires gcsfs!=2025.5.0,>=2023.3.0, which is not installed.\n",
+ "google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.3.1 which is incompatible.\n",
+ "fastai 2.7.19 requires torch<2.7,>=1.10, but you have torch 2.7.1 which is incompatible.\n",
+ "dask-cudf-cu12 25.2.2 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\n",
+ "cudf-cu12 25.2.1 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\u001b[0m\u001b[31m\n",
+ "\u001b[0m"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[nltk_data] Downloading package punkt to /root/nltk_data...\n",
+ "[nltk_data] Package punkt is already up-to-date!\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Torch version: 2.7.1+cu126\n",
+ "GPU available: True\n",
+ "--2025-07-13 18:30:27-- https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json\n",
+ "Resolving rajpurkar.github.io (rajpurkar.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...\n",
+ "Connecting to rajpurkar.github.io (rajpurkar.github.io)|185.199.108.153|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 30288272 (29M) [application/json]\n",
+ "Saving to: ‘train-v1.1.json’\n",
+ "\n",
+ "train-v1.1.json 100%[===================>] 28.88M --.-KB/s in 0.07s \n",
+ "\n",
+ "2025-07-13 18:30:27 (443 MB/s) - ‘train-v1.1.json’ saved [30288272/30288272]\n",
+ "\n",
+ "Sample data: {'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend \"Venite Ad Me Omnes\". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.', 'qas': [{'answers': [{'answer_start': 515, 'text': 'Saint Bernadette Soubirous'}], 'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?', 'id': '5733be284776f41900661182'}, {'answers': [{'answer_start': 188, 'text': 'a copper statue of Christ'}], 'question': 'What is in front of the Notre Dame Main Building?', 'id': '5733be284776f4190066117f'}, {'answers': [{'answer_start': 279, 'text': 'the Main Building'}], 'question': 'The Basilica of the Sacred heart at Notre Dame is beside to which structure?', 'id': '5733be284776f41900661180'}, {'answers': [{'answer_start': 381, 'text': 'a Marian place of prayer and reflection'}], 'question': 'What is the Grotto at Notre Dame?', 'id': '5733be284776f41900661181'}, {'answers': [{'answer_start': 92, 'text': 'a golden statue of the Virgin Mary'}], 'question': 'What sits on top of the Main Building at Notre Dame?', 'id': '5733be284776f4190066117e'}]}\n",
+ "Train size: 80 | Eval size: 20\n",
+ "First train example: {'context': \"In 1919 Father James Burns became president of Notre Dame, and in three years he produced an academic revolution that brought the school up to national standards by adopting the elective system and moving away from the university's traditional scholastic and classical emphasis. By contrast, the Jesuit colleges, bastions of academic conservatism, were reluctant to move to a system of electives. Their graduates were shut out of Harvard Law School for that reason. Notre Dame continued to grow over the years, adding more colleges, programs, and sports teams. By 1921, with the addition of the College of Commerce, Notre Dame had grown from a small college to a university with five colleges and a professional law school. The university continued to expand and add new residence halls and buildings with each subsequent president.\", 'question': 'Which college did Notre Dame add in 1921?', 'answer': 'College of Commerce'}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.11/dist-packages/transformers/tokenization_utils_base.py:1601: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be depracted in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "81a01ed73ad14c0bb242e92fcee3691d",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Map: 0%| | 0/80 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "453ccc0077d341a7b11cb485b2593da5",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Map: 0%| | 0/20 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Fine-tuning started...\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Final Evaluation Results:\n",
+ " eval_loss: 2.223381519317627\n",
+ " eval_rouge1: 0.4088792920468986\n",
+ " eval_rougeL: 0.3724393817985359\n",
+ " eval_runtime: 1.9014\n",
+ " eval_samples_per_second: 10.519\n",
+ " eval_steps_per_second: 5.259\n",
+ " epoch: 3.0\n",
+ "Context: The Lobund Institute grew out of pioneering research in germ-free-life which began in 1928. This are...\n",
+ "Answer: The Lobund Institute\n",
+ "Generated Question: Lobund was the first research organization to answer whether animal life was possible without bacteria?\n",
+ "Reference Question: Work on a germ-free-life ended up in the creation of which Notre Dame institute?\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAHWCAYAAACbsXOkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAko9JREFUeJzs3Xd4VGX6//H3TDLpjXQIafQighA6SnRRbGtZC7quNOu6rLpYVty1/tjlq64urquCrhRlVexrYVUWpYUQmoAiJpSQ0NII6SSZZM7vjxMmDKGbYVI+r+vi0nnOMzP3PDOE3HM/5z4WwzAMRERERERE5GexejoAERERERGRtkDJlYiIiIiISDNQciUiIiIiItIMlFyJiIiIiIg0AyVXIiIiIiIizUDJlYiIiIiISDNQciUiIiIiItIMlFyJiIiIiIg0AyVXIiIiIiIizUDJlYhIC2axWHjyySc98txLly7FYrGwdOlSjzy/yM9lsViYMmWKp8MQkXZEyZWIyEnMmzcPi8Vy3D+rV6/2dIg/yyuvvMK8efM8HYYLh8PBm2++ydChQwkPDyc4OJgePXowfvz4Vr/eJ5Kbm8vdd99NUlISvr6+REdHc80115CWlubp0I7pRH8v7r77bk+HJyJy1nl7OgARkdbi6aefJjk5ucl4t27dPBBN83nllVeIjIxk4sSJLuMXXHABhw4dwsfH56zHdO+99/Lyyy9z9dVXc8stt+Dt7U1mZib//e9/6dKlC8OGDTvrMblbWloal19+OQC33347ffr0IS8vj3nz5nH++efz4osv8vvf/97DUTZ18cUXM378+CbjPXr08EA0IiKepeRKROQUXXbZZaSkpHg6jLPGarXi5+d31p83Pz+fV155hTvuuIPXXnvN5djMmTMpLCw8a7HU1dXhcDjcnmAePHiQ66+/Hn9/f9LS0ujatavz2NSpUxk7diz3338/gwYNYsSIEW6N5UjV1dX4+PhgtR5/o0uPHj34zW9+c9ZiEhFpybQtUESkGdjtdsLDw5k0aVKTY2VlZfj5+fHggw8CUFtby+OPP86gQYMIDQ0lMDCQ888/n2+//fakzzNx4kSSkpKajD/55JNYLBaXsblz53LRRRcRHR2Nr68vffr04dVXX3WZk5SUxJYtW1i2bJlzO1dqaipw/HOu3n//fQYNGoS/vz+RkZH85je/Ye/evU3iDAoKYu/evVxzzTUEBQURFRXFgw8+SH19/QlfY3Z2NoZhMHLkyCbHLBYL0dHRLmMlJSX84Q9/cG6l69y5M+PHj6eoqMg5p6CggNtuu42YmBj8/Pzo378/8+fPd3mcXbt2YbFY+Nvf/sbMmTPp2rUrvr6+/PjjjwD89NNPXH/99YSHh+Pn50dKSgqffvqpy2PY7Xaeeuopunfvjp+fHxEREYwaNYrFixef8DXPnj2bvLw8nnvuOZfECsDf35/58+djsVh4+umnAVi3bh0Wi6XJawD46quvsFgsfP75586xvXv3MnnyZGJiYvD19aVv377MmTPH5X6H3+93332XP//5z8TFxREQEEBZWdkJYz8VqampnHPOOaxfv54RI0bg7+9PcnIys2bNajL3VN4rMLeOvvjii/Tr1w8/Pz+ioqK49NJLWbduXZO5n3zyCeecc47ztX/55Zcux8vLy7n//vtdtmNefPHFbNiw4We/dhFpX1S5EhE5RaWlpS6/sIP5y35ERAQ2m41rr72Wjz76iNmzZ7tUOj755BNqamq46aabADPZ+te//sXNN9/MHXfcQXl5OW+88QZjx45lzZo1DBgwoFniffXVV+nbty9XXXUV3t7efPbZZ9xzzz04HA5+97vfAWYl6Pe//z1BQUH86U9/AiAmJua4jzlv3jwmTZrE4MGDmTFjBvn5+bz44oukpaXx3XffERYW5pxbX1/P2LFjGTp0KH/729/43//+x/PPP0/Xrl357W9/e9znSExMBMwk7oYbbiAgIOC4cysqKjj//PPZunUrkydPZuDAgRQVFfHpp5+yZ88eIiMjOXToEKmpqWzfvp0pU6aQnJzM+++/z8SJEykpKeG+++5zecy5c+dSXV3NnXfeia+vL+Hh4WzZsoWRI0cSFxfHI488QmBgIO+99x7XXHMNH374Iddeey1gJrkzZszg9ttvZ8iQIZSVlbFu3To2bNjAxRdffNzX8dlnn+Hn58eNN954zOPJycmMGjWKb775hkOHDpGSkkKXLl147733mDBhgsvchQsX0qFDB8aOHQuYlcBhw4Y5mztERUXx3//+l9tuu42ysjLuv/9+l/v/v//3//Dx8eHBBx+kpqbmpFW76urqJn8vAEJCQlzue/DgQS6//HJuvPFGbr75Zt577z1++9vf4uPjw+TJkwFO67267bbbmDdvHpdddhm33347dXV1rFixgtWrV7tUmFeuXMlHH33EPffcQ3BwMP/4xz+47rrryM3NJSIiAoC7776bDz74gClTptCnTx8OHDjAypUr2bp1KwMHDjzh6xcRcWGIiMgJzZ071wCO+cfX19c576uvvjIA47PPPnO5/+WXX2506dLFebuurs6oqalxmXPw4EEjJibGmDx5sss4YDzxxBPO2xMmTDASExObxPjEE08YR/9Ir6qqajJv7NixLrEYhmH07dvXGD16dJO53377rQEY3377rWEYhlFbW2tER0cb55xzjnHo0CHnvM8//9wAjMcff9wlTsB4+umnXR7zvPPOMwYNGtTkuY42fvx4AzA6dOhgXHvttcbf/vY3Y+vWrU3mPf744wZgfPTRR02OORwOwzAMY+bMmQZgLFiwwHmstrbWGD58uBEUFGSUlZUZhmEY2dnZBmCEhIQYBQUFLo/1i1/8wujXr59RXV3t8vgjRowwunfv7hzr37+/ccUVV5z09R0tLCzM6N+//wnn3HvvvQZgbN682TAMw5g2bZphs9mM4uJi55yamhojLCzM5XN02223GR07djSKiopcHu+mm24yQkNDnZ+Tw+93ly5djvnZOZbj/b0AjHfeecc5b/To0QZgPP/88y6xDhgwwIiOjjZqa2sNwzj19+qbb74xAOPee+9tEtPh9/1wfD4+Psb27dudY5s2bTIA46WXXnKOhYaGGr/73e9O6TWLiJyItgWKiJyil19+mcWLF7v8+e9//+s8ftFFFxEZGcnChQudYwcPHmTx4sWMGzfOOebl5eX8Rt/hcFBcXExdXR0pKSnNug3J39/f+f+Hq26jR49m586dlJaWnvbjrVu3joKCAu655x6Xc7GuuOIKevXqxRdffNHkPkd3jDv//PPZuXPnSZ9r7ty5/POf/yQ5OZmPP/6YBx98kN69e/OLX/zCZQvihx9+SP/+/Z2VoyMd3ia5aNEiYmNjufnmm53HbDYb9957LxUVFSxbtszlftdddx1RUVHO28XFxXzzzTfceOONlJeXU1RURFFREQcOHGDs2LFs27bNGVNYWBhbtmxh27ZtJ32NRyovLyc4OPiEcw4fP7xNb9y4cdjtdj766CPnnK+//pqSkhLn580wDD788EN++ctfYhiGM/aioiLGjh1LaWlpk8/chAkTXD47J3P11Vc3+XuxePFiLrzwQpd53t7e3HXXXc7bPj4+3HXXXRQUFLB+/Xrg1N+rDz/8EIvFwhNPPNEknqO3x44ZM8Zlq+W5555LSEiIy+cwLCyMjIwM9u3bd8qvW0TkWLQtUETkFA0ZMuSEDS28vb257rrrePvtt6mpqcHX15ePPvoIu93uklwBzJ8/n+eff56ffvoJu93uHD9WN8IzlZaWxhNPPEF6ejpVVVUux0pLSwkNDT2tx8vJyQGgZ8+eTY716tWLlStXuowdPg/mSB06dODgwYMnfS6r1crvfvc7fve733HgwAHS0tKYNWsW//3vf7nppptYsWIFADt27OC66647adzdu3dv0pShd+/eLq/rsKPfg+3bt2MYBo899hiPPfbYMZ+joKCAuLg4nn76aa6++mp69OjBOeecw6WXXsqtt97Kueeee8IYg4ODKS8vP+Gcw8cPJ1n9+/enV69eLFy4kNtuuw0wtwRGRkZy0UUXAVBYWEhJSQmvvfZak+YgR8Z+otd/Mp07d2bMmDEnndepUycCAwNdxg53FNy1axfDhg075fdqx44ddOrUifDw8JM+b0JCQpOxoz+Hzz77LBMmTCA+Pp5BgwZx+eWXM378eLp06XLSxxcROZIqVyIizeimm26ivLzcWdF677336NWrF/3793fOWbBgARMnTqRr16688cYbfPnllyxevJiLLroIh8Nxwsc/+lv5w45uErFjxw5+8YtfUFRUxAsvvMAXX3zB4sWL+cMf/gBw0udpDl5eXs3yOBEREVx11VUsWrSI0aNHs3LlyiYJUXM6umpzeK0efPDBY1ZoFi9e7GzHf8EFF7Bjxw7mzJnDOeecw7/+9S8GDhzIv/71rxM+Z+/evcnMzKSmpua4czZv3ozNZqN79+7OsXHjxvHtt99SVFRETU0Nn376Kddddx3e3t4usf/mN785buxHNw45napVa3C8z6FhGM7/v/HGG9m5cycvvfQSnTp14rnnnqNv374ulWkRkVOhypWISDO64IIL6NixIwsXLnQ2IDjcKOKwDz74gC5duvDRRx+5JEvH2uJ0tA4dOlBSUtJk/Ohk47PPPnP+sn3kN/fH6kh4vITtaIcbTWRmZjorI4dlZmY6j7tTSkoKy5YtY//+/SQmJtK1a1d++OGHE94nMTGRzZs343A4XCoiP/30k/P4iRyuXthstlOq0BzuGjlp0iQqKiq44IILePLJJ7n99tuPe58rr7yS9PR03n///WO2Nd+1axcrVqxgzJgxLsnPuHHjeOqpp/jwww+JiYmhrKzM2TgFICoqiuDgYOrr608pdnfat28flZWVLtWrrKwsAGcHzFN9r7p27cpXX31FcXHxKVWvTkXHjh255557uOeeeygoKGDgwIH85S9/4bLLLmuWxxeR9kGVKxGRZmS1Wrn++uv57LPPeOutt6irq2uyJfDwN+lHfnOekZFBenr6SR+/a9eulJaWsnnzZufY/v37+fjjj0/6HKWlpcydO7fJYwYGBh4zYTtaSkoK0dHRzJo1y6XC8t///petW7dyxRVXnPQxTkVeXp6z/fmRamtrWbJkCVar1Vkpuu6669i0aVOT1w+Nr/3yyy8nLy/P5Vy4uro6XnrpJYKCghg9evQJ44mOjiY1NZXZs2ezf//+JsePvO7WgQMHXI4FBQXRrVu3E1akAO666y6io6N56KGHmpyTVl1dzaRJkzAMg8cff9zlWO/evenXrx8LFy5k4cKFdOzYkQsuuMB53MvLi+uuu44PP/zwmEno2b5m2OzZs523a2trmT17NlFRUQwaNAg49ffquuuuwzAMnnrqqSbPc+Rn/lTU19c3OQcxOjqaTp06nfR9ExE5mipXIiKn6L///a/zG/QjjRgxwuXcjHHjxvHSSy/xxBNP0K9fP+f5IoddeeWVfPTRR1x77bVcccUVZGdnM2vWLPr06UNFRcUJY7jpppv44x//yLXXXsu9995LVVUVr776Kj169HBpTHDJJZfg4+PDL3/5S+666y4qKip4/fXXiY6ObpIgDBo0iFdffZXp06fTrVs3oqOjm1SmwKzcPPPMM0yaNInRo0dz8803O1uxJyUlObcc/lx79uxhyJAhXHTRRfziF78gNjaWgoIC3nnnHTZt2sT9999PZGQkAA899BAffPABN9xwA5MnT2bQoEEUFxfz6aefMmvWLPr378+dd97J7NmzmThxIuvXrycpKYkPPviAtLQ0Zs6cedJGEmA2Mxk1ahT9+vXjjjvuoEuXLuTn55Oens6ePXvYtGkTAH369CE1NZVBgwYRHh7OunXrnC2+TyQiIoIPPviAK664goEDB3L77bfTp08f8vLymDdvHtu3b+fFF1885gWEx40bx+OPP46fnx+33XZbk/OV/u///o9vv/2WoUOHcscdd9CnTx+Ki4vZsGED//vf/yguLj7Vt+aYsrKyWLBgQZPxmJgYl/bznTp14plnnmHXrl306NGDhQsXsnHjRl577TVsNhvAKb9XF154Ibfeeiv/+Mc/2LZtG5deeikOh4MVK1Zw4YUXnnS9j1ReXk7nzp25/vrr6d+/P0FBQfzvf/9j7dq1PP/88z9rbUSkHfJUm0IRkdbiRK3YAWPu3Lku8x0OhxEfH28AxvTp05s8nsPhMP76178aiYmJhq+vr3HeeecZn3/++THbrHNUK3bDMIyvv/7aOOeccwwfHx+jZ8+exoIFC47Ziv3TTz81zj33XMPPz89ISkoynnnmGWPOnDkGYGRnZzvn5eXlGVdccYURHBxsAM627Ee3Yj9s4cKFxnnnnWf4+voa4eHhxi233GLs2bPHZc6ECROMwMDAJq/9WHEerayszHjxxReNsWPHGp07dzZsNpsRHBxsDB8+3Hj99dddWm0bhmEcOHDAmDJlihEXF2f4+PgYnTt3NiZMmODSejw/P9+YNGmSERkZafj4+Bj9+vVr8r4dbsX+3HPPHTOuHTt2GOPHjzdiY2MNm81mxMXFGVdeeaXxwQcfOOdMnz7dGDJkiBEWFmb4+/sbvXr1Mv7yl784W42fTHZ2tnHHHXcYCQkJhs1mMyIjI42rrrrKWLFixXHvs23bNudnceXKlceck5+fb/zud78z4uPjDZvNZsTGxhq/+MUvjNdee8055/D7/f77759SrIZx4lbsR7b3Hz16tNG3b19j3bp1xvDhww0/Pz8jMTHR+Oc//3nMWE/2XhmGeUmD5557zujVq5fh4+NjREVFGZdddpmxfv16l/iO1WI9MTHRmDBhgmEYZkv4hx56yOjfv78RHBxsBAYGGv379zdeeeWVU14HEZHDLIZxmvVzERERkdOQmppKUVHRSc+PExFp7XTOlYiIiIiISDNQciUiIiIiItIMlFyJiIiIiIg0A51zJSIiIiIi0gxUuRIREREREWkGSq5ERERERESagS4ifAwOh4N9+/YRHByMxWLxdDgiIiIiIuIhhmFQXl5Op06dmlyo/WhKro5h3759xMfHezoMERERERFpIXbv3k3nzp1POEfJ1TEEBwcD5gKGhIR4NBa73c7XX3/NJZdcgs1m82gsbZHW1720vu6l9XU/rbF7aX3dS+vrXlpf92pJ61tWVkZ8fLwzRzgRJVfHcHgrYEhISItIrgICAggJCfH4B6st0vq6l9bXvbS+7qc1di+tr3tpfd1L6+teLXF9T+V0ITW0EBERERERaQZKrkRERERERJqBkisREREREZFmoHOuzpBhGNTV1VFfX+/W57Hb7Xh7e1NdXe3252ovvLy88Pb2Vpt9EREREWlWSq7OQG1tLfv376eqqsrtz2UYBrGxsezevVvJQDMKCAigY8eOWlMRERERaTZKrk6Tw+EgOzsbLy8vOnXqhI+Pj1t/QXc4HFRUVBAUFHTSi5bJyRmGQW1tLYWFhWRnZ5OUlOTpkERERESkjVBydZpqa2txOBzEx8cTEBDg9udzOBzU1tbi5+en5KqZ+Pv7Y7PZyMnJwW63ezocEREREWkj9Nv6GVKi07odfv8Mw/BwJCIiIiLSVihDEBERERERaQZKrkRERERERJqBkisREREREZFmoOSqHZk4cSIWiwWLxYLNZiM5OZmHH36Y6upql3mff/45o0ePJjg4mICAAAYPHsy8efNc5ixduhSLxUJJSUmT50lKSmLmzJkuY99++y1XXnklUVFR+Pn50bVrV8aNG8fy5cubPOax/uTl5R33dS1fvpxf/vKXdOrUCYvFwieffHK6SyMiIiIi8rMpuWpnLr30Uvbv38/OnTv5+9//zuzZs3niiSecx1966SWuvvpqRo4cSUZGBps3b+amm27i7rvv5sEHHzyj53zllVf4xS9+QUREBAsXLiQzM5OPP/6YESNG8Ic//KHJ/MzMTPbv3+/yJzo6+riPX1lZSf/+/Xn55ZfPKD4RERERaVkMw8Du8HQUp0+t2JuBYRgcste75bEdDgeHauvxrq1r0qHQ3+Z12tfY8vX1JTY2FoD4+HjGjBnD4sWLeeaZZ9i9ezcPPPAA999/P3/961+d93nggQfw8fHh3nvv5YYbbmDo0KGn/Hy5ubncf//93H///bzwwgsux84991zuvffeJveJjo4mLCzslJ/jsssu47LLLjvl+SIiIiLSMtnrHSz6fj9vrNyJf42Vqz0d0GlSctUMDtnr6fP4V2f9eX98eiwBPmf+Fv7www+sWrWKxMREAD744APsdvsxK1R33XUXjz76KO+8885pJVcffvghdrudhx9++JjH3XkBZhERERFpHYora3lnTS5vpu8iv6wGAD8vC1W1dYTabB6O7tQpuWpnPv/8c4KCgqirq6Ompgar1co///lPALKysggNDaVjx45N7ufj40OXLl3Iyso6refLysoiJCTEWS0DM+GaMGGC83Z6ejr9+vVz3u7cubPLYyQmJrJly5bTel4RERERafmy8suZm5bNRxv2UlNn7gOMCvbl14M7E1WW+bMKCZ7QuqJtofxtXvz49Fi3PLbD4aC8rJzgkOBjbgs8XRdeeCGvvvoqlZWV/P3vf8fb25vrrruuucI9pqOrU2PHjmXjxo3s3buX1NRU6utdt1SuWLGC4OBg521bw7cVK1ascNn+N3v2bG655RY3Ri4iIiIizc3hMFiWVcictGxWbCtyjp8TF8Jto5K5ol8nLEY9ixZlejDKM6PkqhlYLBa3ZdUOh4M6Hy8CfLybJFdnIjAwkG7dugEwZ84c+vfvzxtvvMFtt91Gjx49KC0tZd++fXTq1MnlfrW1tezYsYMLL7wQgJCQEABKS0ubnB9VUlJCaGgoAN27d6e0tJS8vDxn9SooKIhu3brh7X3sNUtOTj7mOVcpKSls3LjReTsmJua0X7+IiIiIeEZlTR0fbdjD3LRd7CyqBMBqgbF9Y5k8KpmUxA7OL+Xtbupn4G7qFtiOWa1WHn30Uf785z9z6NAhrrvuOmw2G88//3yTubNmzaKyspKbb74ZMJMmq9XK+vXrXebt3LmT0tJSevToAcD111+PzWbjmWee+dnx+vv7061bN+efI6tbIiIiItIy7S05xIxFWxk+YwmP/WcLO4sqCfbz5o7zk1n20IW8+ptBDE4KbxPn4qty1c7dcMMNPPTQQ7z88ss8+OCDPPvsszzwwAP4+flx6623YrPZ+M9//sOjjz7KAw884GxmERwczO23384DDzyAt7c3/fr1Y/fu3fzxj39k2LBhjBgxAoCEhASef/557rvvPoqLi5k4cSLJyckUFxezYMECALy8XLc3FhQUNLn2VkREhHN74NEqKirYvn2783Z2djYbN24kPDychISEZlsrERERETk1hmGwPucgc9Ky+WpLPvUOA4CkiAAmjUzmukGdCfJte6lI23tFclq8vb2ZMmUKzz77LL/97W+5//776dKlC3/729948cUXqa+vp2/fvrz66qtMmjTJ5b4vvvgi//d//8cf//hHcnJyiI2N5eKLL+Yvf/mLyzcPv//97+nduzcvvPAC119/PWVlZURERDB8+HC+/PJLl2YW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KxERERERkWag5EpERERERKQZKLkSERERERFpBkquREREREREmoGSKxERERERkWag5EpERERERKQZKLkSERERERFpBkquREREREREmoGSKxERERERkWag5EpERERERKQZKLkSERERERFpBkquREREREREmoG3pwNoiQzDAKCsrMzDkYDdbqeqqoqysjJsNpunw2lztL7upfV1L62v+2mN3Uvr615aX/fS+rpXS1rfwznB4RzhRJRcHUN5eTkA8fHxHo5ERERERERagvLyckJDQ084x2KcSgrWzjgcDvbt20dwcDAWi8WjsZSVlREfH8/u3bsJCQnxaCxtkdbXvbS+7qX1dT+tsXtpfd1L6+teWl/3aknraxgG5eXldOrUCav1xGdVqXJ1DFarlc6dO3s6DBchISEe/2C1ZVpf99L6upfW1/20xu6l9XUvra97aX3dq6Ws78kqVoepoYWIiIiIiEgzUHIlIiIiIiLSDJRctXC+vr488cQT+Pr6ejqUNknr615aX/fS+rqf1ti9tL7upfV1L62ve7XW9VVDCxERERERkWagypWIiIiIiPz/9u49KMryiwP4dxV2uQgCIbCooXhBJcG8QHgZL6CAjiONpTjIoGmmoaNTloyTIWMzYjky1hCWoVgaJCrqlOIFXZwItRAUDBk1Mk2RtFTAS8ae3x8MW68LCvtb7t/PzI7s8553fZ4zZx85vLwrmQGbKyIiIiIiIjNgc0VERERERGQGbK6IiIiIiIjMgM1VMzpx4gSmTp0Kd3d3qFQq7N2795nn6HQ6DB06FBqNBn379kVKSopRTGJiInr16gUrKyv4+/vj9OnT5p98G9HYHO/ZswcTJ05Et27dYG9vj4CAABw6dEgRs3r1aqhUKsVjwIABTbiK1qux+dXpdEa5U6lUKCsrU8Sxhms0Nr9z5sypM7/e3t6GGNZvjbVr12LEiBGws7ODi4sLwsLCUFJS8szz0tPTMWDAAFhZWWHw4ME4cOCA4riI4P3334dWq4W1tTWCgoJw8eLFplpGq2VKfjdv3owxY8bA0dERjo6OCAoKMnrv11XjISEhTbmUVsmU/KakpBjlzsrKShHD+q1hSn7HjRtX5/47ZcoUQwzr919JSUnw8fEx/IfAAQEBOHjw4FPPaav7L5urZlRVVQVfX18kJiY2KL60tBRTpkzB+PHjUVBQgGXLlmH+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\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model and tokenizer saved!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Install dependencies\n",
+ "!pip uninstall -y torch torchvision torchaudio pandas fsspec gcsfs -q\n",
+ "!pip install torch torchvision torchaudio pandas transformers datasets nltk matplotlib evaluate rouge_score sentence-transformers -q\n",
+ "# Restart runtime after installation\n",
+ "\n",
+ "import json\n",
+ "import pandas as pd\n",
+ "from datasets import Dataset, Features, Value\n",
+ "from transformers import T5Tokenizer, T5ForConditionalGeneration, TrainingArguments, Trainer\n",
+ "import evaluate\n",
+ "import matplotlib.pyplot as plt\n",
+ "import torch\n",
+ "import nltk\n",
+ "import numpy as np # Added missing import\n",
+ "nltk.download('punkt')\n",
+ "\n",
+ "# Verify setup\n",
+ "print(f\"Torch version: {torch.__version__}\")\n",
+ "print(f\"GPU available: {torch.cuda.is_available()}\")\n",
+ "\n",
+ "# Step 2: Download and load dataset\n",
+ "!wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json -O train-v1.1.json\n",
+ "with open('train-v1.1.json', 'r', encoding='utf-8') as f:\n",
+ " squad_data = json.load(f)\n",
+ "print(\"Sample data:\", squad_data['data'][0]['paragraphs'][0])\n",
+ "\n",
+ "# Step 3: Clean and prepare dataset\n",
+ "data = []\n",
+ "for article in squad_data['data']:\n",
+ " for paragraph in article['paragraphs']:\n",
+ " context = paragraph['context'].strip()\n",
+ " for qa in paragraph['qas']:\n",
+ " question = qa['question'].strip()\n",
+ " answer = qa['answers'][0]['text'].strip() if qa['answers'] else \"\"\n",
+ " if context and question and answer:\n",
+ " data.append({\"context\": context, \"question\": question, \"answer\": answer})\n",
+ "\n",
+ "data = data[:100]\n",
+ "df = pd.DataFrame(data)\n",
+ "features = Features({\n",
+ " \"context\": Value(\"string\"),\n",
+ " \"question\": Value(\"string\"),\n",
+ " \"answer\": Value(\"string\")\n",
+ "})\n",
+ "dataset = Dataset.from_pandas(df, features=features)\n",
+ "train_test_split = dataset.train_test_split(test_size=0.2, seed=42)\n",
+ "train_dataset = train_test_split[\"train\"]\n",
+ "eval_dataset = train_test_split[\"test\"]\n",
+ "print(f\"Train size: {len(train_dataset)} | Eval size: {len(eval_dataset)}\")\n",
+ "print(\"First train example:\", train_dataset[0])\n",
+ "\n",
+ "# Step 4: Fine-tune the model\n",
+ "model_name = \"valhalla/t5-small-qg-hl\"\n",
+ "tokenizer = T5Tokenizer.from_pretrained(model_name)\n",
+ "model = T5ForConditionalGeneration.from_pretrained(model_name)\n",
+ "\n",
+ "def preprocess(examples):\n",
+ " inputs = [f\"generate question: {ctx} {ans}\" for ctx, ans in zip(examples['context'], examples['answer'])]\n",
+ " targets = examples['question']\n",
+ " model_inputs = tokenizer(inputs, max_length=256, truncation=True, padding=\"max_length\", return_tensors=None)\n",
+ " labels = tokenizer(targets, max_length=32, truncation=True, padding=\"max_length\")[\"input_ids\"]\n",
+ " model_inputs[\"labels\"] = labels\n",
+ " return model_inputs\n",
+ "\n",
+ "tokenized_train_dataset = train_dataset.map(preprocess, remove_columns=train_dataset.column_names, batched=True)\n",
+ "tokenized_eval_dataset = eval_dataset.map(preprocess, remove_columns=eval_dataset.column_names, batched=True)\n",
+ "\n",
+ "tokenized_train_dataset = tokenized_train_dataset.with_format(\"torch\")\n",
+ "tokenized_eval_dataset = tokenized_eval_dataset.with_format(\"torch\")\n",
+ "\n",
+ "training_args = TrainingArguments(\n",
+ " output_dir=\"./qg-finetuned\",\n",
+ " per_device_train_batch_size=2,\n",
+ " per_device_eval_batch_size=2,\n",
+ " num_train_epochs=3, # Increased to 3\n",
+ " eval_strategy=\"epoch\",\n",
+ " learning_rate=2e-5,\n",
+ " logging_dir=\"./logs\",\n",
+ " logging_steps=10,\n",
+ " save_strategy=\"epoch\",\n",
+ " save_total_limit=1,\n",
+ " fp16=True,\n",
+ " report_to=\"none\",\n",
+ " load_best_model_at_end=True,\n",
+ " metric_for_best_model=\"eval_loss\",\n",
+ " greater_is_better=False\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def compute_metrics(eval_pred):\n",
+ " predictions, labels = eval_pred\n",
+ " predictions = predictions[0] if isinstance(predictions, tuple) else predictions\n",
+ " predictions = np.argmax(predictions, axis=-1) if predictions.ndim == 3 else predictions\n",
+ " labels = np.argmax(labels, axis=-1) if labels.ndim == 3 else labels\n",
+ "\n",
+ " def decode_sequences(sequences):\n",
+ " return [tokenizer.decode(seq, skip_special_tokens=True) for seq in sequences]\n",
+ "\n",
+ " decoded_preds = decode_sequences(predictions)\n",
+ " decoded_labels = decode_sequences(labels)\n",
+ "\n",
+ " rouge = evaluate.load(\"rouge\")\n",
+ " rouge_score = rouge.compute(predictions=decoded_preds, references=decoded_labels)\n",
+ "\n",
+ " return {\n",
+ " \"rouge1\": rouge_score[\"rouge1\"],\n",
+ " \"rougeL\": rouge_score[\"rougeL\"]\n",
+ " }\n",
+ "\n",
+ "trainer = Trainer(\n",
+ " model=model,\n",
+ " args=training_args,\n",
+ " train_dataset=tokenized_train_dataset,\n",
+ " eval_dataset=tokenized_eval_dataset,\n",
+ " compute_metrics=compute_metrics\n",
+ ")\n",
+ "\n",
+ "print(\"Fine-tuning started...\")\n",
+ "trainer.train()\n",
+ "print(\"Running final evaluation...\")\n",
+ "results = trainer.evaluate()\n",
+ "print(\"Final Evaluation Results:\")\n",
+ "for metric, score in results.items():\n",
+ " print(f\" {metric}: {score}\")\n",
+ "\n",
+ "# Step 5: Generate and evaluate sample questions\n",
+ "from transformers import GenerationConfig\n",
+ "model.eval()\n",
+ "sample = eval_dataset[0]\n",
+ "inputs = tokenizer(f\"generate question: {sample['context']} {sample['answer']}\", max_length=256, truncation=True, padding=\"max_length\", return_tensors=\"pt\").to(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
+ "\n",
+ "generation_config = GenerationConfig(early_stopping=True, num_beams=5, max_length=128) # Adjusted\n",
+ "outputs = model.generate(**inputs, generation_config=generation_config)\n",
+ "generated_question = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
+ "\n",
+ "print(f\"Context: {sample['context'][:100]}...\")\n",
+ "print(f\"Answer: {sample['answer']}\")\n",
+ "print(f\"Generated Question: {generated_question}\")\n",
+ "print(f\"Reference Question: {sample['question']}\")\n",
+ "\n",
+ "# Step 6: Plot evaluation scores\n",
+ "log_history = trainer.state.log_history\n",
+ "epochs = [entry['epoch'] for entry in log_history if 'eval_rouge1' in entry]\n",
+ "rouge1_scores = [entry['eval_rouge1'] for entry in log_history if 'eval_rouge1' in entry]\n",
+ "rougeL_scores = [entry['eval_rougeL'] for entry in log_history if 'eval_rougeL' in entry]\n",
+ "\n",
+ "plt.figure(figsize=(10, 5))\n",
+ "plt.plot(epochs, rouge1_scores, label='ROUGE-1')\n",
+ "plt.plot(epochs, rougeL_scores, label='ROUGE-L')\n",
+ "plt.xlabel('Epoch')\n",
+ "plt.ylabel('Score')\n",
+ "plt.title('Evaluation Scores Over Epochs')\n",
+ "plt.legend()\n",
+ "plt.grid(True)\n",
+ "plt.show()\n",
+ "\n",
+ "# Step 7: Save the model\n",
+ "model.save_pretrained(\"./qg-finetuned/final\")\n",
+ "tokenizer.save_pretrained(\"./qg-finetuned/final\")\n",
+ "print(\"Model and tokenizer saved!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "PLtSpaNOFLxP"
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "a84e34de79c140abb75f26d9f9ca64c3",
+ "7cd6276e65a34c4381cc3f141f7210ab",
+ "dd4a25ac0fe34b3cb1509487b58ffd04",
+ "58a2acc544464cbfa2cbde86ffcada43",
+ "a2795646ea33406284fdb0a68a772ce7",
+ "39e7157554244ec884531f94e513811e",
+ "352154f2bbf54326b36fc0404752b8c9",
+ "e4cff4262d46424297c8308e97d0be53",
+ "f5eb532c16ad4a2eb6b189f9b583258a",
+ "23a5d020f62447dab80bd7424adf14da",
+ "348bcd5d97c4439b805f3a306cd2dddd",
+ "efe1f351b01440acb9259b254b91eabc",
+ "f70e2f3ca60b4c37b509c3a25363a577",
+ "aefde5f88d1f4f12b49b123758b265fb",
+ "5b8ae4261cf8451192fea749e4134a56",
+ "298a54de277c44c19797ee16216f700d",
+ "24dc071b0e5a46e3a38656ac6ac756fa",
+ "10cdcf806dbd4875ab5597791d8c284f",
+ "5e5250d5fa8249148ad503d7570a5e27",
+ "7907da1db61c44f18d93b73fa0b6a019",
+ "a5f26730a83543abace4fff07987c3f7",
+ "d82a4b978f2b4ee7a1cd9f81850ebab9"
+ ]
+ },
+ "id": "i2p85bpiFO1X",
+ "outputId": "dd52cfe3-5d0f-44bb-d3a0-4a162c5720c9"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[33mWARNING: Skipping gcsfs as it is not installed.\u001b[0m\u001b[33m\n",
+ "\u001b[0m\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
+ "bigframes 2.8.0 requires gcsfs!=2025.5.0,>=2023.3.0, which is not installed.\n",
+ "google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.3.1 which is incompatible.\n",
+ "fastai 2.7.19 requires torch<2.7,>=1.10, but you have torch 2.7.1 which is incompatible.\n",
+ "dask-cudf-cu12 25.2.2 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\n",
+ "cudf-cu12 25.2.1 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\u001b[0m\u001b[31m\n",
+ "\u001b[0m"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[nltk_data] Downloading package punkt to /root/nltk_data...\n",
+ "[nltk_data] Package punkt is already up-to-date!\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Torch version: 2.7.1+cu126\n",
+ "GPU available: True\n",
+ "--2025-07-13 18:40:38-- https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json\n",
+ "Resolving rajpurkar.github.io (rajpurkar.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...\n",
+ "Connecting to rajpurkar.github.io (rajpurkar.github.io)|185.199.108.153|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 30288272 (29M) [application/json]\n",
+ "Saving to: ‘train-v1.1.json’\n",
+ "\n",
+ "train-v1.1.json 100%[===================>] 28.88M --.-KB/s in 0.08s \n",
+ "\n",
+ "2025-07-13 18:40:39 (360 MB/s) - ‘train-v1.1.json’ saved [30288272/30288272]\n",
+ "\n",
+ "Sample data: {'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend \"Venite Ad Me Omnes\". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.', 'qas': [{'answers': [{'answer_start': 515, 'text': 'Saint Bernadette Soubirous'}], 'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?', 'id': '5733be284776f41900661182'}, {'answers': [{'answer_start': 188, 'text': 'a copper statue of Christ'}], 'question': 'What is in front of the Notre Dame Main Building?', 'id': '5733be284776f4190066117f'}, {'answers': [{'answer_start': 279, 'text': 'the Main Building'}], 'question': 'The Basilica of the Sacred heart at Notre Dame is beside to which structure?', 'id': '5733be284776f41900661180'}, {'answers': [{'answer_start': 381, 'text': 'a Marian place of prayer and reflection'}], 'question': 'What is the Grotto at Notre Dame?', 'id': '5733be284776f41900661181'}, {'answers': [{'answer_start': 92, 'text': 'a golden statue of the Virgin Mary'}], 'question': 'What sits on top of the Main Building at Notre Dame?', 'id': '5733be284776f4190066117e'}]}\n",
+ "Train size: 640 | Eval size: 160\n",
+ "First train example: {'context': 'The University of Notre Dame du Lac (or simply Notre Dame /ˌnoʊtərˈdeɪm/ NOH-tər-DAYM) is a Catholic research university located adjacent to South Bend, Indiana, in the United States. In French, Notre Dame du Lac means \"Our Lady of the Lake\" and refers to the university\\'s patron saint, the Virgin Mary. The main campus covers 1,250 acres in a suburban setting and it contains a number of recognizable landmarks, such as the Golden Dome, the \"Word of Life\" mural (commonly known as Touchdown Jesus), and the Basilica.', 'question': 'The school known as Notre Dame is known by a more lengthy name, what is it?', 'answer': 'University of Notre Dame du'}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.11/dist-packages/transformers/tokenization_utils_base.py:1601: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be depracted in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "a84e34de79c140abb75f26d9f9ca64c3",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Map: 0%| | 0/640 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "efe1f351b01440acb9259b254b91eabc",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Map: 0%| | 0/160 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Fine-tuning started...\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Final Evaluation Results:\n",
+ " eval_loss: 1.0516119003295898\n",
+ " eval_rouge1: 0.47456620661431465\n",
+ " eval_rougeL: 0.45454379559304303\n",
+ " eval_runtime: 4.061\n",
+ " eval_samples_per_second: 39.399\n",
+ " eval_steps_per_second: 9.85\n",
+ " epoch: 2.0\n",
+ "Context: In 1919 Father James Burns became president of Notre Dame, and in three years he produced an academi...\n",
+ "Answer: three years\n",
+ "Generated Question: What was the name of the president of Notre Dame in 1919?\n",
+ "Reference Question: Over how many years did the change to national standards undertaken at Notre Dame in the early 20th century take place?\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA18AAAHWCAYAAACIZjNQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbrFJREFUeJzt3Xl4k1X+/vE7adKke4HSlcomiCDLCIK4IbLjF0RRQRlZRNSRioCo4IwL6AxuIIyD4DiAzM8FXBlXlEFRwKojijiOVkWQtYUC3be0eX5/lIamaZsG26Qt79d19WrzbDlPe8TePc85H5NhGIYAAAAAAA3KHOgGAAAAAMDpgPAFAAAAAH5A+AIAAAAAPyB8AQAAAIAfEL4AAAAAwA8IXwAAAADgB4QvAAAAAPADwhcAAAAA+AHhCwAAAAD8gPAFAE2YyWTSgw8+GJD33rx5s0wmkzZv3hyQ9wd+K5PJpJSUlEA3A8BphPAFAL/Rc889J5PJVOPHZ599Fugm/iZPP/20nnvuuUA3w43T6dQ///lP9evXTy1btlRERIQ6d+6siRMnNvnvd2327t2rW2+9Ve3atZPNZlNsbKzGjBmjbdu2Bbpp1artv4tbb7010M0DAL+zBLoBANBcLFiwQO3bt/fYfuaZZwagNfXn6aefVkxMjCZPnuy2/ZJLLlFhYaGCg4P93qYZM2Zo2bJluuKKKzRhwgRZLBalpaXpvffeU4cOHXT++ef7vU0Nbdu2bRo5cqQk6aabblLXrl2Vnp6u5557ThdffLGWLl2q22+/PcCt9DRkyBBNnDjRY3vnzp0D0BoACCzCFwDUkxEjRqhPnz6BbobfmM1m2e12v79vRkaGnn76aU2bNk1///vf3fYtWbJER44c8VtbSktL5XQ6GzyAHj9+XFdffbVCQkK0bds2dezY0bVv9uzZGjZsmGbOnKnevXvrggsuaNC2VFZUVKTg4GCZzTU/SNO5c2f9/ve/91ubAKAx47FDAPADh8Ohli1basqUKR77cnJyZLfbNWfOHElSSUmJ7r//fvXu3VtRUVEKCwvTxRdfrI8++sjr+0yePFnt2rXz2P7ggw/KZDK5bVu9erUuu+wyxcbGymazqWvXrlq+fLnbMe3atdN3332njz/+2PW42KWXXiqp5jlfr7zyinr37q2QkBDFxMTo97//vQ4cOODRzvDwcB04cEBjxoxReHi4WrdurTlz5qisrKzWe9y9e7cMw9CFF17osc9kMik2NtZtW1ZWlmbNmuV6VK9NmzaaOHGiMjMzXcccPnxYU6dOVVxcnOx2u3r27Kk1a9a4XWfPnj0ymUx64okntGTJEnXs2FE2m03/+9//JEk//PCDrr76arVs2VJ2u119+vTRm2++6XYNh8Oh+fPnq1OnTrLb7WrVqpUuuugibdy4sdZ7fuaZZ5Senq7HH3/cLXhJUkhIiNasWSOTyaQFCxZIkr788kuZTCaPe5Ck999/XyaTSW+//bZr24EDB3TjjTcqLi5ONptN3bp106pVq9zOq/h5r127Vn/605+UlJSk0NBQ5eTk1Nr2urj00kt1zjnnaPv27brgggsUEhKi9u3ba8WKFR7H1uVnJZU/mrp06VJ1795ddrtdrVu31vDhw/Xll196HLt+/Xqdc845rnvfsGGD2/7c3FzNnDnT7XHPIUOG6KuvvvrN9w7g9MLIFwDUk+zsbLdf6KXyMNCqVStZrVZdeeWVev311/XMM8+4jZSsX79excXFGj9+vKTyMPaPf/xD1113naZNm6bc3FytXLlSw4YN0xdffKFevXrVS3uXL1+ubt26afTo0bJYLHrrrbd02223yel0avr06ZLKR5Juv/12hYeH649//KMkKS4ursZrPvfcc5oyZYrOO+88LVy4UBkZGVq6dKm2bdumr7/+WtHR0a5jy8rKNGzYMPXr109PPPGE/v3vf2vRokXq2LGj/vCHP9T4Hm3btpVUHvKuueYahYaG1nhsXl6eLr74Yn3//fe68cYbde655yozM1Nvvvmm9u/fr5iYGBUWFurSSy/Vzz//rJSUFLVv316vvPKKJk+erKysLN1xxx1u11y9erWKiop08803y2azqWXLlvruu+904YUXKikpSXPnzlVYWJhefvlljRkzRq+99pquvPJKSeUheOHChbrpppvUt29f5eTk6Msvv9RXX32lIUOG1Hgfb731lux2u6699tpq97dv314XXXSRPvzwQxUWFqpPnz7q0KGDXn75ZU2aNMnt2HXr1qlFixYaNmyYpPKRxPPPP9+1+ETr1q313nvvaerUqcrJydHMmTPdzn/ooYcUHBysOXPmqLi42OuoX1FRkcd/F5IUGRnpdu7x48c1cuRIXXvttbruuuv08ssv6w9/+IOCg4N14403SpJPP6upU6fqueee04gRI3TTTTeptLRUW7Zs0WeffeY2Qr1161a9/vrruu222xQREaG//vWvGjt2rPbu3atWrVpJkm699Va9+uqrSklJUdeuXXX06FFt3bpV33//vc4999xa7x8A3BgAgN9k9erVhqRqP2w2m+u4999/35BkvPXWW27njxw50ujQoYPrdWlpqVFcXOx2zPHjx424uDjjxhtvdNsuyXjggQdcrydNmmS0bdvWo40PPPCAUfWf/IKCAo/jhg0b5tYWwzCMbt26GQMGDPA49qOPPjIkGR999JFhGIZRUlJixMbGGuecc45RWFjoOu7tt982JBn333+/WzslGQsWLHC75u9+9zujd+/eHu9V1cSJEw1JRosWLYwrr7zSeOKJJ4zvv//e47j777/fkGS8/vrrHvucTqdhGIaxZMkSQ5Lx/PPPu/aVlJQY/fv3N8LDw42cnBzDMAxj9+7dhiQjMjLSOHz4sNu1Bg0aZHTv3t0oKipyu/4FF1xgdOrUybWtZ8+exuWXX+71/qqKjo42evbsWesxM2bMMCQZO3fuNAzDMObNm2dYrVbj2LFjrmOKi4uN6Ohot340depUIyEhwcjMzHS73vjx442oqChXP6n4eXfo0KHavlOdmv67kGS89NJLruMGDBhgSDIWLVrk1tZevXoZsbGxRklJiWEYdf9Zffjhh4YkY8aMGR5tqvi5V7QvODjY+Pnnn13bvvnmG0OS8dRTT7m2RUVFGdOnT6/TPQNAbXjsEADqybJly7Rx40a3j/fee8+1/7LLLlNMTIzWrVvn2nb8+HFt3LhR48aNc20LCgpyjQg4nU4dO3ZMpaWl6tOnT70+5hQSEuL6umLUbsCAAfrll1+UnZ3t8/W+/PJLHT58WLfddpvbXLDLL79cXbp00TvvvONxTtUV7y6++GL98ssvXt9r9erV+tvf/qb27dvrjTfe0Jw5c3T22Wdr0KBBbo84vvbaa+rZs6dr5Kmyiscw3333XcXHx+u6665z7bNarZoxY4by8vL08ccfu503duxYtW7d2vX62LFj+vDDD3XttdcqNzdXmZmZyszM1NGjRzVs2DD99NNPrjZFR0fru+++008//eT1HivLzc1VRERErcdU7K94DHDcuHFyOBx6/fXXXcd88MEHysrKcvU3wzD02muvadSoUTIMw9X2zMxMDRs2TNnZ2R59btKkSW59x5srrrjC47+LjRs3auDAgW7HWSwW3XLLLa7XwcHBuuWWW3T48GFt375dUt1/Vq+99ppMJpMeeOABj/ZUffx28ODBbo9y9ujRQ5GRkW79MDo6Wp9//rkOHjxY5/sGgOrw2CEA1JO+ffvWuuCGxWLR2LFj9eKLL6q4uFg2m02vv/66HA6HW/iSpDVr1mjRokX64Ycf5HA4XNurW03xVG3btk0PPPCAUlNTVVBQ4LYvOztbUVFRPl3v119/lSSdddZZHvu6dOmirVu3um2rmIdTWYsWLXT8+HGv72U2mzV9+nRNnz5dR48e1bZt27RixQq99957Gj9+vLZs2SJJ2rVrl8aOHeu13Z06dfJYNOLss892u68KVX8GP//8swzD0H333af77ruv2vc4fPiwkpKStGDBAl1xxRXq3LmzzjnnHA0fPlw33HCDevToUWsbIyIilJubW+sxFfsrQljPnj3VpUsXrVu3TlOnTpVU/shhTEyMLrvsMknSkSNHlJWVpb///e8ei5dUbntt9+9NmzZtNHjwYK/HJSYmKiwszG1bxYqIe/bs0fnnn1/nn9WuXbuUmJioli1ben3fM844w2Nb1X742GOPadKkSUpOTlbv3r01cuRITZw4UR06dPB6fQCojJEvAPCj8ePHKzc31zUi9vLLL6tLly7q2bOn65jnn39ekydPVseOHbVy5Upt2LBBGzdu1GWXXSan01nr9av+Vb9C1UUsdu3apUGDBikzM1OLFy/WO++8o40bN2rWrFmS5PV96kNQUFC9XKdVq1YaPXq03n33XQ0YMEBbt271CEz1qeqoT8X3as6cOdWO8GzcuNFVbuCSSy7Rrl27tGrVKp1zzjn6xz/+oXPPPVf/+Mc/an3Ps88+W2lpaSouLq7xmJ07d8pqtapTp06ubePGjdNHH32kzMxMFRcX680339TYsWNlsVjc2v773/++xrZXXdjEl1GvpqCmfmgYhuvra6+9Vr/88oueeuopJSYm6vHHH1e3bt3cRrYBoC4Y+QIAP7rkkkuUkJCgdevWuRZIqFjIosKrr76qDh066PXXX3cLU9U9QlVVixYtlJWV5bG9ahh56623XL+MV/7Lf3UrKtYU6KqqWAgjLS3NNbJSIS0tzbW/IfXp00cff/yxDh06pLZt26pjx47673//W+s5bdu21c6dO+V0Ot1GVH744QfX/tpUjH5YrdY6jfBUrHo5ZcoU5eXl6ZJLLtGDDz6om266qcZz/u///k+pqal65ZVXql22fc+ePdqyZYsGDx7sFo7GjRun+fPn67XXXlNcXJxycnJcC7tIUuvWrRUREaGysrI6tb0hHTx4UPn5+W6jXz/++KMkuVbwrOvPqmPHjnr//fd17NixOo1+1UVCQoJuu+023XbbbTp8+LDOPfdc/fnPf9aIESPq5foATg+MfAGAH5nNZl199dV666239P/+3/9TaWmpxyOHFX+Jr/yX988//1ypqaler9+xY0dlZ2dr586drm2HDh3SG2+84fU9srOztXr1ao9rhoWFVRvoqurTp49iY2O1YsUKtxGa9957T99//70uv/xyr9eoi/T0dNfy7pWVlJRo06ZNMpvNrpGmsWPH6ptvvvG4f+nkvY8cOVLp6eluc/FKS0v11FNPKTw8XAMGDKi1PbGxsbr00kv1zDPP6NChQx77K9cdO3r0qNu+8PBwnXnmmbWOaEnSLbfcotjYWN11110ec+KKioo0ZcoUGYah+++/323f2Wefre7du2vdunVat26dEhISdMkll7j2BwUFaezYsXrttdeqDan+rpn2zDPPuF6XlJTomWeeUevWrdW7d29Jdf9ZjR07VoZhaP78+R7vU7nP10VZWZnHHMjY2FglJiZ6/bkBQFWMfAFAPXnvvfdcf4Gv7IILLnCbGzJu3Dg99dRTeuCBB9S9e3fXfJUK//d//6fXX39dV155pS6//HLt3r1bK1asUNeuXZWXl1drG8aPH6977rlHV155pWbMmKGCggItX75cnTt3dls4YejQoQoODtaoUaN0yy23KC8vT88++6xiY2M9AkTv3r21fPlyPfzwwzrzzDMVGxvrMbIllY/8PProo5oyZYoGDBig6667zrXUfLt27VyPNP5W+/fvV9++fXXZZZdp0KBBio+P1+HDh/XSSy/pm2++0cyZMxUTEyNJuuuuu/Tqq6/qmmuu0Y033qjevXvr2LFjevPNN7VixQr17NlTN998s5555hlNnjxZ27dvV7t27fTqq69q27ZtWrJkideFLqTyxVYuuugide/eXdOmTVOHDh2UkZGh1NRU7d+/X998840kqWvXrrr00kvVu3dvtWzZUl9++aVrCfPatGrVSq+++qouv/xynXvuubrpppvUtWtXpaen67nnntPPP/+spUuXVltgedy4cbr//vtlt9s1depUj/lSjzzyiD766CP169dP06ZNU9euXXXs2DF99dVX+ve//61jx47V9UdTrR9//FHPP/+8x/a4uDi35fUTExP16KOPas+ePercubPWrVunHTt26O9//7usVqsk1flnNXDgQN1www3661//qp9++knDhw+X0+nUli1bNHDgQK/f78pyc3PVpk0bXX311erZs6fCw8P173//W//5z3+0aNGi3/S9AXAaCtQyiwDQXNS21LwkY/Xq1W7HO51OIzk52ZBkPPzwwx7Xczqdxl/+8hejbdu2hs1mM373u98Zb7/9drXLyKvKUvOGYRgffPCBcc455xjBwcHGWWedZTz//PPVLjX/5ptvGj169DDsdrvRrl0749FHHzVWrVplSDJ2797tOi49Pd24/PLLjYiICEOSa9n5qkvNV1i3bp3xu9/9zrDZbEbLli2NCRMmGPv373c7ZtKkSUZYWJjHvVfXzqpycnKMpUuXGsOGDTPatGljWK1WIyIiwujfv7/x7LPPui0lbhiGcfToUSMlJcVISkoygoODjTZt2hiTJk1yW1o9IyPDmDJlihETE2MEBwcb3bt39/i5VSw1//jjj1fbrl27dhkTJ0404uPjDavVaiQlJRn/93//Z7z66quuYx5++GGjb9++RnR0tBESEmJ06dLF+POf/+xaSt2b3bt3G9OmTTPOOOMMw2q1GjExMcbo0aONLVu21HjOTz/95OqLW7durfaYjIwMY/r06UZycrJhtVqN+Ph4Y9CgQcbf//531zEVP+9XXnmlTm01jNqXmq9cvmDAgAFGt27djC+//NLo37+/YbfbjbZt2xp/+9vfqm2rt5+VYZSXbHj88ceNLl26GMHBwUbr1q2NESNGGNu3b3drX3VLyLdt29aYNGmSYRjlS97fddddRs+ePY2IiAgjLCzM6Nmzp/H000/X+fsAABVMhuHj+DsAAEA9uvTSS5WZmel1fh4ANHXM+QIAAAAAPyB8AQAAAIAfEL4AAAAAwA+Y8wUAAAAAfsDIFwAAAAD4AeELAAAAAPyAIsunyOl06uDBg4qIiJDJZAp0cwAAAAAEiGEYys3NVWJiokcx+8oIX6fo4MGDSk5ODnQzAAAAADQS+/btU5s2bWrcT/g6RREREZLKv8GRkZEBbYvD4dAHH3ygoUOH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agX4DeHLH6yh5SNQDcTpdConN1eREREyV/fYoY8GDhyo5cuXKz8/X08++aQsFovGjh1bT62tXtXRrWHDhmnHjh06cOCALr30UpWVlbnt37JliyIiIlyvKybmbtmyRSNGjHBtf+aZZzRhwoQGbDkAAL4rcpQpPbuo2nlWFduK6zBqFRocdDJUuepanaxzFRdpl5VRK6DRIHz5g8n0mx7988rplKxl5e9RNXydgrCwMJ155pmSpFWrVqlnz55auXKlpk6dqs6dOys7O1sHDx5UYqL7o5QlJSXatWuXazXCigUxsrOzPeZnZWVlKSoqSpLUqVMnZWdnKz093TX6FR4erjPPPFMWS/VdtH379tXO+erTp4927Njheh0XF+fz/QMA8FsYhqHjBY6TwarSiFXFKoFHcou9XsdkkmIjbNWsEFgesNpEhyoyxMLj+UATQvhCrcxms+69917Nnj1b119/vcaOHat77rlHixYt0qJFi9yOXbFihfLz83XddddJKg9VZrNZ27dvd80Zk6RffvlF2dnZ6ty5syTp6quv1ty5c/Xoo4/qySef/E3tDQkJcQVHAAAaQkmpU+nZJ+tYVf18MKtIhY4yr9cJsQadLBjcIkSJUSfDVZsTo1bBFkatgOaE8AWvrrnmGt11111atmyZ5syZo8cee0x33nmn7Ha7brjhBlmtVv3rX//SvffeqzvvvNO12EZERIRuuukm3XnnnbJYLOrevbv27dune+65R+eff74uuOACSdIZZ5yhRYsW6Y477tCxY8c0efJktW/fXseOHdPzzz8vSQoKcq9Yf/jwYRUVFblta9WqVa11QbKzs91GxSrOSU5O/q3fIgBAM2EYhrILHScLBh8v0MFKQetgVqEO5xbL8L76ulqfGLVqU/EoYKVFLJKiQxQdamXUCjjNEL7glcViUUpKih577DH94Q9/0MyZM9WhQwc98cQTWrp0qavI8vLlyzVlyhS3c5cuXapHHnlE99xzj3799VfFx8dryJAh+vOf/+z2P5zbb79dZ599thYvXqyrr75aOTk5atWqlfr3768NGza4LbYhSWeddZZHO1NTU3X++efXeB+bN2/W7373O7dtU6dO1T/+8Y9T+bYAAJogR5nTNdfqYHaVgsEnPvJLvI9a2SxmtxUBKxcMTmoRovgou2yWIK/XAXB6MRlGXf52g6pycnIUFRWl7Oxsj2K/RUVF2r17t9q3by+73d7gbXE6ncrJyVFkZKTnghs4Zf7+OfqTw+HQu+++q5EjR9Y6WghUoM/AV4HoM4ZhKKeotJqCwScWsTheqIzcojqNWsWEB1cJVicLBidG29UyLJhRq3rGvzPwVWPqM7Vlg8oY+QIAAE1CaZlTGbnFriBV+VHAg1nljwbmFZd6vU5wkNn1GGDV0aukFiFKiLLLbmXUCkD9I3wBAIBGIbfIUWPB4APHC5WeUyRnHUatWoYFux4BrC5gtQoLltnMqBUA/yN8AQCABlfmNHQ490SwOn7yUcDKjwfmFnkftbIGmZQQVTG/KtSjYHBiVIhCghm1AtA4Eb4AAMBvll9c6hak9h/N139+Muv5lf/RwawiZeQUqbQOw1bRoVZXgeCkSqsEVqwQGBNuY9QKQJNF+GpArGXStPHzA4ByTqehI3nF7gWDs06uEnggq1DZhY5qzjRLmcddryxmk+Kj7JWWX69UMLhFiBKiQhRm41cTAM0X/8I1gIqaVCUlJQoJCQlwa3CqCgoKJCngq+cAQEMrKCl1LVhR+VHAis/p2UVylHn/g1Sk3eIqEBwfaVPOoT0a2K+XzoiJUFJ0iFpH2BTEqBWA0xjhqwFYLBaFhobqyJEjslqtDb78u9PpVElJiYqKilhqvh4YhqGCggIdPnxY0dHRHgWeAaApcToNZeYXnygY7BmsDmYV6nhBdaNW7oLMJsVH2t0eBXQ9DnhihcAI+8k/VpUvAb1bI3sk8EcsADiB8NUATCaTEhIStHv3bv36668N/n6GYaiwsFAhISHUHKlH0dHRio+PD3QzAKBWRY6yKoHqZE2rg9mFOpRVpJIyp9frhNssriBVdZ5VYnSIYiNssgTxBz4A+C0IXw0kODhYnTp1UklJSYO/l8Ph0CeffKJLLrmEvy7WE6vVyogXgIAzDENH80uq1LUqcgtbR/O9/3/GbJLiIu0eBYNdKwRGhyjSzv8/AKChEb4akNlslt1ub/D3CQoKUmlpqex2O+ELAJqQIkeZ0rOLXCsEus+3Kg9ZxaXeR61Cg4MqjVqdXCUwKTpUidF2xUXaZWXUCgACjvAFAEADMAxDxwsclepanfjIrhjFKlJmXrHX65hMUmyEzaNQcOXHAiNDLDx2DgBNAOELAIBTUFLqVHp2kfZnFVRbMPhgVqGKHN5HrUKsQeWjVC1OFAyOOlkwOCk6RHGRdgVbGLUCgOaA8AUAQBWGYSi70FFlxKrIrc7Vkbxi1aUcYOsTo1ZVCwZXfI4OtTJqBQCnCcIXAOC04yhzuuZaVS4YXPl1QUmZ1+vYLOaTc62iThYMrhi1io+yy2Zh8R4AQDnCFwCgWTEMQzlFpa4RqoPZJxewOHC8/BHBjNyiOo1axYQHu82xcl9+3a6WYcGMWgEA6ozwBQBoUkrLnMrILa6xYPDBrCLlFZd6vU5wkNk1SuWaZ1VpxcCEKLvsVkatAAD1h/AFAGhUcosc1RcMPrEtPadIzjqMWrUMC/aYZ1V5FKtVWLDMZkatAAD+Q/gCAPhNmdNQRk6RRy2ryqNXuUXeR62sQSYlRFVeuMK9YHBiVIhCghm1AgA0LoQvAEC9ySsurfIIYMWoVfliFuk5RSqrw7BVdKi1Sl2rkwWDk6JDFBNuY9QKANDkEL4AAHXiNKT0nCIdzstzq2lV+fHA7EKH1+tYzCbFR9k9HgMsXyHQroSoEIXZ+N8TAKD54f9uAABJUkFJqVuQqhi1qigafCgrSGWffeL1OpF2y8mCwW6jV+WfW0fYFMSoFQDgNET4AoDTgNNpKDOv2GOeVeXHA48XeBu1MinIbFJ8pN1tIYuTo1blKwRG2K1+uScAAJoawhcANAOFJWU6mF2lYHClOleHsopUUub0ep0Im+XkohWVVgmMC7fqh69SNW70cIXYbX64IwAAmh/CFwA0coZhKDOvxG2eVeWaVgezCnU0v8TrdcwmKT7SXqVgsL1S2ApRZA2jVg6HQxnfSZYgc33fHgAApw3CFwAEWJGjTIeyqyy5frzwxEhW+SqBJaXeR63CgoPcgpT7ghZ2xUXaZSU8AQAQMIQvAGhAhmHoWH6JK0R5LMOeVaTMvGKv1zGZpLgIu9ujgFU/R4ZYZDKxkAUAAI0V4QsAfoPi0jKlZxe5FrKoPM+qImQVObyPWoVYT45aJUXblRgVUul1iOIi7Qq2MGoFAEBT1ijC17Jly/T4448rPT1dPXv21FNPPaW+fft6PW/t2rW67rrrdMUVV2j9+vWu7TX95fexxx7TXXfdJUk6duyYbr/9dr311lsym80aO3asli5dqvDw8Hq5JwBNn2EYyipwVBmpKnQbxTqSVyzDe81gxUbYqhQMdn88MDrUyqgVAADNXMDD17p16zR79mytWLFC/fr105IlSzRs2DClpaUpNja2xvP27NmjOXPm6OKLL/bYd+jQIbfX7733nqZOnaqxY8e6tk2YMEGHDh3Sxo0b5XA4NGXKFN1888168cUX6+/mADRqJaVOZeQUecyzqlznqqCkzOt17FbzyWAVdXLp9YqQFR9ll80S5Ic7AgAAjVnAw9fixYs1bdo0TZkyRZK0YsUKvfPOO1q1apXmzp1b7TllZWWaMGGC5s+fry1btigrK8ttf3x8vNvrf/3rXxo4cKA6dOggSfr++++1YcMG/ec//1GfPn0kSU899ZRGjhypJ554QomJifV8lwD8zTAM5RSWnhy1yj5ZMLhilcCM3KI6jVrFhNtqLBicGG1Xy7BgRq0AAIBXAQ1fJSUl2r59u+bNm+faZjabNXjwYKWmptZ43oIFCxQbG6upU6dqy5Yttb5HRkaG3nnnHa1Zs8a1LTU1VdHR0a7gJUmDBw+W2WzW559/riuvvNLjOsXFxSouPjkpPicnR1L58ssOh7fCpA2r4v0D3Q40Hc2hz5SWOZWRW1y+1PqJlQIPZhfpUFaRa5XA/DqMWgVbzEqMsisxyq6E6PLPidEhJz7bFR9pl91a+6hVaWlpfd1Wo9Uc+gz8iz4DX9Fn4KvG1Gfq2oaAhq/MzEyVlZUpLi7ObXtcXJx++OGHas/ZunWrVq5cqR07dtTpPdasWaOIiAhdddVVrm3p6ekejzRaLBa1bNlS6enp1V5n4cKFmj9/vsf2Dz74QKGhoXVqS0PbuHFjoJuAJqYx95nCUul4sXS8xKTjxdKxYpPb6+wSyZD30aZwi6EWNqmFzVCL4BOfK70Ot0pmU4mk8j+oqEhSupSVLmVJ+l8D3mNT1Jj7DBon+gx8RZ+BrxpDnykoKKjTcQF/7NAXubm5uuGGG/Tss88qJiamTuesWrVKEyZMkN1u/03vPW/ePM2ePdv1OicnR8nJyRo6dKgiIyN/07V/K4fDoY0bN2rIkCGyWqsvkApUFug+U1rm1JGKosHZRSdGr8pHqw5lF+lAVpHyir2PJlmDTEpwjVqVj1YlRduVEFX+dUKUXSHBzLWqD4HuM2h66DPwFX0GvmpMfabiqThvAhq+YmJiFBQUpIyMDLftGRkZHvO2JGnXrl3as2ePRo0a5drmdJYv4WyxWJSWlqaOHTu69m3ZskVpaWlat26d23Xi4+N1+PBht22lpaU6duxYte8rSTabTTabzWO71WoN+A+7QmNqC5qGhuozecWlrpUBXUuvV1olMD2nSGVO75OtWoRaaywYnBQdophwm8xm5lr5E//OwFf0GfiKPgNfNYY+U9f3D2j4Cg4OVu/evbVp0yaNGTNGUnmY2rRpk1JSUjyO79Kli7799lu3bX/605+Um5urpUuXKjk52W3fypUr1bt3b/Xs2dNte//+/ZWVlaXt27erd+/ekqQPP/xQTqdT/fr1q8c7BJqfMqehI7nFNRYMPnC8QDlF3ketLGbTiTlWlRawqFTnKiEqRGG2JjU4DwAAUKuA/2Yze/ZsTZo0SX369FHfvn21ZMkS5efnu1Y/nDhxopKSkrRw4ULZ7Xadc845budHR0dLksf2nJwcvfLKK1q0aJHHe5599tkaPny4pk2bphUrVsjhcCglJUXjx49npUOc9gpKSisFqSr1rbILdSirSKV1GLWKCrGeLBjsNmpV/nXrCJuCGLUCAACnkYCHr3HjxunIkSO6//77lZ6erl69emnDhg2uRTj27t0rs9ns83XXrl0rwzB03XXXVbv/hRdeUEpKigYNGuQqsvzXv/71N90L0Ng5nYYy84r1a2auvs406eDWPcrILXEbxcoq8L5aT5DZpPhIu2updfdRqxAlRNkVYeeREQAAgMoCHr4kKSUlpdrHDCVp8+bNtZ773HPPVbv95ptv1s0331zjeS1btqSgMpqdwpKyEwtXnJxrVVEw+EBWoQ5lF8pRVjFqFST99GO114mwW6rMrwp1zbNKjA5RXKSdUSsAAAAfNYrwBcA7wzCUeWKFQM/5VuULWRzLL/F6HbNJiou0y+4sVLd2CWrTMkxJLULcighHMmoFAABQ7whfQCNR5CjToRPFgg8crxSssk+MYmUXqaTU6fU6YcFBrkcAq1slMD7SLsNZpnfffVcjR/YI+OpAAAAApwvCF+AHhmHoWH7JiRGqAtejgJVHrzLzvI9amUxSXIT95DyrirlWUSeDVmSIRSZT7Y8EOpxl9XVrAAAAqCPCF1APikvLlJ5dVKmuVZHbqNWBrEIV12HUKsQa5LbcetUVAuMi7Qq2+L4ADQAAAAKP8AV4YRiGsgoc5cEqy71g8P4TXx/JLa7TtWIjbFVGrOxu4So61Op11AoAAABNE+ELp72SUqcyciqPWp0YsTpRMPhgVpEKHd4f07NbzSfrWUWFVJp3VT6CFR9ll80S5Ic7AgAAQGNE+EKzZhiGcgpLPUatKr8+nFssw3vNYMWE29xWBExy+2xXy7BgRq0AAABQI8IXmjRH2YlRq+OFJ+pbFZ1chv3EKFZ+ifdRq2CL+WTB4Cj3gsGJJ4oG262MWgEAAODUEb7QqOUUOWosGHwwq1AZOUVy1mHUqlVYcI0FgxOjQxQTzqgVAAAAGhbhCwFTWubU4dxij4LBlVcLzC0u9Xqd4CCzEk6MWCWeWMii8uOBiVEhCglm1AoAAACBRfhCg8krLvUsGOwKWUVKzylSWR2GrVqEWmssGJwUHaKYcJvMZkatAAAA0LgRvnBKypyGjuQWexYMrhS0coq8j1pZzCbXqJVr+fXok3WuEqNDFBpMNwUAAEDTx2+1qFZ+cakOZRdqf+WCwVmFrrpW6dlFKq3DqFVUiLXagsEVo1itI2wKYtQKAAAApwHC12nI6TSUmVfsClKugsGValxlFTi8XifIbFJ8pN21SqD7qFX553AbXQwAAACQCF/NUmFJmdscq4pVAg9klRcMPpRdKEeZ91GrCLulSi2rk/OsklqEKDbCzqgVAAAAUEeEryYuu9ChxR/8oK9+MOvvv6bqUHaxjuWXeD3PbJLiIysVDG7hPs8qMTpEkXarH+4AAAAAOD0Qvpo4a5BJa1L3SjJLx3Nd28OCgzwKBSdVClpxETZZgsyBazgAAABwmiF8NXGhwRalXNpB6b/+pMEX9NYZrSKU1CJEkXYLRYMBAACARoShj2bgjkFn6uJ4Q4O6xKprYqSiQqwELwAAAKCRIXwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfkD4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfkD4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfkD4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfkD4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8IOAh69ly5apXbt2stvt6tevn7744os6nbd27VqZTCaNGTPGY9/333+v0aNHKyoqSmFhYTrvvPO0d+9e1/5LL71UJpPJ7ePWW2+tr1sCAAAAAA8BDV/r1q3T7Nmz9cADD+irr75Sz549NWzYMB0+fLjW8/bs2aM5c+bo4osv9ti3a9cuXXTRRerSpYs2b96snTt36r777pPdbnc7btq0aTp06JDr47HHHqvXewMAAACAyiyBfPPFixdr2rRpmjJliiRpxYoVeuedd7Rq1SrNnTu32nPKyso0YcIEzZ8/X1u2bFFWVpbb/j/+8Y8aOXKkW5jq2LGjx3VCQ0MVHx9ffzcDAAAAALUIWPgqKSnR9u3bNW/ePNc2s9mswYMHKzU1tcbzFixYoNjYWE2dOlVbtmxx2+d0OvXOO+/o7rvv1rBhw/T111+rffv2mjdvnsfjiS+88IKef/55xcfHa9SoUbrvvvsUGhpa4/sWFxeruLjY9TonJ0eS5HA45HA4fLn1elfx/oFuB5oO+gx8RZ+Br+gz8BV9Br5qTH2mrm0IWPjKzMxUWVmZ4uLi3LbHxcXphx9+qPacrVu3auXKldqxY0e1+w8fPqy8vDw98sgjevjhh/Xoo49qw4YNuuqqq/TRRx9pwIABkqTrr79ebdu2VWJionbu3Kl77rlHaWlpev3112ts78KFCzV//nyP7R988EGtoc2fNm7cGOgmoImhz8BX9Bn4ij4DX9Fn4KvG0GcKCgrqdFxAHzv0RW5urm644QY9++yziomJqfYYp9MpSbriiis0a9YsSVKvXr306aefasWKFa7wdfPNN7vO6d69uxISEjRo0CDt2rWr2kcUJWnevHmaPXu263VOTo6Sk5M1dOhQRUZG1ss9niqHw6GNGzdqyJAhslqtAW0Lmgb6DHxFn4Gv6DPwFX0GvmpMfabiqThvAha+YmJiFBQUpIyMDLftGRkZ1c7F2rVrl/bs2aNRo0a5tlWELYvForS0NCUnJ8tisahr165u55599tnaunVrjW3p16+fJOnnn3+uMXzZbDbZbDaP7VarNeA/7AqNqS1oGugz8BV9Br6iz8BX9Bn4qjH0mbq+f8BWOwwODlbv3r21adMm1zan06lNmzapf//+Hsd36dJF3377rXbs2OH6GD16tAYOHKgdO3YoOTlZwcHBOu+885SWluZ27o8//qi2bdvW2JaKxxgTEhLq5+YAAAAAoIqAPnY4e/ZsTZo0SX369FHfvn21ZMkS5efnu1Y/nDhxopKSkrRw4ULZ7Xadc845budHR0dLktv2u+66S+PGjdMll1yigQMHasOGDXrrrbe0efNmSeUjaC+++KJGjhypVq1aaefOnZo1a5YuueQS9ejRwy/3DQAAAOD0E9DwNW7cOB05ckT333+/0tPT1atXL23YsMG1CMfevXtlNvs2OHfllVdqxYoVWrhwoWbMmKGzzjpLr732mi666CJJ5SNu//73v11BLzk5WWPHjtWf/vSner8/AAAAAKgQ8AU3UlJSlJKSUu2+itGqmjz33HPVbr/xxht14403VrsvOTlZH3/8sS9NBAAAAIDfLGBzvgAAAADgdEL4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfkD4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfkD4AgAAAAA/IHwBAAAAgB8QvgAAAADADwhfAAAAAOAHhC8AAAAA8APCFwAAAAD4AeELAAAAAPyA8AUAAAAAfvCbwldJSYnS0tJUWlpaX+0BAAAAgGbplMJXQUGBpk6dqtDQUHXr1k179+6VJN1+++165JFH6rWBAAAAANAcnFL4mjdvnr755htt3rxZdrvdtX3w4MFat25dvTUOAAAAAJoLy6mctH79eq1bt07nn3++TCaTa3u3bt20a9euemscAAAAADQXpzTydeTIEcXGxnpsz8/PdwtjAAAAAIBypxS++vTpo3feecf1uiJw/eMf/1D//v3rp2UAAAAA0Iyc0mOHf/nLXzRixAj973//U2lpqZYuXar//e9/+vTTT/Xxxx/XdxsBAAAAoMk7pZGviy66SN98841KS0vVvXt3ffDBB4qNjVVqaqp69+5d320EAAAAgCbP55Evh8OhW265Rffdd5+effbZhmgTAAAAADQ7Po98Wa1Wvfbaaw3RFgAAAABotk7pscMxY8Zo/fr19dwUAAAAAGi+TmnBjU6dOmnBggXatm2bevfurbCwMLf9M2bMqJfGAQAAAEBzcUrha+XKlYqOjtb27du1fft2t30mk4nwBQAAAABVnFL42r17d323AwAAAACatVOa81WZYRgyDKM+2gIAAAAAzdYph69//vOf6t69u0JCQhQSEqIePXro//2//1efbQMAAACAZuOUHjtcvHix7rvvPqWkpOjCCy+UJG3dulW33nqrMjMzNWvWrHptJAAAAAA0dacUvp566iktX75cEydOdG0bPXq0unXrpgcffJDwBQAAAABVnNJjh4cOHdIFF1zgsf2CCy7QoUOHfnOjAAAAAKC5OaXwdeaZZ+rll1/22L5u3Tp16tTpNzcKAAAAAJqbU3rscP78+Ro3bpw++eQT15yvbdu2adOmTdWGMgAAAAA43Z3SyNfYsWP1+eefKyYmRuvXr9f69esVExOjL774QldeeWV9txEAAAAAmrxTGvmSpN69e+v555+vz7YAAAAAQLN1SiNf7777rt5//32P7e+//77ee++939woAAAAAGhuTil8zZ07V2VlZR7bDcPQ3Llzf3OjAAAAAKC5OaXw9dNPP6lr164e27t06aKff/75NzcKAAAAAJqbUwpfUVFR+uWXXzy2//zzzwoLC/vNjQIAAACA5uaUwtcVV1yhmTNnateuXa5tP//8s+68806NHj263hoHAAAAAM3FKYWvxx57TGFhYerSpYvat2+v9u3bq0uXLmrVqpWeeOKJ+m4jAAAAADR5p7TUfFRUlD799FNt3LhR33zzjUJCQtSzZ09dfPHF9d0+AAAAAGgWfBr5Sk1N1dtvvy1JMplMGjp0qGJjY/XEE09o7Nixuvnmm1VcXOxTA5YtW6Z27drJbrerX79++uKLL+p03tq1a2UymTRmzBiPfd9//71Gjx6tqKgohYWF6bzzztPevXtd+4uKijR9+nS1atVK4eHhGjt2rDIyMnxqNwAAAAD4wqfwtWDBAn333Xeu199++62mTZumIUOGaO7cuXrrrbe0cOHCOl9v3bp1mj17th544AF99dVX6tmzp4YNG6bDhw/Xet6ePXs0Z86cakfadu3apYsuukhdunTR5s2btXPnTt13332y2+2uY2bNmqW33npLr7zyij7++GMdPHhQV111VZ3bDQAAAAC+8il87dixQ4MGDXK9Xrt2rfr27atnn31Ws2fP1l//+le9/PLLdb7e4sWLNW3aNE2ZMkVdu3bVihUrFBoaqlWrVtV4TllZmSZMmKD58+erQ4cOHvv/+Mc/auTIkXrsscf0u9/9Th07dtTo0aMVGxsrScrO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tWOp+SbGZDLpjTfe0JgxY2o85p577tE777zj1tHGjx+vrKwsbdiwwQ+tRGNRl/5SnW7dumncuHG6//77G6ZhaLR86TPjx49Xp06dFBQUpPXr12vHjh0N3j40PnXpMxs2bND48eP1yy+/qGXLlv5rHBqluvSZJ554QsuXL9euXbtc25566ik9+uij2r9/vx9aicbmyJEjio2N1ccff6xLLrmk2mPGjRun/Px8vf32265t559/vnr16qUVK1b4q6m1YuSrGUpNTdXgwYPdtg0bNkypqakBahGaEqfTqdzcXH5BQq1Wr16tX375RQ888ECgm4Im4M0331SfPn302GOPKSkpSZ07d9acOXNUWFgY6Kahkerfv7/27dund999V4ZhKCMjQ6+++qpGjhwZ6KYhQLKzsyWp1t9PmsLvwJZANwD1Lz09XXFxcW7b4uLilJOTo8LCQoWEhASoZWgKnnjiCeXl5enaa68NdFPQSP3000+aO3eutmzZIouF/43Au19++UVbt26V3W7XG2+8oczMTN122206evSoVq9eHejmoRG68MIL9cILL2jcuHEqKipSaWmpRo0a5fPj0WgenE6nZs6cqQsvvFDnnHNOjcfV9Dtwenp6Qzexzhj5AuDy4osvav78+Xr55ZcVGxsb6OagESorK9P111+v+fPnq3PnzoFuDpoIp9Mpk8mkF154QX379tXIkSO1ePFirVmzhtEvVOt///uf7rjjDt1///3avn27NmzYoD179ujWW28NdNMQANOnT9d///tfrV27NtBN+c34k2UzFB8fr4yMDLdtGRkZioyMZNQLNVq7dq1uuukmvfLKKx5D9kCF3Nxcffnll/r666+VkpIiqfwXa8MwZLFY9MEHH+iyyy4LcCvR2CQkJCgpKUlRUVGubWeffbYMw9D+/fvVqVOnALYOjdHChQt14YUX6q677pIk9ejRQ2FhYbr44ov18MMPKyEhIcAthL+kpKTo7bff1ieffKI2bdrUemxNvwPHx8c3ZBN9wshXM9S/f39t2rTJbdvGjRvVv3//ALUIjd1LL72kKVOm6KWXXtLll18e6OagEYuMjNS3336rHTt2uD5uvfVWnXXWWdqxY4f69esX6CaiEbrwwgt18OBB5eXlubb9+OOPMpvNXn+ZwumpoKBAZrP7r6lBQUGSJNaKOz0YhqGUlBS98cYb+vDDD9W+fXuv5zSF34EZ+WoC8vLy9PPPP7te7969Wzt27FDLli11xhlnaN68eTpw4ID++c9/SpJuvfVW/e1vf9Pdd9+tG2+8UR9++KFefvllvfPOO4G6BfiRr/3lxRdf1KRJk7R06VL169fP9Vx0SEiI21+p0Xz50mfMZrPH8/axsbGy2+21PoeP5sXXf2euv/56PfTQQ5oyZYrmz5+vzMxM3XXXXbrxxht5IuM04WufGTVqlKZNm6bly5dr2LBhOnTokGbOnKm+ffsqMTExULcBP5o+fbpefPFF/etf/1JERITr95OoqCjXvxsTJ05UUlKSFi5cKEm64447NGDAAC1atEiXX3651q5dqy+//FJ///vfA3YfHgw0eh999JEhyeNj0qRJhmEYxqRJk4wBAwZ4nNOrVy8jODjY6NChg7F69Wq/txuB4Wt/GTBgQK3Ho/k7lX9jKnvggQeMnj17+qWtaBxOpc98//33xuDBg42QkBCjTZs2xuzZs42CggL/Nx4BcSp95q9//avRtWtXIyQkxEhISDAmTJhg7N+/3/+NR0BU118kuf1OO2DAAI/fV15++WWjc+fORnBwsNGtWzfjnXfe8W/DvaDOFwAAAAD4AXO+AAAAAMAPCF8AAAAA4AeELwAAAADwA8IXAAAAAPgB4QsAAAAA/IDwBQAAAAB+QPgCAAAAAD8gfAEAAACAHxC+AADwM5PJpPXr1we6GQAAPyN8AQBOK5MnT5bJZPL4GD58eKCbBgBo5iyBbgAAAP42fPhwrV692m2bzWYLUGsAAKcLRr4AAKcdm82m+Ph4t48WLVpIKn8kcPny5RoxYoRCQkLUoUMHvfrqq27nf/vtt7rssssUEhKiVq1a6eabb1ZeXp7bMatWrVK3bt1ks9mUkJCglJQUt/2ZmZm68sorFRoaqk6dOunNN99s2JsGAAQc4QsAgCruu+8+jR07Vt98840mTJig8ePH6/vvv5ck5efna9iwYWrRooX+85//6JVXXtG///1vt3C1fPlyTZ8+XTfffLO+/fZbvfnmmzrzzDPd3mP+/Pm69tprtXPnTo0cOVITJkzQsWPH/HqfAAD/MhmGYQS6EQAA+MvkyZP1/PPPy263u22/9957de+998pkMunWW2/V8uXLXfvOP/98nXvuuXr66af17LPP6p577tG+ffsUFhYmSXr33Xc1atQoHTx4UHFxcUpKStKUKVP08MMPV9sGk8mkP/3pT3rooYcklQe68PBwvffee8w9A4BmjDlfAIDTzsCBA93ClSS1bNnS9XX//v3d9vXv3187duyQJH3//ffq2bOnK3hJ0oUXXiin06m0tDSZTCYdPHhQgwYNqrUNPXr0cH0dFhamyMhIHT58+FRvCQDQBBC+AACnnbCwMI/HAOtLSEhInY6zWq1ur00mk5xOZ0M0CQDQSDDnCwCAKj777DOP12effbYk6eyzz9Y333yj/Px81/5t27bJbDbrrLPOUkREhNq1a6dNmzb5tc0AgMaPkS8AwGmnuLhY6enpbtssFotiYmIkSa+88or69Omjiy66SC+88IK++OILrVy5UpI0YcIEPfDAA5o0aZIefPBBHTlyRLfffrtuuOEGxcXFSZIefPBB3XrrrYqNjdWIESOUm5urbdu26fbbb/fvjQIAGhXCFwDgtLNhwwYlJCS4bTvrrLP0ww8/SCpfiXDt2rW67bbblJCQoJdeekldu3aVJIWGhur999/XHXfcofPOO0+hoaEaO3asFi9e7LrWpEmTVFRUpCeffFJz5sxRTEyMrr76av/dIACgUWK1QwAAKjGZTHrjjTc0ZsyYQDcFANDMMOcLAAAAAPyA8AUAAAAAfsCcLwAAKuFpfABAQ2HkCwAAAAD8gPAFAAAAAH5A+AIAAAAAPyB8AQAAAIAfEL4AAAAAwA8IXwAAAADgB4QvAAAAAPADwhcAAAAA+MH/B0YizuiAR/vlAAAAAElFTkSuQmCC\n",
+ "text/plain": [
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model and tokenizer saved!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Install dependencies\n",
+ "!pip uninstall -y torch torchvision torchaudio pandas fsspec gcsfs -q\n",
+ "!pip install torch torchvision torchaudio pandas transformers datasets nltk matplotlib evaluate rouge_score sentence-transformers -q\n",
+ "# Restart runtime after installation\n",
+ "\n",
+ "import json\n",
+ "import pandas as pd\n",
+ "from datasets import Dataset, Features, Value\n",
+ "from transformers import T5Tokenizer, T5ForConditionalGeneration, TrainingArguments, Trainer\n",
+ "import evaluate\n",
+ "import matplotlib.pyplot as plt\n",
+ "import torch\n",
+ "import nltk\n",
+ "import numpy as np # Added missing import\n",
+ "nltk.download('punkt')\n",
+ "\n",
+ "# Verify setup\n",
+ "print(f\"Torch version: {torch.__version__}\")\n",
+ "print(f\"GPU available: {torch.cuda.is_available()}\")\n",
+ "\n",
+ "# Step 2: Download and load dataset\n",
+ "!wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json -O train-v1.1.json\n",
+ "with open('train-v1.1.json', 'r', encoding='utf-8') as f:\n",
+ " squad_data = json.load(f)\n",
+ "print(\"Sample data:\", squad_data['data'][0]['paragraphs'][0])\n",
+ "\n",
+ "# Step 3: Clean and prepare dataset\n",
+ "data = []\n",
+ "for article in squad_data['data']:\n",
+ " for paragraph in article['paragraphs']:\n",
+ " context = paragraph['context'].strip()\n",
+ " for qa in paragraph['qas']:\n",
+ " question = qa['question'].strip()\n",
+ " answer = qa['answers'][0]['text'].strip() if qa['answers'] else \"\"\n",
+ " if context and question and answer:\n",
+ " data.append({\"context\": context, \"question\": question, \"answer\": answer})\n",
+ "\n",
+ "data = data[:800]\n",
+ "df = pd.DataFrame(data)\n",
+ "features = Features({\n",
+ " \"context\": Value(\"string\"),\n",
+ " \"question\": Value(\"string\"),\n",
+ " \"answer\": Value(\"string\")\n",
+ "})\n",
+ "dataset = Dataset.from_pandas(df, features=features)\n",
+ "train_test_split = dataset.train_test_split(test_size=0.2, seed=42)\n",
+ "train_dataset = train_test_split[\"train\"]\n",
+ "eval_dataset = train_test_split[\"test\"]\n",
+ "print(f\"Train size: {len(train_dataset)} | Eval size: {len(eval_dataset)}\")\n",
+ "print(\"First train example:\", train_dataset[0])\n",
+ "\n",
+ "# Step 4: Fine-tune the model\n",
+ "model_name = \"valhalla/t5-small-qg-hl\"\n",
+ "tokenizer = T5Tokenizer.from_pretrained(model_name)\n",
+ "model = T5ForConditionalGeneration.from_pretrained(model_name)\n",
+ "\n",
+ "def preprocess(examples):\n",
+ " inputs = [f\"generate question: {ctx} {ans}\" for ctx, ans in zip(examples['context'], examples['answer'])]\n",
+ " targets = examples['question']\n",
+ " model_inputs = tokenizer(inputs, max_length=256, truncation=True, padding=\"max_length\", return_tensors=None)\n",
+ " labels = tokenizer(targets, max_length=32, truncation=True, padding=\"max_length\")[\"input_ids\"]\n",
+ " model_inputs[\"labels\"] = labels\n",
+ " return model_inputs\n",
+ "\n",
+ "tokenized_train_dataset = train_dataset.map(preprocess, remove_columns=train_dataset.column_names, batched=True)\n",
+ "tokenized_eval_dataset = eval_dataset.map(preprocess, remove_columns=eval_dataset.column_names, batched=True)\n",
+ "\n",
+ "tokenized_train_dataset = tokenized_train_dataset.with_format(\"torch\")\n",
+ "tokenized_eval_dataset = tokenized_eval_dataset.with_format(\"torch\")\n",
+ "\n",
+ "training_args = TrainingArguments(\n",
+ " output_dir=\"./qg-finetuned\",\n",
+ " per_device_train_batch_size=4,\n",
+ " per_device_eval_batch_size=4,\n",
+ " num_train_epochs=2,\n",
+ " eval_strategy=\"epoch\",\n",
+ " learning_rate=2e-5,\n",
+ " logging_dir=\"./logs\",\n",
+ " logging_steps=10,\n",
+ " save_strategy=\"epoch\",\n",
+ " save_total_limit=1,\n",
+ " fp16=True,\n",
+ " report_to=\"none\",\n",
+ " load_best_model_at_end=True,\n",
+ " metric_for_best_model=\"eval_loss\",\n",
+ " greater_is_better=False\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def compute_metrics(eval_pred):\n",
+ " predictions, labels = eval_pred\n",
+ " predictions = predictions[0] if isinstance(predictions, tuple) else predictions\n",
+ " predictions = np.argmax(predictions, axis=-1) if predictions.ndim == 3 else predictions\n",
+ " labels = np.argmax(labels, axis=-1) if labels.ndim == 3 else labels\n",
+ "\n",
+ " def decode_sequences(sequences):\n",
+ " return [tokenizer.decode(seq, skip_special_tokens=True) for seq in sequences]\n",
+ "\n",
+ " decoded_preds = decode_sequences(predictions)\n",
+ " decoded_labels = decode_sequences(labels)\n",
+ "\n",
+ " rouge = evaluate.load(\"rouge\")\n",
+ " rouge_score = rouge.compute(predictions=decoded_preds, references=decoded_labels)\n",
+ "\n",
+ " return {\n",
+ " \"rouge1\": rouge_score[\"rouge1\"],\n",
+ " \"rougeL\": rouge_score[\"rougeL\"]\n",
+ " }\n",
+ "\n",
+ "trainer = Trainer(\n",
+ " model=model,\n",
+ " args=training_args,\n",
+ " train_dataset=tokenized_train_dataset,\n",
+ " eval_dataset=tokenized_eval_dataset,\n",
+ " compute_metrics=compute_metrics\n",
+ ")\n",
+ "\n",
+ "print(\"Fine-tuning started...\")\n",
+ "trainer.train()\n",
+ "print(\"Running final evaluation...\")\n",
+ "results = trainer.evaluate()\n",
+ "print(\"Final Evaluation Results:\")\n",
+ "for metric, score in results.items():\n",
+ " print(f\" {metric}: {score}\")\n",
+ "\n",
+ "# Step 5: Generate and evaluate sample questions\n",
+ "from transformers import GenerationConfig\n",
+ "model.eval()\n",
+ "sample = eval_dataset[0]\n",
+ "inputs = tokenizer(f\"generate question: {sample['context']} {sample['answer']}\", max_length=256, truncation=True, padding=\"max_length\", return_tensors=\"pt\").to(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
+ "\n",
+ "generation_config = GenerationConfig(early_stopping=True, num_beams=5, max_length=128) # Adjusted\n",
+ "outputs = model.generate(**inputs, generation_config=generation_config)\n",
+ "generated_question = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
+ "\n",
+ "print(f\"Context: {sample['context'][:100]}...\")\n",
+ "print(f\"Answer: {sample['answer']}\")\n",
+ "print(f\"Generated Question: {generated_question}\")\n",
+ "print(f\"Reference Question: {sample['question']}\")\n",
+ "\n",
+ "# Step 6: Plot evaluation scores\n",
+ "log_history = trainer.state.log_history\n",
+ "epochs = [entry['epoch'] for entry in log_history if 'eval_rouge1' in entry]\n",
+ "rouge1_scores = [entry['eval_rouge1'] for entry in log_history if 'eval_rouge1' in entry]\n",
+ "rougeL_scores = [entry['eval_rougeL'] for entry in log_history if 'eval_rougeL' in entry]\n",
+ "\n",
+ "plt.figure(figsize=(10, 5))\n",
+ "plt.plot(epochs, rouge1_scores, label='ROUGE-1')\n",
+ "plt.plot(epochs, rougeL_scores, label='ROUGE-L')\n",
+ "plt.xlabel('Epoch')\n",
+ "plt.ylabel('Score')\n",
+ "plt.title('Evaluation Scores Over Epochs')\n",
+ "plt.legend()\n",
+ "plt.grid(True)\n",
+ "plt.show()\n",
+ "\n",
+ "# Step 7: Save the model\n",
+ "model.save_pretrained(\"./qg-finetuned/final\")\n",
+ "tokenizer.save_pretrained(\"./qg-finetuned/final\")\n",
+ "print(\"Model and tokenizer saved!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "68nRksRUH2D-"
+ },
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 1000,
+ "referenced_widgets": [
+ "83fcc7f94cd0425e893ac1e68213b9c6",
+ "214ef7b83c4d441b8b9474dcb6ea3aff",
+ "b000c107ddf24b168ba733937efd32a3",
+ "d6fcecfa42234b06ad3c8dc47a265001",
+ "cf1e3fbde7e34642a0dbe181858ea8f2",
+ "d11db59116f5450695f6aaf944617cf6",
+ "27e4b36842a749d781467a4593fbd453",
+ "3cf1c4746da54c88916b90772f434a4f",
+ "c4ef9e9b3c2043f0a08dacd0088871b7",
+ "cb440926360a4ba39cc34d1eae9a429d",
+ "d6ce4f75dd824911971c19a1602d4e34",
+ "e9bd52917d3744a6bde159c367b352cb",
+ "9de9cf92a62f495887c6495e55ce0738",
+ "53e2edf5cacf4eeabe24b61e7c8cc34e",
+ "1eb163a3ed314ca19f97a0ec060aebb6",
+ "352ef36e791348eb9d4d6021f073c8a5",
+ "be5b828dd1444c4694e67b545a858f59",
+ "5d7724fa0d4e4e18a0fabf6344a3503a",
+ "5970fce117894ccaab6e598417968d43",
+ "d1359916a9fd4ff993f142f18b04209e",
+ "11af3884716d44f3b2ed29804a2766a9",
+ "50f01d34d3664802ab2b56e07ea6d630"
+ ]
+ },
+ "id": "waaltAGLH4h2",
+ "outputId": "76774308-9670-4755-805f-f84c5045e12b"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\u001b[33mWARNING: Skipping gcsfs as it is not installed.\u001b[0m\u001b[33m\n",
+ "\u001b[0m\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n",
+ "bigframes 2.8.0 requires gcsfs!=2025.5.0,>=2023.3.0, which is not installed.\n",
+ "google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.3.1 which is incompatible.\n",
+ "fastai 2.7.19 requires torch<2.7,>=1.10, but you have torch 2.7.1 which is incompatible.\n",
+ "dask-cudf-cu12 25.2.2 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\n",
+ "cudf-cu12 25.2.1 requires pandas<2.2.4dev0,>=2.0, but you have pandas 2.3.1 which is incompatible.\u001b[0m\u001b[31m\n",
+ "\u001b[0m"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[nltk_data] Downloading package punkt to /root/nltk_data...\n",
+ "[nltk_data] Package punkt is already up-to-date!\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Torch version: 2.7.1+cu126\n",
+ "GPU available: True\n",
+ "--2025-07-13 18:53:28-- https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json\n",
+ "Resolving rajpurkar.github.io (rajpurkar.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...\n",
+ "Connecting to rajpurkar.github.io (rajpurkar.github.io)|185.199.108.153|:443... connected.\n",
+ "HTTP request sent, awaiting response... 200 OK\n",
+ "Length: 30288272 (29M) [application/json]\n",
+ "Saving to: ‘train-v1.1.json’\n",
+ "\n",
+ "train-v1.1.json 100%[===================>] 28.88M --.-KB/s in 0.08s \n",
+ "\n",
+ "2025-07-13 18:53:29 (356 MB/s) - ‘train-v1.1.json’ saved [30288272/30288272]\n",
+ "\n",
+ "Sample data: {'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend \"Venite Ad Me Omnes\". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.', 'qas': [{'answers': [{'answer_start': 515, 'text': 'Saint Bernadette Soubirous'}], 'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?', 'id': '5733be284776f41900661182'}, {'answers': [{'answer_start': 188, 'text': 'a copper statue of Christ'}], 'question': 'What is in front of the Notre Dame Main Building?', 'id': '5733be284776f4190066117f'}, {'answers': [{'answer_start': 279, 'text': 'the Main Building'}], 'question': 'The Basilica of the Sacred heart at Notre Dame is beside to which structure?', 'id': '5733be284776f41900661180'}, {'answers': [{'answer_start': 381, 'text': 'a Marian place of prayer and reflection'}], 'question': 'What is the Grotto at Notre Dame?', 'id': '5733be284776f41900661181'}, {'answers': [{'answer_start': 92, 'text': 'a golden statue of the Virgin Mary'}], 'question': 'What sits on top of the Main Building at Notre Dame?', 'id': '5733be284776f4190066117e'}]}\n",
+ "Train size: 640 | Eval size: 160\n",
+ "First train example: {'context': 'The University of Notre Dame du Lac (or simply Notre Dame /ˌnoʊtərˈdeɪm/ NOH-tər-DAYM) is a Catholic research university located adjacent to South Bend, Indiana, in the United States. In French, Notre Dame du Lac means \"Our Lady of the Lake\" and refers to the university\\'s patron saint, the Virgin Mary. The main campus covers 1,250 acres in a suburban setting and it contains a number of recognizable landmarks, such as the Golden Dome, the \"Word of Life\" mural (commonly known as Touchdown Jesus), and the Basilica.', 'question': 'The school known as Notre Dame is known by a more lengthy name, what is it?', 'answer': 'University of Notre Dame du'}\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.11/dist-packages/transformers/tokenization_utils_base.py:1601: FutureWarning: `clean_up_tokenization_spaces` was not set. It will be set to `True` by default. This behavior will be depracted in transformers v4.45, and will be then set to `False` by default. For more details check this issue: https://github.com/huggingface/transformers/issues/31884\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "83fcc7f94cd0425e893ac1e68213b9c6",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Map: 0%| | 0/640 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "e9bd52917d3744a6bde159c367b352cb",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Map: 0%| | 0/160 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Fine-tuning started...\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "