File size: 68,811 Bytes
3916521 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 |
{
"cells": [
{
"cell_type": "markdown",
"id": "b3fc8862-0c2b-45f3-badf-e591c7b8f891",
"metadata": {},
"source": [
"# Token Count Exploration\n",
"It would be really useful for deployment to know our input/output expectations. We know that our output is quite verbose relative to the input since the explanations are long. With a model like `mistralai/Mistral-7B-Instruct-v0.3` Id expect that our real output with explanations will be shorter. Thats perfect since our training data will give us a reliable upper bound, which is great to prevent truncation.\n",
"\n",
"Lets figure out how to split input and output tokens, and then we can build a histogram."
]
},
{
"cell_type": "markdown",
"id": "3a501f2f-ba98-4c0f-aa30-f4768bd80dcb",
"metadata": {},
"source": [
"## Config"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "5d0bd22f-293e-4c15-9dfe-8070553f42b5",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"INPUT_DATASET = 'derek-thomas/labeled-multiple-choice-explained-mistral-tokenized'\n",
"BASE_MODEL = 'mistralai/Mistral-7B-Instruct-v0.3'"
]
},
{
"cell_type": "markdown",
"id": "c1c3b00c-17bf-4b00-9ee7-d10c598c53e9",
"metadata": {},
"source": [
"## Setup"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "af2330f3-403c-401c-8028-46ae4971546e",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "d675da3076694064ba0c69ed97f938f8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HTML(value='<center> <img\\nsrc=https://huggingface.co/front/assets/huggingface_logo-noborder.sv…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from huggingface_hub import login, get_token\n",
"login()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "a9e2d29c-1f8e-4a70-839f-f61ae396d6f6",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "dd06a12730fa4af1b863273c333c6a4c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"README.md: 0%| | 0.00/1.18k [00:00<?, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0ab7651927dc407f83c819dffc2c6cf1",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"train-00000-of-00001.parquet: 0%| | 0.00/40.5M [00:00<?, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "93eec90b188d4b4b862cba87fbc65f26",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"test-00000-of-00001.parquet: 0%| | 0.00/10.1M [00:00<?, ?B/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "21a9ed213b2c4da49f6171206102499d",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Generating train split: 0%| | 0/6730 [00:00<?, ? examples/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "52a994708c2a466f8ed72a2fd881aa77",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Generating test split: 0%| | 0/1683 [00:00<?, ? examples/s]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from transformers import AutoTokenizer\n",
"from datasets import load_dataset\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL, token=get_token())\n",
"\n",
"dataset = load_dataset(INPUT_DATASET, split='train')\n",
"df = dataset.to_pandas()"
]
},
{
"cell_type": "markdown",
"id": "f3a644bf-b532-4f30-bd6b-c637dfde5fb2",
"metadata": {},
"source": [
"## Exploration"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "bf5b3e0c-2b7f-42f3-852d-7039c530ed86",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'<s>[INST] Answer the Question and include your Reasoning and the Final Answer in a json like: {\"Reasoning: \"...\", \"Final Answer\": \"x\"} where x is a letter that corresponds to the answer choice which is a letter between a and h.\\nQuestion: What can genetic material have?\\nAnswer Choices: (a) Resistance (b) Mutations (c) Clorophyll (d) Nucleotide (e) Symmetry (f) Allow growth (g) Contamination (h) Warmth[/INST] {\\'Reasoning\\': \\'a) Resistance: Genetic material can carry genes that provide resistance to certain diseases or environmental factors, but this is not a characteristic of genetic material itself. Therefore, this option is incorrect.\\\\n\\\\nc) Chlorophyll: Chlorophyll is a pigment found in plants that is responsible for photosynthesis. It is not a characteristic of genetic material. Therefore, this option is incorrect.\\\\n\\\\nd) Nucleotide: Nucleotides are the building blocks of DNA and RNA, which are types of genetic material. However, this option is too broad and does not fully answer the question. Therefore, this option is incorrect.\\\\n\\\\ne) Symmetry: Symmetry is a characteristic of physical objects and organisms, but it is not a characteristic of genetic material. Therefore, this option is incorrect.\\\\n\\\\nf) Allow growth: Genetic material provides the instructions for the growth and development of organisms, but it is not a characteristic of genetic material itself. Therefore, this option is incorrect.\\\\n\\\\ng) Contamination: Contamination is the presence of unwanted substances or impurities, and it is not a characteristic of genetic material. Therefore, this option is incorrect.\\\\n\\\\nh) Warmth: Warmth is a physical property of objects and is not related to genetic material. Therefore, this option is incorrect.\\\\n\\\\nIn conclusion, the only option that correctly describes a characteristic of genetic material is b) mutations. Genetic material can have mutations, which are changes in the DNA sequence that can lead to genetic variation and evolution.\\', \\'Final Answer\\': \\'b\\'}</s>'"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['conversation_RFA_sg_gpt3_5'].iloc[0]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "0dc985d7-32e3-413f-8640-55829da19838",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[4]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tokenizer.encode('[/INST]', add_special_tokens=False)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "bc9b3856-7652-483c-8dbc-2b9bdc85f9d7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 3, 27075, 1040, 23246, 1072, 3792, 1342, 2066, 2180, 1056, 1072, 1040, 10990, 27075, 1065, 1032, 8379, 1505, 29515, 10598, 20569, 1056, 29515, 1113, 1869, 1316, 1113, 18268, 27075, 2032, 1113, 29512, 18163, 1738, 2086, 1117, 1032, 6266, 1137, 17303, 1066, 1040, 5140, 5550, 1458, 1117, 1032, 6266, 2212, 1032, 1072, 1063, 29491, 781, 25762, 29515, 2592, 1309, 20637, 4156, 1274, 29572, 781, 3588, 17749, 26173, 1982, 29515, 1093, 29476, 29499, 2760, 5400, 1093, 29494, 29499, 17737, 1465, 1093, 29485, 29499, 2134, 1039, 3894, 20298, 1093, 29483, 29499, 1186, 2253, 1059, 1090, 1315, 1093, 29474, 29499, 13124, 17409, 1093, 29490, 29499, 26780, 6825, 1093, 29489, 29499, 3767, 26682, 1093, 29484, 29499, 1162, 2553, 1130, 4, 12780, 20569, 1056, 2637, 1232, 29476, 29499, 2760, 5400, 29515, 7010, 11130, 4156, 1309, 7864, 24971, 1137, 3852, 13336, 1066, 3320, 19025, 1210, 13275, 9380, 29493, 1330, 1224, 1117, 1227, 1032, 18613, 1070, 20637, 4156, 4605, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 15538, 29499, 1457, 6406, 3894, 20298, 29515, 1457, 6406, 3894, 20298, 1117, 1032, 19726, 1234, 2187, 1065, 10691, 1137, 1117, 8100, 1122, 9654, 29492, 1216, 22305, 29491, 1429, 1117, 1227, 1032, 18613, 1070, 20637, 4156, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 1060, 29499, 1186, 2253, 1059, 1090, 1315, 29515, 1186, 2253, 1059, 1090, 2694, 1228, 1040, 4435, 10246, 1070, 16775, 1072, 1167, 4152, 29493, 1458, 1228, 5282, 1070, 20637, 4156, 29491, 3761, 29493, 1224, 4319, 1117, 2136, 6609, 1072, 2003, 1227, 6662, 5140, 1040, 3764, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 1253, 29499, 13124, 17409, 29515, 13124, 17409, 1117, 1032, 18613, 1070, 6045, 7465, 1072, 2938, 11589, 29493, 1330, 1146, 1117, 1227, 1032, 18613, 1070, 20637, 4156, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 24412, 29499, 26780, 6825, 29515, 7010, 11130, 4156, 6080, 1040, 12150, 1122, 1040, 6825, 1072, 4867, 1070, 2938, 11589, 29493, 1330, 1146, 1117, 1227, 1032, 18613, 1070, 20637, 4156, 4605, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 1585, 29499, 3767, 26682, 29515, 3767, 26682, 1117, 1040, 7471, 1070, 13460, 8034, 1851, 9500, 1210, 3592, 1092, 1986, 29493, 1072, 1146, 1117, 1227, 1032, 18613, 1070, 20637, 4156, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 25779, 29499, 1162, 2553, 1130, 29515, 1162, 2553, 1130, 1117, 1032, 6045, 4089, 1070, 7465, 1072, 1117, 1227, 5970, 1066, 20637, 4156, 29491, 9237, 29493, 1224, 4319, 1117, 17158, 6691, 29479, 29524, 29479, 1425, 13654, 29493, 1040, 1633, 4319, 1137, 13510, 14734, 1032, 18613, 1070, 20637, 4156, 1117, 1055, 29499, 5316, 1465, 29491, 7010, 11130, 4156, 1309, 1274, 5316, 1465, 29493, 1458, 1228, 5203, 1065, 1040, 16775, 8536, 1137, 1309, 2504, 1066, 20637, 19191, 1072, 10963, 13775, 1232, 18268, 27075, 2637, 1232, 29494, 15259, 2]\n"
]
},
{
"data": {
"text/plain": [
"[4]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(tokenizer.encode(df['conversation_RFA_sg_gpt3_5'].iloc[0], add_special_tokens=False))\n",
"tokenizer.encode('[/INST]', add_special_tokens=False)"
]
},
{
"cell_type": "markdown",
"id": "677e792e-a85f-448c-ab36-ed0aec84ca8e",
"metadata": {},
"source": [
"Great, we can see that there is a special token `[/INST]` that we will want to split on. We can count the tokens before and including `[/INST]` and that should be our input tokens, and the tokens after will be our output tokens.\n",
"\n",
"Lets count those for each row in `conversation_RFA` and build a histogram of the results. `conversation_RFA` should be a good max since its just a reshuffle or superset of the other columns."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "3c8cd920-4d58-4b1d-b172-098c35dcdfbf",
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"from datasets import load_dataset\n",
"from transformers import AutoTokenizer\n",
"\n",
"# Load the dataset and convert it to a DataFrame\n",
"dataset = load_dataset(INPUT_DATASET, split='test')\n",
"df = dataset.to_pandas()\n",
"\n",
"df_token_gpt3_5 = df[['conversation_RFA_sg_gpt3_5']].copy()\n",
"df_token_gpt3_5['tokens_gpt3_5'] = df['conversation_RFA_sg_gpt3_5'].apply(lambda x: tokenizer.encode(x))\n",
"\n",
"df_token_mistral = df[['conversation_RFA_sg_mistral']].copy()\n",
"df_token_mistral['tokens_mistral'] = df['conversation_RFA_sg_mistral'].apply(lambda x: tokenizer.encode(x))\n",
"\n",
"def split_and_measure(lst):\n",
" if 4 in lst:\n",
" index_of_4 = lst.index(4)\n",
" length_before = index_of_4 + 1 # Including 4\n",
" length_after = len(lst) - length_before\n",
" return length_before, length_after\n",
" else:\n",
" return None, len(lst) # If 4 is not present\n",
"\n",
"df_token_gpt3_5[['input_tokens', 'output_tokens']] = df_token_gpt3_5['tokens_gpt3_5'].apply(split_and_measure).apply(pd.Series)\n",
"df_token_mistral[['input_tokens', 'output_tokens']] = df_token_mistral['tokens_mistral'].apply(split_and_measure).apply(pd.Series)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "9b23b7a3-5448-4b2e-9253-5d1b66ef1e0a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1IAAAIjCAYAAAAJLyrXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABK9klEQVR4nO3de3zP9f//8ft7RzvYZuxAZshxDCEslJBhRBRpH0Y+9Y0ROXzK71OOfUwKEeLbp4w+DqWvQzmFYRVTyFhIaJmyg5LNyDbb6/dHF+9P74b2mm3v4Xa9XF6Xi9fz+Xy9Xo/X+/K60L3n62AxDMMQAAAAAKDIHOxdAAAAAADcbghSAAAAAGASQQoAAAAATCJIAQAAAIBJBCkAAAAAMIkgBQAAAAAmEaQAAAAAwCSCFAAAAACYRJACAAAAAJMIUgCAEmWxWDRixAh7lwEAQKkiSAEAZLFYirTs2rXL3qWaUlBQoGXLlql169by9fVVxYoVVa9ePQ0aNEh79+61d3kAgNuYk70LAADY3/vvv2+zvmzZMm3btq1Qe8OGDcuyrFv2/PPPa8GCBerVq5ciIyPl5OSk48ePa/Pmzapdu7batGlj7xIBALcpi2EYhr2LAACULyNGjNCCBQtUnH8iLBaLoqOjNX/+/FKorOjS09NVtWpV/f3vf9f//u//2vQZhqFz587J39/fTtXZx5UrV+Ti4iIHB25IAYBbxd+kAIAiuXTpksaOHaugoCC5urqqfv36euONN4oUtl599VU5ODjorbfesrZt3rxZ7du3l4eHhypWrKiIiAgdOXLEZrvBgwfL09NTP/30k3r37i1PT0/5+flp3Lhxys/Pv+kxk5OTZRiG2rZtW6jPYrHYhKjJkyfLYrEUGhcbGyuLxaIffvjB2lazZk316NFDu3btUsuWLeXm5qbQ0FDrbY9r1qxRaGioKlSooBYtWujgwYPXPaeUlBT16NFDnp6euueee7RgwQJJUlJSkjp27CgPDw8FBwdrxYoVNtufP39e48aNU2hoqDw9PeXl5aVu3brp0KFDNuN27doli8WiVatW6eWXX9Y999wjd3d3JSYmymKxaM6cOYXOd8+ePbJYLFq5cuVNf1sAAEEKAFAEhmHo0Ucf1Zw5c9S1a1fNnj1b9evX1/jx4zVmzJibbvvyyy9r4sSJWrx4sUaOHCnp91sJIyIi5Onpqddee02vvPKKjh49qnbt2tmEFknKz89XeHi4KleurDfeeEMPPfSQZs2aVWiW6c+Cg4MlSatXr9bly5eLf/LXcfLkST311FPq2bOnYmJi9Ouvv6pnz55avny5XnjhBf3tb3/TlClTdOrUKfXr108FBQWFzqlbt24KCgrSzJkzVbNmTY0YMUKxsbHq2rWrWrZsqddee00VK1bUoEGDlJycbN32+++/17p169SjRw/Nnj1b48ePV1JSkh566CGdPXu2UK3Tpk3Txo0bNW7cOE2fPl0NGjRQ27ZttXz58kJjly9frooVK6pXr14l+nsBwB3JAADgT6Kjo40//hOxbt06Q5Lx6quv2ox7/PHHDYvFYpw8edLaJsmIjo42DMMwxo4dazg4OBixsbHW/osXLxo+Pj7GM888Y7OvtLQ0w9vb26Y9KirKkGRMnTrVZux9991ntGjR4i/PY9CgQYYko1KlSsZjjz1mvPHGG8axY8cKjZs0aZJxvX8SlyxZYkgykpOTrW3BwcGGJGPPnj3Wtk8//dSQZLi5uRmnT5+2ti9evNiQZOzcubPQOU2fPt3a9uuvvxpubm6GxWIxVq1aZW3/9ttvDUnGpEmTrG1Xrlwx8vPzbepMTk42XF1dbX6nnTt3GpKM2rVrG5cvX7YZf62uP/4Wubm5RpUqVYyoqKhCvwMAoDBmpAAAf2nTpk1ydHTU888/b9M+duxYGYahzZs327QbhqERI0Zo7ty5+s9//qOoqChr37Zt23ThwgUNGDBAP//8s3VxdHRU69attXPnzkLHf+6552zW27dvr++///4v616yZInmz5+vWrVqae3atRo3bpwaNmyoTp066aeffjLzE9gICQlRWFiYdb1169aSpI4dO6pGjRqF2q9X69///nfrn318fFS/fn15eHioX79+1vb69evLx8fHZntXV1frM075+fn65Zdf5Onpqfr16+vrr78udJyoqCi5ubnZtPXr108VKlSwmZX69NNP9fPPP+tvf/tb0X4EALjLEaQAAH/p9OnTqlatmipWrGjTfu0tfqdPn7ZpX7ZsmRYsWKC33npLAwYMsOk7ceKEpN9Dh5+fn82ydetWZWRk2IyvUKGC/Pz8bNoqVaqkX3/99S/rdnBwUHR0tA4cOKCff/5Z69evV7du3bRjxw49+eSTRTv56/hjWJIkb29vSVJQUNB12/9c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44039P777+uzzz5TSkqKxo0bJ0m6evWqevfurYceekiHDx9WQkKCnn32WVksFlPnYgYvmwAAAABK2IkTJ2QYhho2bHjd/oYNG+rXX3/VuXPn5O/v/5f78/PzkyRVrlxZgYGBNn0uLi5677335O7urkaNGmnq1KkaP368pk2bJgeHv543ubZvHx+fQvsuiri4OCUlJSk5Odl6e9+yZcvUqFEj7du3T/fff7917J49e9SjRw/985//1NixYyVJKSkpWrJkiVJSUlStWjVJ0rhx47RlyxYtWbJE06dPlyTl5eVp0aJFuvfeeyVJI0aM0NSpUyVJWVlZyszMVI8ePaz9N/rtSwozUgAAAEApKeqM061o2rSp3N3drethYWHKzs7WmTNnSv3YknTs2DEFBQXZPCMVEhIiHx8fHTt2zNqWkpKiRx55RBMnTrSGKElKSkpSfn6+6tWrJ09PT+sSHx+vU6dOWce5u7tbQ5IkVa1aVRkZGZIkX19fDR48WOHh4erZs6fmzp1rc9tfaSBIAQAAACWsTp06slgsNkHij44dO6ZKlSpZZ4MsFkuh0JWXl1citTg4OJTavs3w8/NTq1attHLlSmVlZVnbs7Oz5ejoqAMHDigxMdG6HDt2THPn/veV887Ozjb7+/NvtmTJEiUkJOiBBx7QBx98oHr16mnv3r2ldj4EKQAAAKCEVa5cWY888ogWLlyo3377zaYvLS1Ny5cvV//+/a3P8Pj5+dnMoJw4cUKXL1+2rru4uEiS8vPzCx3r0KFDNsfYu3evPD09rTNEf953VlaWkpOTbfbh7Ox83X0XRcOGDXXmzBmbGbCjR4/qwoULCgkJsba5ublpw4YNqlChgsLDw3Xx4kVJv79AIz8/XxkZGapTp47NYvZWw/vuu08TJkzQnj171LhxY61YsaJY51QUBCkAAACgFMyfP185OTkKDw/XZ599pjNnzmjLli165JFHdM899+hf//qXdWzHjh01f/58HTx4UPv379dzzz1nMwPj7+8vNzc3bdmyRenp6crMzLT25ebmaujQoTp69Kg2bdqkSZMmacSIEdbnozp27Kj3339fn3/+uZKSkhQVFSVHR0ebWmvWrKm4uDilpaXp119/NXWenTt3VmhoqCIjI/X111/rq6++0qBBg/TQQw+pZcuWNmM9PDy0ceNGOTk5qVu3bsrOzla9evUU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",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Plot the histograms\n",
"plt.figure(figsize=(10, 6))\n",
"\n",
"# Histogram for Input Tokens\n",
"plt.hist(df_token_gpt3_5['input_tokens'], bins=10, alpha=0.6, label='Input Tokens')\n",
"\n",
"# Histogram for Output Tokens\n",
"plt.hist(df_token_gpt3_5['output_tokens'], bins=10, alpha=0.6, label='Output Tokens')\n",
"\n",
"# Add titles and labels\n",
"plt.title(\"Token Summary\")\n",
"plt.xlabel(\"Token Count\")\n",
"plt.ylabel(\"Frequency\")\n",
"plt.legend()\n",
"\n",
"# Show the plot\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "9d81d486-bafd-454b-9a44-934ec111ad4d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Our Max Input Tokens:\t162\n",
"Our Max Output Tokens:\t572\n"
]
}
],
"source": [
"print(f\"Our Max Input Tokens:\\t{max(df_token_gpt3_5.input_tokens)}\\nOur Max Output Tokens:\\t{max(df_token_gpt3_5.output_tokens)}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e6e235c3-75f4-48dd-b0cb-d7cc42426e69",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 24,
"id": "7dea222b-a974-4ff6-9e3c-07de766b76c4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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L3RO/v7+ql69eoF72fz9/Z32z8/P1+zZs1WvXj15eHiocuXKqlKlivbu3auMjIwCtdauXbtAW0BAgHr06OF0f9qSJUt03XXXqUOHDhc9bwBA0eOx9wCAItemTRvFx8dr7ty56tu3rwIDA+1t5++neueddxQaGlpgXzc35x9Nrq6uRVJTUFCQ7r77bt19991q3769tm7dqqNHj6pmzZoXfKCHpIs+OORiNV2s3frLg0/+zv5Tp07Vc889p4cfflhTpkxRYGCgXFxcNGLEiAL3qkkqMDt23sCBA7Vy5Upt27ZN4eHh+vDDD/X444/zBEYAKGEEMgDAZdWsWVObNm3SqVOnnGbJvv32W3v7n9WtW1czZsxQ+/bt1blzZ8XGxtr7XX/99ZKk4OBgderUqYTOwFnLli21detWJScnq2bNmqpUqZIkKT09XQEBAXa/v878lQb/+c9/dMcdd+iNN95wak9PT1flypWv+DidO3dWlSpVtGTJErVq1UpnzpzRgAEDirpcAMBl8L/BAACX1bVrV+Xl5RV4t9js2bPlcDjUpUuXAvs0bdpU69at08GDB9WjRw/9/vvvkqTIyEj5+flp6tSpys3NLbDfiRMniqTmlJQUHThwoEB7Tk6OYmNj5eLiorp160r6b0j87LPP7H6nT5/WW2+9VSS1FCVXV9cCM24rV6686nvi3Nzc1K9fP7333nuKiYlReHi4mjZtWpSlAgCuADNkAIDL6tGjh+644w4988wz+vHHH3XjjTfqk08+0QcffKARI0bYgeavWrdurQ8++EBdu3bVvffeq9WrV8vPz08LFizQgAED1Lx5cz3wwAOqUqWKkpKStHbtWrVp06ZIXir9008/6ZZbblGHDh3UsWNHhYaGKi0tTcuWLdOePXs0YsQIe0bprrvuUlhYmIYMGaIxY8bI1dVVb775pl1XadK9e3dNnjxZgwcP1q233qqEhAQtWbJEderUuepjDRw4UK+++qo2b96sF198sRiqBQBcDoEMAHBZLi4u+vDDDzV+/HitWLFCixcvVq1atfTSSy9p1KhRl9y3Q4cOeu+999SnTx8NGDBAS5cu1YMPPqhq1app+vTpeumll5Sdna3rrrtO7dq10+DBg4uk5gYNGuiVV17RunXrNH/+fKWmpsrT01NNmjTR66+/riFDhth9K1SooPfff1+PP/64nnvuOYWGhmrEiBGqVKlSkdVTVP73f/9Xp0+f1tKlS7VixQo1b95ca9eu1dNPP33Vx2rRooVuuOEGHTx4UP379y+GagEAl+Ow/nrdAwAAKDeaNWumwMBAxcbGmi4FAMol7iEDAKCc2rlzp+Lj4zVw4EDTpQBAucUMGQAA5cy+ffu0a9cuzZw5U7/88ouOHDkiT09P02UBQLnEDBkAAOXMf/7zHw0ePFi5ublatmwZYQwADGKGDAAAAAAMYYYMAAAAAAwhkAEAAACAIbyHTFJ+fr6OHz+uihUryuFwmC4HAAAAgCGWZenUqVOqVq2aXFyKf/6KQCbp+PHjqlGjhukyAAAAAJQSx44dU/Xq1Yv9cwhkkipWrCjpjy/dz8/PcDUAAAAATMnMzFSNGjXsjFDcCGSSfZmin58fgQwAAABAid3KxEM9AAAAAMAQAhkAAAAAGEIgAwAAAABDuIcMAAAApZ5lWTp37pzy8vJMl4JrnKurq9zc3ErN664IZAAAACjVcnJylJycrDNnzpguBWWEt7e3qlatKnd3d9OlEMgAAABQeuXn5ysxMVGurq6qVq2a3N3dS83MBq49lmUpJydHJ06cUGJiourVq1ciL3++FAIZAAAASq2cnBzl5+erRo0a8vb2Nl0OygAvLy9VqFBBR48eVU5Ojjw9PY3Ww0M9AAAAUOqZnsVA2VKaxlPpqQQAAAAAyhkCGQAAAAAYwj1kAAAAuCaNW5VQop83rXd4iX5eaVarVi2NGDFCI0aMMF3KNY8ZMgAAAKAYDBo0SL169Srxz42JiVFAQMAl+7Rv314Oh+OiS/v27UukVjBDBgAAAJQ7q1atUk5OjiTp2LFjuuWWW7Rp0ybdcMMNklQq3s9VXjBDBgAAAJSA9u3b68knn9Q///lPBQYGKjQ0VBMnTnTq43A4tGDBAnXp0kVeXl6qU6eO/vOf/9jbt2zZIofDofT0dLstPj5eDodDP/74o7Zs2aLBgwcrIyPDnu3662dIsj8/NDRUVapUkSQFBQXZbZs3b9YNN9wgDw8P1apVSzNnzrzkuf373/9WQECAYmNjJUn79u1Tly5d5Ovrq5CQEA0YMEC//PLLFX8XlmVp4sSJCgsLk4eHh6pVq6Ynn3zyCr/pawuBDAAAACghb731lnx8fPT1119rxowZmjx5sjZu3OjU57nnnlOfPn20Z88e9e/fXw888IAOHjx4Rce/9dZb9corr8jPz0/JyclKTk7W6NGjr6rGXbt2qW/fvnrggQeUkJCgiRMn6rnnnlNMTMwF+8+YMUNPP/20PvnkE3Xs2FHp6enq0KGDmjVrpp07d2rDhg1KTU1V3759r/i7+L//+z/Nnj1bixYt0uHDh7V69WqFh5fNe/i4ZBEAAAAoIU2bNtWECRMkSfXq1dPcuXMVGxurO++80+5z33336R//+IckacqUKdq4caNee+01zZ8//7LHd3d3l7+/vxwOh0JDQwtV46xZs9SxY0c999xzkqT69evrwIEDeumllzRo0CCnvmPHjtU777yjrVu32pc7zp07V82aNdPUqVPtfm+++aZq1Kih7777TvXr17/sd5GUlKTQ0FB16tRJFSpUUFhYmG655ZZCnU9pxwwZAAAAUEKaNm3qtF61alWlpaU5tUVERBRYv9IZsqJw8OBBtWnTxqmtTZs2Onz4sPLy8uy2mTNn6vXXX9cXX3xhhzFJ2rNnjzZv3ixfX197adiwoSTphx9+sPtd6ru477779Pvvv6tOnTp65JFH9P777+vcuXNFfq6lAYEMAAAAKCEVKlRwWnc4HMrPz7/i/V1c/vj13bIsuy03N7doirtK7dq1U15ent577z2n9qysLPXo0UPx8fFOy+HDh3XbbbfZ/S71XdSoUUOHDh3S/Pnz5eXlpccff1y33XabsXMtTgQyAAAAoBT56quvCqw3atRIkuwHcCQnJ9vb4+Pjnfq7u7s7zWRdrUaNGunLL790avvyyy9Vv359ubq62m233HKL1q9fr6lTp+rll1+225s3b679+/erVq1aqlu3rtPi4+NzxXV4eXmpR48eevXVV7VlyxbFxcUpIaFk3z1XEriH7Br015cg8pJCAACAsmPlypVq2bKl2rZtqyVLlmj79u164403JEl169ZVjRo1NHHiRL3wwgv67rvvCjwBsVatWsrKylJsbKxuvPFGeXt7y9vb+4o/f9SoUbr55ps1ZcoU3X///YqLi9PcuXMveA/brbfeqnXr1qlLly5yc3PTiBEjFB0drddff139+vWzn6L4/fffa/ny5fr3v//tFOouJiYmRnl5eWrVqpW8vb317rvvysvLSzVr1rzi87hWEMgAAABwTSqr/1N60qRJWr58uR5//HFVrVpVy5YtU+PGjSX9cZnfsmXLNHToUDVt2lQ3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AwcO1PHjx52OUWJjwwJKQGRkpLV48WJr3759Vnx8vNW1a1crLCzMysrKsvs89thjVo0aNazY2Fhr586dVuvWra1bb73V3n7u3DmrSZMmVqdOnazdu3db69atsypXrmyNGzfOxCmhiG3fvt2qVauW1bRpU2v48OF2O+OifDp58qRVs2ZNa9CgQdbXX39tHTlyxPr444+t77//3u4zffp0y9/f31q9erW1Z88e6+6777Zq165t/f7773afzp07WzfeeKP11VdfWZ9//rlVt25dq1+/fiZOCUXkhRdesIKCgqw1a9ZYiYmJ1sqVKy1fX19rzpw5dh/GRvmxbt0665lnnrFWrVplSbLef/99p+1FMRYyMjKskJAQq3///ta+ffusZcuWWV5eXtaiRYtK6jRRCJcaG+np6VanTp2sFStWWN9++60VFxdn3XLLLVaLFi2cjlFSY4NABiPS0tIsSdbWrVsty/rjH0aFChWslStX2n0OHjxoSbLi4uIsy/rjH5aLi4uVkpJi91mwYIHl5+dnZWdnl+wJoEidOnXKqlevnrVx40br9ttvtwMZ46L8Gjt2rNW2bduLbs/Pz7dCQ0Otl156yW5LT0+3PDw8rGXLllmWZVkHDhywJFk7duyw+6xfv95yOBzWzz//XHzFo1h169bNevjhh53aevfubfXv39+yLMZGefbXX7qLaizMnz/fqlSpktPPlLFjx1oNGjQo5jNCUblQWP+r7du3W5Kso0ePWpZVsmODSxZhREZGhiQpMDBQkrRr1y7l5uaqU6dOdp+GDRsqLCxMcXFxkqS4uDiFh4c7vfA7MjJSmZmZ2r9/fwlWj6IWHR2tbt26Of39S4yL8uzDDz9Uy5Ytdd999yk4OFjNmjXT66+/bm9PTExUSkqK09jw9/dXq1atnMZGQECAWrZsaffp1KmTXFxc9PXXX5fcyaBI3XrrrYqNjdV3330nSdqzZ4+++OILdenSRRJjA/9VVGMhLi5Ot912m9zd3e0+kZGROnTokH777bcSOhsUt4yMDDkcDgUEBEgq2bHhVjSnAFy5/Px8jRgxQm3atFGTJk0kSSkpKXJ3d7f/EZwXEhKilJQUu8+ff+k+v/38Nlybli9frm+++UY7duwosI1xUX4dOXJECxYs0MiRI/W///u/2rFjh5588km5u7srKirK/ru90N/9n8dGcHCw03Y3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qlKliqQ/gtbTTz+tqKgo1alTR3feeaemTJmiRYsWOe0/aNAg9evXT3Xr1tXUqVOVlZVlB52/Oh8GGzZseMnaly5dqrNnz+rtt99WkyZN1KFDB82dO1fvvPOOUlNTr+p76Nq1qx5//HHVrVtXY8eOVeXKlbV582ZJss81KChIoaGhCgwMvKpjAwBKL+4hAwAYk5mZqePHj6tNmzZO7W3atNGePXuc2vr166fq1avr008/lZeXl92+Z88effnll04zYnl5eTp79qzOnDkjb29vSVLTpk3t7T4+PvLz81NaWtoF67Is64rqP3jwoG688Ub5+Pg41Z6fn69Dhw4pJCTkio7z1/rOX9J5sfoAAGUHM2QAgGtC165dtXfvXsXFxTm1Z2VladKkSYqPj7eXhIQEHT58WJ6enna/ChUqOO3ncDiUn59/wc+qX7++JOnbb7/923W7uLgUCHi5ubkF+l1NfQCAsoNABgAwxs/PT9WqVdOXX37p1P7ll1+qcePGTm1Dhw7V9OnTdffddzs94bB58+Y6dOiQ6tatW2C50P1fV+Kmm25S48aNNXPmzAuGovT0dElSo0aNtGfPHp0+fdqpdhcXFzVo0EDSH5cb/vkpk3l5edq3b99V1ePu7m7vCwAoWwhkAACjxowZoxdffFErVqzQoUOH9PTTTys+Pl7Dhw8v0PeJJ57Q888/r+7du+uLL76QJI0fP15vv/22Jk2apP379+vgwYNavny5nn322ULX5HA4tHjxYn333Xdq166d1q1bpyNHjmjv3r164YUX1LNnT0lS//795enpqaioKO3bt0+bN2/WE088oQEDBtiXK3bo0EFr167V2rVr9e2332ro0KF2oLtSwcHB8vLy0oYNG5SamqqMjIxCnxsAoHQhkAEAjHryySc1cuRIjRo1SuHh4dqwYYM+/PBD1atX74L9R4wYoUmTJqlr167atm2bIiMjtWbNGn3yySe6+eab1bp1a82ePVs1a9b8W3Xdcsst2rlzp+rWratHHnlEjRo10t133639+/fbDxzx9vbWxx9/rJMnT+rmm2/Wvffeq44dO2ru3Ln2cR5++GFFRUVp4MCBuv3221WnTh3dcccdV1WLm5ubXn31VS1atEjVqlWzAyEA4NrnsK70zmUAAAAAQJFihgwAAAAADCGQAQAAAIAhBDIAAAAAMIRABgAAAACGEMgAAAAAwBACGQAAAAAYQiADAAAAAEMIZAAAAABgCIEMAAAAAAwhkAEAAACAIQQyAAAAADDk/wHjukUbR19+3QAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Plot the histograms\n",
"plt.figure(figsize=(10, 6))\n",
"\n",
"# Histogram for Input Tokens\n",
"plt.hist(df_token_mistral['input_tokens'], bins=10, alpha=0.6, label='Input Tokens')\n",
"\n",
"# Histogram for Output Tokens\n",
"plt.hist(df_token_mistral['output_tokens'], bins=10, alpha=0.6, label='Output Tokens')\n",
"\n",
"# Add titles and labels\n",
"plt.title(\"Token Summary\")\n",
"plt.xlabel(\"Token Count\")\n",
"plt.ylabel(\"Frequency\")\n",
"plt.legend()\n",
"\n",
"# Show the plot\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "d6a78d92-2fc4-4354-8825-b17cba59eee4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Our Max Input Tokens:\t162\n",
"Our Max Output Tokens:\t1148\n"
]
}
],
"source": [
"print(f\"Our Max Input Tokens:\\t{max(df_token_mistral.input_tokens)}\\nOur Max Output Tokens:\\t{max(df_token_mistral.output_tokens)}\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fdfc0581-1c57-436c-8c76-9bfeab278603",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
|