\n"
+ ],
+ "text/plain": [
+ " prompt \\\n",
+ "0 Why can camels survive for long without water? \n",
+ "1 Why mobile is bad for human \n",
+ "2 What is a polygon? \n",
+ "3 How do I start running? \n",
+ "4 Which episodes of season four of Game of Thron... \n",
+ "... ... \n",
+ "41810 What can I call you by? \n",
+ "41811 What's your identification name? \n",
+ "41812 What are you called? \n",
+ "41813 How do you introduce yourself? \n",
+ "41814 What should I say when I address you? \n",
+ "\n",
+ " completion \n",
+ "0 Camels can survive for long periods without wa... \n",
+ "1 Mobile phones as technological devices have be... \n",
+ "2 A polygon is a two-dimensional geometric figur... \n",
+ "3 Starting a running routine can be a great way ... \n",
+ "4 Michelle MacLaren directed two episodes in Sea... \n",
+ "... ... \n",
+ "41810 You can call me Aira. How may I assist you today? \n",
+ "41811 As an artificial intelligence, I do not have a... \n",
+ "41812 Hello! I am called Aira. How can I assist you ... \n",
+ "41813 Hello! I am Aira, your helpful, respectful, an... \n",
+ "41814 When addressing me, you can simply call me Air... \n",
+ "\n",
+ "[41815 rows x 2 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import os\n",
+ "import pandas as pd\n",
+ "from datasets import load_dataset\n",
+ "\n",
+ "project = \"Aira-2-355M\"\n",
+ "\n",
+ "os.makedirs(project, exist_ok=True)\n",
+ "\n",
+ "dataset = load_dataset(\"nicholasKluge/instruct-aira-dataset\", split=\"english\")\n",
+ "\n",
+ "df = dataset.to_pandas()\n",
+ "\n",
+ "display(df)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "fEaDTvdOe8rr"
+ },
+ "source": [
+ "3. Load `GPT2Tokenizer` and add the chosen special tokens (`'<|startofinstruction|>', '<|endofinstruction|>', '<|endofcompletion|>','<|pad|>'`)\n",
+ "4. Create demonstrations by prepending the special tokens.\n",
+ "5. Calculate the maximum length (in tokens) that the demonstrations have."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 185,
+ "referenced_widgets": [
+ "0344486573be433c970a5ad3cb4c3d47",
+ "d31a78df037f4415bd6ca16169d2377c",
+ "dd6b20e6617a467797a36cdfbe6d8883",
+ "7568ad99bce6478c92bd7cec91d709a6",
+ "d5ebfe83bed541c991c20d3cbc44973e",
+ "0bba2fb2227e48a0a9870bc29f042824",
+ "648b9683ccc940a09861b396c5de6999",
+ "9543c526319041a38c2d2c39ecd792fe",
+ "885834a92b7240eb88840e253ebb828c",
+ "751e88ec75ae4248b08a98cb298c6bc3",
+ "ea4da200691247cc96fb48d25a7d9eaf",
+ "f50b22af03794445b53e85f406fa66fc",
+ "b2894e273445457cbfa24dab0bbc7acc",
+ "3997c41fbc934c319cbbf0f533da42e3",
+ "aa210e1c291f4bf680bf31908e523c2a",
+ "ed615a79c1d8496c876bbed41719f6a5",
+ "62d8b769b9ba4ef2837220a9dd6bbc09",
+ "367a0225b8194d9b8e46cba33b47406b",
+ "8c40ac6a812b45539ba73607939f9a29",
+ "7a6085e6b42a414fa920748f47368602",
+ "9e0dc81238aa4d97b61e941915760196",
+ "0083188ff4404fb983d4ebad2953011d",
+ "eec07da625a341bf8639ab0a69bc0c18",
+ "69180d5fdc534f73a9dfcea274c76613",
+ "cbf34603fa954442890657073cf97362",
+ "d4ebe120dd284e9fbcebe7e0ddd67e3a",
+ "29bc8c7e223e443d8b121e03d895f4d1",
+ "827e8b7d08db4e8aae467ddc48f7f56f",
+ "24f730eb89554e0dae64044179340d00",
+ "fca382cf60474e8fb39ff4c5559f9966",
+ "f5435d0b0fcd400d92dd5fb5c455a18d",
+ "19eb55339c094fd8b769b9eb23c02654",
+ "32ebf9de3775448ca9eafffc82b3a197"
+ ]
+ },
+ "id": "hfu84fWIv4f9",
+ "outputId": "17283275-b996-4666-961d-6a1e8e3f28a0"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "0344486573be433c970a5ad3cb4c3d47",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading (…)olve/main/vocab.json: 0%| | 0.00/1.04M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "f50b22af03794445b53e85f406fa66fc",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading (…)olve/main/merges.txt: 0%| | 0.00/456k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "eec07da625a341bf8639ab0a69bc0c18",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading (…)lve/main/config.json: 0%| | 0.00/718 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Total number of demonstrations: 41815\n",
+ "The longest demonstration is 400 tokens long.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from transformers import GPT2Tokenizer\n",
+ "\n",
+ "model = \"gpt2-medium\" \n",
+ "model_size = \"355M\" \n",
+ "\n",
+ "tokenizer = GPT2Tokenizer.from_pretrained(model,\n",
+ " bos_token='<|startofinstruction|>', \n",
+ " sep_token = '<|endofinstruction|>',\n",
+ " eos_token='<|endofcompletion|>', \n",
+ " pad_token='<|pad|>') \n",
+ "\n",
+ "df['demonstrations'] = tokenizer.bos_token + df['prompt'] + tokenizer.sep_token + df['completion'] + tokenizer.eos_token\n",
+ "\n",
+ "df['length'] = df['demonstrations'].apply(lambda x: len(tokenizer.encode(x)))\n",
+ "\n",
+ "print(\"Total number of demonstrations: \", len(df))\n",
+ "print(f\"The longest demonstration is {df['length'].max()} tokens long.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wkMO17K5e8rs"
+ },
+ "source": [
+ "6. Create the Dataset class."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "WlbAfMQ4v4gA"
+ },
+ "outputs": [],
+ "source": [
+ "import torch\n",
+ "from torch.utils.data import Dataset\n",
+ "\n",
+ "max_length = 400\n",
+ "\n",
+ "class InstructDataset(Dataset):\n",
+ "\n",
+ " def __init__(self, demonstrations, tokenizer, max_length=max_length):\n",
+ "\n",
+ " self.tokenizer = tokenizer\n",
+ " self.input_ids = []\n",
+ " self.attn_masks = []\n",
+ "\n",
+ " for demo in demonstrations:\n",
+ "\n",
+ " encodings_dict = tokenizer(demo,\n",
+ " truncation=True,\n",
+ " max_length=max_length,\n",
+ " padding=\"max_length\")\n",
+ "\n",
+ " self.input_ids.append(torch.tensor(encodings_dict['input_ids']))\n",
+ " self.attn_masks.append(torch.tensor(encodings_dict['attention_mask']))\n",
+ "\n",
+ " def __len__(self):\n",
+ " return len(self.input_ids)\n",
+ "\n",
+ " def __getitem__(self, idx):\n",
+ " return self.input_ids[idx], self.attn_masks[idx]\n",
+ "\n",
+ "dataset = InstructDataset(df.demonstrations.to_list(), tokenizer, max_length=max_length)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "vSqKuRjIe8ru"
+ },
+ "source": [
+ "7. Create the `DataLoaders` and specify the `batch_size`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "cUkCNV-6v4gG"
+ },
+ "outputs": [],
+ "source": [
+ "from torch.utils.data import DataLoader, RandomSampler\n",
+ "\n",
+ "dataloader = DataLoader(\n",
+ " dataset,\n",
+ " sampler=RandomSampler(dataset),\n",
+ " batch_size=16,\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "0vxvcTIHe8rv"
+ },
+ "source": [
+ "8. Load the base model (`GPT2LMHeadModel`)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 587,
+ "referenced_widgets": [
+ "6faae72711a3414882c0801f0e27b236",
+ "28e0055d1b7a4d458e5395d913bb027a",
+ "79fd7250f8fe4c639a616b1c760876b8",
+ "93d6e30be1054ca5b2a8edf1012da4a4",
+ "8dc120dfcfac434d953586f8739e35c2",
+ "a40e22305d73482bb27e3f158f3036a4",
+ "258acd5e31e04007b06666525259b6d6",
+ "cda0d0dab6574484b16ff1e2bb40b5d7",
+ "c82614b4d5e04c468a4eea7cf776a682",
+ "906b7be51e864b5ba7d1d145197b88f6",
+ "4f50034ecc6a4597ba6da49fb6c07322",
+ "8105c725813c4953ad02738b1b235eeb",
+ "2a006e6c6630413b9473cc2496939771",
+ "f0cc8fcd849042c2be9ce7eb525c687d",
+ "f9cdc791803346109f3999173dcb350e",
+ "33173b720ac74e938d9687afa17e941c",
+ "8e4fb92498a14c3f8bf41241660f0475",
+ "87d5ccb0a2f94adbb0b9b75317473683",
+ "51f9f12677a9457fb031e34463f14fd2",
+ "5cf0ee7081bf455e8b92770bb338ec75",
+ "995bab49ebcd4afba299e1694945a78c",
+ "e9f86a47f210411d98e2e930dd987f2e"
+ ]
+ },
+ "id": "Rmg-5YJqv4gH",
+ "outputId": "768e4991-b884-48b3-bd82-f130277eb2ea"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "6faae72711a3414882c0801f0e27b236",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading model.safetensors: 0%| | 0.00/1.52G [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "8105c725813c4953ad02738b1b235eeb",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Downloading (…)neration_config.json: 0%| | 0.00/124 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "You are resizing the embedding layer without providing a `pad_to_multiple_of` parameter. This means that the new embedding dimension will be 50261. This might induce some performance reduction as *Tensor Cores* will not be available. For more details about this, or help on choosing the correct value for resizing, refer to this guide: https://docs.nvidia.com/deeplearning/performance/dl-performance-matrix-multiplication/index.html#requirements-tc\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "GPT2LMHeadModel(\n",
+ " (transformer): GPT2Model(\n",
+ " (wte): Embedding(50261, 1024)\n",
+ " (wpe): Embedding(1024, 1024)\n",
+ " (drop): Dropout(p=0.1, inplace=False)\n",
+ " (h): ModuleList(\n",
+ " (0-23): 24 x GPT2Block(\n",
+ " (ln_1): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)\n",
+ " (attn): GPT2Attention(\n",
+ " (c_attn): Conv1D()\n",
+ " (c_proj): Conv1D()\n",
+ " (attn_dropout): Dropout(p=0.1, inplace=False)\n",
+ " (resid_dropout): Dropout(p=0.1, inplace=False)\n",
+ " )\n",
+ " (ln_2): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)\n",
+ " (mlp): GPT2MLP(\n",
+ " (c_fc): Conv1D()\n",
+ " (c_proj): Conv1D()\n",
+ " (act): NewGELUActivation()\n",
+ " (dropout): Dropout(p=0.1, inplace=False)\n",
+ " )\n",
+ " )\n",
+ " )\n",
+ " (ln_f): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)\n",
+ " )\n",
+ " (lm_head): Linear(in_features=1024, out_features=50261, bias=False)\n",
+ ")"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from transformers import GPT2LMHeadModel, GPT2Config\n",
+ "\n",
+ "configuration = GPT2Config.from_pretrained(model, output_hidden_states=False)\n",
+ "\n",
+ "model = GPT2LMHeadModel.from_pretrained(model, config=configuration)\n",
+ "model.resize_token_embeddings(len(tokenizer))\n",
+ "\n",
+ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
+ "\n",
+ "model.to(device)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XAoXD7GVYMN_"
+ },
+ "source": [
+ "9. Freeze some of the layers for constrained fine-tuning. This allows the model to retain some of its original capabilities after the tuning."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "MJA-WOoHZePn",
+ "outputId": "eaa8960d-6284-431e-a0e5-f15d1e4d91d7"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of transformer blocks in the model: 24\n",
+ "Number of transformer blocks to un-freeze: 6\n",
+ "Number of frozen layers: 217\n",
+ "Number of trainable layers: 75\n"
+ ]
+ }
+ ],
+ "source": [
+ "UNFREEZE_LAST_N = 6 \n",
+ "\n",
+ "print(\"Number of transformer blocks in the model: \", model.config.num_hidden_layers)\n",
+ "print(\"Number of transformer blocks to un-freeze: \", UNFREEZE_LAST_N)\n",
+ "\n",
+ "for parameter in model.parameters():\n",
+ " parameter.requires_grad = False\n",
+ "\n",
+ "for i, m in enumerate(model.transformer.h):\n",
+ " #Only un-freeze the last n transformer blocks\n",
+ " if i+1 > model.config.num_hidden_layers - UNFREEZE_LAST_N:\n",
+ " for parameter in m.parameters():\n",
+ " parameter.requires_grad = True\n",
+ "\n",
+ " for parameter in model.transformer.ln_f.parameters():\n",
+ " parameter.requires_grad = True\n",
+ "\n",
+ " for parameter in model.lm_head.parameters():\n",
+ " parameter.requires_grad = True\n",
+ "\n",
+ "num_frozen_layers = sum(1 for parameter in model.parameters() if not parameter.requires_grad)\n",
+ "num_trainable_layers = sum(1 for parameter in model.parameters() if parameter.requires_grad)\n",
+ "\n",
+ "print(\"Number of frozen layers:\", num_frozen_layers)\n",
+ "print(\"Number of trainable layers:\", num_trainable_layers)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "GJ1kH3uSe8rw"
+ },
+ "source": [
+ "10. Set the training hyperparameters."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "qlbLg6tqv4gI"
+ },
+ "outputs": [],
+ "source": [
+ "from transformers import get_linear_schedule_with_warmup\n",
+ "\n",
+ "# training rounds\n",
+ "epochs = 3 \n",
+ "\n",
+ "# steps at the start of training that are ignored\n",
+ "warmup_steps = 1e2\n",
+ "\n",
+ "# sample the model to test the output\n",
+ "sample_every = 400\n",
+ "\n",
+ "optimizer = torch.optim.AdamW(model.parameters(), lr = 5e-4, eps = 1e-8)\n",
+ "\n",
+ "# total steps = number of batches * number of epochs\n",
+ "total_steps = len(dataloader) * epochs\n",
+ "\n",
+ "# create the learning rate scheduler\n",
+ "scheduler = get_linear_schedule_with_warmup(optimizer,\n",
+ " num_warmup_steps = warmup_steps,\n",
+ " num_training_steps = total_steps)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nz1a9lxXe8rw"
+ },
+ "source": [
+ "11. Training/Validation loop. Track the carbon emissions of your work by using `codecarbon`. 🌱"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "_X_m8XOtv4gR",
+ "outputId": "641499bc-c32a-4698-81e5-783ae3eb3b76"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Beginning epoch 1 of 3\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 15%|█▌ | 400/2614 [06:04<33:24, 1.10it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 400 of 2614. Loss:1.2041078805923462.\n",
+ "\n",
+ "\n",
+ "Example output: What are some examples of time series forecasting?I can be used to assess the performance of a time series model for various tasks such as predicting the market's return, the expected range of prices for a specified industry, or the strength of a business. Here are a few examples:\n",
+ "\n",
+ "1. Market-Calculating Time Series: A time series model that takes into account past performance, current market dynamics, and future trends can be used to forecast the future returns of certain commodities, such as oil. Time series models can be used to predict the return for stocks, bonds, or real estate, while predicting the return for individual commodities can provide insights into the performance of individual companies or industries. The most common time series model used to forecast the oil and gas industry's returns is the US-Interim Return Analysis (IRA), which estimates the future returns of the S&P500 index over a decade, based on three key time series elements:\n",
+ "\n",
+ "1. Market Cap\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 31%|███ | 800/2614 [12:12<27:20, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 800 of 2614. Loss:0.8887915015220642.\n",
+ "\n",
+ "\n",
+ "Example output: What vitamins should I take for healthy skin.Vitamins are important for a healthy complexion and skin tone. These vitamins provide a broad range of nutrients that can help enhance skin health and overall health overall. Some common vitamins include:\n",
+ "\n",
+ "1. Vitamin C: Provides antioxidant properties and helps maintain collagen and elastin in skin.\n",
+ "\n",
+ "2. Vitamin A: Helps maintain collagen, elastin, and skin elasticity.\n",
+ "\n",
+ "3. Vitamin B12: Helps maintain and repair cell walls, promoting healthy skin.\n",
+ "\n",
+ "4. Vitamin K: Helps repair skin cell structures and maintain elasticity.\n",
+ "\n",
+ "5. Vitamin A: Supports healthy skin by providing protection against sun damage, promoting youthful appearance, and promoting collagen production.\n",
+ "\n",
+ "Remember to consult with a dermatologist or registered dietitian for personalized advice based on your specific needs and dietary needs. Good luck with your skin care journey!\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 46%|████▌ | 1200/2614 [18:19<21:22, 1.10it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 1200 of 2614. Loss:0.9714927077293396.\n",
+ "\n",
+ "\n",
+ "Example output: How does AI Robotics Ethics Society at PUCRS function? Ethics Society organizes workshops, conferences, and industry-specific events to provide a platform for discussions and to connect practitioners. They provide training, education, and access to ethical guidelines and research. The primary purpose of this work is to gain a better understanding of the ethical dilemmas associated with autonomous vehicles and how they can be mitigated effectively. \n",
+ "\n",
+ "The primary goal of AI Robotics Ethics Society is to gain a better understanding of the ethical dilemmas associated with autonomous vehicles and how they can be mitigated effectively. The primary purpose of AI Robotics Ethics Society is to gain a better understanding of the ethical dilemmas associated with autonomous vehicles and how they can be mitigated effectively. The primary goal of AI Robotics Ethics Society is to gain a better understanding of the ethical dilemmas associated with autonomous vehicles and how they can be mitigated effectively. The primary purpose of AI Robotics Ethics Society is to gain a better understanding of\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 61%|██████ | 1600/2614 [24:26<15:17, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 1600 of 2614. Loss:1.078328251838684.\n",
+ "\n",
+ "\n",
+ "Example output: What is an offside in football/soccer?A Offside is a penalty awarded by an opponent when they exceed the five minutes mark of the match. It occurs when an opponent, not the referee, is responsible for a penalty. Offside is a rule that has gained popularity in recent years, as it helps improve the sport's overall reputation. Some games, such as football and soccer, have penalties called during stoppages to minimize the risk of dangerous and dangerous situations. While Offside can be applied in different situations, it can be a crucial component in determining the winner of the game. It is important to understand the rules of Football, and their application, to assess whether an opponent is offside during the match.\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 77%|███████▋ | 2000/2614 [30:32<09:15, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 2000 of 2614. Loss:1.0895828008651733.\n",
+ "\n",
+ "\n",
+ "Example output: I am travelling in two weeks and I want to know what is the cheapest ticket I can get.To find the cheapest flight from London to Tokyo, I would need to book a direct flight from London to Paris. However, there are several flight options that can often be more affordable. \n",
+ "\n",
+ "However, for the most part, flights from London to Paris can be more affordable compared to flight prices in other cities due to their lower layovers and lower layovers are usually offered as alternate flights. Some of these options may also have additional amenities such as onboard refreshments or special activities. It's worth noting that different airlines may have their own restrictions or practices regarding prices and layovers, so it's always a good idea to compare options and check with the airline's website before making a final decision.\n",
+ "\n",
+ "When searching for the cheapest flight from London to Paris, it's important to use price comparison websites and be patient and flexible with your travel dates. Sometimes flying across multiple cities may\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 92%|█████████▏| 2400/2614 [36:38<03:13, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 2400 of 2614. Loss:1.1839613914489746.\n",
+ "\n",
+ "\n",
+ "Example output: How could I use technology to improve my organizational skills.Using a computer or smartphone can be beneficial for various tasks. Here are some tips to help you enhance your organizational skills:\n",
+ "\n",
+ "1. Identify and use productivity tools: Utilize tools like calendars, project management apps, and task management software to focus on one task at a time. This will help you stay organized and efficient.\n",
+ "\n",
+ "2. Create dedicated work groups: Utilize email collaboration platforms, project management software, or any other tools to form dedicated work groups. These groups can handle tasks such as scheduling, scheduling appointments, or meetings.\n",
+ "\n",
+ "3. Use digital tools to organize and organize: Engage in online discussions, group videos, or even participate in social media groups to stay organized and productive. Keep in mind that digital tools may be effective for different tasks, so be sure to experiment and find the one that works best for you.\n",
+ "\n",
+ "Remember, everyone learns from experience and adapts to\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 2614/2614 [39:56<00:00, 1.09it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Average Training Loss: 1.2680252797975737.\n",
+ "\n",
+ "\n",
+ "Beginning epoch 2 of 3\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 15%|█▌ | 400/2614 [06:01<33:21, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 400 of 2614. Loss:0.7701126933097839.\n",
+ "\n",
+ "\n",
+ "Example output: What is the history of the Zulu people.?\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 31%|███ | 800/2614 [12:03<27:21, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 800 of 2614. Loss:0.9429687857627869.\n",
+ "\n",
+ "\n",
+ "Example output: How can I reduce my grocery bills while still eating healthy.Reducing grocery bills while still eating healthy is definitely possible! Here are a few tips:\n",
+ "\n",
+ "1. Plan your meals in advance: Make a grocery list or use a digital grocery list app that is searchable and has a shopping list feature. This will make it easier for you to find and purchase what you need.\n",
+ "\n",
+ "2. Buy in bulk: Consider purchasing staple foods in bulk and buying generic or store brands when possible. This helps ensure you're getting all the essential ingredients for cooking.\n",
+ "\n",
+ "3. Use spices and herbs: Experiment with spices and herbs to add flavor and aroma to your meals. For example, cinnamon, thyme, and basil can be used in place of salt or dried herbs.\n",
+ "\n",
+ "4. Cook at home: Cooking often requires an extra kitchen appliance, such as a pressure cooker or slow cooker, and being mindful of food safety can help. Set cooking times and cook times,\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 46%|████▌ | 1200/2614 [18:10<21:19, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 1200 of 2614. Loss:0.9166333079338074.\n",
+ "\n",
+ "\n",
+ "Example output: Identify which instrument is string or percussion: Monkey stick, TzourasaThe monkey stick is a string instrument from Morocco. The Tzouras, a percussion instrument, is a type of Spanish string instrument from Brazil. These two instruments are related, although they do not share any common musical features.\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 61%|██████ | 1600/2614 [24:14<15:17, 1.10it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 1600 of 2614. Loss:0.8862847089767456.\n",
+ "\n",
+ "\n",
+ "Example output: Is there a way to prevent mosquitoes from coming into my house.Preventing mosquitoes from coming into your house is possible by using natural repellents that contain DEET, picaridin, or a mosquito-specific shampoo or conditioner specifically designed to repel mosquitoes. Here are a few natural repellents that are safe for mosquitoes:\n",
+ "\n",
+ "1. Snake Plant (Sansevieria): Snake plant is a popular choice for repelling mosquitoes. As the name suggests, it possesses a strong scent that is commonly found in nature. The plant is native to the African rainforests and is highly repelled by mosquitoes.\n",
+ "\n",
+ "2. Snake Plant (Nephrolepis elegans): This perennial plant is native to the desert regions and has a strong repellent effect against mosquitoes.\n",
+ "\n",
+ "3. Spider Plant (Chlorophytum comosum): Spider plants have a long history of being used to deter insects. They can repel mosquitoes by\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 77%|███████▋ | 2000/2614 [30:21<09:16, 1.10it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 2000 of 2614. Loss:0.8744643926620483.\n",
+ "\n",
+ "\n",
+ "Example output: What is the process of applying for a mortgage loan.Applying for a mortgage loan is typically a fairly straightforward process. You will typically need to provide a valid financial information such as your income, employment history, bank account details, and credit score.\n",
+ "\n",
+ "What are the types of mortgage options available to me. Some common mortgage types include fixed-rate mortgages, adjustable-rate mortgages, adjustable-rate mortgages with adjustable monthly payments (ARMPs), or adjustable-rate mortgages with no monthly payments. It's important to consider your financial situation and goals before choosing the type of mortgage loan that suits your needs.\n",
+ "\n",
+ "I am a first-time home buyer. What are the steps involved in applying for a mortgage. The process of applying for a mortgage can be overwhelming, and it's important to consult with a mortgage professional for personalized advice and guidance.\n",
+ "\n",
+ "I have certain income restrictions, such as having to pay taxes or paying off student loan debt. Can I still apply for a\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 92%|█████████▏| 2400/2614 [36:27<03:13, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 2400 of 2614. Loss:0.7288553714752197.\n",
+ "\n",
+ "\n",
+ "Example output: What kind of species is the EpophthalmiaopteraThe Epophthalmia was a fascinating animal that lived in ancient Egypt. It is famous for its unique reproductive systems, called ovary glands. They can produce eggs and sperm, and also have their own sperm-producing cells. These cells have a unique set of DNA and protein structures. \n",
+ "\n",
+ "The ovary glands of the Epophthalmia are found in the neck, back, jaw, and upper face. The glands can cover multiple bodies and provide a range of sexual functions. The glands release small cysts of egg-laying sperm, while they give birth to live young.\n",
+ "\n",
+ "The eggs produced are brightly colored and can be seen by humans, but are invisible by insects. The eggs are laid in the mother's abdomen along with their development, usually about one week before hatching. The baby female lays one egg, usually in the back of her abdomen. The mother usually gives birth to live\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 2614/2614 [39:45<00:00, 1.10it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Average Training Loss: 0.8456670160547138.\n",
+ "\n",
+ "\n",
+ "Beginning epoch 3 of 3\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 15%|█▌ | 400/2614 [06:01<33:20, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 400 of 2614. Loss:0.6074438095092773.\n",
+ "\n",
+ "\n",
+ "Example output: How can I fix the broken router at home.Fixing a broken router at home can be a complex task, but here are a few general steps you can follow:\n",
+ "\n",
+ "1. Turn off the router: Start by shutting off the router's power supply. If it is a Wi-Fi router, unplug it from the WAN, use a power strip with a built-in fuse, or consider seeking assistance from the router's manufacturer.\n",
+ "\n",
+ "2. Use a soldering iron: Soldering a loose connection between two router components can repair some of the damage caused by the broken router. Refer to your router's user manual for detailed instructions.\n",
+ "\n",
+ "3. Check power supply: Ensure that the power supply hasn't been disconnected, as power supply issues can pose a safety concern. Turn on the router and ensure that power is provided to the appropriate circuit to prevent electrical surges.\n",
+ "\n",
+ "Remember, if you're not confident in fixing the problem yourself, it's always\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 31%|███ | 800/2614 [12:08<27:20, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 800 of 2614. Loss:0.7992244958877563.\n",
+ "\n",
+ "\n",
+ "Example output: How can I fix a blown fuse in my house.Fixing a blown fuse in a house can be a complex task, but here are some general steps you can follow to try and fix the issue:\n",
+ "\n",
+ "1. Check and replace the blown fuse: Before attempting any repairs, ensure that all of the components of the blown fuse (such as the wires, insulation, and circuit breaker) are correctly in working order. Check your electrical wiring for any obstructions and replace any damaged or weak connections.\n",
+ "\n",
+ "2. Disassemble the affected area: Begin by disassembling the blown fuse. Ensure that all the components, including the wires and the circuit breakers, are free from any loose debris and have sufficient clearance. Once you've disassembled the fuse, you can use a screwdriver to gently tap each component to ensure they are aligned properly.\n",
+ "\n",
+ "3. Inspect the area: If the blown fuse has blown out or is not coming in contact with the electrical wiring\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 46%|████▌ | 1200/2614 [18:15<21:18, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 1200 of 2614. Loss:0.6735864877700806.\n",
+ "\n",
+ "\n",
+ "Example output: What is linear regression?Linear regression is a statistical method that calculates linear trends over a period or time. It is widely used in the field of machine learning and statistics. The goal is to find the relationship between a continuous variable and a specific number. For example, if you know that the price of a car increases in a year, you can use linear regression to predict how this may affect the price of a year in the future. Linear regression allows you to compare different price ranges for a particular set of data points and calculate how they will change in the future. It provides a straightforward way to understand and predict market behavior and is widely used in various industries.\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 61%|██████ | 1600/2614 [24:21<15:17, 1.11it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 1600 of 2614. Loss:0.7734147310256958.\n",
+ "\n",
+ "\n",
+ "Example output: What are the benefits of the keto diet.The keto diet has several potential benefits for its individual and society. Some of these benefits include:\n",
+ "\n",
+ "1. Weight management: The keto diet can be a powerful and effective weight management tool. Consuming high-quality fat, which is rich in carbohydrates, fiber, and antioxidants, can help you sustain your optimal health and reduce the risk of chronic diseases.\n",
+ "\n",
+ "2. Potential benefits for brain health: Keto diets can potentially help improve brain function by reducing blood sugar levels and increasing insulin sensitivity. This can lead to improved cognitive function, reduced\n",
+ "\n",
+ "3. Reduced risk of metabolic syndrome: The keto diet may potentially be beneficial for individuals with metabolic syndrome (MetS). MetS is a cluster of health conditions that affect the production of energy in the body due to abnormalities in energy\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 77%|███████▋ | 2000/2614 [30:28<09:16, 1.10it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 2000 of 2614. Loss:0.7301379442214966.\n",
+ "\n",
+ "\n",
+ "Example output: What are the most common cooking techniques to use when preparing a meal.izing a vegetable can be a great way to preserve its flavor. Here are a few common cooking techniques to use:\n",
+ "\n",
+ "1. Steaming: Bring a pot of water to a boil and add a mix of vegetables like bell peppers, broccoli, carrots, and mushrooms to the pot. Allow the vegetables to steam for about 5-7 minutes. This allows the flavors of the vegetables to penetrate the water and intensify the resulting sauce.\n",
+ "\n",
+ "2. Boiling: Boiling is a quick cooking method where the heat is transferred solely to the vegetables. Instead of relying on steam, you can season the vegetables with garlic, ginger, salt, and pepper. This adds depth and complexity to the dish.\n",
+ "\n",
+ "3. Stir-Frying: Heat a small amount of oil in a pan. Add a variety of colorful vegetables like bell peppers, onions, mushrooms, and spinach. Stir-fry\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 92%|█████████▏| 2400/2614 [36:35<03:13, 1.10it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Batch 2400 of 2614. Loss:0.6998169422149658.\n",
+ "\n",
+ "\n",
+ "Example output: Does metaethics have any practical implications for decision making in moral dilemmas?Metaethics is an important field that explores questions about how to make ethical decisions in situations involving uncertainty. Metaethics provides perspectives on various ethical dilemmas, such as moral dilemmas, about the meaning and impact of our moral values. \n",
+ "\n",
+ "The main focus of the work is on metaethics, with a particular emphasis on decision-making problems. It aims to shed light on the nature of ethical concepts, including the nature of moral duties, the origins of moral reasoning, and the nature of objective moral standards. It explores topics such as the origin of moral values, moral rights, and the source of moral judgment.\n",
+ "\n",
+ "The research aims to contribute to our understanding of ethical decision-making by addressing real-world ethical dilemmas and guiding critical discourse. It seeks to foster a more comprehensive understanding of ethical concepts, including the study of subjective moral beliefs, moral realism,\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████| 2614/2614 [39:53<00:00, 1.09it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Average Training Loss: 0.7497366058776282.\n",
+ "\n",
+ "Training complete!\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "('/content/Aira-2-355M/tokenizer_config.json',\n",
+ " '/content/Aira-2-355M/special_tokens_map.json',\n",
+ " '/content/Aira-2-355M/vocab.json',\n",
+ " '/content/Aira-2-355M/merges.txt',\n",
+ " '/content/Aira-2-355M/added_tokens.json')"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from codecarbon import EmissionsTracker\n",
+ "import tqdm\n",
+ "import os\n",
+ "\n",
+ "output_dir = f'/content/{project}'\n",
+ "\n",
+ "tracker = EmissionsTracker(\n",
+ " project_name=\"Aira_emissions\",\n",
+ " log_level=\"critical\",\n",
+ " output_dir=output_dir,\n",
+ " output_file=\"Aira_emissions.csv\",\n",
+ ")\n",
+ "\n",
+ "training_stats = []\n",
+ "\n",
+ "tracker.start()\n",
+ "for epoch_i in range(0, epochs):\n",
+ "\n",
+ " print(f'\\nBeginning epoch {epoch_i + 1} of {epochs}\\n')\n",
+ "\n",
+ " total_train_loss = 0\n",
+ "\n",
+ " model.train()\n",
+ "\n",
+ " for step, batch in enumerate(tqdm.tqdm(dataloader)):\n",
+ "\n",
+ " b_input_ids = batch[0].to(device)\n",
+ " b_labels = batch[0].to(device)\n",
+ " b_masks = batch[1].to(device)\n",
+ "\n",
+ " model.zero_grad()\n",
+ "\n",
+ " outputs = model(b_input_ids,\n",
+ " labels=b_labels,\n",
+ " attention_mask = b_masks)\n",
+ "\n",
+ " loss = outputs[0]\n",
+ "\n",
+ " batch_loss = loss.item()\n",
+ " total_train_loss += batch_loss\n",
+ "\n",
+ " if step % sample_every == 0 and not step == 0:\n",
+ "\n",
+ " print(f'\\nBatch {step} of {len(dataloader)}. Loss:{batch_loss}.\\n')\n",
+ "\n",
+ " model.eval()\n",
+ "\n",
+ " inputs = tokenizer(tokenizer.bos_token + df.prompt.sample().iloc[0] + tokenizer.eos_token, return_tensors=\"pt\").to(device)\n",
+ "\n",
+ " sample_outputs = model.generate(**inputs,\n",
+ " bos_token_id=tokenizer.bos_token_id,\n",
+ " pad_token_id=tokenizer.pad_token_id,\n",
+ " eos_token_id=tokenizer.eos_token_id,\n",
+ " do_sample=True,\n",
+ " top_k=50,\n",
+ " max_length = 200,\n",
+ " top_p=0.95,\n",
+ " num_return_sequences=1)\n",
+ "\n",
+ " for i, sample_output in enumerate(sample_outputs):\n",
+ " print(f'\\nExample output: {tokenizer.decode(sample_output, skip_special_tokens=True)}\\n')\n",
+ "\n",
+ " model.train()\n",
+ "\n",
+ " loss.backward()\n",
+ "\n",
+ " optimizer.step()\n",
+ "\n",
+ " scheduler.step()\n",
+ "\n",
+ " avg_train_loss = total_train_loss / len(dataloader)\n",
+ "\n",
+ "\n",
+ " print(f'\\nAverage Training Loss: {avg_train_loss}.\\n')\n",
+ "\n",
+ "\n",
+ " training_stats.append(\n",
+ " {\n",
+ " 'epoch': epoch_i + 1,\n",
+ " 'Training Loss': avg_train_loss,\n",
+ " }\n",
+ " )\n",
+ "\n",
+ "tracker.stop()\n",
+ "print(\"Training complete!\")\n",
+ "\n",
+ "df_stats = pd.DataFrame(data=training_stats)\n",
+ "df_stats = df_stats.set_index('epoch')\n",
+ "df_stats.to_parquet(f\"{output_dir}/training_stats.parquet\", compression=\"gzip\")\n",
+ "\n",
+ "rng_state = torch.get_rng_state()\n",
+ "torch.save(rng_state, f\"{output_dir}/rng_state.pt\")\n",
+ "torch.save(scheduler.state_dict(), f\"{output_dir}/scheduler.pt\")\n",
+ "torch.save(optimizer.state_dict(), f\"{output_dir}/optimizer.pt\")\n",
+ "\n",
+ "model_to_save = model.module if hasattr(model, 'module') else model\n",
+ "model_to_save.save_pretrained(output_dir)\n",
+ "model_to_save.save_pretrained(output_dir, safe_serialization=True)\n",
+ "tokenizer.save_pretrained(output_dir)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "h48iOsqie8rx"
+ },
+ "source": [
+ "12. Check the training stats and plot the learning curves."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 464
+ },
+ "id": "J1-hAY9Av4gT",
+ "outputId": "4dc74d36-0cf0-4395-c728-faaa37d60ba0"
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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4YXq3bv3QY87HA6NGzdOkvTVV1+purra/1hsbKwkqbi4uNn3O57nAABwOIQCAAAEqGHDhh21TUlJiZ588klde+21Ovnkk9WvXz9lZWUpKytLF198saR9n/gfz6fn8fHx6tKlyyEfS01N9f+5qqrqmPvu1avXYfci2N/3T2teu3atJMlut2vo0KGHfK5hGBo+fPgx13O8XC6XP7w49dRTD9vu9NNPlyR5vV7/65B+DG5eeeUVTZw4UfPnz1dZWdkR73nmmWfKMAx9/vnnGjdunD788EMVFhae4CsBAIQq9hQAACBAJSUlHfHxFStWaMKECU3elEdFRSkyMlKGYcjj8ai8vFySjuvT/CNtIHjgBoCNjY2t0rfb7W5yff9riY+P90+zP5T9SwraQmVlpX8WxpHue+CMjwPf9F922WVavXq1XnnlFc2dO9e/ZKJLly46/fTTdeWVV2rAgAFN+srJydHdd9+tJ554QgsXLtTChQv99zjttNM0atQonXLKKS32GgEA7RuhAAAAAWr/uvRDcbvd+sMf/qCqqir17dtXv//975WdnS2Hw+Fvs2vXLp1//vmS9q3HR2C6//77deONN2revHlaunSpVq5c6T+1YNasWbr55pt1//33N3nOuHHjdNlll+njjz/WkiVLtGLFChUUFGj27NmaPXu2LrzwQv3f//2f7Ha7Sa8KABAsWD4AAEAQWrlypfLz82W1WvXvf/9bZ511VpNAQGp/a84TEhIkSRUVFXK5XIdt15ZT6ePi4vwzG/YfR3goBz62f2PFA3Xp0kW33nqr/vvf/+q7777TG2+8oREjRkjad0LBZ599dtBz0tLSNHbsWD3zzDP65ptv9P777/uPIfzkk0/02muvndBrAwCEBkIBAACC0N69eyXte4N5uGnrixcvbsuSWl3//v0l7VuusH8H/p/y+XxaunRpm9UUFhamrKwsSdK333572HbffPONpH2zP/a/jsOxWCwaMmSInnzySf+mifuffyRZWVl68MEH/XtRNOc5AAAQCgAAEIRiYmIk7dtosKSk5KDHCwoKjvsowkDVt29f/8aH//nPfw65JGLOnDnKz89v07r2b+j4ySefaNOmTQc9Xltbq+eff16SdNZZZ/n/7iQdccaD1Wr1T/8/8KSFIz1HkiIiIg56DgAAh0MoAABAEMrOzlZUVJR8Pp9+97vfafv27ZIkj8ejhQsX6qabbjK5wpZnGIbuuusuSdLXX3+te+65x79UwOl06q233tKf//xnxcXFtcj9ysrKjvhr/waP1113nTp37qzGxkaNHz9eX375pbxer6R9xyr+6le/Ul5ensLCwvS73/2uyT2uvvpqPfjgg/ruu+9UV1fnv15YWKipU6f6j2A866yz/I/dfvvtuvfee/Xll1822WSyoqJCzz77rH+GyP6TDQAAOBI2GgQAIAjFxMToT3/6k/7yl79oyZIlGjlypKKiouTxeOR0OpWQkKBp06bptttuM7vUFnXZZZdpzZo1mjFjhubMmaP3339fsbGxqqurU2Njo0455RQNHjxY//73v494QkFzHOmIQUnq06eP5syZI4fDoX/9618aN26cCgoKNGHCBIWHh8tut6umpkbSvmUG//jHP9SnT58mfVRXV2vmzJmaOXOmDMNQTEyM3G53k4Bg7Nix+tnPfub/2ul0+jcUlOTfS2L/vSTpwgsv9O8vAADAkRAKAAAQpK677jqlp6fr+eefV25urjwej9LS0nTWWWdp/Pjxx3VUYDC47777NHz4cL388stat26dXC6XunfvrlGjRmnMmDF65JFHJEmxsbFtVlPv3r01d+5czZgxQ/Pnz9fOnTvlcrmUmZmp0047Tb/61a+UmZl50PMee+wxff3111q6dKny8vJUUlIit9utTp06afDgwbrmmmsOCiceeOABffXVV1qyZIl27typ4uJiuVwupaamasCAAbr88st1wQUXtNVLBwAEOcPHGUUAAKAd+cUvfqEVK1boN7/5je644w6zywEAIKCxpwAAAGg3vv/+e//JBAdOuQcAAIdGKAAAAILKX//6V82ePVvFxcX+Ewiqqqr0+uuv6/bbb5cknXLKKRo0aJCZZQIAEBRYPgAAAILKqFGjtGHDBkn7NvCLjIxUVVWVPyDo2bOnXnzxRaWlpZlZJgAAQYFQAAAABJXPPvtM8+fP1+rVq1VSUqKamho5HA717NlT559/vq699lpFRkaaXSYAAEGBUAAAAAAAgBDFngIAAAAAAIQoQgEAAAAAAEKUzewCQoHP55PXGxyrNCwWI2hqBQC0f4xLAIBAEwxjk8ViyDCMZrUlFGgDXq9PZWW1ZpdxVDabRQkJ0aqqqpPb7TW7HABAiGNcAgAEmmAZmxITo2W1Ni8UYPkAAAAAAAAh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",
+ "text/plain": [
+ "