File size: 167,048 Bytes
4b7f9b6
1
{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"mount_file_id":"1InRgLMZPkNA6-Y62poIwyeNylGY8rYDk","authorship_tag":"ABX9TyMQONHdmulQ0Lve0gsrzSqR"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"},"widgets":{"application/vnd.jupyter.widget-state+json":{"7d50cc4d70a8453ea1023c081dd107b6":{"model_module":"@jupyter-widgets/controls","model_name":"VBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"VBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"VBoxView","box_style":"","children":["IPY_MODEL_d84e05020333431296fd65c7c3be9b2a","IPY_MODEL_b2f4e6f16f0a4d3b90717d0179ed642a","IPY_MODEL_3084ffb3b3664cfbb6b9931bea153f83","IPY_MODEL_68fd6d6b9e6c4adeb5431e29e735713d","IPY_MODEL_1d9521b2ef344ec4a8bf5a4d270d802b"],"layout":"IPY_MODEL_7a6f7ecb69c24b6583c3e55a8b22f4c8"}},"d84e05020333431296fd65c7c3be9b2a":{"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_5998e43917dc48618e326cfa5d148e79","placeholder":"​","style":"IPY_MODEL_b01977fca14b443d9f10b7aea7575c7a","value":"<center> <img\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.svg\nalt='Hugging Face'> <br> Copy a token from <a\nhref=\"https://huggingface.co/settings/tokens\" target=\"_blank\">your Hugging Face\ntokens page</a> and paste it below. <br> Immediately click login after copying\nyour token or it might be stored in plain text in this notebook file. </center>"}},"b2f4e6f16f0a4d3b90717d0179ed642a":{"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_e636d0177e1e4d0a8b65896085538ef0","placeholder":"​","style":"IPY_MODEL_471c56e7723e4bb892ac8bfe97523304","value":""}},"3084ffb3b3664cfbb6b9931bea153f83":{"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_6c5f07b8a0274ea48baf5825c496bfb1","style":"IPY_MODEL_219ec2d07f764f9fb137534c89682b7f","value":true}},"68fd6d6b9e6c4adeb5431e29e735713d":{"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_4abf542d1bd54db491bd53a4bd6ae39f","style":"IPY_MODEL_b8e6ba6cafd64e43a7c6dd40fc6cb377","tooltip":""}},"1d9521b2ef344ec4a8bf5a4d270d802b":{"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_a41054d6970c4fc2989e8942c1e8373f","placeholder":"​","style":"IPY_MODEL_621bc786ebaa46f3bb5e66312644a65c","value":"\n<b>Pro Tip:</b> 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. </center>"}},"7a6f7ecb69c24b6583c3e55a8b22f4c8":{"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%"}},"5998e43917dc48618e326cfa5d148e79":{"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}},"b01977fca14b443d9f10b7aea7575c7a":{"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":""}},"e636d0177e1e4d0a8b65896085538ef0":{"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}},"471c56e7723e4bb892ac8bfe97523304":{"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":""}},"6c5f07b8a0274ea48baf5825c496bfb1":{"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}},"219ec2d07f764f9fb137534c89682b7f":{"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":""}},"4abf542d1bd54db491bd53a4bd6ae39f":{"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}},"b8e6ba6cafd64e43a7c6dd40fc6cb377":{"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":""}},"a41054d6970c4fc2989e8942c1e8373f":{"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}},"621bc786ebaa46f3bb5e66312644a65c":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"cells":[{"cell_type":"markdown","source":["## Preparing the enviroment"],"metadata":{"id":"ifSzFnZl1M5V"}},{"cell_type":"code","execution_count":1,"metadata":{"id":"Eyy-XD2tfVzx","executionInfo":{"status":"ok","timestamp":1720530566765,"user_tz":240,"elapsed":16497,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"outputs":[],"source":["import torch\n","from torch import nn\n","from torch.nn import functional as F\n","import numpy as np\n","from matplotlib import pyplot as plt\n","import time\n","import pandas as pd\n","from collections import OrderedDict\n","from torch.utils.data import DataLoader, Dataset\n","from torch.utils.tensorboard import SummaryWriter\n","from datetime import datetime"]},{"cell_type":"code","source":["# diretório do córpus\n","%cd /content/drive/MyDrive/Mestrado/NLP_2024/TP_LLM"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"W6fVNbBU2lzH","executionInfo":{"status":"ok","timestamp":1720530569323,"user_tz":240,"elapsed":892,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"10c239a1-5353-4e99-9669-6de81321be7e"},"execution_count":2,"outputs":[{"output_type":"stream","name":"stdout","text":["/content/drive/MyDrive/Mestrado/NLP_2024/TP_LLM\n"]}]},{"cell_type":"code","source":["# model hyperparameters\n","config = {\n","    'd_model': 64,\n","    'n_heads': 8,\n","    'n_layers': 6,\n","    'context_window': 22,\n","    'epochs': 100,\n","    'log_interval': 10,\n","}"],"metadata":{"id":"jz-w5gh2bUZ0","executionInfo":{"status":"ok","timestamp":1720530570641,"user_tz":240,"elapsed":4,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":3,"outputs":[]},{"cell_type":"markdown","source":["## Carregamento e pré-processamento dos dados\n","\n","---\n","Nessa seção, ocorrem as seguites etapas:\n","\n","\n","1.   Teinamento do tokenizador no córpus. O tokenizador utilizado utilizado foi o `sentencepiece` com o algoritmo `Byte-pair encoding`.\n","2.   Todo o córpus é tokenizado, e o vocabulário é construído a partir do conjunto de tokens originado.\n","3. O dataset é montado a partir da tokenização do córpus.\n","4. Partição do dataset em treino, teste e validação.\n","5. Transformação dessas partições para o tipo `Dataloader` do Pytorch, a fim de facilitar o treinamento em batches.\n","\n","\n","\n"],"metadata":{"id":"OSAlYt2R2hm7"}},{"cell_type":"code","source":["# ! pip install sentencepiece\n","import sentencepiece as spm"],"metadata":{"id":"RzBkAXYlfDjS","executionInfo":{"status":"ok","timestamp":1720530626588,"user_tz":240,"elapsed":355,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":15,"outputs":[]},{"cell_type":"code","source":["# treinamento do tokenizador SentencePiece\n","spm.SentencePieceTrainer.Train('--input=./input.txt --model_prefix=tiny_shakespeare --vocab_size=8000 --model_type=bpe')"],"metadata":{"id":"5sx2WRFzrMRX"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# carregamento do tokenizador\n","tokenizer = spm.SentencePieceProcessor()\n","tokenizer.load('tiny_shakespeare.model')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"37PjjLlvr2xC","executionInfo":{"status":"ok","timestamp":1720530629498,"user_tz":240,"elapsed":491,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"a4ec245a-050c-47ea-89d1-735471b7417d"},"execution_count":16,"outputs":[{"output_type":"execute_result","data":{"text/plain":["True"]},"metadata":{},"execution_count":16}]},{"cell_type":"code","source":["# construção do vocabulário (criação do vocabulário)\n","lines = open('./input.txt', 'r').read()  # Lê o conteúdo do arquivo de entrada\n","\n","vocab = sorted(set(tokenizer.EncodeAsPieces(lines)))  # Codifica o texto e cria um conjunto único e ordenado de tokens\n","itos = {i:ch for i, ch in enumerate(vocab)}  # Dicionário que mapeia índices para tokens (índice -> caractere)\n","stoi = {ch:i for i, ch in enumerate(vocab)}  # Dicionário que mapeia tokens para índices (caractere -> índice)\n","print('tamanho do vocabulário:', len(vocab))  # Imprime o tamanho do vocabulário (número de tokens únicos)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Z54bTde_tG3H","executionInfo":{"status":"ok","timestamp":1720530635292,"user_tz":240,"elapsed":2894,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"318deb54-485c-49ab-b938-b068783ddf8a"},"execution_count":17,"outputs":[{"output_type":"stream","name":"stdout","text":["tamanho do vocabulário: 7268\n"]}]},{"cell_type":"code","source":["def encode(s):\n","    # Codifica uma string `s` em uma lista de índices inteiros.\n","    return [stoi[token] for token in tokenizer.EncodeAsPieces(s)]\n","\n","def decode(l):\n","    # Decodifica uma lista de índices inteiros `l` de volta para uma string.\n","    return ''.join([itos[i] for i in l])"],"metadata":{"id":"jbxWLO-pilFX","executionInfo":{"status":"ok","timestamp":1720530637982,"user_tz":240,"elapsed":345,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":18,"outputs":[]},{"cell_type":"code","source":["encode(\"hello\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"o8JcNdqZfDr7","executionInfo":{"status":"ok","timestamp":1720495947860,"user_tz":240,"elapsed":309,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"d21dbd92-4c9b-42b0-81dc-526f32fb089f"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["[4670, 1160]"]},"metadata":{},"execution_count":41}]},{"cell_type":"code","source":["config"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"v6W_nS-TaaBI","executionInfo":{"status":"ok","timestamp":1720494835300,"user_tz":240,"elapsed":419,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"727f1f58-935c-4acb-f7cb-dda402bc7731"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["{'d_model': 64,\n"," 'n_heads': 8,\n"," 'n_layers': 6,\n"," 'context_window': 22,\n"," 'epochs': 100,\n"," 'log_interval': 10,\n"," 'vocab_size': 7268,\n"," 'batch_size': 32}"]},"metadata":{},"execution_count":112}]},{"cell_type":"code","source":["# construção do dataset a partir do córpus tokenizado e update das configs com o tamanho do vocbulário\n","config.update({\n","   \"vocab_size\": len(vocab),\n","})\n","\n","dataset = torch.tensor(encode(lines), dtype=torch.int16)\n","dataset.shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9cWFh_-w4N4j","executionInfo":{"status":"ok","timestamp":1720530649649,"user_tz":240,"elapsed":333,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"28205fe6-19ae-4552-ba99-9bb4e8fc646d"},"execution_count":19,"outputs":[{"output_type":"execute_result","data":{"text/plain":["torch.Size([279996])"]},"metadata":{},"execution_count":19}]},{"cell_type":"code","source":["# Define a função para montar os splits de teste, treino e validação do dataset\n","def mount_dataset_splits(data, context_window, config=config):\n","\n","  # Calcula o tamanho de 80% do dataset para o treino\n","  train = data[:int(.8 * len(data))]\n","  # Calcula o tamanho de 10% do dataset para validação (entre 80% e 90%)\n","  val = data[int(.8 * len(data)): int(.9 * len(data))]\n","  # O restante do dataset (10%) fica para teste\n","  test = data[int(.9 * len(data)):]\n","\n","  # Dicionário para armazenar os splits\n","  data_splitted = {}\n","\n","  # Itera por cada split ('train', 'val', 'test')\n","  for split in ['train', 'val', 'test']:\n","    # Define os dados do batch de acordo com o split\n","    batch_data = train\n","    if split == 'val':\n","        batch_data = val  # Seleciona dados de validação\n","\n","    if split == 'test':\n","        batch_data = test  # Seleciona dados de teste\n","\n","    # Cria indices para janelas de contexto (tamanho do batch - janela - 1)\n","    ix = torch.arange(0, batch_data.size(0)-context_window-1, context_window)\n","\n","    # Cria o tensor 'x' com as janelas de contexto (entradas)\n","    x = torch.stack([batch_data[i:i+context_window] for i in ix]).long()\n","\n","    # Cria o tensor 'y' com os próximos valores (saídas)\n","    y = torch.stack([batch_data[i+1:i+context_window+1] for i in ix]).long()\n","\n","    # Adiciona o par (entradas, saídas) no dicionário para o split atual\n","    data_splitted[split] = (x, y)\n","\n","  # Retorna os splits de treino, validação e teste\n","  return data_splitted['train'], data_splitted['val'], data_splitted['test']\n"],"metadata":{"id":"VswFFIHD199G","executionInfo":{"status":"ok","timestamp":1720531305811,"user_tz":240,"elapsed":340,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":33,"outputs":[]},{"cell_type":"code","source":["class TorchDataset(Dataset):\n","    # Classe personalizada para encapsular um dataset do PyTorch.\n","    # Recebe um dataset existente e o encapsula para ser utilizado com o PyTorch.\n","\n","    def __init__(self, dataset):\n","        # Método construtor da classe.\n","        # dataset: O dataset existente que será encapsulado.\n","        self.dataset = dataset\n","\n","    def __len__(self):\n","        # Define o tamanho do dataset.\n","        # Retorna o comprimento da segunda lista dentro do dataset encapsulado, que geralmente representa os alvos.\n","        return len(self.dataset[1])  # Comprimento da lista de alvos\n","\n","    def __getitem__(self, idx):\n","        # Recupera um item específico do dataset.\n","        # idx: O índice do item a ser recuperado.\n","        # Retorna uma tupla contendo a entrada (primeira lista) e o alvo (segunda lista) correspondentes ao índice fornecido.\n","        input = self.dataset[0][idx]  # Entrada no índice especificado\n","        target = self.dataset[1][idx]  # Alvo no índice especificado\n","        return input, target\n","\n"],"metadata":{"id":"Cg1iyhi7PW8b","executionInfo":{"status":"ok","timestamp":1720531307332,"user_tz":240,"elapsed":4,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":34,"outputs":[]},{"cell_type":"code","source":["config.update({\n","    'batch_size': 32,\n","})"],"metadata":{"id":"kERNaCcUbtsM","executionInfo":{"status":"ok","timestamp":1720531308931,"user_tz":240,"elapsed":2,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":35,"outputs":[]},{"cell_type":"code","source":["# Divide o dataset em conjuntos de treino, validação e teste\n","train, test, val = mount_dataset_splits(dataset, config['context_window'])\n","\n","# Converte os conjuntos para o formato TorchDataset\n","train = TorchDataset(train)\n","test = TorchDataset(test)\n","val = TorchDataset(val)\n","\n","# Imprime o tamanho dos conjuntos de treino e validação\n","print('O conjunto de treino possui {} instâncias'.format(len(train)))\n","print('O conjunto de validação possui {} instâncias'.format(len(val)))\n","\n","# Carregadores de dados (dataloaders) para treino, validação e teste\n","train_dataloader = torch.utils.data.DataLoader(train, config['batch_size'], shuffle=True)\n","validation_loader = torch.utils.data.DataLoader(val, config['batch_size'], shuffle=False)\n","test_dataloader = torch.utils.data.DataLoader(test, config['batch_size'], shuffle=True)\n"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"D_q5Je_fc0h_","executionInfo":{"status":"ok","timestamp":1720531310551,"user_tz":240,"elapsed":488,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"1bd814ce-35e1-478b-f290-6bb69aca0a97"},"execution_count":36,"outputs":[{"output_type":"stream","name":"stdout","text":["O conjunto de treino possui 10181 instâncias\n","O conjunto de validação possui 1272 instâncias\n"]}]},{"cell_type":"code","source":["train_features, train_labels = next(iter(train_dataloader))\n","print(f\"Feature batch shape: {train_features.size()}\")\n","print(f\"Labels batch shape: {train_labels.size()}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"NMqX3YkIYDY5","executionInfo":{"status":"ok","timestamp":1720531313098,"user_tz":240,"elapsed":347,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"dd90cc18-a435-4dc7-c54c-dc413f666b98"},"execution_count":37,"outputs":[{"output_type":"stream","name":"stdout","text":["Feature batch shape: torch.Size([32, 22])\n","Labels batch shape: torch.Size([32, 22])\n"]}]},{"cell_type":"markdown","source":["## Defining the model"],"metadata":{"id":"aEZ52i4Z_VrZ"}},{"cell_type":"markdown","source":["### Componentes Llama\n","---\n","Implementação dos componentes principais da arquietetura do Llama:\n","\n","\n","* RMSNorm\n","* SwiGLU\n","* Rotary Embeddings\n","\n","\n"],"metadata":{"id":"p5kj5Yr1XJiJ"}},{"cell_type":"markdown","source":["RMSNorm"],"metadata":{"id":"7culAQVIXRGX"}},{"cell_type":"code","source":["class RMSNorm(torch.nn.Module):\n","  # Classe de normalização RMS (Root Mean Square).\n","\n","  # Atributos:\n","  #     input_shape (tupla): Dimensão da entrada do tensor.\n","  #     eps (float, opcional): Valor pequeno para evitar divisão por zero.\n","  #         Padrão é 1e-6.\n","  #     gi (nn.Parameter): Vetor de pesos aprendíveis, com o mesmo tamanho da\n","  #         entrada.\n","\n","  def __init__(self, input_shape, eps = 1e-6):\n","      super().__init__()\n","      self.eps = eps  # Valor para evitar divisão por zero\n","      self.input_shape = input_shape\n","      self.gi = nn.Parameter(torch.ones(input_shape))  # Vetor de pesos aprendíveis\n","      self.register_parameter(\"gi\", self.gi)\n","\n","  def forward(self, input_tensor):\n","    # Realiza a normalização RMS na entrada.\n","\n","    # Parâmetros:\n","    #     input_tensor (torch.Tensor): Tensor de entrada.\n","\n","    # Retorno:\n","    #     torch.Tensor: Tensor normalizado.\n","    norm_input = input_tensor.norm(2, dim=(1,2))  # Normalização longo dos eixos 1 e 2\n","    rms_input = norm_input * input_tensor[0].numel() ** (-1. / 2)  # Raiz quadrada média\n","\n","    # Normalização RMS com adição de epsilon para evitar divisão por zero\n","    input_normed = input_tensor / (rms_input.unsqueeze(-1).unsqueeze(-1) + self.eps)\n","    return input_normed * self.gi  # Aplica pesos aprendíveis\n"],"metadata":{"id":"AFfkupixbqPs","executionInfo":{"status":"ok","timestamp":1720530582239,"user_tz":240,"elapsed":368,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":4,"outputs":[]},{"cell_type":"markdown","source":["Rede Neural Feedforward com função de ativação SwuiGLU"],"metadata":{"id":"ztzrlx5aAouQ"}},{"cell_type":"code","source":["class FFN_SwiGLU(nn.Module):\n","\n","    def __init__(self, dim) -> None:\n","        super().__init__()\n","        # Camada linear 1: dim entradas -> dim saídas, sem viés (bias=False)\n","        self.w1 = nn.Linear(dim, dim, bias=False)\n","        # Camada linear 2: dim entradas -> dim saídas, sem viés (bias=False)\n","        self.w2 = nn.Linear(dim, dim, bias=False)\n","        # Camada linear 3: dim entradas -> dim saídas, sem viés (bias=False)\n","        self.w3 = nn.Linear(dim, dim, bias=False)\n","\n","    def forward(self, input_tensor):\n","        # Saída da camada linear 1\n","        x1 = F.linear(input_tensor, self.w1.weight)\n","        # Saída da camada linear 3\n","        x3 = F.linear(input_tensor, self.w3.weight)\n","        # Aplicação da função de ativação SiLU em x1 e multiplicação por x3\n","        hidden = F.silu(x1) * x3\n","        # Saída final: camada linear 2 aplicada em hidden\n","        return self.w2(hidden)\n"],"metadata":{"id":"pLzR_ZpHpdYh","executionInfo":{"status":"ok","timestamp":1720530584146,"user_tz":240,"elapsed":449,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":5,"outputs":[]},{"cell_type":"markdown","source":["Camada Multi-Attention com embeddings rotatórios"],"metadata":{"id":"mOWguICSBWpr"}},{"cell_type":"code","source":["def get_rotary_matrix(context_window, embedding_dim):\n","  # Esta função cria uma matriz de rotação para modelagem de posição.\n","\n","  # Args:\n","  #     context_window: Tamanho da janela de contexto (número de posições).\n","  #     embedding_dim: Dimensão do embedding.\n","\n","  # Returns:\n","  #     Uma matriz de rotação com dimensão (context_window, embedding_dim, embedding_dim).\n","\n","  R = torch.zeros((context_window, embedding_dim, embedding_dim), requires_grad=False)\n","  for position in range(context_window):\n","    # Loop para cada posição na janela de contexto.\n","    for i in range(embedding_dim // 2):\n","      # Loop para metade da dimensão do embedding (matriz rotacional é diagonal por blocos).\n","      theta = 10000. ** (-2. * (i - 1) / embedding_dim)\n","      m_theta = position * theta\n","      R[position, 2 * i, 2 * i] = np.cos(m_theta)\n","      R[position, 2 * i, 2 * i + 1] = -np.sin(m_theta)\n","      R[position, 2 * i + 1, 2 * i] = np.sin(m_theta)\n","      R[position, 2 * i + 1, 2 * i + 1] = np.cos(m_theta)\n","  return R\n"],"metadata":{"id":"8huMU-TA86t8","executionInfo":{"status":"ok","timestamp":1720530584531,"user_tz":240,"elapsed":3,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":6,"outputs":[]},{"cell_type":"code","source":["\n","class RopeAttentionHead(nn.Module):\n","  def __init__(self, config):\n","    super().__init__()\n","\n","    # Camada linear para mapeamento de consulta (query)\n","    self.w_q = nn.Linear(config['d_model'], config['d_model'], bias=False)\n","\n","    # Camada linear para mapeamento de chave (key)\n","    self.w_k = nn.Linear(config['d_model'], config['d_model'], bias=False)\n","\n","    # Camada linear para mapeamento de valor (value)\n","    self.w_v = nn.Linear(config['d_model'], config['d_model'], bias=False)\n","\n","    # Matriz de rotação para atenção posicional relativa\n","    self.R = get_rotary_matrix(config['context_window'], config['d_model'])\n","\n","  def forward(self, x):\n","    # x é um lote de sentenças\n","    b, m, d = x.shape  # b = tamanho do lote, m = tamanho da sequência, d = dimensão do embedding\n","\n","    q = self.w_q(x)  # Gera representações de consulta\n","    k = self.w_k(x)  # Gera representações de chave\n","    v = self.w_v(x)  # Gera representações de valor\n","\n","    # Aplica rotação posicional relativa usando a matriz R\n","    q_rotated = (torch.bmm(q.transpose(0, 1), self.R[:m])).transpose(0, 1)\n","    k_rotated = (torch.bmm(k.transpose(0, 1), self.R[:m])).transpose(0, 1)\n","\n","    # Calcula a atenção usando scaled dot-product attention com dropout\n","    a = F.scaled_dot_product_attention(q_rotated, k_rotated, v, dropout_p=.1, is_causal=True)\n","\n","    return a\n"],"metadata":{"id":"-5svowDC7Q_k","executionInfo":{"status":"ok","timestamp":1720530585334,"user_tz":240,"elapsed":2,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":7,"outputs":[]},{"cell_type":"code","source":["class MultiheadRopeAttention(nn.Module):\n","  def __init__(self, config):\n","    super().__init__()\n","\n","    # Define o número de heads de atenção (cabeças de atenção)\n","    self.heads = nn.ModuleList([RopeAttentionHead(config) for _ in range(config['n_heads'])])\n","\n","    # Camada linear para projetar a saída concatenada das heads de volta para a dimensão original\n","    self.w0 = nn.Linear(config['n_heads'] * config['d_model'], config['d_model'])\n","\n","    # Dropout para regularização (evitar overfitting)\n","    self.dropout = nn.Dropout(.1)\n","\n","  def forward(self, x):\n","    # Processa a entrada 'x' por cada head de atenção individualmente\n","    heads = [head(x) for head in self.heads]\n","\n","    # Concatena as saídas de todas as heads de atenção (junta as dimensões)\n","    o = torch.cat(heads, dim=-1)\n","\n","    # Projeta a saída concatenada de volta para a dimensão original (d_model)\n","    o = self.w0(o)\n","\n","    # Aplica dropout para regularização\n","    o = self.dropout(o)\n","\n","    return o\n"],"metadata":{"id":"yYjUGRDFJWG-","executionInfo":{"status":"ok","timestamp":1720530585695,"user_tz":240,"elapsed":1,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":8,"outputs":[]},{"cell_type":"markdown","source":["### Llama block"],"metadata":{"id":"6JP7a_S2JSA8"}},{"cell_type":"code","source":["class LlamaBlock(nn.Module):\n","  def __init__(self, config):\n","    super().__init__()\n","    self.rms_norm = RMSNorm(config['d_model'])  # Normalização RMS\n","    self.multihead = MultiheadRopeAttention(config)  # Atenção Multi-head com Rope\n","    self.ffn_swiglu = FFN_SwiGLU(config['d_model'])  # Rede Feedforward com SwiGLU\n","\n","  def forward(self, x):\n","    x = self.rms_norm(x)  # Normalização RMS pré-ativação\n","    x = x + self.multihead(x)  # Soma o resultado da Atenção Multi-head com a entrada\n","\n","    x = self.rms_norm(x)  # Normalização RMS pré-ativação\n","    x = x + self.ffn_swiglu(x)  # Soma o resultado da Rede Feedforward com a entrada\n","    return x\n"],"metadata":{"id":"puERxeblJFrj","executionInfo":{"status":"ok","timestamp":1720530587052,"user_tz":240,"elapsed":0,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":9,"outputs":[]},{"cell_type":"markdown","source":["### Llama"],"metadata":{"id":"0GwxyFq78cxz"}},{"cell_type":"code","source":["class Llama(nn.Module):\n","  def __init__(self, config):\n","    super().__init__()\n","    # Armazena a configuração do modelo\n","    self.config = config\n","\n","    # Camada de embedding que transforma índices de palavras em vetores densos\n","    self.embedding_layer = nn.Embedding(config['vocab_size'], config['d_model'])\n","\n","    # Sequência de blocos Llama empilhados\n","    self.llama_blocks = nn.Sequential(OrderedDict([(f\"llama_{i}\", LlamaBlock(config)) for i in range(config['n_layers'])]))\n","\n","    # Normalização RMS (Root Mean Square)\n","    self.rms = RMSNorm(config['d_model'])\n","\n","    # Camada linear final para previsão do próximo token (cabeça do modelo de linguagem)\n","    self.lm_head = nn.Linear(config['d_model'], config['vocab_size'])\n","\n","    # Camada linear intermediária com FFN SwiGLU para tarefas auxiliares\n","    self.linear = nn.Sequential(\n","            nn.Linear(config['d_model'], config['d_model']),\n","            FFN_SwiGLU(config['d_model']),\n","            nn.Linear(config['d_model'], config['vocab_size']),\n","        )\n","\n","    # Imprime o número total de parâmetros do modelo\n","    print(\"model params:\", sum([m.numel() for m in self.parameters()]))\n","\n","  def forward(self, x):\n","    # Embutimento de palavras na camada de embedding\n","    x = self.embedding_layer(x)\n","\n","    # Passagem pela sequência de blocos Llama\n","    x = self.llama_blocks(x)\n","\n","    # Normalização RMS\n","    x = self.rms(x)\n","\n","    # Camada linear final (ou intermediária) para saída\n","    x = self.linear(x)\n","\n","    return x\n"],"metadata":{"id":"Ram7uk6n8B8r","executionInfo":{"status":"ok","timestamp":1720530587506,"user_tz":240,"elapsed":3,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":10,"outputs":[]},{"cell_type":"markdown","source":["## Treinamento"],"metadata":{"id":"8gIzLwCSBXVk"}},{"cell_type":"code","source":["config.update({\n","    'epochs': 50\n","})"],"metadata":{"id":"SRsg5NqVGLuw"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["config"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"K-Mv8B88GiPf","executionInfo":{"status":"ok","timestamp":1720475729998,"user_tz":240,"elapsed":3,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"2d47cbc1-cea7-4c91-ded9-bbda506095ad"},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["{'d_model': 64,\n"," 'n_heads': 8,\n"," 'n_layers': 6,\n"," 'context_window': 22,\n"," 'epochs': 50,\n"," 'log_interval': 10,\n"," 'vocab_size': 7268,\n"," 'batch_size': 32}"]},"metadata":{},"execution_count":47}]},{"cell_type":"code","source":["model = Llama(config)\n","\n","loss_fn = torch.nn.CrossEntropyLoss()\n","optimizer = torch.optim.Adam(model.parameters(), lr = 0.001)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"ypO2rCbzG5qx","executionInfo":{"status":"ok","timestamp":1720475738713,"user_tz":240,"elapsed":3147,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"d77493d8-ab6b-4a09-83b0-804936918827"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["model params: 2287432\n"]}]},{"cell_type":"code","source":["def train_one_epoch(epoch_index, tb_writer):\n","    running_loss = 0.\n","    last_loss = 0.\n","\n","    # Here, we use enumerate(training_loader) instead of\n","    # iter(training_loader) so that we can track the batch\n","    # index and do some intra-epoch reporting\n","    for i, data in enumerate(train_dataloader):\n","      # Every data instance is an input + label pair\n","      inputs, labels = data\n","\n","      # Zero your gradients for every batch!\n","      optimizer.zero_grad()\n","\n","      # Make predictions for this batch\n","      outputs = model(inputs)\n","\n","      # Compute the loss and its gradients\n","      loss = F.cross_entropy(outputs.view(-1, config['vocab_size']), labels.view(-1))\n","      loss.backward()\n","\n","      # Adjust learning weights\n","      optimizer.step()\n","\n","      # Gather data and report\n","      running_loss += loss.item()\n","      if i % 100 == 99:\n","        last_loss = running_loss / 100 # loss per batch\n","        print('  batch {} loss: {}'.format(i + 1, last_loss))\n","        tb_x = epoch_index * len(train_dataloader) + i + 1\n","        tb_writer.add_scalar('Loss/train', last_loss, tb_x)\n","        running_loss = 0.\n","\n","    return last_loss"],"metadata":{"id":"VSR1SfhF_CjJ"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def train_model(config, model):\n","  # Initializing in a separate cell so we can easily add more epochs to the same run\n","  timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')\n","  writer = SummaryWriter('runs/fashion_trainer_{}'.format(timestamp))\n","  epoch_number = 0\n","\n","  EPOCHS = 50\n","\n","  best_vloss = 1_000_000.\n","  losses = {'train': [], 'valid': []}\n","\n","  for epoch in range(EPOCHS):\n","      print('EPOCH {}:'.format(epoch_number + 1))\n","\n","      # Make sure gradient tracking is on, and do a pass over the data\n","      model.train(True)\n","      avg_loss = train_one_epoch(epoch_number, writer)\n","\n","\n","      running_vloss = 0.0\n","      # Set the model to evaluation mode, disabling dropout and using population\n","      # statistics for batch normalization.\n","      model.eval()\n","\n","      # Disable gradient computation and reduce memory consumption.\n","      with torch.no_grad():\n","          for i, vdata in enumerate(validation_loader):\n","              vinputs, vlabels = vdata\n","              voutputs = model(vinputs)\n","              vloss = F.cross_entropy(voutputs.view(-1, config['vocab_size']), vlabels.view(-1))\n","              running_vloss += vloss\n","\n","      avg_vloss = running_vloss / (i + 1)\n","      losses['train'].append(avg_loss)\n","      losses['valid'].append(avg_vloss.item())\n","      print('LOSS train {} valid {}'.format(avg_loss, avg_vloss))\n","\n","      # Log the running loss averaged per batch\n","      # for both training and validation\n","      writer.add_scalars('Training vs. Validation Loss',\n","                      { 'Training' : avg_loss, 'Validation' : avg_vloss },\n","                      epoch_number + 1)\n","      writer.flush()\n","\n","      # Track best performance, and save the model's state\n","      if avg_vloss < best_vloss:\n","          best_vloss = avg_vloss\n","          model_path = 'model_{}_{}'.format(timestamp, epoch_number)\n","          torch.save(model.state_dict(), model_path)\n","\n","      epoch_number += 1\n","\n","  pd.DataFrame(losses).plot()"],"metadata":{"id":"FRJcTmVHCHH0"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Treinamento com `batch_size` = 16"],"metadata":{"id":"iY-mllSZvpJg"}},{"cell_type":"code","source":["train_model(config, model)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"W-dA_qYDGcgA","outputId":"27d423b8-e2ba-4c7c-b252-67d5aa3083c8","executionInfo":{"status":"ok","timestamp":1720475286590,"user_tz":240,"elapsed":176741,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["EPOCH 1:\n","  batch 100 loss: 7.254485898017883\n","  batch 200 loss: 6.72920759677887\n","  batch 300 loss: 6.6483221530914305\n","  batch 400 loss: 6.690575227737427\n","  batch 500 loss: 6.618522758483887\n","  batch 600 loss: 6.599264216423035\n","LOSS train 6.599264216423035 valid 6.901430606842041\n","EPOCH 2:\n","  batch 100 loss: 6.580296430587769\n","  batch 200 loss: 6.578885645866394\n","  batch 300 loss: 6.6078906965255735\n","  batch 400 loss: 6.584995603561401\n","  batch 500 loss: 6.601514177322388\n","  batch 600 loss: 6.609987564086914\n","LOSS train 6.609987564086914 valid 6.904172420501709\n","EPOCH 3:\n","  batch 100 loss: 6.591444034576416\n","  batch 200 loss: 6.564644765853882\n","  batch 300 loss: 6.575415391921997\n","  batch 400 loss: 6.590406394004821\n","  batch 500 loss: 6.593808465003967\n","  batch 600 loss: 6.60360047340393\n","LOSS train 6.60360047340393 valid 6.879724025726318\n","EPOCH 4:\n","  batch 100 loss: 6.580120692253113\n","  batch 200 loss: 6.5862398529052735\n","  batch 300 loss: 6.593850221633911\n","  batch 400 loss: 6.588077220916748\n","  batch 500 loss: 6.581966590881348\n","  batch 600 loss: 6.5882522487640385\n","LOSS train 6.5882522487640385 valid 6.909512996673584\n","EPOCH 5:\n","  batch 100 loss: 6.578727827072144\n","  batch 200 loss: 6.5831868982315065\n","  batch 300 loss: 6.590605983734131\n","  batch 400 loss: 6.590784053802491\n","  batch 500 loss: 6.580624976158142\n","  batch 600 loss: 6.578814177513123\n","LOSS train 6.578814177513123 valid 6.917264461517334\n","EPOCH 6:\n","  batch 100 loss: 6.560040545463562\n","  batch 200 loss: 6.572971782684326\n","  batch 300 loss: 6.599514727592468\n","  batch 400 loss: 6.596052861213684\n","  batch 500 loss: 6.594382667541504\n","  batch 600 loss: 6.582794198989868\n","LOSS train 6.582794198989868 valid 6.931935787200928\n","EPOCH 7:\n","  batch 100 loss: 6.559836192131042\n","  batch 200 loss: 6.575530066490173\n","  batch 300 loss: 6.55260015964508\n","  batch 400 loss: 6.597680506706237\n","  batch 500 loss: 6.60317440032959\n","  batch 600 loss: 6.584929151535034\n","LOSS train 6.584929151535034 valid 6.937662601470947\n","EPOCH 8:\n","  batch 100 loss: 6.566373510360718\n","  batch 200 loss: 6.556069231033325\n","  batch 300 loss: 6.595703058242798\n","  batch 400 loss: 6.570441856384277\n","  batch 500 loss: 6.615760755538941\n","  batch 600 loss: 6.558448724746704\n","LOSS train 6.558448724746704 valid 6.941678047180176\n","EPOCH 9:\n","  batch 100 loss: 6.564875254631042\n","  batch 200 loss: 6.579329714775086\n","  batch 300 loss: 6.570184783935547\n","  batch 400 loss: 6.580846128463745\n","  batch 500 loss: 6.580609383583069\n","  batch 600 loss: 6.596588416099548\n","LOSS train 6.596588416099548 valid 6.976319789886475\n","EPOCH 10:\n","  batch 100 loss: 6.571156268119812\n","  batch 200 loss: 6.552039556503296\n","  batch 300 loss: 6.564516258239746\n","  batch 400 loss: 6.60458215713501\n","  batch 500 loss: 6.583310332298279\n","  batch 600 loss: 6.583385305404663\n","LOSS train 6.583385305404663 valid 6.983857154846191\n","EPOCH 11:\n","  batch 100 loss: 6.567958526611328\n","  batch 200 loss: 6.6028373384475705\n","  batch 300 loss: 6.566983342170715\n","  batch 400 loss: 6.575128974914551\n","  batch 500 loss: 6.571655740737915\n","  batch 600 loss: 6.566354598999023\n","LOSS train 6.566354598999023 valid 6.989124298095703\n","EPOCH 12:\n","  batch 100 loss: 6.592281746864319\n","  batch 200 loss: 6.534661345481872\n","  batch 300 loss: 6.572481174468994\n","  batch 400 loss: 6.588158221244812\n","  batch 500 loss: 6.591622776985169\n","  batch 600 loss: 6.568725719451904\n","LOSS train 6.568725719451904 valid 7.0073137283325195\n","EPOCH 13:\n","  batch 100 loss: 6.562606024742126\n","  batch 200 loss: 6.562768802642823\n","  batch 300 loss: 6.567439794540405\n","  batch 400 loss: 6.565530376434326\n","  batch 500 loss: 6.603497505187988\n","  batch 600 loss: 6.589612183570861\n","LOSS train 6.589612183570861 valid 7.013947486877441\n","EPOCH 14:\n","  batch 100 loss: 6.567205629348755\n","  batch 200 loss: 6.564379653930664\n","  batch 300 loss: 6.571182346343994\n","  batch 400 loss: 6.577518548965454\n","  batch 500 loss: 6.588018941879272\n","  batch 600 loss: 6.581626229286194\n","LOSS train 6.581626229286194 valid 7.031599521636963\n","EPOCH 15:\n","  batch 100 loss: 6.5464914464950565\n","  batch 200 loss: 6.577048268318176\n","  batch 300 loss: 6.581699676513672\n","  batch 400 loss: 6.581840267181397\n","  batch 500 loss: 6.562737092971802\n","  batch 600 loss: 6.586595730781555\n","LOSS train 6.586595730781555 valid 7.034348964691162\n","EPOCH 16:\n","  batch 100 loss: 6.544588537216186\n","  batch 200 loss: 6.582893800735474\n","  batch 300 loss: 6.6008024454116825\n","  batch 400 loss: 6.58988461971283\n","  batch 500 loss: 6.541111888885498\n","  batch 600 loss: 6.581812653541565\n","LOSS train 6.581812653541565 valid 7.0664381980896\n","EPOCH 17:\n","  batch 100 loss: 6.551539568901062\n","  batch 200 loss: 6.57414707660675\n","  batch 300 loss: 6.58046178817749\n","  batch 400 loss: 6.553614950180053\n","  batch 500 loss: 6.583387479782105\n","  batch 600 loss: 6.595599536895752\n","LOSS train 6.595599536895752 valid 7.06130838394165\n","EPOCH 18:\n","  batch 100 loss: 6.566115574836731\n","  batch 200 loss: 6.560071096420288\n","  batch 300 loss: 6.551137237548828\n","  batch 400 loss: 6.576573548316955\n","  batch 500 loss: 6.597802829742432\n","  batch 600 loss: 6.568505039215088\n","LOSS train 6.568505039215088 valid 7.07714319229126\n","EPOCH 19:\n","  batch 100 loss: 6.564255890846252\n","  batch 200 loss: 6.558865914344787\n","  batch 300 loss: 6.55938762664795\n","  batch 400 loss: 6.575385274887085\n","  batch 500 loss: 6.571145167350769\n","  batch 600 loss: 6.589157776832581\n","LOSS train 6.589157776832581 valid 7.0945611000061035\n","EPOCH 20:\n","  batch 100 loss: 6.5550105762481685\n","  batch 200 loss: 6.574929261207581\n","  batch 300 loss: 6.556095662117005\n","  batch 400 loss: 6.566363430023193\n","  batch 500 loss: 6.5743719005584715\n","  batch 600 loss: 6.583142786026001\n","LOSS train 6.583142786026001 valid 7.118529319763184\n","EPOCH 21:\n","  batch 100 loss: 6.548122506141663\n","  batch 200 loss: 6.553948926925659\n","  batch 300 loss: 6.5781525087356565\n","  batch 400 loss: 6.543014073371888\n","  batch 500 loss: 6.592370190620422\n","  batch 600 loss: 6.586455979347229\n","LOSS train 6.586455979347229 valid 7.109251976013184\n","EPOCH 22:\n","  batch 100 loss: 6.523948349952698\n","  batch 200 loss: 6.548625469207764\n","  batch 300 loss: 6.571464214324951\n","  batch 400 loss: 6.586494879722595\n","  batch 500 loss: 6.578914699554443\n","  batch 600 loss: 6.573911905288696\n","LOSS train 6.573911905288696 valid 7.121114253997803\n","EPOCH 23:\n","  batch 100 loss: 6.558890852928162\n","  batch 200 loss: 6.538014535903931\n","  batch 300 loss: 6.569413876533508\n","  batch 400 loss: 6.541698789596557\n","  batch 500 loss: 6.579856009483337\n","  batch 600 loss: 6.554808902740478\n","LOSS train 6.554808902740478 valid 7.123199462890625\n","EPOCH 24:\n","  batch 100 loss: 6.538546228408814\n","  batch 200 loss: 6.539492511749268\n","  batch 300 loss: 6.543084988594055\n","  batch 400 loss: 6.549443392753601\n","  batch 500 loss: 6.589137706756592\n","  batch 600 loss: 6.568361105918885\n","LOSS train 6.568361105918885 valid 7.141907691955566\n","EPOCH 25:\n","  batch 100 loss: 6.5412467575073245\n","  batch 200 loss: 6.554701061248779\n","  batch 300 loss: 6.558792958259582\n","  batch 400 loss: 6.532972960472107\n","  batch 500 loss: 6.547908911705017\n","  batch 600 loss: 6.553964881896973\n","LOSS train 6.553964881896973 valid 7.15984582901001\n","EPOCH 26:\n","  batch 100 loss: 6.502383580207825\n","  batch 200 loss: 6.506418261528015\n","  batch 300 loss: 6.656693043708802\n","  batch 400 loss: 6.56102306842804\n","  batch 500 loss: 6.527300033569336\n","  batch 600 loss: 6.5371735429763795\n","LOSS train 6.5371735429763795 valid 7.115063667297363\n","EPOCH 27:\n","  batch 100 loss: 6.513447532653808\n","  batch 200 loss: 6.497464432716369\n","  batch 300 loss: 6.5209917020797725\n","  batch 400 loss: 6.491918354034424\n","  batch 500 loss: 6.529042053222656\n","  batch 600 loss: 6.508379697799683\n","LOSS train 6.508379697799683 valid 7.098448753356934\n","EPOCH 28:\n","  batch 100 loss: 6.491382918357849\n","  batch 200 loss: 6.477219285964966\n","  batch 300 loss: 6.4809818887710575\n","  batch 400 loss: 6.493492069244385\n","  batch 500 loss: 6.502482190132141\n","  batch 600 loss: 6.486911187171936\n","LOSS train 6.486911187171936 valid 7.050586700439453\n","EPOCH 29:\n","  batch 100 loss: 6.447491722106934\n","  batch 200 loss: 6.47750153541565\n","  batch 300 loss: 6.462226090431213\n","  batch 400 loss: 6.471752362251282\n","  batch 500 loss: 6.455769844055176\n","  batch 600 loss: 6.481536073684692\n","LOSS train 6.481536073684692 valid 7.067141532897949\n","EPOCH 30:\n","  batch 100 loss: 6.431420063972473\n","  batch 200 loss: 6.429241437911987\n","  batch 300 loss: 6.446416010856629\n","  batch 400 loss: 6.452865800857544\n","  batch 500 loss: 6.441871075630188\n","  batch 600 loss: 6.481301641464233\n","LOSS train 6.481301641464233 valid 7.033505439758301\n","EPOCH 31:\n","  batch 100 loss: 6.4371893072128294\n","  batch 200 loss: 6.4184278392791745\n","  batch 300 loss: 6.4399604320526125\n","  batch 400 loss: 6.460789761543274\n","  batch 500 loss: 6.460857768058776\n","  batch 600 loss: 6.442670884132386\n","LOSS train 6.442670884132386 valid 7.030813694000244\n","EPOCH 32:\n","  batch 100 loss: 6.41266547203064\n","  batch 200 loss: 6.443150177001953\n","  batch 300 loss: 6.411829543113709\n","  batch 400 loss: 6.420839729309082\n","  batch 500 loss: 6.448990087509156\n","  batch 600 loss: 6.430414538383484\n","LOSS train 6.430414538383484 valid 7.043978691101074\n","EPOCH 33:\n","  batch 100 loss: 6.389787497520447\n","  batch 200 loss: 6.411245346069336\n","  batch 300 loss: 6.421475305557251\n","  batch 400 loss: 6.507261333465576\n","  batch 500 loss: 6.476127953529358\n","  batch 600 loss: 6.453008193969726\n","LOSS train 6.453008193969726 valid 7.03551721572876\n","EPOCH 34:\n","  batch 100 loss: 6.430651307106018\n","  batch 200 loss: 6.421110577583313\n","  batch 300 loss: 6.415716428756713\n","  batch 400 loss: 6.4142104482650755\n","  batch 500 loss: 6.428186640739441\n","  batch 600 loss: 6.435166039466858\n","LOSS train 6.435166039466858 valid 7.043789863586426\n","EPOCH 35:\n","  batch 100 loss: 6.385214333534241\n","  batch 200 loss: 6.395712161064148\n","  batch 300 loss: 6.428929119110108\n","  batch 400 loss: 6.413891558647156\n","  batch 500 loss: 6.583587484359741\n","  batch 600 loss: 6.578288340568543\n","LOSS train 6.578288340568543 valid 7.108015537261963\n","EPOCH 36:\n","  batch 100 loss: 6.540544028282166\n","  batch 200 loss: 6.543326025009155\n","  batch 300 loss: 6.5408097887039185\n","  batch 400 loss: 6.5395600748062135\n","  batch 500 loss: 6.522721891403198\n","  batch 600 loss: 6.519186248779297\n","LOSS train 6.519186248779297 valid 7.113694667816162\n","EPOCH 37:\n","  batch 100 loss: 6.498777656555176\n","  batch 200 loss: 6.495661149024963\n","  batch 300 loss: 6.501683101654053\n","  batch 400 loss: 6.506357712745666\n","  batch 500 loss: 6.513505058288574\n","  batch 600 loss: 6.494283967018127\n","LOSS train 6.494283967018127 valid 7.116103172302246\n","EPOCH 38:\n","  batch 100 loss: 6.4706564617156985\n","  batch 200 loss: 6.5286725950241085\n","  batch 300 loss: 6.5076979064941405\n","  batch 400 loss: 6.514157242774964\n","  batch 500 loss: 6.487441992759704\n","  batch 600 loss: 6.501930351257324\n","LOSS train 6.501930351257324 valid 7.126080513000488\n","EPOCH 39:\n","  batch 100 loss: 6.4892742586135865\n","  batch 200 loss: 6.463800644874572\n","  batch 300 loss: 6.491882257461548\n","  batch 400 loss: 6.4794546365737915\n","  batch 500 loss: 6.475056920051575\n","  batch 600 loss: 6.475516648292541\n","LOSS train 6.475516648292541 valid 7.129582405090332\n","EPOCH 40:\n","  batch 100 loss: 6.45053807258606\n","  batch 200 loss: 6.438479175567627\n","  batch 300 loss: 6.507103371620178\n","  batch 400 loss: 6.512490930557251\n","  batch 500 loss: 6.48032247543335\n","  batch 600 loss: 6.499647622108459\n","LOSS train 6.499647622108459 valid 7.112171173095703\n","EPOCH 41:\n","  batch 100 loss: 6.463958077430725\n","  batch 200 loss: 6.467284770011902\n","  batch 300 loss: 6.487425794601441\n","  batch 400 loss: 6.501281037330627\n","  batch 500 loss: 6.477662000656128\n","  batch 600 loss: 6.4896377849578855\n","LOSS train 6.4896377849578855 valid 7.126997947692871\n","EPOCH 42:\n","  batch 100 loss: 6.4809159088134765\n","  batch 200 loss: 6.468009572029114\n","  batch 300 loss: 6.495647053718567\n","  batch 400 loss: 6.51474552154541\n","  batch 500 loss: 6.457751355171204\n","  batch 600 loss: 6.470253939628601\n","LOSS train 6.470253939628601 valid 7.133437156677246\n","EPOCH 43:\n","  batch 100 loss: 6.4647204875946045\n","  batch 200 loss: 6.452745881080627\n","  batch 300 loss: 6.4637512636184695\n","  batch 400 loss: 6.442908539772033\n","  batch 500 loss: 6.453943176269531\n","  batch 600 loss: 6.427407455444336\n","LOSS train 6.427407455444336 valid 7.121382713317871\n","EPOCH 44:\n","  batch 100 loss: 6.42605507850647\n","  batch 200 loss: 6.426686096191406\n","  batch 300 loss: 6.428371777534485\n","  batch 400 loss: 6.428095831871032\n","  batch 500 loss: 6.42728180885315\n","  batch 600 loss: 6.41529278755188\n","LOSS train 6.41529278755188 valid 7.101837158203125\n","EPOCH 45:\n","  batch 100 loss: 6.388901100158692\n","  batch 200 loss: 6.396873302459717\n","  batch 300 loss: 6.430823044776917\n","  batch 400 loss: 6.435814719200135\n","  batch 500 loss: 6.45037733078003\n","  batch 600 loss: 6.419003801345825\n","LOSS train 6.419003801345825 valid 7.124403476715088\n","EPOCH 46:\n","  batch 100 loss: 6.378414149284363\n","  batch 200 loss: 6.421618952751159\n","  batch 300 loss: 6.40506724357605\n","  batch 400 loss: 6.412917518615723\n","  batch 500 loss: 6.398574676513672\n","  batch 600 loss: 6.422784910202027\n","LOSS train 6.422784910202027 valid 7.114327430725098\n","EPOCH 47:\n","  batch 100 loss: 6.382177243232727\n","  batch 200 loss: 6.3837039232254025\n","  batch 300 loss: 6.375428819656372\n","  batch 400 loss: 6.3952450180053715\n","  batch 500 loss: 6.422552003860473\n","  batch 600 loss: 6.401733222007752\n","LOSS train 6.401733222007752 valid 7.130518913269043\n","EPOCH 48:\n","  batch 100 loss: 6.37449089050293\n","  batch 200 loss: 6.384265007972718\n","  batch 300 loss: 6.380558428764343\n","  batch 400 loss: 6.383541660308838\n","  batch 500 loss: 6.400592350959778\n","  batch 600 loss: 6.406537475585938\n","LOSS train 6.406537475585938 valid 7.119816780090332\n","EPOCH 49:\n","  batch 100 loss: 6.36315957069397\n","  batch 200 loss: 6.367721962928772\n","  batch 300 loss: 6.369583930969238\n","  batch 400 loss: 6.386765179634094\n","  batch 500 loss: 6.3947264766693115\n","  batch 600 loss: 6.395237894058227\n","LOSS train 6.395237894058227 valid 7.132377624511719\n","EPOCH 50:\n","  batch 100 loss: 6.371091256141662\n","  batch 200 loss: 6.37949001789093\n","  batch 300 loss: 6.383036327362061\n","  batch 400 loss: 6.37596417427063\n","  batch 500 loss: 6.368903679847717\n","  batch 600 loss: 6.388664498329162\n","LOSS train 6.388664498329162 valid 7.146467685699463\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 1 Axes>"],"image/png":"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Pl/0gYHfmn1sfhxqXmZpc6/5s1jWYamSciiM1KxZM9/jN954g/r169OtW7cC9+/YsSMdO3YE4Pnnny9miQ5y9TJbKKzg6ti8CH379sUwDH755Rc6duzI8uXL+d//zKXUn332WRYuXMg777xDgwYN8PT05M477yQrK6s0KpfyauX75qUXbOYogrpdinaczWY2A0dcXarllTrPAHPtm2VvwLI3zRkm47dA/y/N9U2kcHt/N0e++NaGR/4oX60fFUG1cytRfzvQXNvm69vN4ce5WWZH1b7v65yWoGL3QMrKymLq1Kk8/fTT2MpTMrTZrnytjDLi4eHB7bffzjfffENsbCyNGzemXbt2AKxcuZIhQ4Zw2223AZCamsqBAweK/NpNmzbl66+/JiMjI691ZM2aNSX+GaQU/fmD2bEQzA5wzfpZW49VnM7NSFmrLcx8BA6thYndoP8X5ro2UrAdP5n/NuunL83i8vA1R9X8ONRcAyc307y8dcfkku3AK8UfTTN79mzOnDnDkCFDSrAcU2ZmJsnJyfluldWgQYP45Zdf+Pzzzxk0aFDe9oYNGzJz5kw2b97Mli1bGDhw4EUjby5l4MCB2Gw2hg0bxo4dO5g3bx7vvPPO5Q+U8mH/HzD7XP+ero+bK3dWdY1vhIeXQFAzc6bYL/ua/WPkYjmZF2YqraohtqS4esBdX5nzg7S9D+75xrwcKiWq2GFk8uTJ3HjjjdSqVfKdRceOHYufn1/eLSysGDNMVhDXX3891atXJyYmhoEDLwwNe++99wgICOCqq66ib9++9O7dO6/VpCi8vb35+eef2bp1K23btuVf//oXb775Zml8BClpCTvg23vNadmb3Qq9tIptnsD65kii5reDPQd+/bd5HV/y27fUnF7cOwTqdLK6morP2cWc9bXfRxWm5b2iKVY708GDB1m0aBEzZ84s6XoAGD16NE8//XTe4+Tk5EobSJycnDh69OI+LhEREfz+++/5to0YMSLf479ftvn7KO0uXbqwefPmS+4j5cyRDeawxswks6PhbZ+qif3v3KrBbZ/AgRXmMNXts815L+SCvEs0t+jnRyqEYv2UTpkyhaCgIG6++eaSrgcAd3d3fH19891EKr2tP8KUm8xVcoOamROTleYkTxWZizt0fMi8v2a8OepITDlZsGuueV+XaKSCcDiM2O12pkyZwv3334+L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ERFLKYyIiIiIpRRGRERExFIKIyIiImIphRERERGxlMKIiIiIWEphRERERCylMCIiIiKWUhgRERERSymMiIiIiKUURkRERMRSCiMiIiJiKYURERERsZTCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilHA4jR44c4d577yUwMBBPT09atmzJ+vXrL3nMN998Q+vWrfHy8iI0NJShQ4dy6tSpYhctIiIilYdDYSQxMZGoqChcXV2ZP38+O3bs4N133yUgIKDQY1auXMngwYN58MEH2b59Oz/88APr1q1j2LBhV1y8iIiIVHwujuz85ptvEhYWxpQpU/K2RUZGXvKY1atXExERwciRI/P2f+SRR3jzzTeLUa6IiIhUNg61jMyZM4cOHTrQv39/goKCaNu2LZMmTbrkMV27duXQoUPMmzcPwzBISEjgxx9/5Kabbir0mMzMTJKTk/PdREREpHJyKIzs27ePCRMm0LBhQ3799VeGDx/OyJEj+fLLLws9Jioqim+++Ya7774bNzc3QkJC8PPzY/z48YUeM3bsWPz8/PJuYWFhjpQpIiIiFYjNMAyjqDu7ubnRoUMHVq1albdt5MiRREdHs3r16gKP2bFjBz179mTUqFH07t2b+Ph4nnvuOTp27MjkyZMLPCYzM5PMzMy8x8nJyYSFhZGUlISvr29RyxURERELJScn4+fnd9nvb4f6jISGhtKsWbN825o2bcqMGTMKPWbs2LFERUXx3HPPAdCqVSuqVavGNddcw+uvv05oaOhFx7i7u+Pu7u5IaSIiIlJBOXSZJioqipiYmHzbdu/eTXh4eKHHpKen4+SU/22cnZ0BcKBRRkRERCoph8LIqFGjWLNmDWPGjCE2NpZp06YxceJERowYkbfP6NGjGTx4cN7jvn37MnPmTCZMmMC+fftYuXIlI0eOpFOnTtSqVavkPomIiIhUSA5dpunYsSOzZs1i9OjRvPrqq0RGRjJu3DgGDRqUt098fDxxcXF5j4cMGUJKSgofffQRzzzzDP7+/lx//fUa2isiIiKAgx1YrVLUDjAiIiJSfhT1+1tr04iIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiIiIpRRGRERExFIKIyIiImIphRERERGxlMKIiIiIWEphRERERCylMCIiIiKWUhgRERERSymMiIiIiKUURkRERMRSCiMiIiJiKYURERERsZTCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiIiIpRwOI0eOHOHee+8lMDAQT09PWrZsyfr16wvdf8iQIdhstotuzZs3v6LCRUREpHJwKIwkJiYSFRWFq6sr8+fPZ8eOHbz77rsEBAQUesz7779PfHx83u3QoUNUr16d/v37X3HxIiIiUvG5OLLzm2++SVhYGFOmTMnbFhkZeclj/Pz88PPzy3s8e/ZsEhMTeeCBBxwsVURERCojh1pG5syZQ4cOHejfvz9BQUG0bduWSZMmOfSGkydPpmfPnoSHhxe6T2ZmJsnJyfluIiIiUjk5FEb27dvHhAkTaNiwIb/++ivDhw9n5MiRfPnll0U6/ujRo8yfP5+HHnrokvuNHTs2r0XFz8+PsLAwR8oUERGRCsRmGIZR1J3d3Nzo0KEDq1atyts2cuRIoqOjWb169WWPHzt2LO+++y5Hjx7Fzc2t0P0yMzPJzMzMe5ycnExYWBhJSUn4+voWtVwRERGxUHJyMn5+fpf9/naoZSQ0NJRmzZrl29a0aVPi4uIue6xhGHz++efcd999lwwiAO7u7vj6+ua7iYiISOXkUBiJiooiJiYm37bdu3dfsv/HecuWLSM2NpYHH3zQsQpFRESkUnMojIwaNYo1a9YwZswYYmNjmTZtGhMnTmTEiBF5+4wePZrBgwdfdOzkyZPp3LkzLVq0uPKqRUREpNJwKIx07NiRWbNmMX36dFq0aMFrr73GuHHjGDRoUN4+8fHxF122SUpKYsaMGWoVERERkYs41IHVKkXtACMiIiLlR6l0YBUREREpaQojIiIiYimFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiIiIpRRGRERExFIKIyIiImIphRERERGxlMKIiIiIWEphRERERCylMCIiIiKWUhgRERERSymMiIiIiKUURkRERMRSCiMiIiJiKYURERERsZTCiIiIiFhKYUREREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiIhYSmFERERE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pTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbFUhVi11zAMwFyKWERERCqG89/b57/HC1MhwkhKSgoAYWFhFlciIiIijkpJScHPz6/Q523G5eJKOWC32zl69Cg+Pj7YbLYSe93k5GTCwsI4dOgQvr6+Jfa6UjCd77Kl8122dL7Lls532SvOOTcMg5SUFGrVqoWTU+E9QypEy4iTkxN16tQptdf39fXVD3MZ0vkuWzrfZUvnu2zpfJc9R8/5pVpEzlMHVhEREbGUwoiIiIhYqkqHEXd3d1566SXc3d2tLqVK0PkuWzrfZUvnu2zpfJe90jznFaIDq4iIiFReVbplRERERKynMCIiIiKWUhgRERERSymMiIiIiKWqdBgZP348EREReHh40LlzZ9atW2d1SZXCH3/8Qd++falVqxY2m43Zs2fne94wDF588UVCQ0Px9PSkZ8+e7Nmzx5piK4GxY8fSsWNHfHx8CAoK4tZbbyUmJibfPhkZGYwYMYLAwEC8vb254447SEhIsKjiim3ChAm0atUqb+Knrl27Mn/+/Lznda5LzxtvvIHNZuOpp57K26bzXbJefvllbDZbvluTJk3yni+t811lw8h3333H008/zUsvvcTGjRtp3bo1vXv35vjx41aXVuGlpaXRunVrxo8fX+Dzb731Fh988AGffPIJa9eupVq1avTu3ZuMjIwyrrRyWLZsGSNGjGDNmjUsXLiQ7OxsbrjhBtLS0vL2GTVqFD///DM//PADy5Yt4+jRo9x+++0WVl1x1alThzfeeIMNGzawfv16rr/+evr168f27dsBnevSEh0dzaeffkqrVq3ybdf5LnnNmzcnPj4+77ZixYq850rtfBtVVKdOnYwRI0bkPc7NzTVq1apljB071sKqKh/AmDVrVt5ju91uhISEGG+//XbetjNnzhju7u7G9OnTLaiw8jl+/LgBGMuWLTMMwzy/rq6uxg8//JC3z86dOw3AWL16tVVlVioBAQHGZ599pnNdSlJSUoyGDRsaCxcuNLp162Y8+eSThmHoZ7s0vPTSS0br1q0LfK40z3eVbBnJyspiw4YN9OzZM2+bk5MTPXv2ZPXq1RZWVvnt37+fY8eO5Tv3fn5+dO7cWee+hCQlJQFQvXp1ADZs2EB2dna+c96kSRPq1q2rc36FcnNz+fbbb0lLS6Nr164616VkxIgR3HzzzfnOK+hnu7Ts2bOHWrVqUa9ePQYNGkRcXBxQuue7QiyUV9JOnjxJbm4uwcHB+bYHBweza9cui6qqGo4dOwZQ4Lk//5wUn91u56mnniIqKooWLVoA5jl3c3PD398/374658W3detWunbtSkZGBt7e3syaNYtmzZqxefNmnesS9u2337Jx40aio6Mvek4/2yWvc+fOfPHFFzRu3Jj4+HheeeUVrrnmGrZt21aq57tKhhGRymrEiBFs27Yt3zVeKXmNGzdm8+bNJCUl8eOPP3L//fezbNkyq8uqdA4dOsSTTz7JwoUL8fDwsLqcKuHGG2/Mu9+qVSs6d+5MeHg433//PZ6enqX2vlXyMk2NGjVwdna+qAdwQkICISEhFlVVNZw/vzr3Je/xxx9n7ty5LFmyhDp16uRtDwkJISsrizNnzuTbX+e8+Nzc3GjQoAHt27dn7NixtG7dmvfff1/nuoRt2LCB48eP065dO1xcXHBxcWHZsmV88MEHuLi4EBwcrPNdyvz9/WnUqBGxsbGl+vNdJcOIm5sb7du3Z/HixXnb7HY7ixcvpmvXrhZWVvlFRkYSEhKS79wnJyezdu1anftiMgyDxx9/nFmzZvH7778TGRmZ7/n27dvj6uqa75zHxMQQFxenc15C7HY7mZmZOtclrEePHmzdupXNmzfn3Tp06MCgQYPy7ut8l67U1FT27t1LaGho6f58X1H31wrs22+/Ndzd3Y0vvvjC2LFjh/Hwww8b/v7+xrFjx6wurcJLSUkxNm3aZGzatMkAjPfee8/YtGmTcfDgQcMwDOONN94w/P39jZ9++sn4888/jX79+hmRkZHG2bNnLa68Yho+fLjh5+dnLF261IiPj8+7paen5+3z6KOPGnXr1jV+//13Y/369UbXrl2Nrl27Wlh1xfX8888by5YtM/bv32/8+eefxvPPP2/YbDbjt99+MwxD57q0/XU0jWHofJe0Z555xli6dKmxf/9+Y+XKlUbPnj2NGjVqGMePHzcMo/TOd5UNI4ZhGB9++KFRt25dw83NzejUqZOxZs0aq0uqFJYsWWIAF93uv/9+wzDM4b3/+c9/jODgYMPd3d3o0aOHERMTY23RFVhB5xowpkyZkrfP2bNnjccee8wICAgwvLy8jNtuu82Ij4+3rugKbOjQoUZ4eLjh5uZm1KxZ0+jRo0deEDEMnevS9vcwovNdsu6++24jNDTUcHNzM2rXrm3cfffdRmxsbN7zpXW+bYZhGFfWtiIiIiJSfFWyz4iIiIiUHwojIiIiYimFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiIiIpRRGRERExFIKIyIiImIphRERERGxlMKIiIiIWOr/AYkSxU5I8TkEAAAAAElFTkSuQmCC\n"},"metadata":{}}]},{"cell_type":"code","source":["torch.save(model, 'my_model.pth')"],"metadata":{"id":"teVMf8MBHlVl"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Treinamento com `batch_size` = 32"],"metadata":{"id":"ss7kU7QrvwWx"}},{"cell_type":"code","source":["config.update({\n","    'batch_size': 32\n","})"],"metadata":{"id":"tbsgd2fEnz6B"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["train_model(config, model)"],"metadata":{"id":"xwAZdMKTV8Rj","colab":{"base_uri":"https://localhost:8080/","height":1000},"executionInfo":{"status":"ok","timestamp":1720482937546,"user_tz":300,"elapsed":599124,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"c6a2e561-dfad-456a-c251-098abbcee8b0"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["EPOCH 1:\n","  batch 100 loss: 7.172227883338929\n","  batch 200 loss: 6.641011209487915\n","  batch 300 loss: 6.622778711318969\n","LOSS train 6.622778711318969 valid 6.869982719421387\n","EPOCH 2:\n","  batch 100 loss: 6.589296593666076\n","  batch 200 loss: 6.5783744764328\n","  batch 300 loss: 6.523212966918945\n","LOSS train 6.523212966918945 valid 6.668927192687988\n","EPOCH 3:\n","  batch 100 loss: 6.367052774429322\n","  batch 200 loss: 6.245095438957215\n","  batch 300 loss: 6.161773190498352\n","LOSS train 6.161773190498352 valid 6.4662580490112305\n","EPOCH 4:\n","  batch 100 loss: 5.980791273117066\n","  batch 200 loss: 5.94928249835968\n","  batch 300 loss: 5.883374304771423\n","LOSS train 5.883374304771423 valid 6.2536187171936035\n","EPOCH 5:\n","  batch 100 loss: 5.765328869819641\n","  batch 200 loss: 5.708793077468872\n","  batch 300 loss: 5.647432579994201\n","LOSS train 5.647432579994201 valid 6.056188583374023\n","EPOCH 6:\n","  batch 100 loss: 5.522223701477051\n","  batch 200 loss: 5.51192259311676\n","  batch 300 loss: 5.485039143562317\n","LOSS train 5.485039143562317 valid 6.002313613891602\n","EPOCH 7:\n","  batch 100 loss: 5.366386723518372\n","  batch 200 loss: 5.343162803649903\n","  batch 300 loss: 5.349799561500549\n","LOSS train 5.349799561500549 valid 5.914008617401123\n","EPOCH 8:\n","  batch 100 loss: 5.2450868082046505\n","  batch 200 loss: 5.221986150741577\n","  batch 300 loss: 5.214074268341064\n","LOSS train 5.214074268341064 valid 5.940862655639648\n","EPOCH 9:\n","  batch 100 loss: 5.127347750663757\n","  batch 200 loss: 5.106661410331726\n","  batch 300 loss: 5.179489970207214\n","LOSS train 5.179489970207214 valid 5.893185615539551\n","EPOCH 10:\n","  batch 100 loss: 5.025272417068481\n","  batch 200 loss: 5.040288195610047\n","  batch 300 loss: 5.023049664497376\n","LOSS train 5.023049664497376 valid 5.818782329559326\n","EPOCH 11:\n","  batch 100 loss: 4.944939289093018\n","  batch 200 loss: 4.938350229263306\n","  batch 300 loss: 4.940429320335388\n","LOSS train 4.940429320335388 valid 5.79094934463501\n","EPOCH 12:\n","  batch 100 loss: 4.847834324836731\n","  batch 200 loss: 4.86101731300354\n","  batch 300 loss: 4.900515027046204\n","LOSS train 4.900515027046204 valid 5.810030460357666\n","EPOCH 13:\n","  batch 100 loss: 4.772279562950135\n","  batch 200 loss: 4.808963198661804\n","  batch 300 loss: 4.830773520469665\n","LOSS train 4.830773520469665 valid 5.7970099449157715\n","EPOCH 14:\n","  batch 100 loss: 4.729389381408692\n","  batch 200 loss: 4.736234517097473\n","  batch 300 loss: 4.760689487457276\n","LOSS train 4.760689487457276 valid 5.748399257659912\n","EPOCH 15:\n","  batch 100 loss: 4.739435610771179\n","  batch 200 loss: 4.761809258460999\n","  batch 300 loss: 4.7103673934936525\n","LOSS train 4.7103673934936525 valid 5.8211445808410645\n","EPOCH 16:\n","  batch 100 loss: 4.623151025772095\n","  batch 200 loss: 4.634681401252746\n","  batch 300 loss: 4.6569615793228145\n","LOSS train 4.6569615793228145 valid 5.820262908935547\n","EPOCH 17:\n","  batch 100 loss: 4.55587375164032\n","  batch 200 loss: 4.587977967262268\n","  batch 300 loss: 4.6188200044631955\n","LOSS train 4.6188200044631955 valid 5.745680809020996\n","EPOCH 18:\n","  batch 100 loss: 4.520093288421631\n","  batch 200 loss: 4.539075546264648\n","  batch 300 loss: 4.573925409317017\n","LOSS train 4.573925409317017 valid 5.784363746643066\n","EPOCH 19:\n","  batch 100 loss: 4.460341238975525\n","  batch 200 loss: 4.519164433479309\n","  batch 300 loss: 4.531325259208679\n","LOSS train 4.531325259208679 valid 5.878668785095215\n","EPOCH 20:\n","  batch 100 loss: 4.425350794792175\n","  batch 200 loss: 4.47442994594574\n","  batch 300 loss: 4.484270219802856\n","LOSS train 4.484270219802856 valid 5.974778652191162\n","EPOCH 21:\n","  batch 100 loss: 4.377736864089965\n","  batch 200 loss: 4.396480851173401\n","  batch 300 loss: 4.45960497379303\n","LOSS train 4.45960497379303 valid 5.947024822235107\n","EPOCH 22:\n","  batch 100 loss: 4.341839108467102\n","  batch 200 loss: 4.384986872673035\n","  batch 300 loss: 4.396161489486694\n","LOSS train 4.396161489486694 valid 5.971501350402832\n","EPOCH 23:\n","  batch 100 loss: 4.322825553417206\n","  batch 200 loss: 4.3269310212135315\n","  batch 300 loss: 4.361510910987854\n","LOSS train 4.361510910987854 valid 5.950575351715088\n","EPOCH 24:\n","  batch 100 loss: 4.263336644172669\n","  batch 200 loss: 4.314425795078278\n","  batch 300 loss: 4.329500770568847\n","LOSS train 4.329500770568847 valid 5.965373516082764\n","EPOCH 25:\n","  batch 100 loss: 4.73459703207016\n","  batch 200 loss: 4.406391320228576\n","  batch 300 loss: 4.387493586540222\n","LOSS train 4.387493586540222 valid 5.971930027008057\n","EPOCH 26:\n","  batch 100 loss: 4.218559174537659\n","  batch 200 loss: 4.2838466620445255\n","  batch 300 loss: 4.296542391777039\n","LOSS train 4.296542391777039 valid 5.994229316711426\n","EPOCH 27:\n","  batch 100 loss: 4.169474675655365\n","  batch 200 loss: 4.240190186500549\n","  batch 300 loss: 4.236780226230621\n","LOSS train 4.236780226230621 valid 6.0544915199279785\n","EPOCH 28:\n","  batch 100 loss: 4.117045829296112\n","  batch 200 loss: 4.20404869556427\n","  batch 300 loss: 4.20469839811325\n","LOSS train 4.20469839811325 valid 6.056950092315674\n","EPOCH 29:\n","  batch 100 loss: 4.076124663352966\n","  batch 200 loss: 4.141241619586944\n","  batch 300 loss: 4.1852592587471005\n","LOSS train 4.1852592587471005 valid 6.109691619873047\n","EPOCH 30:\n","  batch 100 loss: 4.060036919116974\n","  batch 200 loss: 4.113920016288757\n","  batch 300 loss: 4.162429881095886\n","LOSS train 4.162429881095886 valid 6.045992374420166\n","EPOCH 31:\n","  batch 100 loss: 4.022013132572174\n","  batch 200 loss: 4.089898765087128\n","  batch 300 loss: 4.1225871348381045\n","LOSS train 4.1225871348381045 valid 6.123666763305664\n","EPOCH 32:\n","  batch 100 loss: 4.005324738025665\n","  batch 200 loss: 4.0577108716964725\n","  batch 300 loss: 4.0878568100929265\n","LOSS train 4.0878568100929265 valid 6.173917770385742\n","EPOCH 33:\n","  batch 100 loss: 3.9602249479293823\n","  batch 200 loss: 4.042502901554108\n","  batch 300 loss: 4.085650110244751\n","LOSS train 4.085650110244751 valid 6.122374057769775\n","EPOCH 34:\n","  batch 100 loss: 3.946941063404083\n","  batch 200 loss: 4.015143511295318\n","  batch 300 loss: 4.061908349990845\n","LOSS train 4.061908349990845 valid 6.207901477813721\n","EPOCH 35:\n","  batch 100 loss: 3.9436364507675172\n","  batch 200 loss: 3.9668062853813173\n","  batch 300 loss: 4.03125834941864\n","LOSS train 4.03125834941864 valid 6.376011371612549\n","EPOCH 36:\n","  batch 100 loss: 3.902646629810333\n","  batch 200 loss: 3.9415264105796814\n","  batch 300 loss: 3.998851013183594\n","LOSS train 3.998851013183594 valid 6.308480739593506\n","EPOCH 37:\n","  batch 100 loss: 3.8685570883750917\n","  batch 200 loss: 3.9376883912086487\n","  batch 300 loss: 3.9492770409584046\n","LOSS train 3.9492770409584046 valid 6.350978374481201\n","EPOCH 38:\n","  batch 100 loss: 3.85991007566452\n","  batch 200 loss: 3.9139299488067625\n","  batch 300 loss: 3.9430702471733095\n","LOSS train 3.9430702471733095 valid 6.307162284851074\n","EPOCH 39:\n","  batch 100 loss: 3.830420000553131\n","  batch 200 loss: 3.8678387451171874\n","  batch 300 loss: 3.924768602848053\n","LOSS train 3.924768602848053 valid 6.285574913024902\n","EPOCH 40:\n","  batch 100 loss: 3.8177448987960814\n","  batch 200 loss: 3.862979459762573\n","  batch 300 loss: 3.8775752711296083\n","LOSS train 3.8775752711296083 valid 6.423800468444824\n","EPOCH 41:\n","  batch 100 loss: 4.959664311408996\n","  batch 200 loss: 4.55969336271286\n","  batch 300 loss: 4.203508949279785\n","LOSS train 4.203508949279785 valid 6.352086067199707\n","EPOCH 42:\n","  batch 100 loss: 3.9864105868339537\n","  batch 200 loss: 3.9753793144226073\n","  batch 300 loss: 3.9787585139274597\n","LOSS train 3.9787585139274597 valid 6.345963954925537\n","EPOCH 43:\n","  batch 100 loss: 3.824919855594635\n","  batch 200 loss: 3.8663721799850466\n","  batch 300 loss: 3.8794995021820067\n","LOSS train 3.8794995021820067 valid 6.470861911773682\n","EPOCH 44:\n","  batch 100 loss: 3.7395345830917357\n","  batch 200 loss: 3.8164124035835267\n","  batch 300 loss: 3.8584246921539305\n","LOSS train 3.8584246921539305 valid 6.545734405517578\n","EPOCH 45:\n","  batch 100 loss: 3.7270442414283753\n","  batch 200 loss: 3.7668605852127075\n","  batch 300 loss: 3.804299988746643\n","LOSS train 3.804299988746643 valid 6.558882236480713\n","EPOCH 46:\n","  batch 100 loss: 3.6908179712295532\n","  batch 200 loss: 3.802176911830902\n","  batch 300 loss: 3.8035173773765565\n","LOSS train 3.8035173773765565 valid 6.528656005859375\n","EPOCH 47:\n","  batch 100 loss: 3.6601963949203493\n","  batch 200 loss: 3.7149740624427796\n","  batch 300 loss: 3.7762435460090638\n","LOSS train 3.7762435460090638 valid 6.582528114318848\n","EPOCH 48:\n","  batch 100 loss: 3.6323843812942505\n","  batch 200 loss: 3.703022177219391\n","  batch 300 loss: 3.75785231590271\n","LOSS train 3.75785231590271 valid 6.653554439544678\n","EPOCH 49:\n","  batch 100 loss: 3.609143373966217\n","  batch 200 loss: 3.6926794934272764\n","  batch 300 loss: 4.974221394062043\n","LOSS train 4.974221394062043 valid 6.254998207092285\n","EPOCH 50:\n","  batch 100 loss: 4.266746120452881\n","  batch 200 loss: 4.006846477985382\n","  batch 300 loss: 3.8907069182395935\n","LOSS train 3.8907069182395935 valid 6.411135673522949\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 1 Axes>"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAiMAAAGgCAYAAAB45mdaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABrtklEQVR4nO3dd3hUZdrH8e/MpIc0AilA6L13DEVAQBBQsKAiFuwFX7uLrGV13V107a4NG9gQRQVEitJ7771DEkgBQhrpmXn/OCQQTUL6mSS/z3XNxWTmnJl7jpi5eZ77uR+Lw+FwICIiImISq9kBiIiISM2mZERERERMpWRERERETKVkREREREylZERERERMpWRERERETKVkREREREylZERERERMpWRERERETKVkRERERExVomSkcePGWCyWv9wmTJhQ6DkzZ86kdevWeHh40KFDB+bPn1/moEVERKT6cCnJwZs2bSInJyfv5927dzNkyBDGjBlT4PFr165l7NixTJ48mZEjRzJ9+nRGjx7N1q1bad++fbHf1263c+rUKXx8fLBYLCUJWUREREzicDhITk6mXr16WK2Fj39YyrJR3hNPPMFvv/3GoUOHCkwSbrnlFs6fP89vv/2W99gVV1xB586d+eSTT4r9PlFRUYSFhZU2TBERETFRZGQkDRo0KPT5Eo2MXCozM5Nvv/2Wp556qtDRinXr1vHUU0/le2zo0KHMnj27yNfOyMggIyMj7+fcfCkyMhJfX9/ShiwiIiKVKCkpibCwMHx8fIo8rtTJyOzZs0lISGD8+PGFHhMTE0NwcHC+x4KDg4mJiSnytSdPnswrr7zyl8d9fX2VjIiIiFQxlyuxKPVqmi+++IJrrrmGevXqlfYlCjVp0iQSExPzbpGRkeX+HiIiIuIcSjUycuLECRYvXswvv/xS5HEhISHExsbmeyw2NpaQkJAiz3N3d8fd3b00oYmIiEgVU6qRkalTpxIUFMSIESOKPC48PJwlS5bke2zRokWEh4eX5m1FRESkGipxMmK325k6dSp33XUXLi75B1buvPNOJk2alPfz448/zsKFC3nrrbfYv38/L7/8Mps3b+bRRx8te+QiIiJSLZQ4GVm8eDERERHcc889f3kuIiKC6OjovJ979+7N9OnT+fTTT+nUqRM//fQTs2fPLlGPEREREaneytRnpLIkJSXh5+dH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uOGGG/juu+84fPgwrVq1omvXrgCsWbOG8ePHc/311wNGDcjx48eL/dpt2rThm2++IT09PW90ZP369eX+GUREpGzcXKwMaBXEgFZB/Gu0g83H41m6P45tEQnsPJlAcno2qw6dYdWhM3nn5HaArQ71IlAdk5EqZty4cYwcOZI9e/Zw++235z3eokULfvnlF6699losFgsvvvgidnvx17HfdtttPP/889x///1MmjSJ48eP8+abb1bERxARkXJis1ro1TSQXhf2wMnKsXMgJpntkQl5t8NxKZxJyQAg1MTN7cqTkhGTXXXVVdSuXZsDBw5w22235T3+9ttvc88999C7d2/q1KnDxIkTSUpKKvbr1qpVi7lz5/LQQw/RpUsX2rZty+uvv86NN95YER9DREQqgKvNSvv6frSv78ftVzQCjA3ydkYlcCAmmStbVuzOxpXF4nDklsA4r6SkJPz8/EhMTMTXN//ugunp6Rw7dowmTZrkK9aUktO1FBGR8lTU9/el1IFVRERETKVkREREREylZERERERMpWRERERETKVkRERERExVbZKRKrAoyOmVpI+JiIhIeanyfUZcXV2xWCycPn2aunXrlmk75prK4XCQmZnJ6dOnsVqtuLm5mR2SiIjUIFU+GbHZbDRo0ICoqKgStUuXv/Ly8qJhw4ZYrdVmwExERKqAKp+MgNFttEWLFmRlZZkdSpVls9lwcXHRyJKIiFS6apGMgPFlarNV/Z0LRUREahqNx4uIiIiplIyIiIiIqZSMiIiIiKmqRM1Ibg+RpKQkkyMRERGR4sr93r5cL7AqkYwkJycDEBYWZnIkIiIiUlLJycn4+fkV+rzFUQVal9rtdk6dOoWPj0+5Lj1NSkoiLCyMyMhIfH19y+11pWC63pVL17ty6XpXLl3vylXa6+1wOEhOTqZevXpF9rCqEiMjVquVBg0aVNjr+/r66i9zJdL1rly63pVL17ty6XpXrtJc76JGRHKpgFVERERMpWRERERETFWjkxF3d3f+8Y9/4O7ubnYoNYKud+XS9a5cut6VS9e7clX09a4SBawiIiJSfdXokRERERExn5IRERERMZWSERERETGVkhERERExVY1ORj788EMaN26Mh4cHvXr1YuPGjWaHVC2sXLmSa6+9lnr16mGxWJg9e3a+5x0OBy+99BKhoaF4enoyePBgDh06ZE6w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\n"},"metadata":{}}]},{"cell_type":"code","source":["torch.save(model, 'my_model2.pth')"],"metadata":{"id":"7no1isIrWc-8"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Avaliação do modelo"],"metadata":{"id":"pI2yLWI5M-yY"}},{"cell_type":"markdown","source":["### Funções de avaliação"],"metadata":{"id":"FShdol5xqIig"}},{"cell_type":"markdown","source":["Perplexidade"],"metadata":{"id":"ygz7I_El0t_5"}},{"cell_type":"code","source":["def calculate_perplexity(lm_model, test_dataset):\n","\n","  lm_model.eval()\n","\n","  total_loss = []\n","  with torch.no_grad():\n","    for inputs in test_dataset:\n","      input_ids = inputs[0]\n","      labels = inputs[1]\n","\n","      # Forward pass through the language model\n","      logits = lm_model(input_ids)\n","\n","      # Calculate cross-entropy loss (without reduction)\n","      loss = F.cross_entropy(logits.view(-1, config['vocab_size']), labels.view(-1))\n","      total_loss.append(loss.item())\n","\n","      # Accumulate loss and number of tokens (excluding padding)\n","\n","  # Calculate average loss and perplexity\n","  avg_loss = np.mean(total_loss)\n","  perplexity = np.exp(avg_loss)\n","\n","  return perplexity.item()\n"],"metadata":{"id":"0ObPz2OAuJO5","executionInfo":{"status":"ok","timestamp":1720532710812,"user_tz":240,"elapsed":333,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":49,"outputs":[]},{"cell_type":"markdown","source":["Acurácia"],"metadata":{"id":"to4kq9mBqpSZ"}},{"cell_type":"code","source":["import torch\n","\n","def calculate_accuracy(model, test_loader):\n","  \"\"\"\n","  Calculates the accuracy of a language model on a test dataset.\n","\n","  Args:\n","      model (torch.nn.Module): The language model to evaluate.\n","      test_loader (torch.utils.data.DataLoader): The test data loader.\n","      criterion (torch.nn.Module): The loss function used during training.\n","\n","  Returns:\n","      float: The accuracy of the model on the test dataset.\n","  \"\"\"\n","  # Set model to evaluation mode\n","  model.eval()\n","\n","  # Track variables\n","  correct = 0\n","  total = 0\n","\n","  # No gradient calculation needed during evaluation\n","  with torch.no_grad():\n","    for inputs, labels in test_loader:\n","      outputs = model(inputs)\n","      predicted = torch.argmax(outputs, dim=-1)  # Get the index of max probability\n","\n","      # Update counters\n","      total += labels.numel()\n","      correct += (predicted == labels).sum().item()\n","\n","\n","  # Calculate accuracy\n","  accuracy = correct / total\n","  return accuracy\n"],"metadata":{"id":"0qL4ridHpslh","executionInfo":{"status":"ok","timestamp":1720533351518,"user_tz":240,"elapsed":348,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":72,"outputs":[]},{"cell_type":"markdown","source":["### Avaliação dos dois modelos"],"metadata":{"id":"rs37ec6I01RL"}},{"cell_type":"markdown","source":["Modelo 1 (`batch_size` = 16)\n","\n"],"metadata":{"id":"qiM1Ey3504Ht"}},{"cell_type":"code","source":["model = torch.load('my_model.pth')\n","model.eval()\n","\n","ppl = calculate_perplexity(model, test_dataloader)\n","acc = calculate_accuracy(model, test_dataloader)\n","\n","print(f\"Perplexidade: {ppl}\")\n","print(f\"Acurácia: {acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"PqF1BGVTwJ42","executionInfo":{"status":"ok","timestamp":1720534223283,"user_tz":240,"elapsed":11791,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"50c6609d-763f-4c19-d063-1987ba0b2ff1"},"execution_count":74,"outputs":[{"output_type":"stream","name":"stdout","text":["Perplexidade: 880.1006243403579\n","Acurácia: 0.08547741566609492\n"]}]},{"cell_type":"markdown","source":["Modelo 2 (`batch_size` = 32)\n","\n"],"metadata":{"id":"A9JRZiwY1Qwe"}},{"cell_type":"code","source":["model2 = torch.load('my_model2.pth')\n","model.eval()\n","\n","ppl = calculate_perplexity(model, test_dataloader)\n","acc = calculate_accuracy(model, test_dataloader)\n","\n","print(f\"Perplexidade: {ppl}\")\n","print(f\"Acurácia: {acc}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"-95redLc1Jny","executionInfo":{"status":"ok","timestamp":1720534268235,"user_tz":240,"elapsed":9146,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"5e8104a8-c872-45fa-db86-fc8c1cf225a8"},"execution_count":75,"outputs":[{"output_type":"stream","name":"stdout","text":["Perplexidade: 880.1528531595403\n","Acurácia: 0.08501286449399657\n"]}]},{"cell_type":"markdown","source":["## Gerando compartilhamento no Huggingface"],"metadata":{"id":"qk542nk83Gbt"}},{"cell_type":"code","source":["! pip install huggingface_hub"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"DQ4N9cD31VO6","executionInfo":{"status":"ok","timestamp":1720534818648,"user_tz":240,"elapsed":8558,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"a8f0829f-f598-4f69-fdbf-e250ad64664f"},"execution_count":76,"outputs":[{"output_type":"stream","name":"stdout","text":["Requirement already satisfied: huggingface_hub in /usr/local/lib/python3.10/dist-packages (0.23.4)\n","Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (3.15.4)\n","Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (2023.6.0)\n","Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (24.1)\n","Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (6.0.1)\n","Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (2.31.0)\n","Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (4.66.4)\n","Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface_hub) (4.12.2)\n","Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface_hub) (3.3.2)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface_hub) (3.7)\n","Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface_hub) (2.0.7)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface_hub) (2024.6.2)\n"]}]},{"cell_type":"code","source":["from huggingface_hub import notebook_login\n","\n","notebook_login()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":331,"referenced_widgets":["7d50cc4d70a8453ea1023c081dd107b6","d84e05020333431296fd65c7c3be9b2a","b2f4e6f16f0a4d3b90717d0179ed642a","3084ffb3b3664cfbb6b9931bea153f83","68fd6d6b9e6c4adeb5431e29e735713d","1d9521b2ef344ec4a8bf5a4d270d802b","7a6f7ecb69c24b6583c3e55a8b22f4c8","5998e43917dc48618e326cfa5d148e79","b01977fca14b443d9f10b7aea7575c7a","e636d0177e1e4d0a8b65896085538ef0","471c56e7723e4bb892ac8bfe97523304","6c5f07b8a0274ea48baf5825c496bfb1","219ec2d07f764f9fb137534c89682b7f","4abf542d1bd54db491bd53a4bd6ae39f","b8e6ba6cafd64e43a7c6dd40fc6cb377","a41054d6970c4fc2989e8942c1e8373f","621bc786ebaa46f3bb5e66312644a65c"]},"id":"nLaTKLtL3bww","executionInfo":{"status":"ok","timestamp":1720535647184,"user_tz":240,"elapsed":364,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"17fe7491-760d-4172-c8c8-cd12862e4334"},"execution_count":83,"outputs":[{"output_type":"display_data","data":{"text/plain":["VBox(children=(HTML(value='<center> <img\\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.sv…"],"application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"7d50cc4d70a8453ea1023c081dd107b6"}},"metadata":{}}]},{"cell_type":"code","source":["from huggingface_hub import HfApi\n","from huggingface_hub.utils import HfHubHTTPError\n","api = HfApi()\n","model_repo_name = \"gioandrade/llama1_TinyShakespeare\""],"metadata":{"id":"0Yoxa-ET3gBQ","executionInfo":{"status":"ok","timestamp":1720535616976,"user_tz":240,"elapsed":475,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}}},"execution_count":81,"outputs":[]},{"cell_type":"code","source":["model_path = '/content/drive/MyDrive/Mestrado/NLP_2024/TP_LLM/my_model2.pth'\n","torch.save(model2, model_path)\n","\n","api.upload_folder(\n","    folder_path='/content/drive/MyDrive/Mestrado/NLP_2024/TP_LLM/',\n","    repo_id=model_repo_name\n",")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":602},"id":"pXTKJ0y24IYw","executionInfo":{"status":"error","timestamp":1720535626050,"user_tz":240,"elapsed":6922,"user":{"displayName":"GIOVANNA ANDRADE SANTOS","userId":"13165743699645260115"}},"outputId":"66cf70f2-ce6a-4bb2-887b-98dc6443a69b"},"execution_count":82,"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_token.py:89: UserWarning: \n","The secret `HF_TOKEN` does not exist in your Colab secrets.\n","To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n","You will be able to reuse this secret in all of your notebooks.\n","Please note that authentication is recommended but still optional to access public models or datasets.\n","  warnings.warn(\n"]},{"output_type":"error","ename":"HfHubHTTPError","evalue":" (Request ID: Root=1-668d4a5a-564ed7ba76dfae4e5eb403b3;c12f819b-d5ae-4cd0-b490-5b7bb0a84619)\n\n403 Forbidden: Authorization error..\nCannot access content at: https://huggingface.co/gioandrade/llama1_TinyShakespeare.git/info/lfs/objects/batch.\nIf you are trying to create or update content,make sure you have a token with the `write` role.","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mHTTPError\u001b[0m                                 Traceback (most recent call last)","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_errors.py\u001b[0m in \u001b[0;36mhf_raise_for_status\u001b[0;34m(response, endpoint_name)\u001b[0m\n\u001b[1;32m    303\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 304\u001b[0;31m         \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraise_for_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    305\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0mHTTPError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/requests/models.py\u001b[0m in \u001b[0;36mraise_for_status\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1020\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mhttp_error_msg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1021\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhttp_error_msg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1022\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mHTTPError\u001b[0m: 403 Client Error: Forbidden for url: https://huggingface.co/gioandrade/llama1_TinyShakespeare.git/info/lfs/objects/batch","\nThe above exception was the direct cause of the following exception:\n","\u001b[0;31mHfHubHTTPError\u001b[0m                            Traceback (most recent call last)","\u001b[0;32m<ipython-input-82-aa3e9c1ccd77>\u001b[0m in \u001b[0;36m<cell line: 4>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0mtorch\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel_path\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m api.upload_folder(\n\u001b[0m\u001b[1;32m      5\u001b[0m     \u001b[0mfolder_path\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'/content/drive/MyDrive/Mestrado/NLP_2024/TP_LLM/'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m     \u001b[0mrepo_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel_repo_name\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_validators.py\u001b[0m in \u001b[0;36m_inner_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    112\u001b[0m             \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msmoothly_deprecate_use_auth_token\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_token\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhas_token\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    116\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0m_inner_fn\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/hf_api.py\u001b[0m in \u001b[0;36m_inner\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1284\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1285\u001b[0m         \u001b[0;31m# Otherwise, call the function normally\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1286\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1287\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1288\u001b[0m     \u001b[0m_inner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_future_compatible\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/hf_api.py\u001b[0m in \u001b[0;36mupload_folder\u001b[0;34m(self, repo_id, folder_path, path_in_repo, commit_message, commit_description, token, repo_type, revision, create_pr, parent_commit, allow_patterns, ignore_patterns, delete_patterns, multi_commits, multi_commits_verbose, run_as_future)\u001b[0m\n\u001b[1;32m   4722\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mpr_url\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4723\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4724\u001b[0;31m         commit_info = self.create_commit(\n\u001b[0m\u001b[1;32m   4725\u001b[0m             \u001b[0mrepo_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrepo_type\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4726\u001b[0m             \u001b[0mrepo_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrepo_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_validators.py\u001b[0m in \u001b[0;36m_inner_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    112\u001b[0m             \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msmoothly_deprecate_use_auth_token\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_token\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhas_token\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    116\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0m_inner_fn\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/hf_api.py\u001b[0m in \u001b[0;36m_inner\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1284\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1285\u001b[0m         \u001b[0;31m# Otherwise, call the function normally\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1286\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1287\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1288\u001b[0m     \u001b[0m_inner\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_future_compatible\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/hf_api.py\u001b[0m in \u001b[0;36mcreate_commit\u001b[0;34m(self, repo_id, operations, commit_message, commit_description, token, repo_type, revision, create_pr, num_threads, parent_commit, run_as_future)\u001b[0m\n\u001b[1;32m   3675\u001b[0m         \u001b[0m_warn_on_overwriting_operations\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moperations\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3676\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3677\u001b[0;31m         self.preupload_lfs_files(\n\u001b[0m\u001b[1;32m   3678\u001b[0m             \u001b[0mrepo_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrepo_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3679\u001b[0m             \u001b[0madditions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0madditions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/hf_api.py\u001b[0m in \u001b[0;36mpreupload_lfs_files\u001b[0;34m(self, repo_id, additions, token, repo_type, revision, create_pr, num_threads, free_memory, gitignore_content)\u001b[0m\n\u001b[1;32m   4182\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4183\u001b[0m         \u001b[0;31m# Upload new LFS files\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4184\u001b[0;31m         _upload_lfs_files(\n\u001b[0m\u001b[1;32m   4185\u001b[0m             \u001b[0madditions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnew_lfs_additions_to_upload\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   4186\u001b[0m             \u001b[0mrepo_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrepo_type\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_validators.py\u001b[0m in \u001b[0;36m_inner_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    112\u001b[0m             \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msmoothly_deprecate_use_auth_token\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_token\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhas_token\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    116\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0m_inner_fn\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/_commit_api.py\u001b[0m in \u001b[0;36m_upload_lfs_files\u001b[0;34m(additions, repo_type, repo_id, headers, endpoint, num_threads, revision)\u001b[0m\n\u001b[1;32m    359\u001b[0m     \u001b[0mbatch_actions\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mDict\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    360\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mchunk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mchunk_iterable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0madditions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchunk_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m256\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 361\u001b[0;31m         batch_actions_chunk, batch_errors_chunk = post_lfs_batch_info(\n\u001b[0m\u001b[1;32m    362\u001b[0m             \u001b[0mupload_infos\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mop\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupload_info\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mchunk\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    363\u001b[0m             \u001b[0mrepo_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrepo_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_validators.py\u001b[0m in \u001b[0;36m_inner_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    112\u001b[0m             \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msmoothly_deprecate_use_auth_token\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_token\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhas_token\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    116\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0m_inner_fn\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/lfs.py\u001b[0m in \u001b[0;36mpost_lfs_batch_info\u001b[0;34m(upload_infos, token, repo_type, repo_id, revision, endpoint, headers)\u001b[0m\n\u001b[1;32m    165\u001b[0m     }\n\u001b[1;32m    166\u001b[0m     \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_session\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpost\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjson\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpayload\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 167\u001b[0;31m     \u001b[0mhf_raise_for_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    168\u001b[0m     \u001b[0mbatch_info\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mresp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjson\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    169\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.10/dist-packages/huggingface_hub/utils/_errors.py\u001b[0m in \u001b[0;36mhf_raise_for_status\u001b[0;34m(response, endpoint_name)\u001b[0m\n\u001b[1;32m    365\u001b[0m                 \u001b[0;34m+\u001b[0m \u001b[0;34m\"make sure you have a token with the `write` role.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    366\u001b[0m             )\n\u001b[0;32m--> 367\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mHfHubHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    368\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    369\u001b[0m         \u001b[0;31m# Convert `HTTPError` into a `HfHubHTTPError` to display request information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mHfHubHTTPError\u001b[0m:  (Request ID: Root=1-668d4a5a-564ed7ba76dfae4e5eb403b3;c12f819b-d5ae-4cd0-b490-5b7bb0a84619)\n\n403 Forbidden: Authorization error..\nCannot access content at: https://huggingface.co/gioandrade/llama1_TinyShakespeare.git/info/lfs/objects/batch.\nIf you are trying to create or update content,make sure you have a token with the `write` role."]}]},{"cell_type":"code","source":[],"metadata":{"id":"Q37l6dHG6ft-"},"execution_count":null,"outputs":[]}]}