File size: 69,565 Bytes
3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 3916521 725b438 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 |
{
"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-falcon-tokenized'\n",
"BASE_MODEL = 'tiiuae/Falcon3-7B-Instruct'"
]
},
{
"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": "2c216b161c3340ada0223141da2cc441",
"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": [],
"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": 4,
"id": "bf5b3e0c-2b7f-42f3-852d-7039c530ed86",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([{'content': 'Answer the Question and include your reasoning and the final answer in a json like: {\"reasoning\": <reasoning about the answer>, \"final_answer\": <letter corresponding to the answer>}.', 'role': 'system'},\n",
" {'content': 'Question: What can genetic material have?\\nAnswer Choices: (a) Resistance (b) Mutations (c) Clorophyll (d) Nucleotide (e) Symmetry (f) Allow growth (g) Contamination (h) Warmth', 'role': 'user'},\n",
" {'content': \"{'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'}\", 'role': 'assistant'}],\n",
" dtype=object)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['conversation_RFA_gpt3_5'].iloc[0]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "7c18dcbb-9dba-4154-8cb2-b678215a293a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<|system|>\n",
"Answer the Question and include your reasoning and the final answer in a json like: {\"reasoning\": <reasoning about the answer>, \"final_answer\": <letter corresponding to the answer>}.\n",
"<|user|>\n",
"Question: What can genetic material have?\n",
"Answer Choices: (a) Resistance (b) Mutations (c) Clorophyll (d) Nucleotide (e) Symmetry (f) Allow growth (g) Contamination (h) Warmth\n",
"<|assistant|>\n",
"{'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'}<|endoftext|>\n"
]
}
],
"source": [
"print(tokenizer.apply_chat_template(df['conversation_RFA_gpt3_5'].iloc[0], tokenize=False))"
]
},
{
"cell_type": "markdown",
"id": "6c6200b3-13c2-47ae-96b9-1222073c49ec",
"metadata": {},
"source": [
"Great, we can see that there is a special token `<|assistant|>` that we will want to split on. We can count the tokens before and including `<|assistant|>` 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": 6,
"id": "1f577945-aef9-451f-8dda-e2bc88fdcc74",
"metadata": {},
"outputs": [],
"source": [
"def split_and_measure(lst):\n",
" # Encode the subsequence dynamically\n",
" subsequence = tokenizer.encode('<|assistant|>', add_special_tokens=False)\n",
" \n",
" # Check if the subsequence exists in the list\n",
" for i in range(len(lst) - len(subsequence) + 1):\n",
" if lst[i:i + len(subsequence)] == subsequence:\n",
" input_length = i # Elements before the subsequence\n",
" output_length = len(lst) - input_length # Includes subsequence and everything after\n",
" return input_length, output_length\n",
" \n",
" # If the subsequence is not found\n",
" return len(lst), 0\n"
]
},
{
"cell_type": "code",
"execution_count": 7,
"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_gpt3_5']].copy()\n",
"df_token_gpt3_5['tokens_gpt3_5'] = df['conversation_RFA_gpt3_5'].apply(lambda x: tokenizer.apply_chat_template(x))\n",
"\n",
"df_token_falcon = df[['conversation_RFA_falcon']].copy()\n",
"df_token_falcon['tokens_falcon'] = df['conversation_RFA_falcon'].apply(lambda x: tokenizer.apply_chat_template(x))\n",
"\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_falcon[['input_tokens', 'output_tokens']] = df_token_falcon['tokens_falcon'].apply(split_and_measure).apply(pd.Series)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "9b23b7a3-5448-4b2e-9253-5d1b66ef1e0a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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qVGjRrrvvvv08ssv67HHHrMef//99+vZZ59Vv3799Msvv2jy5Mk3XAL9Zpo1a6YPP/xQkyZN0vTp01WpUiVNmzYt30IT17Vt21abNm1St27d5OzsrJEjR2rv3r164YUX1LlzZ2VlZalatWrq0qWL9dHEv+Ln56dZs2ZpzJgxys3NVWhoqD7++GNVqFChwNdR3CzGHx+wvEtlZGTI19dX6enp8vHxsXc5AAB7YUbq5piRgp1cvXpViYmJqlGjhsqUKWPvcoqdxWLRunXr1KtXL3uXcke71X1V0GzAO1IAAAAAYBJBCgAAAABM4h0pAAAAwEHw1k3pwYwUAAAAAJhEkAIAAAAAkwhSAAAAAGASQQoAAAAATCJIAQAAAIBJBCkAAAAAMInlzwEAAFA6fTyqZD+vx/yS/bw7yJQpU7R+/XrFx8fbu5Qiw4wUAAAAUEzOnj2rp556SpUrV5abm5uqVaumUaNG6ZdffjF1nh9++EEWi6XYgojFYtH69etv2h8TEyOLxXLL7YcffiiW2hwVQQoAAAAoBt9//71atGihU6dOadWqVTp9+rSWLFmi2NhYhYWF6cKFC/YuscD69eun5ORk6xYWFqann37api04ONjeZZYoghQAAABQDKKiouTm5qZt27bpwQcfVNWqVdW1a1ft2LFDP/30k/71r39Zx95oRsjPz08xMTGSpBo1akiSmjZtKovFovbt20uSBg8erF69emnq1Kny9/eXj4+Pnn32WWVnZ1vPU716db3xxhs2527SpImmTJli7ZekRx99VBaLxbr/Rx4eHgoKCrJubm5u8vT0tO5nZ2erd+/e8vb2lo+Pj/r27avU1NSbfjffffedatasqREjRsgwDGVlZWncuHG655575OXlpVatWmn37t3W8TExMfLz89Mnn3yi+vXry9vbW126dFFycrJ1zO7du9WyZUt5eXnJz89Pbdq00ZkzZ25aw+0iSAEAAABF7MKFC/rkk080fPhweXh42PQFBQVpwIAB+uCDD2QYRoHO9+WXX0qSduzYoeTkZK1du9baFxsbqxMnTmj37t1atWqV1q5dq6lTpxa41gMHDkiSoqOjlZycbN0vqLy8PPXs2VMXLlzQnj17tH37dn3//ffq16/fDccfPXpUbdu21RNPPKGFCxfKYrFoxIgRiouL0+rVq3X06FE99thj6tKli06dOmU9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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": 9,
"id": "9d81d486-bafd-454b-9a44-934ec111ad4d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Our Max Input Tokens:\t155\n",
"Our Max Output Tokens:\t538\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": 10,
"id": "7dea222b-a974-4ff6-9e3c-07de766b76c4",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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kJALtv+91gvNycfHRzfeeGOJa9N8fHzs3l9cXKxZs2apQYMGcnd3V40aNVSzZk3t27dPOTk5JWoNDQ0t0ebr66uePXvaXW+2dOlS3XDDDerUqdNF5w0AKBvcoh4AUObat2+vpKQkzZs3T/369ZOfn5/Zd/76qHfffVdBQUEl3uviYv+jydnZuUxq8vf31z333KN77rlHd955p7Zv366jR4+qTp06F7wph6SL3vzjYjVdrN34281L/sn7p0yZovHjx+vhhx/W5MmT5efnJycnJ40YMaLEtWeSSqyCnTdo0CCtXLlSO3bsUHh4uD7++GM98cQT3DkRACxACAMAXFadOnW0efNmnTp1ym417LvvvjP7/6p+/fqaPn267rzzTnXt2lUJCQnm+2666SZJUkBAgCIjIy2agb3WrVtr+/btSk9PV506dVS9enVJUnZ2tnx9fc1xf1/hqwj++9//6q677tLbb79t156dna0aNWpc8X66du2qmjVraunSpWrbtq3OnDmjgQMHlnW5AIAL4H93AQAuq3v37ioqKirx7K9Zs2bJZrOpW7duJd7TrFkzffLJJzp06JB69uypP/74Q5IUFRUlb29vTZkyRYWFhSXed+LEiTKpOSMjQwcPHizRXlBQoISEBDk5Oal+/fqS/i8YfvbZZ+a406dPa/HixWVSS1lydnYusbK2cuXKq77GzcXFRQMGDNAHH3yg+Ph4hYeHq1mzZmVZKgDgIlgJAwBcVs+ePXXXXXfpueee008//aRbbrlFn376qT766CONGDHCDDF/165dO3300Ufq3r277rvvPq1evVre3t5asGCBBg4cqJYtW6p///6qWbOm0tLStG7dOrVv375MHvT8888/69Zbb1WnTp3UuXNnBQUFKSsrS8uXL9fevXs1YsQIc+WoS5cuql27toYOHaoxY8bI2dlZ77zzjllXRdKjRw9NmjRJQ4YM0W233abk5GQtXbpU9erVu+p9DRo0SHPnztXWrVv1yiuvlEO1AIALIYQBAC7LyclJH3/8sSZMmKD3339fixYtUt26dfXvf/9bo0aNuuR7O3XqpA8++EB9+/bVwIEDtWzZMj344IMKDg7WtGnT9O9//1v5+fm64YYb1LFjRw0ZMqRMam7UqJFmz56tTz75RPPnz1dmZqaqVKmipk2b6q233tLQoUPNsa6urvrwww/1xBNP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fMuXL9fjjz+uZs2aqU2bNnrppZd0//33m++/7bbb9Nhjj+mBBx7Qb7/9pokTJ17wNvUX07JlS33wwQeaMGGCJk+erFq1amnSpEklbspxXocOHbRu3Tp1795dzs7OevLJJ/Xll19q7Nix6tKli/Lz81WnTh117drV/Drl5fj6+mratGkaOXKkioqKFB4erjVr1sjf3/+K51GR2Yy/fqH0OpWbmysfHx/l5OTI29vb0eUApcNKGACgEjp79qxSU1MVGhqqKlWqOLqccmez2fThhx+qd+/eji6lUrvUnysrsgHXhAEAAACAhQhhAAAAAGAhrgkDAAAAKgiuFLo+sBIGAAAAABYihAEAAACAhQhhAAAAAGAhQhgAAAAAWIgQBgAAAAAWcmgIKyoq0vjx4xUaGioPDw/ddNNNmjx5st1dYQzD0IQJE1SrVi15eHgoMjJSKSkpdvs5efKkYmJi5O3tLV9fXw0dOlR5eXlWTwcAAAAALsuht6h/5ZVXtGDBAi1evFg333yzdu/erSFDhsjHx0dPPfWUJGn69OmaO3euFi9erNDQUI0fP15RUVE6ePCg+XTrmJgYpaena9OmTSosLNSQIUP06KOPatmyZY6cHgAAAMrTmuHWHq/nHGuPV4m88MILWr16tZKSkhxdSoXg0JWwHTt2qFevXoqOjlbdunV13333qUuXLtq1a5ekP1fBZs+ereeff169evVSs2bNtGTJEh0/flyrV6+WJB06dEgbNmzQf/7zH7Vt21YdOnTQa6+9phUrVuj48eMOnB0AAACud8eOHdPDDz+s4OBgubm5qU6dOho+fLh+++23q9rPTz/9JJvNVm4hxmazmb9fX0h8fLxsNtslt59++qlcaquMHBrCbrvtNiUkJOj777+XJO3du1dffPGFunXrJklKTU1VRkaGIiMjzff4+Piobdu2SkxMlCQlJibK19dXrVu3NsdERkbKyclJO3fuvOBx8/PzlZuba7cBAAAAZenIkSNq3bq1UlJStHz5cv3www9auHChEhISFBERoZMnTzq6xCv2wAMPKD093dwiIiL0yCOP2LWFhIQ4usxrhkND2LPPPqv+/furcePGcnV1VYsWLTRixAjFxMRIkjIyMiRJgYGBdu8LDAw0+zIyMhQQEGDX7+LiIj8/P3PM302dOlU+Pj7mxh8YAAAAlLW4uDi5ubnp008/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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_falcon['input_tokens'], bins=10, alpha=0.6, label='Input Tokens')\n",
"\n",
"# Histogram for Output Tokens\n",
"plt.hist(df_token_falcon['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": 11,
"id": "d6a78d92-2fc4-4354-8825-b17cba59eee4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Our Max Input Tokens:\t155\n",
"Our Max Output Tokens:\t1535\n"
]
}
],
"source": [
"print(f\"Our Max Input Tokens:\\t{max(df_token_falcon.input_tokens)}\\nOur Max Output Tokens:\\t{max(df_token_falcon.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.11"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
|