├── .gitignore ├── Llama-2 ├── Part 1 │ └── BabyLLaMA.ipynb ├── Part 2 │ └── BabyLLaMA.ipynb └── Part 3 │ └── BabyLLaMA.ipynb ├── Llama-3 ├── Part 1 │ └── Downcycling.ipynb └── Part 2 │ ├── Config │ └── train-llama-3-6B.yml │ ├── Downcycling_Comparision.ipynb │ ├── FineWeb10B.ipynb │ └── assets │ ├── Comparision_of_Model_Scores.png │ ├── Experiment Canvas.png │ ├── Llama-3-8B-vs-6B-v0.png │ ├── Training Loss.png │ ├── downcycling.png │ ├── llama-3-6B icon.jpeg │ ├── model_scores.png │ └── model_scores_llama_3_8B.png └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /Llama-2/Part 1/BabyLLaMA.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\n", 8 | " \"Open\n", 9 | "" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": { 15 | "id": "n4oOcpvm2Bt6" 16 | }, 17 | "source": [ 18 | " # BabyLLaMA\n", 19 | "\n", 20 | "Coding the LLaMA-2 research paper from scratch to create models with sizes 100M, 250M and 500M params." 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": { 26 | "id": "NrmuruVN5_2F" 27 | }, 28 | "source": [ 29 | "## Model Arch\n", 30 | "\n", 31 | "Decoder only: Composed of identical `n_layers`. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple position-wise fully connected FFN. We employ residual connection around each of the sub-layers, followed by layers normalizatin. That is:\n", 32 | "LayerNorm(x + Sublayer(x))\n", 33 | " -- A Vaswani et al., 2017." 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": { 40 | "id": "bZjKLwgz6os2" 41 | }, 42 | "outputs": [], 43 | "source": [ 44 | "import torch\n", 45 | "from torch import nn\n", 46 | "import torch.nn.functional as F\n", 47 | "from math import sqrt" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": { 54 | "id": "xf2Oy7eGLr8f" 55 | }, 56 | "outputs": [], 57 | "source": [ 58 | "n_layers = 6 # 22 Tiny LLaMA\n", 59 | "n_heads = 6 # 32 Tiny LLaMA\n", 60 | "d_model = 768 # 2048 Tiny LLaMA\n", 61 | "intermediate_dim = d_model * 4" 62 | ] 63 | }, 64 | { 65 | "cell_type": "markdown", 66 | "metadata": { 67 | "id": "tmh9Ms0WKW6B" 68 | }, 69 | "source": [ 70 | "### MHA\n", 71 | "" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": null, 77 | "metadata": { 78 | "id": "yR6sUtOaUZ-r" 79 | }, 80 | "outputs": [], 81 | "source": [ 82 | "# Generate random input data\n", 83 | "sequence_length = 10 # number of tokens\n", 84 | "batch_size = 5\n", 85 | "input_data = torch.rand((batch_size, sequence_length, d_model)) # [bs, sequence_length, d_model]" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "metadata": { 92 | "colab": { 93 | "base_uri": "https://localhost:8080/" 94 | }, 95 | "id": "Q0P9tmSWVMrz", 96 | "outputId": "debef009-d3d9-41dd-b7bc-dd1a644b15f0" 97 | }, 98 | "outputs": [ 99 | { 100 | "data": { 101 | "text/plain": [ 102 | "torch.Size([5, 10, 768])" 103 | ] 104 | }, 105 | "execution_count": 99, 106 | "metadata": {}, 107 | "output_type": "execute_result" 108 | } 109 | ], 110 | "source": [ 111 | "input_data.shape" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": { 117 | "id": "X6fJhFVGZQDG" 118 | }, 119 | "source": [ 120 | "- MQA\n", 121 | "- GQA" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": null, 127 | "metadata": { 128 | "id": "L6BA3bdJJTVu" 129 | }, 130 | "outputs": [], 131 | "source": [ 132 | "class AttentionHead(nn.Module):\n", 133 | " def __init__(self, embed_dim, hidden_dim):\n", 134 | " super(AttentionHead, self).__init__()\n", 135 | " self.q = nn.Linear(embed_dim, hidden_dim)\n", 136 | " self.k = nn.Linear(embed_dim, hidden_dim)\n", 137 | " self.v = nn.Linear(embed_dim, hidden_dim)\n", 138 | "\n", 139 | " def scaled_dot_product_attention(self, q, k, v, mask = None):\n", 140 | " dim_k = q.size(-1)\n", 141 | " scores = torch.bmm(q, k.transpose(1, 2)) / sqrt(dim_k) # k.T = [bs, seq_len, embed_dim] -> [bs, embed_dim, seq_len]\n", 142 | " if mask is not None:\n", 143 | " scores = torch.masked_fill(scores, mask == 0, -torch.inf)\n", 144 | " weights = F.softmax(scores, dim=-1)\n", 145 | " return torch.bmm(weights, v)\n", 146 | "\n", 147 | " def forward(self, hidden_state, mask=None):\n", 148 | " output = self.scaled_dot_product_attention(\n", 149 | " self.q(hidden_state), self.k(hidden_state), self.v(hidden_state), mask=mask\n", 150 | " )\n", 151 | " return output" 152 | ] 153 | }, 154 | { 155 | "cell_type": "code", 156 | "execution_count": null, 157 | "metadata": { 158 | "colab": { 159 | "base_uri": "https://localhost:8080/" 160 | }, 161 | "id": "yR7l4QQIW_1S", 162 | "outputId": "7ebd7dd2-bff2-4167-d5a5-6a53c85e0d72" 163 | }, 164 | "outputs": [ 165 | { 166 | "data": { 167 | "text/plain": [ 168 | "torch.Size([5, 10, 128])" 169 | ] 170 | }, 171 | "execution_count": 8, 172 | "metadata": {}, 173 | "output_type": "execute_result" 174 | } 175 | ], 176 | "source": [ 177 | "attn = AttentionHead(d_model, d_model//n_heads)\n", 178 | "attn(input_data).shape" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": null, 184 | "metadata": { 185 | "id": "9D3EVPKaYXRJ" 186 | }, 187 | "outputs": [], 188 | "source": [ 189 | "class MHA(nn.Module):\n", 190 | " def __init__(self, n_heads, hidden_dim):\n", 191 | " super(MHA, self).__init__()\n", 192 | " embed_dim = hidden_dim\n", 193 | " head_dim = hidden_dim // n_heads\n", 194 | " self.heads = nn.ModuleList(\n", 195 | " [AttentionHead(embed_dim, head_dim) for _ in range(n_heads)]\n", 196 | " )\n", 197 | " self.out_proj = nn.Linear(embed_dim, embed_dim)\n", 198 | "\n", 199 | " def forward(self, hidden_state):\n", 200 | " x = torch.cat([h(hidden_state) for h in self.heads], dim=-1)\n", 201 | " return self.out_proj(x)" 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "execution_count": null, 207 | "metadata": { 208 | "colab": { 209 | "base_uri": "https://localhost:8080/" 210 | }, 211 | "id": "DmeF6UoHe_Vy", 212 | "outputId": "bd59b7a8-4e7f-41f2-82b6-79970a9e36ad" 213 | }, 214 | "outputs": [ 215 | { 216 | "data": { 217 | "text/plain": [ 218 | "torch.Size([5, 10, 768])" 219 | ] 220 | }, 221 | "execution_count": 10, 222 | "metadata": {}, 223 | "output_type": "execute_result" 224 | } 225 | ], 226 | "source": [ 227 | "mha = MHA(n_heads, d_model)\n", 228 | "mha(input_data).shape" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": null, 234 | "metadata": { 235 | "colab": { 236 | "base_uri": "https://localhost:8080/" 237 | }, 238 | "id": "jnqN13SHOMQF", 239 | "outputId": "c43aecaf-fac5-456d-a759-37df602cc6a3" 240 | }, 241 | "outputs": [ 242 | { 243 | "data": { 244 | "text/plain": [ 245 | "torch.Size([5, 10, 768])" 246 | ] 247 | }, 248 | "execution_count": 11, 249 | "metadata": {}, 250 | "output_type": "execute_result" 251 | } 252 | ], 253 | "source": [ 254 | "input_data.shape" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": null, 260 | "metadata": { 261 | "colab": { 262 | "base_uri": "https://localhost:8080/" 263 | }, 264 | "id": "xj0XTxleorjE", 265 | "outputId": "f7e134d7-513b-4e50-f036-df84ef878274" 266 | }, 267 | "outputs": [ 268 | { 269 | "data": { 270 | "text/plain": [ 271 | "MHA(\n", 272 | " (heads): ModuleList(\n", 273 | " (0-5): 6 x AttentionHead(\n", 274 | " (q): Linear(in_features=768, out_features=128, bias=True)\n", 275 | " (k): Linear(in_features=768, out_features=128, bias=True)\n", 276 | " (v): Linear(in_features=768, out_features=128, bias=True)\n", 277 | " )\n", 278 | " )\n", 279 | " (out_proj): Linear(in_features=768, out_features=768, bias=True)\n", 280 | ")" 281 | ] 282 | }, 283 | "execution_count": 12, 284 | "metadata": {}, 285 | "output_type": "execute_result" 286 | } 287 | ], 288 | "source": [ 289 | "mha" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": null, 295 | "metadata": { 296 | "id": "rQfC90HwjtgN" 297 | }, 298 | "outputs": [], 299 | "source": [ 300 | "class LLaMAMLP(nn.Module):\n", 301 | " def __init__(self, hidden_dim, intermediate_dim): # in MLP: intermediate_dim= 4 * hidden_dim\n", 302 | " super(LLaMAMLP, self).__init__()\n", 303 | " self.linear_1 = nn.Linear(hidden_dim, intermediate_dim)\n", 304 | " self.linear_2 = nn.Linear(hidden_dim, intermediate_dim) # Original: intermediate -> hidden.\n", 305 | " self.activation_fn = nn.SiLU()\n", 306 | " self.out_proj = nn.Linear(intermediate_dim, hidden_dim) # Original: dropout\n", 307 | "\n", 308 | "\n", 309 | " def forward(self, hidden_state):\n", 310 | " x_fc_1 = self.linear_1(hidden_state)\n", 311 | " x_fc_2 = self.linear_2(hidden_state)\n", 312 | " x = self.activation_fn(x_fc_1) * x_fc_2\n", 313 | " return self.out_proj(x)" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": null, 319 | "metadata": { 320 | "colab": { 321 | "base_uri": "https://localhost:8080/" 322 | }, 323 | "id": "HifM3AeAq44l", 324 | "outputId": "b7a981f1-a0e7-44a6-bf51-ee44a71d9311" 325 | }, 326 | "outputs": [ 327 | { 328 | "data": { 329 | "text/plain": [ 330 | "torch.Size([5, 10, 768])" 331 | ] 332 | }, 333 | "execution_count": 18, 334 | "metadata": {}, 335 | "output_type": "execute_result" 336 | } 337 | ], 338 | "source": [ 339 | "mlp = LLaMAMLP(d_model, intermediate_dim)\n", 340 | "mlp(input_data).shape" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": null, 346 | "metadata": { 347 | "id": "DDnXHH6bP4a3" 348 | }, 349 | "outputs": [], 350 | "source": [ 351 | "class Block(nn.Module):\n", 352 | " def __init__(self, n_heads, hidden_dim, intermediate_dim):\n", 353 | " super(Block, self).__init__()\n", 354 | " self.n_heads = n_heads\n", 355 | " self.hidden_dim = hidden_dim\n", 356 | " self.intermediate_dim = intermediate_dim\n", 357 | " self.mha = MHA(n_heads, hidden_dim=hidden_dim)\n", 358 | " self.layer_norm = nn.LayerNorm(hidden_dim)\n", 359 | " self.mlp = LLaMAMLP(hidden_dim, intermediate_dim)\n", 360 | "\n", 361 | " def forward(self, hidden_state, mask=None):\n", 362 | " x = self.mha(hidden_state)\n", 363 | " x = self.layer_norm(hidden_state) + x\n", 364 | " x_fc = self.mlp(x)\n", 365 | " x += x_fc\n", 366 | " return x\n" 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "execution_count": null, 372 | "metadata": { 373 | "colab": { 374 | "base_uri": "https://localhost:8080/" 375 | }, 376 | "id": "S5UplSTmSDpt", 377 | "outputId": "12f728e4-056d-4bdf-f1eb-f06c5982831c" 378 | }, 379 | "outputs": [ 380 | { 381 | "data": { 382 | "text/plain": [ 383 | "torch.Size([5, 10, 768])" 384 | ] 385 | }, 386 | "execution_count": 20, 387 | "metadata": {}, 388 | "output_type": "execute_result" 389 | } 390 | ], 391 | "source": [ 392 | "block = Block(n_heads, d_model, intermediate_dim)\n", 393 | "block(input_data).shape" 394 | ] 395 | }, 396 | { 397 | "cell_type": "code", 398 | "execution_count": null, 399 | "metadata": { 400 | "id": "GcngjpHCSUnh" 401 | }, 402 | "outputs": [], 403 | "source": [ 404 | "class babyLLaMA(nn.Module):\n", 405 | " def __init__(self, max_seq_len, vocab_size, n_layers, n_heads, hidden_dim, intermediate_dim):\n", 406 | " super(babyLLaMA, self).__init__()\n", 407 | " self.emb = nn.Embedding(vocab_size, hidden_dim)\n", 408 | " self.pos = nn.Embedding(max_seq_len, hidden_dim)\n", 409 | " self.blocks = nn.ModuleList(\n", 410 | " [Block(n_heads, hidden_dim, intermediate_dim) for _ in range(n_layers)]\n", 411 | " )\n", 412 | " self.out_proj = nn.Linear(hidden_dim, vocab_size)\n", 413 | "\n", 414 | " def forward(self, hidden_state):\n", 415 | " emb = self.emb(hidden_state)\n", 416 | " seq_len = hidden_state.size(1)\n", 417 | " positions = torch.arange(seq_len, dtype=torch.long).unsqueeze(0)\n", 418 | " pos = self.pos(positions)\n", 419 | " x = emb + pos\n", 420 | " for b in self.blocks:\n", 421 | " x = b(x)\n", 422 | "\n", 423 | " x = self.out_proj(x)\n", 424 | " return F.softmax(x, dim=-1)\n" 425 | ] 426 | }, 427 | { 428 | "cell_type": "code", 429 | "execution_count": null, 430 | "metadata": { 431 | "id": "HZqvBWtmVxUk" 432 | }, 433 | "outputs": [], 434 | "source": [ 435 | "llm = babyLLaMA(d_model, 32000, 22, n_heads, d_model, intermediate_dim)\n", 436 | "input_ids = torch.randint(1, 32000, (batch_size, sequence_length))" 437 | ] 438 | }, 439 | { 440 | "cell_type": "code", 441 | "execution_count": null, 442 | "metadata": { 443 | "colab": { 444 | "base_uri": "https://localhost:8080/" 445 | }, 446 | "id": "Lk9xlnKeYNuY", 447 | "outputId": "6b45abed-323a-4ea7-f105-0a9503ba1b85" 448 | }, 449 | "outputs": [ 450 | { 451 | "data": { 452 | "text/plain": [ 453 | "torch.Size([5, 10, 32000])" 454 | ] 455 | }, 456 | "execution_count": 43, 457 | "metadata": {}, 458 | "output_type": "execute_result" 459 | } 460 | ], 461 | "source": [ 462 | "llm(input_ids).shape" 463 | ] 464 | }, 465 | { 466 | "cell_type": "code", 467 | "execution_count": null, 468 | "metadata": { 469 | "colab": { 470 | "base_uri": "https://localhost:8080/" 471 | }, 472 | "id": "geZxTDtrYica", 473 | "outputId": "23823184-49d3-4140-8bc9-af08580d9f7d" 474 | }, 475 | "outputs": [ 476 | { 477 | "data": { 478 | "text/plain": [ 479 | "babyLLaMA(\n", 480 | " (emb): Embedding(32000, 768)\n", 481 | " (pos): Embedding(768, 768)\n", 482 | " (blocks): ModuleList(\n", 483 | " (0-5): 6 x Block(\n", 484 | " (mha): MHA(\n", 485 | " (heads): ModuleList(\n", 486 | " (0-5): 6 x AttentionHead(\n", 487 | " (q): Linear(in_features=768, out_features=128, bias=True)\n", 488 | " (k): Linear(in_features=768, out_features=128, bias=True)\n", 489 | " (v): Linear(in_features=768, out_features=128, bias=True)\n", 490 | " )\n", 491 | " )\n", 492 | " (out_proj): Linear(in_features=768, out_features=768, bias=True)\n", 493 | " )\n", 494 | " (layer_norm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n", 495 | " (mlp): LLaMAMLP(\n", 496 | " (linear_1): Linear(in_features=768, out_features=3072, bias=True)\n", 497 | " (linear_2): Linear(in_features=768, out_features=3072, bias=True)\n", 498 | " (activation_fn): SiLU()\n", 499 | " (out_proj): Linear(in_features=3072, out_features=768, bias=True)\n", 500 | " )\n", 501 | " )\n", 502 | " )\n", 503 | " (out_proj): Linear(in_features=768, out_features=32000, bias=True)\n", 504 | ")" 505 | ] 506 | }, 507 | "execution_count": 38, 508 | "metadata": {}, 509 | "output_type": "execute_result" 510 | } 511 | ], 512 | "source": [ 513 | "llm" 514 | ] 515 | }, 516 | { 517 | "cell_type": "code", 518 | "execution_count": null, 519 | "metadata": { 520 | "id": "3jNqAo_vYlHT" 521 | }, 522 | "outputs": [], 523 | "source": [ 524 | "def count_parameters(model):\n", 525 | " return sum(p.numel() for p in model.parameters() if p.requires_grad)" 526 | ] 527 | }, 528 | { 529 | "cell_type": "code", 530 | "execution_count": null, 531 | "metadata": { 532 | "colab": { 533 | "base_uri": "https://localhost:8080/" 534 | }, 535 | "id": "FUnuoPINY9VS", 536 | "outputId": "cd62a0e3-8f17-43cf-9f60-cb8122eb1913" 537 | }, 538 | "outputs": [ 539 | { 540 | "data": { 541 | "text/plain": [ 542 | "257645312" 543 | ] 544 | }, 545 | "execution_count": 45, 546 | "metadata": {}, 547 | "output_type": "execute_result" 548 | } 549 | ], 550 | "source": [ 551 | "count_parameters(llm)" 552 | ] 553 | }, 554 | { 555 | "cell_type": "code", 556 | "execution_count": null, 557 | "metadata": { 558 | "id": "MJSfGx2I2Io6" 559 | }, 560 | "outputs": [], 561 | "source": [] 562 | } 563 | ], 564 | "metadata": { 565 | "colab": { 566 | "provenance": [] 567 | }, 568 | "kernelspec": { 569 | "display_name": "Python 3", 570 | "name": "python3" 571 | }, 572 | "language_info": { 573 | "name": "python" 574 | } 575 | }, 576 | "nbformat": 4, 577 | "nbformat_minor": 0 578 | } 579 | -------------------------------------------------------------------------------- /Llama-2/Part 2/BabyLLaMA.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "\n", 8 | " \"Open\n", 9 | "" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": { 15 | "id": "n4oOcpvm2Bt6" 16 | }, 17 | "source": [ 18 | " # BabyLLaMA\n", 19 | "\n", 20 | "Coding the LLaMA-2 research paper from scratch to create models with sizes 100M, 250M and 500M params." 21 | ] 22 | }, 23 | { 24 | "cell_type": "markdown", 25 | "metadata": { 26 | "id": "NrmuruVN5_2F" 27 | }, 28 | "source": [ 29 | "## Model Arch\n", 30 | "\n", 31 | "Decoder only: Composed of identical `n_layers`. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple position-wise fully connected FFN. We employ residual connection around each of the sub-layers, followed by layers normalizatin. That is:\n", 32 | "LayerNorm(x + Sublayer(x))\n", 33 | " -- A Vaswani et al., 2017." 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": null, 39 | "metadata": { 40 | "id": "3jNqAo_vYlHT" 41 | }, 42 | "outputs": [], 43 | "source": [ 44 | "def count_parameters(model):\n", 45 | " return sum(p.numel() for p in model.parameters() if p.requires_grad)" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": null, 51 | "metadata": { 52 | "id": "bZjKLwgz6os2" 53 | }, 54 | "outputs": [], 55 | "source": [ 56 | "import torch\n", 57 | "from torch import nn\n", 58 | "import torch.nn.functional as F\n", 59 | "from math import sqrt" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": null, 65 | "metadata": { 66 | "id": "xf2Oy7eGLr8f" 67 | }, 68 | "outputs": [], 69 | "source": [ 70 | "n_layers = 6 # 22 Tiny LLaMA\n", 71 | "n_heads = 6 # 32 Tiny LLaMA\n", 72 | "d_model = 768 # 2048 Tiny LLaMA\n", 73 | "intermediate_dim = d_model * 4" 74 | ] 75 | }, 76 | { 77 | "cell_type": "markdown", 78 | "metadata": { 79 | "id": "tmh9Ms0WKW6B" 80 | }, 81 | "source": [ 82 | "### MHA\n", 83 | "" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": null, 89 | "metadata": { 90 | "id": "yR6sUtOaUZ-r" 91 | }, 92 | "outputs": [], 93 | "source": [ 94 | "# Generate random input data\n", 95 | "sequence_length = 10 # number of tokens\n", 96 | "batch_size = 5\n", 97 | "input_data = torch.rand((batch_size, sequence_length, d_model)) # [bs, sequence_length, d_model]" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": { 104 | "colab": { 105 | "base_uri": "https://localhost:8080/" 106 | }, 107 | "id": "Q0P9tmSWVMrz", 108 | "outputId": "debef009-d3d9-41dd-b7bc-dd1a644b15f0" 109 | }, 110 | "outputs": [ 111 | { 112 | "data": { 113 | "text/plain": [ 114 | "torch.Size([5, 10, 768])" 115 | ] 116 | }, 117 | "execution_count": 99, 118 | "metadata": {}, 119 | "output_type": "execute_result" 120 | } 121 | ], 122 | "source": [ 123 | "input_data.shape" 124 | ] 125 | }, 126 | { 127 | "cell_type": "markdown", 128 | "metadata": { 129 | "id": "X6fJhFVGZQDG" 130 | }, 131 | "source": [ 132 | "- MQA\n", 133 | "- GQA" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": null, 139 | "metadata": { 140 | "id": "L6BA3bdJJTVu" 141 | }, 142 | "outputs": [], 143 | "source": [ 144 | "class AttentionHead(nn.Module):\n", 145 | " def __init__(self, embed_dim, hidden_dim):\n", 146 | " super(AttentionHead, self).__init__()\n", 147 | " self.q = nn.Linear(embed_dim, hidden_dim)\n", 148 | " self.k = nn.Linear(embed_dim, hidden_dim)\n", 149 | " self.v = nn.Linear(embed_dim, hidden_dim)\n", 150 | "\n", 151 | " def scaled_dot_product_attention(self, q, k, v, mask = None):\n", 152 | " dim_k = q.size(-1)\n", 153 | " scores = torch.bmm(q, k.transpose(1, 2)) / sqrt(dim_k) # k.T = [bs, seq_len, embed_dim] -> [bs, embed_dim, seq_len]\n", 154 | " if mask is not None:\n", 155 | " scores = torch.masked_fill(scores, mask == 0, -torch.inf)\n", 156 | " weights = F.softmax(scores, dim=-1)\n", 157 | " return torch.bmm(weights, v)\n", 158 | "\n", 159 | " def forward(self, hidden_state, mask = None):\n", 160 | " output = self.scaled_dot_product_attention(\n", 161 | " self.q(hidden_state), self.k(hidden_state), self.v(hidden_state), mask=mask\n", 162 | " )\n", 163 | " return output" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": null, 169 | "metadata": { 170 | "colab": { 171 | "base_uri": "https://localhost:8080/" 172 | }, 173 | "id": "yR7l4QQIW_1S", 174 | "outputId": "7ebd7dd2-bff2-4167-d5a5-6a53c85e0d72" 175 | }, 176 | "outputs": [ 177 | { 178 | "data": { 179 | "text/plain": [ 180 | "torch.Size([5, 10, 128])" 181 | ] 182 | }, 183 | "execution_count": 8, 184 | "metadata": {}, 185 | "output_type": "execute_result" 186 | } 187 | ], 188 | "source": [ 189 | "attn = AttentionHead(d_model, d_model//n_heads)\n", 190 | "attn(input_data).shape" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": null, 196 | "metadata": { 197 | "id": "xdkLltN5kMlb" 198 | }, 199 | "outputs": [], 200 | "source": [] 201 | }, 202 | { 203 | "cell_type": "markdown", 204 | "metadata": { 205 | "id": "xzQ-tT98j4v4" 206 | }, 207 | "source": [ 208 | "## MHA vs GQA vs MQA\n", 209 | "![gqa.webp](data:image/webp;base64,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)" 210 | ] 211 | }, 212 | { 213 | "cell_type": "code", 214 | "execution_count": null, 215 | "metadata": { 216 | "id": "9D3EVPKaYXRJ" 217 | }, 218 | "outputs": [], 219 | "source": [ 220 | "class MultiHeadAttention(nn.Module):\n", 221 | " def __init__(self, n_heads, hidden_dim):\n", 222 | " super(MultiHeadAttention, self).__init__()\n", 223 | " embed_dim = hidden_dim\n", 224 | " head_dim = hidden_dim // n_heads\n", 225 | " self.heads = nn.ModuleList(\n", 226 | " [AttentionHead(embed_dim, head_dim) for _ in range(n_heads)]\n", 227 | " )\n", 228 | " self.out_proj = nn.Linear(embed_dim, embed_dim)\n", 229 | "\n", 230 | " def forward(self, hidden_state):\n", 231 | " x = torch.cat([h(hidden_state) for h in self.heads], dim=-1)\n", 232 | " return self.out_proj(x)\n", 233 | "\n", 234 | "\n", 235 | "class MultiQueryAttention(nn.Module):\n", 236 | " def __init__(self, n_q_heads, hidden_dim):\n", 237 | " super(MultiQueryAttention, self).__init__()\n", 238 | " head_dim = hidden_dim // n_heads\n", 239 | " self.queries = nn.ModuleList(\n", 240 | " [nn.Linear(hidden_dim, head_dim) for _ in range(n_q_heads)]\n", 241 | " )\n", 242 | " self.key = nn.Linear(hidden_dim, head_dim)\n", 243 | " self.value = nn.Linear(hidden_dim, head_dim)\n", 244 | " self.out_proj = nn.Linear(n_q_heads * head_dim, hidden_dim)\n", 245 | "\n", 246 | " def scaled_dot_product_attention(self, q, k, v, mask = None):\n", 247 | " dim_k = q.size(-1)\n", 248 | " scores = torch.bmm(q, k.transpose(1, 2)) / sqrt(dim_k) # k.T = [bs, seq_len, embed_dim] -> [bs, embed_dim, seq_len]\n", 249 | " if mask is not None:\n", 250 | " scores = torch.masked_fill(scores, mask == 0, -torch.inf)\n", 251 | " weights = F.softmax(scores, dim=-1)\n", 252 | " return torch.bmm(weights, v)\n", 253 | "\n", 254 | " def forward(self, hidden_state):\n", 255 | " k = self.key(hidden_state)\n", 256 | " v = self.value(hidden_state)\n", 257 | " x = torch.cat([\n", 258 | " self.scaled_dot_product_attention(query(hidden_state), k, v)\n", 259 | " for query in self.queries\n", 260 | " ], dim=-1)\n", 261 | " return self.out_proj(x)\n", 262 | "\n", 263 | "\n", 264 | "class GroupedQueryAttention(nn.Module):\n", 265 | " def __init__(self, n_q_heads_per_group, n_k_v_heads, hidden_dim):\n", 266 | " super(GroupedQueryAttention, self).__init__()\n", 267 | " self.n_k_v_heads = n_k_v_heads\n", 268 | " self.n_q_heads_per_group = n_q_heads_per_group\n", 269 | " self.hidden_dim = hidden_dim\n", 270 | " self.grouped = nn.ModuleList([\n", 271 | " MultiQueryAttention(\n", 272 | " n_q_heads=n_q_heads_per_group, hidden_dim=hidden_dim\n", 273 | " )\n", 274 | " for _ in range(n_k_v_heads)\n", 275 | " ])\n", 276 | " self.proj = nn.Linear(in_features=hidden_dim * n_k_v_heads,\n", 277 | " out_features=hidden_dim, bias=False)\n", 278 | "\n", 279 | " def forward(self, hidden_state, mask=None):\n", 280 | " Z_s = torch.cat([head(hidden_state) for head in self.grouped], dim=-1)\n", 281 | " Z = self.proj(Z_s)\n", 282 | " return Z" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": null, 288 | "metadata": { 289 | "colab": { 290 | "base_uri": "https://localhost:8080/" 291 | }, 292 | "id": "DmeF6UoHe_Vy", 293 | "outputId": "059a3f41-23f0-4cc0-93e2-069b634091be" 294 | }, 295 | "outputs": [ 296 | { 297 | "data": { 298 | "text/plain": [ 299 | "torch.Size([5, 10, 768])" 300 | ] 301 | }, 302 | "execution_count": 23, 303 | "metadata": {}, 304 | "output_type": "execute_result" 305 | } 306 | ], 307 | "source": [ 308 | "mha = MultiHeadAttention(n_heads, d_model)\n", 309 | "mha(input_data).shape" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": null, 315 | "metadata": { 316 | "colab": { 317 | "base_uri": "https://localhost:8080/" 318 | }, 319 | "id": "kHzHnc6QuzDx", 320 | "outputId": "3777829b-8b5a-49b4-e56f-6c6c40ace32a" 321 | }, 322 | "outputs": [ 323 | { 324 | "data": { 325 | "text/plain": [ 326 | "2362368" 327 | ] 328 | }, 329 | "execution_count": 86, 330 | "metadata": {}, 331 | "output_type": "execute_result" 332 | } 333 | ], 334 | "source": [ 335 | "count_parameters(mha)" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": null, 341 | "metadata": { 342 | "colab": { 343 | "base_uri": "https://localhost:8080/" 344 | }, 345 | "id": "UxWS1kkIkI4C", 346 | "outputId": "64757630-b346-4975-8cd6-0a1b9e346a00" 347 | }, 348 | "outputs": [ 349 | { 350 | "data": { 351 | "text/plain": [ 352 | "torch.Size([5, 10, 768])" 353 | ] 354 | }, 355 | "execution_count": 85, 356 | "metadata": {}, 357 | "output_type": "execute_result" 358 | } 359 | ], 360 | "source": [ 361 | "mqa = MultiQueryAttention(n_heads, d_model)\n", 362 | "mqa(input_data).shape" 363 | ] 364 | }, 365 | { 366 | "cell_type": "code", 367 | "execution_count": null, 368 | "metadata": { 369 | "colab": { 370 | "base_uri": "https://localhost:8080/" 371 | }, 372 | "id": "jnqN13SHOMQF", 373 | "outputId": "86d62f49-c22a-4d75-edb5-abd4ff8839c5" 374 | }, 375 | "outputs": [ 376 | { 377 | "data": { 378 | "text/plain": [ 379 | "1378048" 380 | ] 381 | }, 382 | "execution_count": 84, 383 | "metadata": {}, 384 | "output_type": "execute_result" 385 | } 386 | ], 387 | "source": [ 388 | "count_parameters(mqa)" 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": null, 394 | "metadata": { 395 | "colab": { 396 | "base_uri": "https://localhost:8080/" 397 | }, 398 | "id": "awEPrfZumBhd", 399 | "outputId": "90d9cba3-fe1c-46c1-b28e-756c7292f1b2" 400 | }, 401 | "outputs": [ 402 | { 403 | "data": { 404 | "text/plain": [ 405 | "torch.Size([5, 10, 768])" 406 | ] 407 | }, 408 | "execution_count": 103, 409 | "metadata": {}, 410 | "output_type": "execute_result" 411 | } 412 | ], 413 | "source": [ 414 | "num_q_heads = n_heads\n", 415 | "n_k_v_heads=2\n", 416 | "n_q_heads_per_group = num_q_heads // n_k_v_heads\n", 417 | "\n", 418 | "gqa = GroupedQueryAttention(n_q_heads_per_group=n_q_heads_per_group, n_k_v_heads=n_k_v_heads, hidden_dim=d_model)\n", 419 | "gqa(input_data).shape" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": null, 425 | "metadata": { 426 | "colab": { 427 | "base_uri": "https://localhost:8080/" 428 | }, 429 | "id": "7YVIJen6urJW", 430 | "outputId": "5ea7e561-8deb-4757-823c-00785dcfd9ba" 431 | }, 432 | "outputs": [ 433 | { 434 | "data": { 435 | "text/plain": [ 436 | "2755328" 437 | ] 438 | }, 439 | "execution_count": 104, 440 | "metadata": {}, 441 | "output_type": "execute_result" 442 | } 443 | ], 444 | "source": [ 445 | "count_parameters(gqa)" 446 | ] 447 | }, 448 | { 449 | "cell_type": "code", 450 | "execution_count": null, 451 | "metadata": { 452 | "colab": { 453 | "base_uri": "https://localhost:8080/" 454 | }, 455 | "id": "xj0XTxleorjE", 456 | "outputId": "f7e134d7-513b-4e50-f036-df84ef878274" 457 | }, 458 | "outputs": [ 459 | { 460 | "data": { 461 | "text/plain": [ 462 | "MHA(\n", 463 | " (heads): ModuleList(\n", 464 | " (0-5): 6 x AttentionHead(\n", 465 | " (q): Linear(in_features=768, out_features=128, bias=True)\n", 466 | " (k): Linear(in_features=768, out_features=128, bias=True)\n", 467 | " (v): Linear(in_features=768, out_features=128, bias=True)\n", 468 | " )\n", 469 | " )\n", 470 | " (out_proj): Linear(in_features=768, out_features=768, bias=True)\n", 471 | ")" 472 | ] 473 | }, 474 | "execution_count": 12, 475 | "metadata": {}, 476 | "output_type": "execute_result" 477 | } 478 | ], 479 | "source": [ 480 | "mha" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": null, 486 | "metadata": { 487 | "id": "rQfC90HwjtgN" 488 | }, 489 | "outputs": [], 490 | "source": [ 491 | "class LLaMAMLP(nn.Module):\n", 492 | " def __init__(self, hidden_dim, intermediate_dim): # in MLP: intermediate_dim= 4 * hidden_dim\n", 493 | " super(LLaMAMLP, self).__init__()\n", 494 | " self.linear_1 = nn.Linear(hidden_dim, intermediate_dim)\n", 495 | " self.linear_2 = nn.Linear(hidden_dim, intermediate_dim) # Original: intermediate -> hidden.\n", 496 | " self.activation_fn = nn.SiLU()\n", 497 | " self.out_proj = nn.Linear(intermediate_dim, hidden_dim) # Original: dropout\n", 498 | "\n", 499 | "\n", 500 | " def forward(self, hidden_state):\n", 501 | " x_fc_1 = self.linear_1(hidden_state)\n", 502 | " x_fc_2 = self.linear_2(hidden_state)\n", 503 | " x = self.activation_fn(x_fc_1) * x_fc_2\n", 504 | " return self.out_proj(x)" 505 | ] 506 | }, 507 | { 508 | "cell_type": "code", 509 | "execution_count": null, 510 | "metadata": { 511 | "colab": { 512 | "base_uri": "https://localhost:8080/" 513 | }, 514 | "id": "HifM3AeAq44l", 515 | "outputId": "f562f104-fe04-4045-d96f-bab97c8fb4f9" 516 | }, 517 | "outputs": [ 518 | { 519 | "data": { 520 | "text/plain": [ 521 | "torch.Size([5, 10, 768])" 522 | ] 523 | }, 524 | "execution_count": 51, 525 | "metadata": {}, 526 | "output_type": "execute_result" 527 | } 528 | ], 529 | "source": [ 530 | "mlp = LLaMAMLP(d_model, intermediate_dim)\n", 531 | "mlp(input_data).shape" 532 | ] 533 | }, 534 | { 535 | "cell_type": "code", 536 | "execution_count": null, 537 | "metadata": { 538 | "id": "DDnXHH6bP4a3" 539 | }, 540 | "outputs": [], 541 | "source": [ 542 | "class Block(nn.Module):\n", 543 | " def __init__(self, n_heads, n_k_v_heads, hidden_dim, intermediate_dim):\n", 544 | " super(Block, self).__init__()\n", 545 | " self.n_heads = n_heads\n", 546 | " self.hidden_dim = hidden_dim\n", 547 | " self.intermediate_dim = intermediate_dim\n", 548 | "\n", 549 | " # Self-Attention (MHA, MQA & GQA)\n", 550 | " if n_heads == n_k_v_heads:\n", 551 | " # MHA selected\n", 552 | " self.attn = MultiHeadAttention(n_heads, hidden_dim=hidden_dim)\n", 553 | " elif n_k_v_heads == 1 :\n", 554 | " # MQA selected\n", 555 | " self.attn = MultiQueryAttention(n_heads, hidden_dim=hidden_dim)\n", 556 | " elif n_heads // n_k_v_heads > 1:\n", 557 | " # GQA selected\n", 558 | " self.attn = GroupedQueryAttention(n_heads // n_k_v_heads, n_k_v_heads, hidden_dim=hidden_dim)\n", 559 | " else:\n", 560 | " # MHA selected\n", 561 | " self.attn = MultiHeadAttention(n_heads, hidden_dim=hidden_dim)\n", 562 | "\n", 563 | " self.layer_norm = nn.LayerNorm(hidden_dim)\n", 564 | " self.mlp = LLaMAMLP(hidden_dim, intermediate_dim)\n", 565 | "\n", 566 | " def forward(self, hidden_state, mask=None):\n", 567 | " x = self.attn(hidden_state)\n", 568 | " x = self.layer_norm(hidden_state) + x\n", 569 | " x_fc = self.mlp(x)\n", 570 | " x += x_fc\n", 571 | " return x\n" 572 | ] 573 | }, 574 | { 575 | "cell_type": "code", 576 | "execution_count": null, 577 | "metadata": { 578 | "colab": { 579 | "base_uri": "https://localhost:8080/" 580 | }, 581 | "id": "S5UplSTmSDpt", 582 | "outputId": "cb272aad-0958-4267-9266-f0a5ee4eb557" 583 | }, 584 | "outputs": [ 585 | { 586 | "name": "stdout", 587 | "output_type": "stream", 588 | "text": [ 589 | "GQA selected\n" 590 | ] 591 | }, 592 | { 593 | "data": { 594 | "text/plain": [ 595 | "torch.Size([5, 10, 768])" 596 | ] 597 | }, 598 | "execution_count": 112, 599 | "metadata": {}, 600 | "output_type": "execute_result" 601 | } 602 | ], 603 | "source": [ 604 | "block = Block(n_heads, n_k_v_heads, d_model, intermediate_dim)\n", 605 | "block(input_data).shape" 606 | ] 607 | }, 608 | { 609 | "cell_type": "code", 610 | "execution_count": null, 611 | "metadata": { 612 | "id": "GcngjpHCSUnh" 613 | }, 614 | "outputs": [], 615 | "source": [ 616 | "class babyLLaMA(nn.Module):\n", 617 | " def __init__(self, max_seq_len, vocab_size, n_layers, n_heads, n_k_v_heads, hidden_dim, intermediate_dim):\n", 618 | " super(babyLLaMA, self).__init__()\n", 619 | " self.emb = nn.Embedding(vocab_size, hidden_dim)\n", 620 | " self.pos = nn.Embedding(max_seq_len, hidden_dim)\n", 621 | " self.blocks = nn.ModuleList(\n", 622 | " [Block(n_heads, n_k_v_heads, hidden_dim, intermediate_dim) for _ in range(n_layers)]\n", 623 | " )\n", 624 | " self.out_proj = nn.Linear(hidden_dim, vocab_size)\n", 625 | "\n", 626 | " def forward(self, hidden_state):\n", 627 | " emb = self.emb(hidden_state)\n", 628 | " seq_len = hidden_state.size(1)\n", 629 | " positions = torch.arange(seq_len, dtype=torch.long).unsqueeze(0)\n", 630 | " pos = self.pos(positions)\n", 631 | " x = emb + pos\n", 632 | "\n", 633 | " for b in self.blocks:\n", 634 | " x = b(x)\n", 635 | "\n", 636 | " x = self.out_proj(x)\n", 637 | " return F.softmax(x, dim=-1)\n" 638 | ] 639 | }, 640 | { 641 | "cell_type": "code", 642 | "execution_count": null, 643 | "metadata": { 644 | "id": "HZqvBWtmVxUk" 645 | }, 646 | "outputs": [], 647 | "source": [ 648 | "llm = babyLLaMA(d_model, 32000, 22, n_heads, n_k_v_heads, d_model, intermediate_dim)\n", 649 | "input_ids = torch.randint(1, 32000, (batch_size, sequence_length))" 650 | ] 651 | }, 652 | { 653 | "cell_type": "code", 654 | "execution_count": null, 655 | "metadata": { 656 | "colab": { 657 | "base_uri": "https://localhost:8080/" 658 | }, 659 | "id": "Lk9xlnKeYNuY", 660 | "outputId": "c380de0c-0737-4537-a586-22a2d757a1d0" 661 | }, 662 | "outputs": [ 663 | { 664 | "data": { 665 | "text/plain": [ 666 | "torch.Size([5, 10, 32000])" 667 | ] 668 | }, 669 | "execution_count": 69, 670 | "metadata": {}, 671 | "output_type": "execute_result" 672 | } 673 | ], 674 | "source": [ 675 | "llm(input_ids).shape" 676 | ] 677 | }, 678 | { 679 | "cell_type": "code", 680 | "execution_count": null, 681 | "metadata": { 682 | "colab": { 683 | "base_uri": "https://localhost:8080/" 684 | }, 685 | "id": "geZxTDtrYica", 686 | "outputId": "13f3cc25-5ed2-453c-a787-c6e5e8a3d3f8" 687 | }, 688 | "outputs": [ 689 | { 690 | "data": { 691 | "text/plain": [ 692 | "babyLLaMA(\n", 693 | " (emb): Embedding(32000, 768)\n", 694 | " (pos): Embedding(768, 768)\n", 695 | " (blocks): ModuleList(\n", 696 | " (0-21): 22 x Block(\n", 697 | " (mqa): MultiQueryAttention(\n", 698 | " (queries): ModuleList(\n", 699 | " (0-5): 6 x Linear(in_features=768, out_features=128, bias=True)\n", 700 | " )\n", 701 | " (key): Linear(in_features=768, out_features=128, bias=True)\n", 702 | " (value): Linear(in_features=768, out_features=128, bias=True)\n", 703 | " (out_proj): Linear(in_features=768, out_features=768, bias=True)\n", 704 | " )\n", 705 | " (layer_norm): LayerNorm((768,), eps=1e-05, elementwise_affine=True)\n", 706 | " (mlp): LLaMAMLP(\n", 707 | " (linear_1): Linear(in_features=768, out_features=3072, bias=True)\n", 708 | " (linear_2): Linear(in_features=768, out_features=3072, bias=True)\n", 709 | " (activation_fn): SiLU()\n", 710 | " (out_proj): Linear(in_features=3072, out_features=768, bias=True)\n", 711 | " )\n", 712 | " )\n", 713 | " )\n", 714 | " (out_proj): Linear(in_features=768, out_features=32000, bias=True)\n", 715 | ")" 716 | ] 717 | }, 718 | "execution_count": 75, 719 | "metadata": {}, 720 | "output_type": "execute_result" 721 | } 722 | ], 723 | "source": [ 724 | "llm" 725 | ] 726 | }, 727 | { 728 | "cell_type": "code", 729 | "execution_count": null, 730 | "metadata": { 731 | "colab": { 732 | "base_uri": "https://localhost:8080/" 733 | }, 734 | "id": "FUnuoPINY9VS", 735 | "outputId": "09a464ce-0c95-4bdf-a3e3-561e51fa27a6" 736 | }, 737 | "outputs": [ 738 | { 739 | "data": { 740 | "text/plain": [ 741 | "266290432" 742 | ] 743 | }, 744 | "execution_count": 127, 745 | "metadata": {}, 746 | "output_type": "execute_result" 747 | } 748 | ], 749 | "source": [ 750 | "count_parameters(llm)" 751 | ] 752 | } 753 | ], 754 | "metadata": { 755 | "colab": { 756 | "provenance": [] 757 | }, 758 | "kernelspec": { 759 | "display_name": "Python 3", 760 | "name": "python3" 761 | }, 762 | "language_info": { 763 | "name": "python" 764 | } 765 | }, 766 | "nbformat": 4, 767 | "nbformat_minor": 0 768 | } 769 | -------------------------------------------------------------------------------- /Llama-3/Part 1/Downcycling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "! pip install transformers torch accelerate huggingface-hub huggingface-cli hf-transfer" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "def count_parameters(model):\n", 19 | " # Calculate the number of parameters in billions\n", 20 | " num_params = sum(p.numel() for p in model.parameters() if p.requires_grad) / 10**9\n", 21 | " print(f\"Model size: {num_params:.3f}B parameters\")\n", 22 | " return int(num_params)\n" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "## Load Reference Model" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": null, 35 | "metadata": {}, 36 | "outputs": [], 37 | "source": [ 38 | "from transformers import AutoModelForCausalLM, AutoConfig, AutoTokenizer\n", 39 | "import os\n", 40 | "\n", 41 | "os.environ[\"HF_HUB_ENABLE_HF_TRANSFER\"] = \"1\"\n", 42 | "\n", 43 | "# Load meta-llama/Meta-Llama-3-8B model, config and tokenizer\n", 44 | "model_name = \"meta-llama/Meta-Llama-3-8B\"\n", 45 | "model = AutoModelForCausalLM.from_pretrained(model_name)\n", 46 | "config = AutoConfig.from_pretrained(model_name)\n", 47 | "tokenizer = AutoTokenizer.from_pretrained(model_name)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "code", 52 | "execution_count": null, 53 | "metadata": {}, 54 | "outputs": [], 55 | "source": [ 56 | "count_parameters(model)" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": null, 62 | "metadata": {}, 63 | "outputs": [], 64 | "source": [ 65 | "model" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": null, 71 | "metadata": {}, 72 | "outputs": [], 73 | "source": [ 74 | "def extract_model_weights(reference_model, n_layers):\n", 75 | " params = {}\n", 76 | " current_layer = 0 # To keep track of the main layer count\n", 77 | "\n", 78 | " # Iterate over all named modules\n", 79 | " for name, module in reference_model.named_modules():\n", 80 | "\n", 81 | " # Check and store parameters\n", 82 | " if hasattr(module, 'weight') and module.weight is not None:\n", 83 | " params[name + '.weight'] = module.weight.data.clone()\n", 84 | " if hasattr(module, 'bias') and module.bias is not None:\n", 85 | " params[name + '.bias'] = module.bias.data.clone()\n", 86 | "\n", 87 | " if 'model.layers.' in name:\n", 88 | " # Check the layer index\n", 89 | " layer_index = int(name.split('.')[2]) # This splits the name and gets the third element\n", 90 | " if layer_index > current_layer:\n", 91 | " current_layer = layer_index\n", 92 | " if current_layer > n_layers-1:\n", 93 | " break # Stop after reaching the specified main layer\n", 94 | "\n", 95 | " norm_layer = model.model.norm # Adjust this path based on your model's architecture\n", 96 | " if hasattr(norm_layer, 'weight') and norm_layer.weight is not None:\n", 97 | " params['model.norm.weight'] = norm_layer.weight.data.clone()\n", 98 | " if hasattr(norm_layer, 'bias') and norm_layer.bias is not None:\n", 99 | " params['model.norm.bias'] = norm_layer.bias.data.clone()\n", 100 | "\n", 101 | " lm_head = reference_model.lm_head\n", 102 | " if hasattr(lm_head, 'weight') and lm_head.weight is not None:\n", 103 | " params[\"lm_head.weight\"] = lm_head.weight.data\n", 104 | " if hasattr(lm_head, 'bias') and lm_head.bias is not None:\n", 105 | " params[\"lm_head.bias\"] = lm_head.bias.data\n", 106 | "\n", 107 | " return params\n" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": null, 113 | "metadata": {}, 114 | "outputs": [], 115 | "source": [ 116 | "target_model_n_layers = 24\n", 117 | "pretrained_weights = extract_model_weights(model, target_model_n_layers)" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": null, 123 | "metadata": {}, 124 | "outputs": [], 125 | "source": [ 126 | "from transformers import AutoModelForCausalLM, AutoConfig\n", 127 | "config = AutoConfig.from_pretrained(model_name)\n", 128 | "config.num_hidden_layers = target_model_n_layers\n", 129 | "target_model = AutoModelForCausalLM.from_config(config)\n" 130 | ] 131 | }, 132 | { 133 | "cell_type": "code", 134 | "execution_count": null, 135 | "metadata": {}, 136 | "outputs": [], 137 | "source": [ 138 | "target_model_size = count_parameters(target_model)" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": null, 144 | "metadata": {}, 145 | "outputs": [], 146 | "source": [ 147 | "target_model.load_state_dict(pretrained_weights)\n" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": null, 153 | "metadata": {}, 154 | "outputs": [], 155 | "source": [ 156 | "inputs = tokenizer(\n", 157 | "[\n", 158 | " \"Who created Python?\"\n", 159 | "], return_tensors = \"pt\")\n", 160 | "\n", 161 | "# inputs = tokenizer.apply_chat_template(\n", 162 | "# [\n", 163 | "# # {\"content\":\"\",\"role\":\"system\"},\n", 164 | "# {\"content\":\"\"\"Given the question: Read the article and select the best\n", 165 | "# answer. Article: Can you swim? Do you like swimming? Well, how can you\n", 166 | "# learn to swim? I think the best way is to go into the water and learn.\n", 167 | "# I'm afraid you'll never learn to swim just by reading books about\n", 168 | "# Swimming or looking at others swimming. It's the same with the English\n", 169 | "# study. We must practice, practice and practice. Listening and speaking\n", 170 | "# are very important for beginners. We can listen to English programs on radio.\n", 171 | "# You may just understand a few words. It doesn't matter. Just be relaxed,\n", 172 | "# try to catch every word. Somebody may be a good listener, but he is afraid\n", 173 | "# to speak because he's afraid of making mistakes. You know we sometimes\n", 174 | "# make mistakes when we speak Chinese. Don't be afraid. We must be brave.\n", 175 | "# If you really want to learn English well, you must try to speak with\n", 176 | "# everyone as long as he knows English. When there's nobody to talk with,\n", 177 | "# you can talk to yourself in English. It's interesting and also a good\n", 178 | "# way to practice your spoken English. Remember, the more you speak, the\n", 179 | "# fewer mistakes you'll make. Reading and writing are more important for\n", 180 | "# senior school students. First we must choose the books we're interested\n", 181 | "# in. A lot of reading will improve your language sense.\n", 182 | "# This is very important. It's easier said than done. Well, let's do\n", 183 | "# more practice from now on. I'm sure you'll learn English well in this\n", 184 | "# way. ,A, B, C, D,. (10)\n", 185 | "# Question: Which is the best title for the passage?\n", 186 | "# Options:\n", 187 | "# A: How to Learn English.\n", 188 | "# B: Easier Said Than Done.\n", 189 | "# C: Listen First, Speak Second.\n", 190 | "# D: How to learn to Swim.\\n\n", 191 | "# The answer is:\"\"\",\"role\":\"user\"}\n", 192 | "# ], add_generation_prompt=True, return_tensors='pt',\n", 193 | "# )" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": null, 199 | "metadata": {}, 200 | "outputs": [], 201 | "source": [ 202 | "from transformers import TextStreamer\n", 203 | "text_streamer = TextStreamer(tokenizer)\n", 204 | "_ = target_model.generate(**inputs, streamer = text_streamer, max_new_tokens = 200)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": null, 210 | "metadata": {}, 211 | "outputs": [], 212 | "source": [ 213 | "target_model.push_to_hub(\"Llama-3-6B-Instruct-v0.1\")\n", 214 | "tokenizer.push_to_hub(\"Llama-3-6B-Instruct-v0.1\")" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": {}, 220 | "source": [ 221 | "# Downcycling by getting the first X layers and last X layers \n", 222 | "\n", 223 | "Where X is a N/2.\n", 224 | "\n", 225 | "For instance, if our target number layers is 24 then X will be 24/2 = 12." 226 | ] 227 | }, 228 | { 229 | "cell_type": "code", 230 | "execution_count": null, 231 | "metadata": {}, 232 | "outputs": [], 233 | "source": [ 234 | "target_model_n_layers = 24\n", 235 | "weights_1 = model.model.layers[:target_model_n_layers//2]\n", 236 | "weights_2 = model.model.layers[-target_model_n_layers//2:]\n", 237 | "\n", 238 | "# Assuming 'model' is your pre-existing large model\n", 239 | "# This part is conceptual, assuming the model is split into exactly 24 layers evenly.\n", 240 | "\n", 241 | "# Extract weights for the first 12 layers\n", 242 | "weights_1 = {f'model.layers.{k}': v.clone() for k, v in weights_1.state_dict().items() }\n", 243 | "\n", 244 | "# Extract weights for the last 12 layers\n", 245 | "weights_2 = {f'model.layers.{k}': v.clone() for k, v in weights_2.state_dict().items()}\n" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": null, 251 | "metadata": {}, 252 | "outputs": [], 253 | "source": [ 254 | "# Get remainder modules weights\n", 255 | "weights_1[\"model.embed_tokens.weight\"] = model.model.state_dict()['embed_tokens.weight']\n", 256 | "weights_2[\"model.norm.weight\"] = model.model.state_dict()['norm.weight']\n", 257 | "weights_2[\"lm_head.weight\"] = model.state_dict()['lm_head.weight']" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": null, 263 | "metadata": {}, 264 | "outputs": [], 265 | "source": [ 266 | "import re\n", 267 | "def update_layer_numbers(state_dict, x_size):\n", 268 | " new_state_dict = {}\n", 269 | " # Regular expression to find and manipulate the layer numbers\n", 270 | " pattern = re.compile(r'model.layers.(\\d+)')\n", 271 | "\n", 272 | " for key, value in state_dict.items():\n", 273 | " # Search for the pattern and update\n", 274 | " new_key = pattern.sub(lambda x: f\"model.layers.{int(x.group(1)) + x_size}\", key)\n", 275 | " new_state_dict[new_key] = value\n", 276 | "\n", 277 | " return new_state_dict\n", 278 | "\n", 279 | "\n", 280 | "weights_2 = update_layer_numbers(weights_2, target_model_n_layers//2)" 281 | ] 282 | }, 283 | { 284 | "cell_type": "code", 285 | "execution_count": null, 286 | "metadata": {}, 287 | "outputs": [], 288 | "source": [ 289 | "from transformers import AutoModelForCausalLM, AutoConfig\n", 290 | "config = AutoConfig.from_pretrained(model_name)\n", 291 | "config.num_hidden_layers = target_model_n_layers\n", 292 | "target_model = AutoModelForCausalLM.from_config(config)" 293 | ] 294 | }, 295 | { 296 | "cell_type": "code", 297 | "execution_count": null, 298 | "metadata": {}, 299 | "outputs": [], 300 | "source": [ 301 | "target_model.load_state_dict({**weights_1, **weights_2})" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": null, 307 | "metadata": {}, 308 | "outputs": [], 309 | "source": [ 310 | "count_parameters(target_model)" 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "execution_count": null, 316 | "metadata": {}, 317 | "outputs": [], 318 | "source": [ 319 | "inputs = tokenizer.apply_chat_template(\n", 320 | " [\n", 321 | " # {\"content\":\"\",\"role\":\"system\"},\n", 322 | " {\"content\":\"\"\"Given the question: Read the article and select the best\n", 323 | " answer. Article: Can you swim? Do you like swimming? Well, how can you\n", 324 | " learn to swim? I think the best way is to go into the water and learn.\n", 325 | " I'm afraid you'll never learn to swim just by reading books about\n", 326 | " Swimming or looking at others swimming. It's the same with the English\n", 327 | " study. We must practice, practice and practice. Listening and speaking\n", 328 | " are very important for beginners. We can listen to English programs on radio.\n", 329 | " You may just understand a few words. It doesn't matter. Just be relaxed,\n", 330 | " try to catch every word. Somebody may be a good listener, but he is afraid\n", 331 | " to speak because he's afraid of making mistakes. You know we sometimes\n", 332 | " make mistakes when we speak Chinese. Don't be afraid. We must be brave.\n", 333 | " If you really want to learn English well, you must try to speak with\n", 334 | " everyone as long as he knows English. When there's nobody to talk with,\n", 335 | " you can talk to yourself in English. It's interesting and also a good\n", 336 | " way to practice your spoken English. Remember, the more you speak, the\n", 337 | " fewer mistakes you'll make. Reading and writing are more important for\n", 338 | " senior school students. First we must choose the books we're interested\n", 339 | " in. A lot of reading will improve your language sense.\n", 340 | " This is very important. It's easier said than done. Well, let's do\n", 341 | " more practice from now on. I'm sure you'll learn English well in this\n", 342 | " way. ,A, B, C, D,. (10)\n", 343 | " Question: Which is the best title for the passage?\n", 344 | " Options:\n", 345 | " A: How to Learn English.\n", 346 | " B: Easier Said Than Done.\n", 347 | " C: Listen First, Speak Second.\n", 348 | " D: How to learn to Swim.\\n\n", 349 | " The answer is:\"\"\",\"role\":\"user\"}\n", 350 | " ], add_generation_prompt=True, return_tensors='pt',\n", 351 | ")" 352 | ] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": null, 357 | "metadata": {}, 358 | "outputs": [], 359 | "source": [ 360 | "from transformers import TextStreamer\n", 361 | "text_streamer = TextStreamer(tokenizer)\n", 362 | "_ = target_model.generate(inputs, streamer = text_streamer, max_new_tokens = 128)" 363 | ] 364 | }, 365 | { 366 | "cell_type": "code", 367 | "execution_count": null, 368 | "metadata": {}, 369 | "outputs": [], 370 | "source": [ 371 | "target_model.push_to_hub(\"Llama-3-6B-Instruct-Granite-v0.1\")\n", 372 | "tokenizer.push_to_hub(\"Llama-3-6B-Instruct-Granite-v0.1\")" 373 | ] 374 | } 375 | ], 376 | "metadata": { 377 | "kernelspec": { 378 | "display_name": "mlx_code", 379 | "language": "python", 380 | "name": "python3" 381 | }, 382 | "language_info": { 383 | "codemirror_mode": { 384 | "name": "ipython", 385 | "version": 3 386 | }, 387 | "file_extension": ".py", 388 | "mimetype": "text/x-python", 389 | "name": "python", 390 | "nbconvert_exporter": "python", 391 | "pygments_lexer": "ipython3", 392 | "version": "3.10.14" 393 | } 394 | }, 395 | "nbformat": 4, 396 | "nbformat_minor": 2 397 | } 398 | -------------------------------------------------------------------------------- /Llama-3/Part 2/Config/train-llama-3-6B.yml: -------------------------------------------------------------------------------- 1 | base_model: prince-canuma/Llama-3-6B-v0 2 | model_type: AutoModelForCausalLM 3 | tokenizer_type: AutoTokenizer 4 | 5 | load_in_8bit: false 6 | load_in_4bit: true 7 | strict: false 8 | 9 | datasets: 10 | - path: prince-canuma/fineweb-CC-MAIN-2024-10-1B-en 11 | type: completion 12 | split: train 13 | dataset_prepared_path: last_run_prepared 14 | val_set_size: 0.001 15 | output_dir: ./llama-3-6b 16 | save_safetensors: true 17 | adapter: qlora 18 | lora_model_dir: 19 | 20 | sequence_len: 8192 21 | sample_packing: false 22 | pad_to_sequence_len: false 23 | 24 | lora_r: 128 25 | lora_alpha: 128 26 | lora_dropout: 0.05 27 | lora_target_modules: 28 | lora_target_linear: true 29 | lora_fan_in_fan_out: 30 | 31 | 32 | wandb_project: llama-3-6b 33 | wandb_entity: 34 | wandb_watch: 35 | wandb_name: 36 | wandb_log_model: 37 | 38 | gradient_accumulation_steps: 8 39 | micro_batch_size: 2 40 | num_epochs: 2 41 | optimizer: paged_adamw_32bit 42 | lr_scheduler: cosine 43 | learning_rate: 2e-4 44 | 45 | train_on_inputs: false 46 | group_by_length: false 47 | bf16: auto 48 | fp16: 49 | tf32: false 50 | 51 | gradient_checkpointing: true 52 | early_stopping_patience: 53 | resume_from_checkpoint: 54 | local_rank: 55 | logging_steps: 1 56 | xformers_attention: 57 | flash_attention: true 58 | 59 | warmup_steps: 100 60 | evals_per_epoch: 4 61 | eval_table_size: 62 | save_steps: 4000 63 | debug: 64 | deepspeed: 65 | weight_decay: 0.0 66 | fsdp: 67 | fsdp_config: 68 | special_tokens: 69 | pad_token: "<|reserved_special_token_0|>" 70 | 71 | -------------------------------------------------------------------------------- /Llama-3/Part 2/Downcycling_Comparision.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "! pip install transformers torch accelerate huggingface-hub huggingface-cli hf-transfer" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "from transformers import TextStreamer\n", 19 | "\n", 20 | "def count_parameters(model):\n", 21 | " # Calculate the number of parameters in billions\n", 22 | " num_params = sum(p.numel() for p in model.parameters() if p.requires_grad) / 10**9\n", 23 | " print(f\"Model size: {num_params:.3f}B parameters\")\n", 24 | " return int(num_params)\n", 25 | "\n", 26 | "def generate(model, tokenizer, inputs, max_new_tokens=50):\n", 27 | " text_streamer = TextStreamer(tokenizer)\n", 28 | " _ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = max_new_tokens)" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "" 36 | ] 37 | }, 38 | { 39 | "cell_type": "markdown", 40 | "metadata": {}, 41 | "source": [ 42 | "## Load Untrained Downcycled Model" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": null, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "from transformers import AutoModelForCausalLM, AutoTokenizer\n", 52 | "import os\n", 53 | "\n", 54 | "os.environ[\"HF_HUB_ENABLE_HF_TRANSFER\"] = \"1\"\n", 55 | "\n", 56 | "# Load model, config and tokenizer\n", 57 | "model_name = \"prince-canuma/Llama-3-6B-v0\"\n", 58 | "untrained_model = AutoModelForCausalLM.from_pretrained(model_name)\n", 59 | "tokenizer = AutoTokenizer.from_pretrained(model_name)" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": {}, 65 | "source": [ 66 | "## Load Pretrained Downcycled Model" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": null, 72 | "metadata": {}, 73 | "outputs": [], 74 | "source": [ 75 | "from transformers import AutoModelForCausalLM, AutoTokenizer\n", 76 | "\n", 77 | "\n", 78 | "# Load model, config and tokenizer\n", 79 | "model_name = \"prince-canuma/Llama-3-6B-v0.1\"\n", 80 | "model = AutoModelForCausalLM.from_pretrained(model_name)\n", 81 | "tokenizer = AutoTokenizer.from_pretrained(model_name)" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": null, 87 | "metadata": {}, 88 | "outputs": [], 89 | "source": [ 90 | "count_parameters(model)" 91 | ] 92 | }, 93 | { 94 | "cell_type": "code", 95 | "execution_count": null, 96 | "metadata": {}, 97 | "outputs": [], 98 | "source": [ 99 | "inputs = tokenizer(\n", 100 | "[\n", 101 | " \"The Eifel tower is located in\"\n", 102 | "], return_tensors = \"pt\")\n" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": null, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [ 111 | "generate(untrained_model, tokenizer, inputs)" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": null, 117 | "metadata": {}, 118 | "outputs": [], 119 | "source": [ 120 | "generate(model, tokenizer, inputs)" 121 | ] 122 | } 123 | ], 124 | "metadata": { 125 | "kernelspec": { 126 | "display_name": "mlx_code", 127 | "language": "python", 128 | "name": "python3" 129 | }, 130 | "language_info": { 131 | "codemirror_mode": { 132 | "name": "ipython", 133 | "version": 3 134 | }, 135 | "file_extension": ".py", 136 | "mimetype": "text/x-python", 137 | "name": "python", 138 | "nbconvert_exporter": "python", 139 | "pygments_lexer": "ipython3", 140 | "version": "3.10.14" 141 | } 142 | }, 143 | "nbformat": 4, 144 | "nbformat_minor": 2 145 | } 146 | -------------------------------------------------------------------------------- /Llama-3/Part 2/FineWeb10B.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "colab": { 8 | "base_uri": "https://localhost:8080/" 9 | }, 10 | "id": "KDeqo4iUPPK_", 11 | "outputId": "0726a097-ea22-481d-c5ce-7f330576053e" 12 | }, 13 | "outputs": [], 14 | "source": [ 15 | "!pip install datasets huggingface-hub[cli] hf-transfer pyarrow" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": null, 21 | "metadata": { 22 | "colab": { 23 | "base_uri": "https://localhost:8080/", 24 | "height": 205, 25 | "referenced_widgets": [ 26 | "3b6f554968d54e70a8e9ece4763fa612", 27 | "22b34f9b327746dd93ebe6538482ffdc", 28 | "0b69c40ac70542d7809ae6240c6ea8d3", 29 | "2921d2c9d1a7426bab54397a71772757", 30 | "a1e41ea2a9dd4138bcba2643d472ec78", 31 | "31ae5b1ddf8c405d9b97c901043365d7", 32 | "2e15dd36207146789d737ad4077d368b", 33 | "e4457ef8ca424b74a546e2fa85cdf69f", 34 | "53c8d989d57443ce8cd5861721bbdb41", 35 | "0eb083ee46f743d4b429bf6612da55a6", 36 | "048a01b6f7034148b5fa53d0e33088b0", 37 | "b9da0257d25e47d087dda0644be79d0f", 38 | "952a134784564a40a26f60fdc24a4b29", 39 | "c86d3e5c71804299bd3626eda5ad6bec", 40 | "3d78d66f951c48969c2036764cd415d0", 41 | "ed5c1bfee6084b40953064d2cf66ebdd", 42 | "fd32ad532d594347849bf1aa89fa0b15", 43 | "7c5d9781693245f8bf888e8f909f097f", 44 | "4289ac665bd3494b8091af46aa03d27b", 45 | "05eafd28789747c5b8541e81d392aef4", 46 | "bc96b42534554357872d4497616054c4", 47 | "6a59d212d5184dc39ce77c279ebca348" 48 | ] 49 | }, 50 | "id": "jh97g8-gPe3H", 51 | "outputId": "e0c87cbd-939e-4faf-ab9d-87993f1a80ae" 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "from datasets import load_dataset\n", 56 | "# use name=\"sample-10BT\" to use the 10BT sample\n", 57 | "fw = load_dataset(\"HuggingFaceFW/fineweb\", name=\"CC-MAIN-2024-10\", split=\"train\", streaming=True)\n" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": { 64 | "colab": { 65 | "base_uri": "https://localhost:8080/" 66 | }, 67 | "id": "yPWI91xuQGaV", 68 | "outputId": "00c4901f-dd90-411f-da71-8a831ca4241d" 69 | }, 70 | "outputs": [], 71 | "source": [ 72 | "fw" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": null, 78 | "metadata": { 79 | "id": "oDnktugVQHru" 80 | }, 81 | "outputs": [], 82 | "source": [ 83 | "filtered_dataset = fw.filter(lambda example: example['language'] == 'en')" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": null, 89 | "metadata": { 90 | "id": "Y9StbBlrQhgf" 91 | }, 92 | "outputs": [], 93 | "source": [ 94 | "from tqdm import tqdm\n", 95 | "\n", 96 | "# Wrapping the 'take' method call with tqdm to display a progress bar\n", 97 | "dataset_10B = [item for item in tqdm(filtered_dataset.take(15000000), total=15000000)]\n" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "execution_count": null, 103 | "metadata": { 104 | "id": "sSSY3K9kSwW5" 105 | }, 106 | "outputs": [], 107 | "source": [ 108 | "import pandas as pd\n", 109 | "dataset = pd.DataFrame(dataset_10B, index=None)" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": null, 115 | "metadata": { 116 | "colab": { 117 | "base_uri": "https://localhost:8080/", 118 | "height": 1000 119 | }, 120 | "id": "EXuxcMFBUYjQ", 121 | "outputId": "0881e898-89c2-4ebc-a3e4-7d479db33a77" 122 | }, 123 | "outputs": [], 124 | "source": [ 125 | "dataset" 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": null, 131 | "metadata": { 132 | "colab": { 133 | "base_uri": "https://localhost:8080/" 134 | }, 135 | "id": "Ex1lKDNIVlTj", 136 | "outputId": "9789ff15-9a27-4bd8-b307-34039e3a2983" 137 | }, 138 | "outputs": [], 139 | "source": [ 140 | "dataset[\"token_count\"].sum()" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": null, 146 | "metadata": {}, 147 | "outputs": [], 148 | "source": [ 149 | "dataset.to_csv('fineweb-CC-MAIN-2024-10-1B-en.csv', index=False)" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": null, 155 | "metadata": {}, 156 | "outputs": [], 157 | "source": [ 158 | "from datasets import load_dataset\n", 159 | "\n", 160 | "\n", 161 | "dataset = load_dataset(\"csv\", data_files = {\"train\":\"fineweb-CC-MAIN-2024-10-8B-en.csv\"})" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": null, 167 | "metadata": {}, 168 | "outputs": [], 169 | "source": [ 170 | "dataset.push_to_hub(\"fineweb-CC-MAIN-2024-10-8B-en\")" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": null, 176 | "metadata": {}, 177 | "outputs": [], 178 | "source": [ 179 | "N = 8300000 # Specify the number of rows you want\n", 180 | "dataset_6b = dataset[\"train\"].select(range(N))" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": null, 186 | "metadata": {}, 187 | "outputs": [], 188 | "source": [ 189 | "sum(dataset_6b['token_count'])" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": null, 195 | "metadata": {}, 196 | "outputs": [], 197 | "source": [ 198 | "dataset_6b.push_to_hub(\"fineweb-CC-MAIN-2024-10-6B-en\")" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": {}, 205 | "outputs": [], 206 | "source": [ 207 | "from datasets import Dataset\n", 208 | "dataset_1b = Dataset.from_pandas(dataset, preserve_index=False)\n", 209 | "\n", 210 | "N = 1500000 # Specify the number of rows you want\n", 211 | "dataset_1b = dataset[\"train\"].select(range(N))" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": null, 217 | "metadata": {}, 218 | "outputs": [], 219 | "source": [ 220 | "dataset_1b.push_to_hub(\"fineweb-CC-MAIN-2024-10-1B-en\")" 221 | ] 222 | } 223 | ], 224 | "metadata": { 225 | "colab": { 226 | "provenance": [] 227 | }, 228 | "kernelspec": { 229 | "display_name": "Python 3 (ipykernel)", 230 | "language": "python", 231 | "name": "python3" 232 | }, 233 | "language_info": { 234 | "codemirror_mode": { 235 | "name": "ipython", 236 | "version": 3 237 | }, 238 | "file_extension": ".py", 239 | "mimetype": "text/x-python", 240 | "name": "python", 241 | "nbconvert_exporter": "python", 242 | "pygments_lexer": "ipython3", 243 | "version": "3.10.14" 244 | }, 245 | "widgets": { 246 | "application/vnd.jupyter.widget-state+json": { 247 | "048a01b6f7034148b5fa53d0e33088b0": { 248 | "model_module": "@jupyter-widgets/controls", 249 | "model_module_version": "1.5.0", 250 | "model_name": "DescriptionStyleModel", 251 | "state": { 252 | "_model_module": "@jupyter-widgets/controls", 253 | "_model_module_version": "1.5.0", 254 | "_model_name": "DescriptionStyleModel", 255 | "_view_count": null, 256 | "_view_module": "@jupyter-widgets/base", 257 | "_view_module_version": "1.2.0", 258 | "_view_name": "StyleView", 259 | "description_width": "" 260 | } 261 | }, 262 | "05eafd28789747c5b8541e81d392aef4": { 263 | "model_module": "@jupyter-widgets/controls", 264 | "model_module_version": "1.5.0", 265 | "model_name": "ProgressStyleModel", 266 | "state": { 267 | "_model_module": "@jupyter-widgets/controls", 268 | "_model_module_version": "1.5.0", 269 | "_model_name": "ProgressStyleModel", 270 | "_view_count": null, 271 | "_view_module": "@jupyter-widgets/base", 272 | "_view_module_version": "1.2.0", 273 | "_view_name": "StyleView", 274 | "bar_color": null, 275 | "description_width": "" 276 | } 277 | }, 278 | "0b69c40ac70542d7809ae6240c6ea8d3": { 279 | "model_module": "@jupyter-widgets/controls", 280 | "model_module_version": "1.5.0", 281 | "model_name": "FloatProgressModel", 282 | "state": { 283 | "_dom_classes": [], 284 | "_model_module": "@jupyter-widgets/controls", 285 | "_model_module_version": "1.5.0", 286 | "_model_name": "FloatProgressModel", 287 | "_view_count": null, 288 | "_view_module": "@jupyter-widgets/controls", 289 | "_view_module_version": "1.5.0", 290 | "_view_name": "ProgressView", 291 | "bar_style": "success", 292 | "description": "", 293 | "description_tooltip": null, 294 | "layout": "IPY_MODEL_e4457ef8ca424b74a546e2fa85cdf69f", 295 | "max": 23032, 296 | "min": 0, 297 | "orientation": "horizontal", 298 | "style": "IPY_MODEL_53c8d989d57443ce8cd5861721bbdb41", 299 | "value": 23032 300 | } 301 | }, 302 | "0eb083ee46f743d4b429bf6612da55a6": { 303 | "model_module": "@jupyter-widgets/base", 304 | "model_module_version": "1.2.0", 305 | "model_name": "LayoutModel", 306 | "state": { 307 | "_model_module": "@jupyter-widgets/base", 308 | "_model_module_version": "1.2.0", 309 | "_model_name": "LayoutModel", 310 | "_view_count": null, 311 | "_view_module": "@jupyter-widgets/base", 312 | "_view_module_version": "1.2.0", 313 | "_view_name": "LayoutView", 314 | "align_content": null, 315 | "align_items": null, 316 | "align_self": null, 317 | "border": null, 318 | "bottom": null, 319 | "display": null, 320 | "flex": null, 321 | "flex_flow": null, 322 | "grid_area": null, 323 | "grid_auto_columns": null, 324 | "grid_auto_flow": null, 325 | "grid_auto_rows": null, 326 | "grid_column": null, 327 | "grid_gap": null, 328 | "grid_row": null, 329 | "grid_template_areas": null, 330 | "grid_template_columns": null, 331 | "grid_template_rows": null, 332 | "height": null, 333 | "justify_content": null, 334 | "justify_items": null, 335 | "left": null, 336 | "margin": null, 337 | "max_height": null, 338 | "max_width": null, 339 | "min_height": null, 340 | "min_width": null, 341 | "object_fit": null, 342 | "object_position": null, 343 | "order": null, 344 | "overflow": null, 345 | "overflow_x": null, 346 | "overflow_y": null, 347 | "padding": null, 348 | "right": null, 349 | "top": null, 350 | "visibility": null, 351 | "width": null 352 | } 353 | }, 354 | "22b34f9b327746dd93ebe6538482ffdc": { 355 | "model_module": "@jupyter-widgets/controls", 356 | "model_module_version": "1.5.0", 357 | "model_name": "HTMLModel", 358 | "state": { 359 | "_dom_classes": [], 360 | "_model_module": "@jupyter-widgets/controls", 361 | "_model_module_version": "1.5.0", 362 | "_model_name": "HTMLModel", 363 | "_view_count": null, 364 | "_view_module": "@jupyter-widgets/controls", 365 | "_view_module_version": "1.5.0", 366 | "_view_name": "HTMLView", 367 | "description": "", 368 | "description_tooltip": null, 369 | "layout": "IPY_MODEL_31ae5b1ddf8c405d9b97c901043365d7", 370 | "placeholder": "​", 371 | "style": "IPY_MODEL_2e15dd36207146789d737ad4077d368b", 372 | "value": "Resolving data files: 100%" 373 | } 374 | }, 375 | "2921d2c9d1a7426bab54397a71772757": { 376 | "model_module": "@jupyter-widgets/controls", 377 | "model_module_version": "1.5.0", 378 | "model_name": "HTMLModel", 379 | "state": { 380 | "_dom_classes": [], 381 | "_model_module": "@jupyter-widgets/controls", 382 | "_model_module_version": "1.5.0", 383 | "_model_name": "HTMLModel", 384 | "_view_count": null, 385 | "_view_module": "@jupyter-widgets/controls", 386 | "_view_module_version": "1.5.0", 387 | "_view_name": "HTMLView", 388 | "description": "", 389 | "description_tooltip": null, 390 | "layout": "IPY_MODEL_0eb083ee46f743d4b429bf6612da55a6", 391 | "placeholder": "​", 392 | "style": "IPY_MODEL_048a01b6f7034148b5fa53d0e33088b0", 393 | "value": " 23032/23032 [00:00<00:00,  7.06it/s]" 394 | } 395 | }, 396 | "2e15dd36207146789d737ad4077d368b": { 397 | "model_module": "@jupyter-widgets/controls", 398 | "model_module_version": "1.5.0", 399 | "model_name": "DescriptionStyleModel", 400 | "state": { 401 | "_model_module": "@jupyter-widgets/controls", 402 | "_model_module_version": "1.5.0", 403 | "_model_name": "DescriptionStyleModel", 404 | "_view_count": null, 405 | "_view_module": "@jupyter-widgets/base", 406 | "_view_module_version": "1.2.0", 407 | "_view_name": "StyleView", 408 | "description_width": "" 409 | } 410 | }, 411 | "31ae5b1ddf8c405d9b97c901043365d7": { 412 | "model_module": "@jupyter-widgets/base", 413 | "model_module_version": "1.2.0", 414 | "model_name": "LayoutModel", 415 | "state": { 416 | "_model_module": "@jupyter-widgets/base", 417 | "_model_module_version": "1.2.0", 418 | "_model_name": "LayoutModel", 419 | "_view_count": null, 420 | "_view_module": "@jupyter-widgets/base", 421 | "_view_module_version": "1.2.0", 422 | "_view_name": "LayoutView", 423 | "align_content": null, 424 | "align_items": null, 425 | "align_self": null, 426 | "border": null, 427 | "bottom": null, 428 | "display": null, 429 | "flex": null, 430 | "flex_flow": null, 431 | "grid_area": null, 432 | "grid_auto_columns": null, 433 | "grid_auto_flow": null, 434 | "grid_auto_rows": null, 435 | "grid_column": null, 436 | "grid_gap": null, 437 | "grid_row": null, 438 | "grid_template_areas": null, 439 | "grid_template_columns": null, 440 | "grid_template_rows": null, 441 | "height": null, 442 | "justify_content": null, 443 | "justify_items": null, 444 | "left": null, 445 | "margin": null, 446 | "max_height": null, 447 | "max_width": null, 448 | "min_height": null, 449 | "min_width": null, 450 | "object_fit": null, 451 | "object_position": null, 452 | "order": null, 453 | "overflow": null, 454 | "overflow_x": null, 455 | "overflow_y": null, 456 | "padding": null, 457 | "right": null, 458 | "top": null, 459 | "visibility": null, 460 | "width": null 461 | } 462 | }, 463 | "3b6f554968d54e70a8e9ece4763fa612": { 464 | "model_module": "@jupyter-widgets/controls", 465 | "model_module_version": "1.5.0", 466 | "model_name": "HBoxModel", 467 | "state": { 468 | "_dom_classes": [], 469 | "_model_module": "@jupyter-widgets/controls", 470 | "_model_module_version": "1.5.0", 471 | "_model_name": "HBoxModel", 472 | "_view_count": null, 473 | "_view_module": "@jupyter-widgets/controls", 474 | "_view_module_version": "1.5.0", 475 | "_view_name": "HBoxView", 476 | "box_style": "", 477 | "children": [ 478 | "IPY_MODEL_22b34f9b327746dd93ebe6538482ffdc", 479 | "IPY_MODEL_0b69c40ac70542d7809ae6240c6ea8d3", 480 | "IPY_MODEL_2921d2c9d1a7426bab54397a71772757" 481 | ], 482 | "layout": "IPY_MODEL_a1e41ea2a9dd4138bcba2643d472ec78" 483 | } 484 | }, 485 | "3d78d66f951c48969c2036764cd415d0": { 486 | "model_module": "@jupyter-widgets/controls", 487 | "model_module_version": "1.5.0", 488 | "model_name": "HTMLModel", 489 | "state": { 490 | "_dom_classes": [], 491 | "_model_module": "@jupyter-widgets/controls", 492 | "_model_module_version": "1.5.0", 493 | "_model_name": "HTMLModel", 494 | "_view_count": null, 495 | "_view_module": "@jupyter-widgets/controls", 496 | "_view_module_version": "1.5.0", 497 | "_view_name": "HTMLView", 498 | "description": "", 499 | "description_tooltip": null, 500 | "layout": "IPY_MODEL_bc96b42534554357872d4497616054c4", 501 | "placeholder": "​", 502 | "style": "IPY_MODEL_6a59d212d5184dc39ce77c279ebca348", 503 | "value": " 250/250 [00:00<00:00, 6483.86it/s]" 504 | } 505 | }, 506 | "4289ac665bd3494b8091af46aa03d27b": { 507 | "model_module": "@jupyter-widgets/base", 508 | "model_module_version": "1.2.0", 509 | "model_name": "LayoutModel", 510 | "state": { 511 | "_model_module": "@jupyter-widgets/base", 512 | "_model_module_version": "1.2.0", 513 | "_model_name": "LayoutModel", 514 | "_view_count": null, 515 | "_view_module": "@jupyter-widgets/base", 516 | "_view_module_version": "1.2.0", 517 | "_view_name": "LayoutView", 518 | "align_content": null, 519 | "align_items": null, 520 | "align_self": null, 521 | "border": null, 522 | "bottom": null, 523 | "display": null, 524 | "flex": null, 525 | "flex_flow": null, 526 | "grid_area": null, 527 | "grid_auto_columns": null, 528 | "grid_auto_flow": null, 529 | "grid_auto_rows": null, 530 | "grid_column": null, 531 | "grid_gap": null, 532 | "grid_row": null, 533 | "grid_template_areas": null, 534 | "grid_template_columns": null, 535 | "grid_template_rows": null, 536 | "height": null, 537 | "justify_content": null, 538 | "justify_items": null, 539 | "left": null, 540 | "margin": null, 541 | "max_height": null, 542 | "max_width": null, 543 | "min_height": null, 544 | "min_width": null, 545 | "object_fit": null, 546 | "object_position": null, 547 | "order": null, 548 | "overflow": null, 549 | "overflow_x": null, 550 | "overflow_y": null, 551 | "padding": null, 552 | "right": null, 553 | "top": null, 554 | "visibility": null, 555 | "width": null 556 | } 557 | }, 558 | "53c8d989d57443ce8cd5861721bbdb41": { 559 | "model_module": "@jupyter-widgets/controls", 560 | "model_module_version": "1.5.0", 561 | "model_name": "ProgressStyleModel", 562 | "state": { 563 | "_model_module": "@jupyter-widgets/controls", 564 | "_model_module_version": "1.5.0", 565 | "_model_name": "ProgressStyleModel", 566 | "_view_count": null, 567 | "_view_module": "@jupyter-widgets/base", 568 | "_view_module_version": "1.2.0", 569 | "_view_name": "StyleView", 570 | "bar_color": null, 571 | "description_width": "" 572 | } 573 | }, 574 | "6a59d212d5184dc39ce77c279ebca348": { 575 | "model_module": "@jupyter-widgets/controls", 576 | "model_module_version": "1.5.0", 577 | "model_name": "DescriptionStyleModel", 578 | "state": { 579 | "_model_module": "@jupyter-widgets/controls", 580 | "_model_module_version": "1.5.0", 581 | "_model_name": "DescriptionStyleModel", 582 | "_view_count": null, 583 | "_view_module": "@jupyter-widgets/base", 584 | "_view_module_version": "1.2.0", 585 | "_view_name": "StyleView", 586 | "description_width": "" 587 | } 588 | }, 589 | "7c5d9781693245f8bf888e8f909f097f": { 590 | "model_module": "@jupyter-widgets/controls", 591 | "model_module_version": "1.5.0", 592 | "model_name": "DescriptionStyleModel", 593 | "state": { 594 | "_model_module": "@jupyter-widgets/controls", 595 | "_model_module_version": "1.5.0", 596 | "_model_name": "DescriptionStyleModel", 597 | "_view_count": null, 598 | "_view_module": "@jupyter-widgets/base", 599 | "_view_module_version": "1.2.0", 600 | "_view_name": "StyleView", 601 | "description_width": "" 602 | } 603 | }, 604 | "952a134784564a40a26f60fdc24a4b29": { 605 | "model_module": "@jupyter-widgets/controls", 606 | "model_module_version": "1.5.0", 607 | "model_name": "HTMLModel", 608 | "state": { 609 | "_dom_classes": [], 610 | "_model_module": "@jupyter-widgets/controls", 611 | "_model_module_version": "1.5.0", 612 | "_model_name": "HTMLModel", 613 | "_view_count": null, 614 | "_view_module": "@jupyter-widgets/controls", 615 | "_view_module_version": "1.5.0", 616 | "_view_name": "HTMLView", 617 | "description": "", 618 | "description_tooltip": null, 619 | "layout": "IPY_MODEL_fd32ad532d594347849bf1aa89fa0b15", 620 | "placeholder": "​", 621 | "style": "IPY_MODEL_7c5d9781693245f8bf888e8f909f097f", 622 | "value": "Resolving data files: 100%" 623 | } 624 | }, 625 | "a1e41ea2a9dd4138bcba2643d472ec78": { 626 | "model_module": "@jupyter-widgets/base", 627 | "model_module_version": "1.2.0", 628 | "model_name": "LayoutModel", 629 | "state": { 630 | "_model_module": "@jupyter-widgets/base", 631 | "_model_module_version": "1.2.0", 632 | "_model_name": "LayoutModel", 633 | "_view_count": null, 634 | "_view_module": "@jupyter-widgets/base", 635 | "_view_module_version": "1.2.0", 636 | "_view_name": "LayoutView", 637 | "align_content": null, 638 | "align_items": null, 639 | "align_self": null, 640 | "border": null, 641 | "bottom": null, 642 | "display": null, 643 | "flex": null, 644 | "flex_flow": null, 645 | "grid_area": null, 646 | "grid_auto_columns": null, 647 | "grid_auto_flow": null, 648 | "grid_auto_rows": null, 649 | "grid_column": null, 650 | "grid_gap": null, 651 | "grid_row": null, 652 | "grid_template_areas": null, 653 | "grid_template_columns": null, 654 | "grid_template_rows": null, 655 | "height": null, 656 | "justify_content": null, 657 | "justify_items": null, 658 | "left": null, 659 | "margin": null, 660 | "max_height": null, 661 | "max_width": null, 662 | "min_height": null, 663 | "min_width": null, 664 | "object_fit": null, 665 | "object_position": null, 666 | "order": null, 667 | "overflow": null, 668 | "overflow_x": null, 669 | "overflow_y": null, 670 | "padding": null, 671 | "right": null, 672 | "top": null, 673 | "visibility": null, 674 | "width": null 675 | } 676 | }, 677 | "b9da0257d25e47d087dda0644be79d0f": { 678 | "model_module": "@jupyter-widgets/controls", 679 | "model_module_version": "1.5.0", 680 | "model_name": "HBoxModel", 681 | "state": { 682 | "_dom_classes": [], 683 | "_model_module": "@jupyter-widgets/controls", 684 | "_model_module_version": "1.5.0", 685 | "_model_name": "HBoxModel", 686 | "_view_count": null, 687 | "_view_module": "@jupyter-widgets/controls", 688 | "_view_module_version": "1.5.0", 689 | "_view_name": "HBoxView", 690 | "box_style": "", 691 | "children": [ 692 | "IPY_MODEL_952a134784564a40a26f60fdc24a4b29", 693 | "IPY_MODEL_c86d3e5c71804299bd3626eda5ad6bec", 694 | "IPY_MODEL_3d78d66f951c48969c2036764cd415d0" 695 | ], 696 | "layout": "IPY_MODEL_ed5c1bfee6084b40953064d2cf66ebdd" 697 | } 698 | }, 699 | "bc96b42534554357872d4497616054c4": { 700 | "model_module": "@jupyter-widgets/base", 701 | "model_module_version": "1.2.0", 702 | "model_name": "LayoutModel", 703 | "state": { 704 | "_model_module": "@jupyter-widgets/base", 705 | "_model_module_version": "1.2.0", 706 | "_model_name": "LayoutModel", 707 | "_view_count": null, 708 | "_view_module": "@jupyter-widgets/base", 709 | "_view_module_version": "1.2.0", 710 | "_view_name": "LayoutView", 711 | "align_content": null, 712 | "align_items": null, 713 | "align_self": null, 714 | "border": null, 715 | "bottom": null, 716 | "display": null, 717 | "flex": null, 718 | "flex_flow": null, 719 | "grid_area": null, 720 | "grid_auto_columns": null, 721 | "grid_auto_flow": null, 722 | "grid_auto_rows": null, 723 | "grid_column": null, 724 | "grid_gap": null, 725 | "grid_row": null, 726 | "grid_template_areas": null, 727 | "grid_template_columns": null, 728 | "grid_template_rows": null, 729 | "height": null, 730 | "justify_content": null, 731 | "justify_items": null, 732 | "left": null, 733 | "margin": null, 734 | "max_height": null, 735 | "max_width": null, 736 | "min_height": null, 737 | "min_width": null, 738 | "object_fit": null, 739 | "object_position": null, 740 | "order": null, 741 | "overflow": null, 742 | "overflow_x": null, 743 | "overflow_y": null, 744 | "padding": null, 745 | "right": null, 746 | "top": null, 747 | "visibility": null, 748 | "width": null 749 | } 750 | }, 751 | "c86d3e5c71804299bd3626eda5ad6bec": { 752 | "model_module": "@jupyter-widgets/controls", 753 | "model_module_version": "1.5.0", 754 | "model_name": "FloatProgressModel", 755 | "state": { 756 | "_dom_classes": [], 757 | "_model_module": "@jupyter-widgets/controls", 758 | "_model_module_version": "1.5.0", 759 | "_model_name": "FloatProgressModel", 760 | "_view_count": null, 761 | "_view_module": "@jupyter-widgets/controls", 762 | "_view_module_version": "1.5.0", 763 | "_view_name": "ProgressView", 764 | "bar_style": "success", 765 | "description": "", 766 | "description_tooltip": null, 767 | "layout": "IPY_MODEL_4289ac665bd3494b8091af46aa03d27b", 768 | "max": 250, 769 | "min": 0, 770 | "orientation": "horizontal", 771 | "style": "IPY_MODEL_05eafd28789747c5b8541e81d392aef4", 772 | "value": 250 773 | } 774 | }, 775 | "e4457ef8ca424b74a546e2fa85cdf69f": { 776 | "model_module": "@jupyter-widgets/base", 777 | "model_module_version": "1.2.0", 778 | "model_name": "LayoutModel", 779 | "state": { 780 | "_model_module": "@jupyter-widgets/base", 781 | "_model_module_version": "1.2.0", 782 | "_model_name": "LayoutModel", 783 | "_view_count": null, 784 | "_view_module": "@jupyter-widgets/base", 785 | "_view_module_version": "1.2.0", 786 | "_view_name": "LayoutView", 787 | "align_content": null, 788 | "align_items": null, 789 | "align_self": null, 790 | "border": null, 791 | "bottom": null, 792 | "display": null, 793 | "flex": null, 794 | "flex_flow": null, 795 | "grid_area": null, 796 | "grid_auto_columns": null, 797 | "grid_auto_flow": null, 798 | "grid_auto_rows": null, 799 | "grid_column": null, 800 | "grid_gap": null, 801 | "grid_row": null, 802 | "grid_template_areas": null, 803 | "grid_template_columns": null, 804 | "grid_template_rows": null, 805 | "height": null, 806 | "justify_content": null, 807 | "justify_items": null, 808 | "left": null, 809 | "margin": null, 810 | "max_height": null, 811 | "max_width": null, 812 | "min_height": null, 813 | "min_width": null, 814 | "object_fit": null, 815 | "object_position": null, 816 | "order": null, 817 | "overflow": null, 818 | "overflow_x": null, 819 | "overflow_y": null, 820 | "padding": null, 821 | "right": null, 822 | "top": null, 823 | "visibility": null, 824 | "width": null 825 | } 826 | }, 827 | "ed5c1bfee6084b40953064d2cf66ebdd": { 828 | "model_module": "@jupyter-widgets/base", 829 | "model_module_version": "1.2.0", 830 | "model_name": "LayoutModel", 831 | "state": { 832 | "_model_module": "@jupyter-widgets/base", 833 | "_model_module_version": "1.2.0", 834 | "_model_name": "LayoutModel", 835 | "_view_count": null, 836 | "_view_module": "@jupyter-widgets/base", 837 | "_view_module_version": "1.2.0", 838 | "_view_name": "LayoutView", 839 | "align_content": null, 840 | "align_items": null, 841 | "align_self": null, 842 | "border": null, 843 | "bottom": null, 844 | "display": null, 845 | "flex": null, 846 | "flex_flow": null, 847 | "grid_area": null, 848 | "grid_auto_columns": null, 849 | "grid_auto_flow": null, 850 | "grid_auto_rows": null, 851 | "grid_column": null, 852 | "grid_gap": null, 853 | "grid_row": null, 854 | "grid_template_areas": null, 855 | "grid_template_columns": null, 856 | "grid_template_rows": null, 857 | "height": null, 858 | "justify_content": null, 859 | "justify_items": null, 860 | "left": null, 861 | "margin": null, 862 | "max_height": null, 863 | "max_width": null, 864 | "min_height": null, 865 | "min_width": null, 866 | "object_fit": null, 867 | "object_position": null, 868 | "order": null, 869 | "overflow": null, 870 | "overflow_x": null, 871 | "overflow_y": null, 872 | "padding": null, 873 | "right": null, 874 | "top": null, 875 | "visibility": null, 876 | "width": null 877 | } 878 | }, 879 | "fd32ad532d594347849bf1aa89fa0b15": { 880 | "model_module": "@jupyter-widgets/base", 881 | "model_module_version": "1.2.0", 882 | "model_name": "LayoutModel", 883 | "state": { 884 | "_model_module": "@jupyter-widgets/base", 885 | "_model_module_version": "1.2.0", 886 | "_model_name": "LayoutModel", 887 | "_view_count": null, 888 | "_view_module": "@jupyter-widgets/base", 889 | "_view_module_version": "1.2.0", 890 | "_view_name": "LayoutView", 891 | "align_content": null, 892 | "align_items": null, 893 | "align_self": null, 894 | "border": null, 895 | "bottom": null, 896 | "display": null, 897 | "flex": null, 898 | "flex_flow": null, 899 | "grid_area": null, 900 | "grid_auto_columns": null, 901 | "grid_auto_flow": null, 902 | "grid_auto_rows": null, 903 | "grid_column": null, 904 | "grid_gap": null, 905 | "grid_row": null, 906 | "grid_template_areas": null, 907 | "grid_template_columns": null, 908 | "grid_template_rows": null, 909 | "height": null, 910 | "justify_content": null, 911 | "justify_items": null, 912 | "left": null, 913 | "margin": null, 914 | "max_height": null, 915 | "max_width": null, 916 | "min_height": null, 917 | "min_width": null, 918 | "object_fit": null, 919 | "object_position": null, 920 | "order": null, 921 | "overflow": null, 922 | "overflow_x": null, 923 | "overflow_y": null, 924 | "padding": null, 925 | "right": null, 926 | "top": null, 927 | "visibility": null, 928 | "width": null 929 | } 930 | } 931 | } 932 | } 933 | }, 934 | "nbformat": 4, 935 | "nbformat_minor": 4 936 | } 937 | -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/Comparision_of_Model_Scores.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/Comparision_of_Model_Scores.png -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/Experiment Canvas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/Experiment Canvas.png -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/Llama-3-8B-vs-6B-v0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/Llama-3-8B-vs-6B-v0.png -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/Training Loss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/Training Loss.png -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/downcycling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/downcycling.png -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/llama-3-6B icon.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/llama-3-6B icon.jpeg -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/model_scores.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/model_scores.png -------------------------------------------------------------------------------- /Llama-3/Part 2/assets/model_scores_llama_3_8B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Blaizzy/Coding-LLMs-from-scratch/9c3a182fcfbe898f532c9de947a5fc692ca4cc6b/Llama-3/Part 2/assets/model_scores_llama_3_8B.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Coding LLMs from scratch 2 | # Coding Llama-2 3 | You will learn how to train and fine-tune Llama 2 model from scratch. 4 | 5 | Throught the series you will learn about transformers architecture, different attention mechanisms (MHA, MQA and GQA), KV cache, RoPE, and Hugginface Trainer in detail. 6 | 7 | By the end, you will have created and trained a LLaMA 2 model with 100M parameters from scratch using PyTorch to do code completion. 8 | 9 | 🎥 **YT Video Playlist:** 10 | - https://youtube.com/playlist?list=PLDn_JsyofyfTH5_5V1MNb8UYKxMl6IMNy&si=5Y4cm-6wrMOD1Abr 11 | 12 | 13 | 14 | # Coding Llama-3 15 | 16 | You will learn how to train and fine-tune Llama 3 model from scratch. 17 | 18 | The goal is to code LLaMA 3 from scratch in PyTorch to create models with sizes 3B, 6B, 35B and 45B params. 19 | 20 | 🎥 **YT Video Playlist:** 21 | - https://youtube.com/playlist?list=PLDn_JsyofyfTH5_5V1MNb8UYKxMl6IMNy&si=5Y4cm-6wrMOD1Abr 22 | 23 | 📚 **Papers**: 24 | - Sparse Upcycling Training Mixture-of-Experts from Dense Checkpoints 25 | : https://arxiv.org/abs/2212.05055 26 | - Pre-training Small Base LMs with Fewer Tokens: https://arxiv.org/abs/2404.08634 27 | Leave No Context Behind Efficient Infinite Context Transformers with Infini-attention: https://arxiv.org/abs/2404.07143 28 | 29 | 30 | 31 | ## Llama-3-6B-v0.1 32 | Llama-3-6B 33 | 34 | Introducing the world's first Llama-3 base model with 6B parameters. This model is a pretrained version of [prince-canuma/Llama-3-6B-v0](https://huggingface.co/prince-canuma/Llama-3-6B-v0), which was created from Meta-Llama-3-8B using a technique called [downcycling](https://youtube.com/playlist?list=PLDn_JsyofyfTH5_5V1MNb8UYKxMl6IMNy&si=9hcOol4KHIgWThgt) . 35 | The model was continually pretrained on 1 billion tokens of English-only text from fineweb, achieving impressive results on the evaluation set: 36 | - Loss: 2.4942 37 | 38 | 39 | ## Model Description 40 | 41 | - **Developed by:** [Prince Canuma](https://huggingface.co/prince-canuma) 42 | - **Sponsored by:** General 43 | - **Model type:** Llama 44 | - **License:** [Llama-3](https://llama.meta.com/llama3/license) 45 | - **Pretrained from model:** prince-canuma/Llama-3-6B-v0 46 | 47 | ### Model Sources 48 | 49 | - **Repository:** https://github.com/Blaizzy/Coding-LLMs-from-scratch/tree/main/Llama-3 50 | - **Video:** https://youtube.com/playlist?list=PLDn_JsyofyfTH5_5V1MNb8UYKxMl6IMNy&si=5Y4cm-6wrMOD1Abr 51 | 52 | ## Uses 53 | 54 | 55 | You can use this model to create instruct and chat versions for various use cases such as: Coding assistant, RAG, Function Calling and more. 56 | 57 | ### Limitations 58 | 59 | This model inherits some of the base model's limitations and some additional ones from it's creation process, such as: 60 | - Limited scope for coding and math: According to benchmarks, this model needs more pretraining/finetuning on code and math data to excel at reasoning tasks. 61 | - Language Limitations: This model was continually pretrained on english only data. If you are planning to use it for multilingual use cases I recommend fine-tuning or continued pretraining. 62 | 63 | 64 | ## Read more 65 | https://huggingface.co/prince-canuma/Llama-3-6B-v0.1 --------------------------------------------------------------------------------