diff --git a/nbs/01_tensor.ipynb b/nbs/01_tensor.ipynb index 8a606aa..5dc468e 100644 --- a/nbs/01_tensor.ipynb +++ b/nbs/01_tensor.ipynb @@ -33,7 +33,8 @@ "from lovely_numpy import lovely\n", "\n", "import tidygrad.ops as ops\n", - "import tidygrad.tensor_helpers as helpers" + "import tidygrad.tensor_helpers as helpers\n", + "import traceback" ] }, { @@ -67,21 +68,54 @@ "class Tensor:\n", " pass\n", "\n", + "def simplify_trace(trace):\n", + " return ' -> '.join(f'{frame.name} at {frame.filename}:{frame.lineno}' for frame in trace if '/python' not in frame.filename)\n", + "\n", + "alloc_log = {}\n", + "\n", "class Tensor:\n", - " # op = \"L\"\n", " name: str = \"\"\n", "\n", " def __init__(self, data, name=None, op=None, eps=1e-8, requires_grad=False):\n", " global _num_tensors\n", " _num_tensors += 1\n", - " self.data = np.asarray(data, dtype=np.float64) # , dtype=np.float32\n", "\n", - " self.grad = (np.zeros_like(self.data, dtype=np.float64) if requires_grad else None)\n", + " trace = traceback.extract_stack()\n", + " simplified_trace = simplify_trace(trace)\n", + " alloc_log[id(self)] = simplified_trace\n", + " \n", + " # Increment allocation count\n", + "\n", + " # if _num_tensors > 620:\n", + " # raise Exception(\"Too many tensors\")\n", + "\n", + " self.data = np.asarray(data) # , dtype=np.float32\n", + " if self.data.dtype == np.float64:\n", + " self.data = self.data.astype(np.float32)\n", + "\n", + " self.grad = (np.zeros_like(self.data, dtype=np.float32) if requires_grad else None)\n", " self.eps = eps\n", " self.op = op or ops.Load(name=name)\n", " self.name = name or self.op.name\n", - " self.requires_grad = requires_grad\n", + " self._requires_grad = requires_grad\n", "\n", + " def __del__(self):\n", + " # print(f\"Tensor {self.name} deleted\")\n", + " del alloc_log[id(self)]\n", + " global _num_tensors\n", + " _num_tensors -= 1\n", + "\n", + " @property\n", + " def requires_grad(self):\n", + " return self._requires_grad\n", + "\n", + " @requires_grad.setter\n", + " def requires_grad(self, requires_grad):\n", + " if requires_grad and self.grad is None:\n", + " self.grad = np.zeros_like(self.data)\n", + " \n", + " self._requires_grad = requires_grad\n", + " \n", " def __repr__(self):\n", " value_str = f\"v={lovely(self.data)}\"\n", " grad_str = f\"∇={lovely(self.grad)}\" if self.grad is not None else \"\"\n", @@ -90,7 +124,7 @@ " return f'Tensor{list(self.data.shape)}(name=\"{self.name}\" op={type(self.op).__name__}{parents}):\\n {value_str}\\n {grad_str}'\n", "\n", " def accum_grad(self, grad):\n", - " if not self.requires_grad:\n", + " if not self._requires_grad:\n", " return\n", "\n", " if self.grad is None:\n", @@ -230,9 +264,11 @@ " for n in nodes[::-1]:\n", " if hasattr(n.op, \"backward\"):\n", " n.op.backward()\n", + " n.op = None\n", + "\n", "\n", " def zero_grad(self):\n", - " assert self.requires_grad, \"Cannot zero grad on non-differentiable tensor\"\n", + " assert self._requires_grad, \"Cannot zero grad on non-differentiable tensor\"\n", " self.grad.fill(0)" ] } diff --git a/nbs/02_func.ipynb b/nbs/02_func.ipynb index d87b232..e4facba 100644 --- a/nbs/02_func.ipynb +++ b/nbs/02_func.ipynb @@ -215,6 +215,7 @@ " target = Tensor(target)\n", " sm = softmax(logits)\n", " loss = -target * sm.log()\n", + "\n", " if reduction == \"mean\":\n", " return loss.mean(axis=-1, keepdims=True)\n", " if reduction == \"sum\":\n", diff --git a/nbs/02_ops.conv.ipynb b/nbs/02_ops.conv.ipynb index 130559f..f3d94f3 100644 --- a/nbs/02_ops.conv.ipynb +++ b/nbs/02_ops.conv.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "skip_exec: true\n", + "---" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/nbs/06_training.ipynb b/nbs/06_training.ipynb index 1916f63..fc67d68 100644 --- a/nbs/06_training.ipynb +++ b/nbs/06_training.ipynb @@ -31,7 +31,9 @@ "# | export\n", "from tidygrad import Tensor\n", "from tidygrad.utils import noop\n", - "import numpy as np" + "import numpy as np\n", + "import time\n", + "import gc" ] }, { @@ -39,9 +41,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "import time" - ] + "source": [] }, { "cell_type": "code", @@ -79,6 +79,8 @@ "metadata": {}, "outputs": [], "source": [ + "#| export\n", + "\n", "class Metric:\n", " def __init__(self, train=True, valid=True):\n", " self.train = train\n", @@ -218,6 +220,9 @@ " @add_callbacks\n", " def do_batch_backward(self):\n", " self.loss.backward()\n", + " f = float(self.loss.data) \n", + " self.loss = f\n", + " gc.collect()\n", " self.optimizer.step()\n", " self.optimizer.zero_grad()" ] @@ -240,15 +245,11 @@ "source": [ "#| export\n", "\n", - "def one_hot_encode_batch(y, n_classes):\n", - " diag = np.eye(n_classes)\n", - " return Tensor(diag[y])\n", - "\n", "\n", + "def one_hot_encode_batch(y, n_classes):\n", " batch_size = y.shape[0]\n", " assert batch_size > 0\n", " assert n_classes > 0\n", - " # assert y.shape[0] == batch_size\n", " assert np.min(y) >= 0\n", "\n", " # Initialize a zero matrix of shape (batch_size, num_classes)\n", @@ -358,6 +359,8 @@ " if x_lim is None:\n", " x_lim = len(learner.dataloaders.train) * learner.n_epochs\n", " fig, ax = plt.subplots(1, len(metrics), figsize=(4 * len(metrics), 4), tight_layout=True)\n", + " if len(metrics) == 1:\n", + " ax = [ax] # wtf matplotlib???\n", " plt.close(fig)\n", " for i, m in enumerate(metrics):\n", " train_metrics = []\n", @@ -500,15 +503,19 @@ " inputs.data = inputs.data.reshape(inputs.data.shape[0], -1)\n", " x = inputs\n", " w1, b1, w2 = params\n", + " # print(\"model inputs\", x)\n", + "\n", " z1 = relu(x.mmul(w1, \"z1\") + b1)\n", " z2 = z1.mmul(w2, \"z2\")\n", "\n", + " # print(\"model outputs\", z2)\n", + "\n", " return z2\n", "\n", "MM_func = partial(linear_model, params=[w1, b1, w2])\n", "optimizer = Adam([w1, b1, w2], lr=0.005)\n", "\n", - "loss_f = lambda preds, targets: CrossEntropy_loss(preds, one_hot_encode_batch(targets.data, n_classes=10))\n", + "loss_f = lambda preds, targets: CrossEntropy_loss(preds, one_hot_encode_batch(targets.data, n_classes=10)).mean()\n", "# loss_f = lambda preds, targets: CrossEntropy_loss(preds, one_hot_encode_batch(targets.data, 10))\n", "\n", "student = Learner(\n", @@ -531,7 +538,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "fca1cf84a7d74983bf209d9eab87ed20", + "model_id": "214d07742b554eeda15fa660373d8f3a", "version_major": 2, "version_minor": 0 }, @@ -545,7 +552,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3c29691b6e214e14baf786bcde45df92", + "model_id": "c7f1890229ba4560bf11186043d94c28", "version_major": 2, "version_minor": 0 }, @@ -558,7 +565,7 @@ }, { "data": { - "image/png": "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PTQmTZoU//mf/7n3qgBgv9MfAHJXl75Tsb/sjfN9AehYTz7G9uS1A/QE78p3KgAAAP6RUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAkj0KFfPnz4+KioooKiqKysrKWL58+TvOb25ujquuuirKy8ujsLAwRowYEYsWLdqjBQPQfekPALkpv6sbLF68OGbOnBnz58+PD3/4w/H9738/Jk+eHE899VQMHz68w23OOuusePHFF2PhwoXx3ve+NzZu3Bjbt29PXjwA3Yf+AJC78rIsy7qywbhx42LMmDGxYMGC1rGRI0fGlClToqampt38e++9N6ZNmxZr1qyJ/v3779Eim5qaoqSkJBobG6O4uHiPngOAju2tY6z+AND7dPY426XTn1paWmLlypVRVVXVZryqqipWrFjR4TZ33313jB07Nq699to47LDD4uijj46vfOUrsW3btq68NADdmP4AkNu6dPrTpk2bYseOHVFaWtpmvLS0NDZs2NDhNmvWrIkHH3wwioqK4q677opNmzbFv/3bv8XLL7+8y/Nmm5ubo7m5ufV+U1NTV5YJwD6mPwDktj36onZeXl6b+1mWtRt7286dOyMvLy9uv/32OP744+Pkk0+O66+/Pm699dZdvhtVU1MTJSUlrbdhw4btyTIB2Mf0B4Dc1KVQMXDgwOjTp0+7d502btzY7t2ptw0dOjQOO+ywKCkpaR0bOXJkZFkW69ev73Cb2bNnR2NjY+tt3bp1XVkmAPuY/gCQ27oUKgoKCqKysjJqa2vbjNfW1saECRM63ObDH/5wvPDCC7F169bWsb/97W9xwAEHxOGHH97hNoWFhVFcXNzmBkD3pT8A5LYun/40a9asuPnmm2PRokWxevXquPTSS6O+vj6qq6sj4q13kaZPn946/5xzzokBAwbE+eefH0899VQ88MAD8e///u9xwQUXRL9+/fZeJQDsV/oDQO7q8u9UTJ06NTZv3hzz5s2LhoaGGDVqVCxZsiTKy8sjIqKhoSHq6+tb5x988MFRW1sbX/rSl2Ls2LExYMCAOOuss+I//uM/9l4VAOx3+gNA7ury71TsD65DDvDu6cnH2J68doCe4F35nQoAAIB/JFQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCRCBQAAkGSPQsX8+fOjoqIiioqKorKyMpYvX96p7f7whz9Efn5+fOADH9iTlwWgm9MfAHJTl0PF4sWLY+bMmXHVVVdFXV1dTJw4MSZPnhz19fXvuF1jY2NMnz49Pvaxj+3xYgHovvQHgNyVl2VZ1pUNxo0bF2PGjIkFCxa0jo0cOTKmTJkSNTU1u9xu2rRpcdRRR0WfPn3iV7/6VaxatarTr9nU1BQlJSXR2NgYxcXFXVkuALuxt46x+gNA79PZ42yXPqloaWmJlStXRlVVVZvxqqqqWLFixS63u+WWW+Lvf/97zJkzpysvB0APoT8A5Lb8rkzetGlT7NixI0pLS9uMl5aWxoYNGzrc5plnnokrrrgili9fHvn5nXu55ubmaG5ubr3f1NTUlWUCsI/pDwC5bY++qJ2Xl9fmfpZl7cYiInbs2BHnnHNOXHPNNXH00Ud3+vlramqipKSk9TZs2LA9WSYA+5j+AJCbuhQqBg4cGH369Gn3rtPGjRvbvTsVEbFly5Z49NFH45JLLon8/PzIz8+PefPmxZ///OfIz8+PpUuXdvg6s2fPjsbGxtbbunXrurJMAPYx/QEgt3Xp9KeCgoKorKyM2traOOOMM1rHa2tr4/TTT283v7i4OJ544ok2Y/Pnz4+lS5fGL37xi6ioqOjwdQoLC6OwsLArSwNgP9IfAHJbl0JFRMSsWbPi85//fIwdOzbGjx8fP/jBD6K+vj6qq6sj4q13kZ5//vm47bbb4oADDohRo0a12X7w4MFRVFTUbhyAnk1/AMhdXQ4VU6dOjc2bN8e8efOioaEhRo0aFUuWLIny8vKIiGhoaNjtNckB6H30B4Dc1eXfqdgfXIcc4N3Tk4+xPXntAD3Bu/I7FQAAAP9IqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAkESoAAIAkQgUAAJBEqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAkESoAAIAkQgUAAJBEqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAkESoAAIAkQgUAAJBEqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAkESoAAIAkQgUAAJBEqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAkESoAAIAkQgUAAJBEqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAkESoAAIAkQgUAAJBEqAAAAJIIFQAAQBKhAgAASCJUAAAASYQKAAAgiVABAAAk2aNQMX/+/KioqIiioqKorKyM5cuX73LunXfeGZ/4xCdi0KBBUVxcHOPHj4/77rtvjxcMQPelPwDkpi6HisWLF8fMmTPjqquuirq6upg4cWJMnjw56uvrO5z/wAMPxCc+8YlYsmRJrFy5Mk466aQ47bTToq6uLnnxAHQf+gNA7srLsizrygbjxo2LMWPGxIIFC1rHRo4cGVOmTImamppOPcf73//+mDp1alx99dWdmt/U1BQlJSXR2NgYxcXFXVkuALuxt46x+gNA79PZ42yXPqloaWmJlStXRlVVVZvxqqqqWLFiRaeeY+fOnbFly5bo37//Luc0NzdHU1NTmxsA3Zf+AJDbuhQqNm3aFDt27IjS0tI246WlpbFhw4ZOPcc3v/nNeO211+Kss87a5ZyampooKSlpvQ0bNqwrywRgH9MfAHLbHn1ROy8vr839LMvajXXkpz/9acydOzcWL14cgwcP3uW82bNnR2NjY+tt3bp1e7JMAPYx/QEgN+V3ZfLAgQOjT58+7d512rhxY7t3p/7R4sWL48ILL4w77rgjPv7xj7/j3MLCwigsLOzK0gDYj/QHgNzWpU8qCgoKorKyMmpra9uM19bWxoQJE3a53U9/+tM477zz4ic/+Umccsope7ZSALot/QEgt3Xpk4qIiFmzZsXnP//5GDt2bIwfPz5+8IMfRH19fVRXV0fEWx9NP//883HbbbdFxFsNY/r06fGd73wnPvShD7W+i9WvX78oKSnZi6UAsD/pDwC5q8uhYurUqbF58+aYN29eNDQ0xKhRo2LJkiVRXl4eERENDQ1trkn+/e9/P7Zv3x4XX3xxXHzxxa3j5557btx6663pFQDQLegPALmry79TsT+4DjnAu6cnH2N78toBeoJ35XcqAAAA/pFQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAEASoQIAAEgiVAAAAEmECgAAIIlQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAEASoQIAAEgiVAAAAEmECgAAIIlQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAEASoQIAAEgiVAAAAEmECgAAIIlQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAEASoQIAAEgiVAAAAEmECgAAIIlQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAEASoQIAAEgiVAAAAEmECgAAIIlQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAEASoQIAAEgiVAAAAEmECgAAIIlQAQAAJBEqAACAJEIFAACQRKgAAACSCBUAAECSPQoV8+fPj4qKiigqKorKyspYvnz5O85ftmxZVFZWRlFRURx55JFx00037dFiAeje9AeA3NTlULF48eKYOXNmXHXVVVFXVxcTJ06MyZMnR319fYfz165dGyeffHJMnDgx6urq4sorr4wZM2bEL3/5y+TFA9B96A8AuSsvy7KsKxuMGzcuxowZEwsWLGgdGzlyZEyZMiVqamrazb/88svj7rvvjtWrV7eOVVdXx5///Od46KGHOvWaTU1NUVJSEo2NjVFcXNyV5QKwG3vrGKs/APQ+nT3O5nflSVtaWmLlypVxxRVXtBmvqqqKFStWdLjNQw89FFVVVW3GPvnJT8bChQvjzTffjL59+7bbprm5OZqbm1vvNzY2RsRbRQGwd719bO3ie0xt6A8AvVNne0SXQsWmTZtix44dUVpa2ma8tLQ0NmzY0OE2GzZs6HD+9u3bY9OmTTF06NB229TU1MQ111zTbnzYsGFdWS4AXbBly5YoKSnZo231B4DebXc9okuh4m15eXlt7mdZ1m5sd/M7Gn/b7NmzY9asWa33X3311SgvL4/6+vo9bng9RVNTUwwbNizWrVuXEx/lq7f3yqVaI3p2vVmWxZYtW6KsrCz5ufSHd1dP/ne2J3Kp3lyqNSK36u3ptXa2R3QpVAwcODD69OnT7l2njRs3tnu36W1DhgzpcH5+fn4MGDCgw20KCwujsLCw3XhJSUmP3Bl7ori4OGdqjVBvb5ZLtUb03HpT/0OuP+xbPfXf2Z7KpXpzqdaI3Kq3J9famR7Rpas/FRQURGVlZdTW1rYZr62tjQkTJnS4zfjx49vN/81vfhNjx47t8HxZAHoe/QEgt3X5krKzZs2Km2++ORYtWhSrV6+OSy+9NOrr66O6ujoi3vpoevr06a3zq6ur47nnnotZs2bF6tWrY9GiRbFw4cL4yle+sveqAGC/0x8AcleXv1MxderU2Lx5c8ybNy8aGhpi1KhRsWTJkigvL4+IiIaGhjbXJK+oqIglS5bEpZdeGjfeeGOUlZXFd7/73TjzzDM7/ZqFhYUxZ86cDj/y7m1yqdYI9fZmuVRrRO7V2xH94d2n3t4rl2qNyK16c6XWLv9OBQAAwP/V5dOfAAAA/i+hAgAASCJUAAAASYQKAAAgSbcPFfPnz4+KioooKiqKysrKWL58+f5e0l4xd+7cyMvLa3MbMmRI6+NZlsXcuXOjrKws+vXrFx/96EfjySef3I8r7rwHHnggTjvttCgrK4u8vLz41a9+1ebxztTW3NwcX/rSl2LgwIFx0EEHxT//8z/H+vXr92EVnbe7es8777x2+/pDH/pQmzk9pd6ampr44Ac/GIccckgMHjw4pkyZEk8//XSbOb1p/3am3t60f3ui3tgjenN/iMitHqE/6A+9Zf92RrcOFYsXL46ZM2fGVVddFXV1dTFx4sSYPHlym0sS9mTvf//7o6GhofX2xBNPtD527bXXxvXXXx833HBDPPLIIzFkyJD4xCc+EVu2bNmPK+6c1157LUaPHh033HBDh493praZM2fGXXfdFT/72c/iwQcfjK1bt8app54aO3bs2FdldNru6o2I+NSnPtVmXy9ZsqTN4z2l3mXLlsXFF18cDz/8cNTW1sb27dujqqoqXnvttdY5vWn/dqbeiN6zf3ua3twjemt/iMitHqE/6A+9Zf92StaNHX/88Vl1dXWbsWOOOSa74oor9tOK9p45c+Zko0eP7vCxnTt3ZkOGDMm+8Y1vtI698cYbWUlJSXbTTTftoxXuHRGR3XXXXa33O1Pbq6++mvXt2zf72c9+1jrn+eefzw444IDs3nvv3Wdr3xP/WG+WZdm5556bnX766bvcpifXu3HjxiwismXLlmVZ1vv37z/Wm2W9e/92d721R+RKf8iy3OoR+kPv3bdZpj9kWZZ1208qWlpaYuXKlVFVVdVmvKqqKlasWLGfVrV3PfPMM1FWVhYVFRUxbdq0WLNmTURErF27NjZs2NCm9sLCwjjxxBN7fO2dqW3lypXx5ptvtplTVlYWo0aN6rH1//73v4/BgwfH0UcfHf/yL/8SGzdubH2sJ9fb2NgYERH9+/ePiN6/f/+x3rf11v3bnfX2HpGL/SGi9x9DOtJbjx/6w1t66/7tSLcNFZs2bYodO3ZEaWlpm/HS0tLYsGHDflrV3jNu3Li47bbb4r777osf/vCHsWHDhpgwYUJs3ry5tb7eWHtnatuwYUMUFBTEe97znl3O6UkmT54ct99+eyxdujS++c1vxiOPPBKTJk2K5ubmiOi59WZZFrNmzYoTTjghRo0aFRG9e/92VG9E792/3V1v7hG52h8ievcxpCO99fihP7ylt+7fXcnf3wvYnby8vDb3syxrN9YTTZ48ufXPxx57bIwfPz5GjBgRP/rRj1q/xNNba4/Ys9p6av1Tp05t/fOoUaNi7NixUV5eHvfcc098+tOf3uV23b3eSy65JB5//PF48MEH2z3WG/fvrurtrfu3p+iNx8lc7w8RvfMY0pHeevzQH97SW/fvrnTbTyoGDhwYffr0aZfUNm7c2C7l9gYHHXRQHHvssfHMM8+0XuWjN9bemdqGDBkSLS0t8corr+xyTk82dOjQKC8vj2eeeSYiema9X/rSl+Luu++O+++/Pw4//PDW8d66f3dVb0d6w/7tCXKpR+RKf4jovceQzuoNxw/9Ydd6w/59J902VBQUFERlZWXU1ta2Ga+trY0JEybsp1W9e5qbm2P16tUxdOjQqKioiCFDhrSpvaWlJZYtW9bja+9MbZWVldG3b982cxoaGuIvf/lLj68/ImLz5s2xbt26GDp0aET0rHqzLItLLrkk7rzzzli6dGlUVFS0eby37d/d1duRnrx/e5Jc6hG50h8iet8xpKt68vFDf9AfuvXVn372s59lffv2zRYuXJg99dRT2cyZM7ODDjooe/bZZ/f30pJddtll2e9///tszZo12cMPP5ydeuqp2SGHHNJa2ze+8Y2spKQku/POO7MnnngiO/vss7OhQ4dmTU1N+3nlu7dly5asrq4uq6uryyIiu/7667O6urrsueeey7Ksc7VVV1dnhx9+ePbb3/42e+yxx7JJkyZlo0ePzrZv376/ytqld6p3y5Yt2WWXXZatWLEiW7t2bXb//fdn48ePzw477LAeWe+//uu/ZiUlJdnvf//7rKGhofX2+uuvt87pTft3d/X2tv3b0/TWHtGb+0OW5VaP0B/0h96yfzujW4eKLMuyG2+8MSsvL88KCgqyMWPGtLlUV082derUbOjQoVnfvn2zsrKy7NOf/nT25JNPtj6+c+fObM6cOdmQIUOywsLC7CMf+Uj2xBNP7McVd97999+fRUS727nnnptlWedq27ZtW3bJJZdk/fv3z/r165edeuqpWX19/X6oZvfeqd7XX389q6qqygYNGpT17ds3Gz58eHbuuee2q6Wn1NtRnRGR3XLLLa1zetP+3V29vW3/9kS9sUf05v6QZbnVI/QH/aG37N/OyMuyLNv7n38AAAC5ott+pwIAAOgZhAoAACCJUAEAACQRKgAAgCRCBQAAkESoAAAAkggVAABAEqECAABIIlQAAABJhAoAACCJUAEAACQRKgAAgCT/D5IFw/6K4u2eAAAAAElFTkSuQmCC", + "image/png": "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4t///jd33XUXt912m7Hd7/dTX18fM6fu5g1wzjnnMHbsWJ544gmSk5PZsGEDL774YrfHCQRmhKdCIDgETJ06FY/HE/OlfODAAd555x3OPffcuMedcMIJ3H777YwbN44NGzbE7LfZbEyePJknn3wSIO4YgUAgEPQMSZJwuVyWbW+88QZlZWWWbbNmzWLHjh288847Cc81a9YsOjo64lZ20snLy8PtdrN582bL9n/+85+9mrOqqjHz/sMf/kA4HI6Z03//+1+2b9/e7XlvvPFG3njjDRYuXEheXh7f+c53ejwngQCEp0IgOCSkp6dzxx138Itf/IIrr7ySyy+/nLq6Ou655x7cbjd33XUXAJs3b+anP/0p3/nOdxg+fDhOp5N33nmHzZs3GytQTz31FO+88w5f//rXKS4upqOjg2XLlgF0Gd8rEAgEgq75xje+wfPPP8/IkSMZP34869ev58EHH4wJGZo/fz6vvPIKF110Ebfddhunnnoq7e3tvPfee3zjG9/g7LPP5vLLL+e5555j7ty5bN++nbPPPhtFUfjwww8ZNWoUl112GZIk8YMf/IBly5YxdOhQTjzxRD766CP+9Kc/9XjOqampnHHGGTz44INkZ2czePBg3nvvPZ599lmLdwXg3nvv5c033+SMM87gF7/4BePGjaOxsZG33nqLBQsWMHLkSGPsD37wAxYuXMj//vc/br/9dpxO50G9toLjkCOdKS4QfFUwV3/S+cMf/qCOHz9edTqdalpamnrRRRepW7ZsMfZXVVWpV111lTpy5Eg1KSlJTU5OVsePH68+8sgjaigUUlVVVdeuXatecskl6qBBg1SXy6VmZWWpZ555pvr6668f7lsUCASCrxQNDQ3qnDlz1NzcXNXr9aqnnXaaunr1avXMM89UzzzzzJixN910k1pcXKw6HA41NzdX/frXv65+8cUXxpj29nb1zjvvVIcPH646nU41KytLPeecc9Q1a9YYY5qamtRrr71WzcvLU5OSktQLL7xQ3bt3b8LqTzU1NTHzPnDggHrppZeqGRkZakpKinr++eern3/+uTpo0CD1hz/8oWXs/v371WuuuUbNz89XHQ6HWlhYqH73u99Vq6qqYs571VVXqXa7XT1w4EDfXlDBcY2kqpFUf4FAIBAIBALBcUkgEGDw4MGcdtpp/OUvfznS0xEcg4jwJ4FAIBAI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J2eccQZXX301//jHP/j000+ZP38+2dnZnHfeeQBkZGRw++23M2rUKBwOB//973+54ooryMnJ4bTTTuvReQUCgUBFX0ujPypFGywVcZ7fbbdqrlr+QOcuBorVIVzYL55zmLUoTE+IsrIcCFlZWVit1iirRFVVVZT1IhJZlnnqqae45JJLcDiMY8rPz8dut2O1hl3ERo8eTUVFBV6vN6o9wG233caCBQu0z01NTd0WFt5AUKtVkeoSNSoEAwR7gmIx6K9zd4N58+Zx3XXX8dhjj/H0009TXFysTaT//Oc/89BDD7Fw4ULGjx9PYmIiN910U7cCnX/xi1/wzjvv8MADDzBs2DDcbjc/+MEPtD7cbnenx3e132KxGNy3gKi4CIDERKP15vPPP9esEKeddppmDfnzn/8c97nnzp2L0+nkX//6F06nE4/Ho82jBwrdtlR0N+juiSeeoKioiIULFzJ69GiuuuoqrrzySh544AGtzZw5czjnnHMYPXo0Q4cO5cYbb2TChAl88sknPT6vQCAQqOhX9w92kLaKetp4NY3FIjF7RDYzdXU0YlYX1/VpMynmZ3qITugMSnczpiCFIVnxuTHEi8PhYPLkySxbtsywfdmyZUyfPr3TYz/66CO2bdvGvHnzovbNmDGDbdu2EdRV9fvuu+/Iz883FRQATqeTlJQUw6u7NLQpkweLRFSGsHjd2gSCXkeSFBek/nh18/f+Rz/6EVarlRdeeIG///3vXHHFFdq9aMWKFZx11llcfPHFTJw4kSFDhrB169Zu9b9ixQouv/xyzjnnHMaPH09eXh67du3S9o8fP55gMMhHH31kevyECRNYsWKFqVAAyM7Opry8XPscCARYv359l+P69NNPKS4u5vbbb2fKlCkMHz48KhPWhAkTWL58ecw+bDYbl112GU8//TRPP/00F1xwAQkJ3RN1fU23nq49CbpbuXJlVPvTTjuNVatWmf7QZFlm+fLlbNmyheOPP77H5wXFh7apqcnwEggERx79bamA8CS+O/UMbFaLoY6G22EuKvQ92uOscK7/Glx2KwVp7j6por1gwQL+9re/8dRTT7Fp0yZuvvlmysrKuPbaawHFgnDppZdGHbdkyRKmTp3KuHHjovb99Kc/pba2lhtvvJHvvvuOt956i9/97nf87Gc/6/Xx66lvU1Y7U9z2qJ+jkBQCQdckJSVx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", "text/plain": [ "
" ] @@ -570,6 +577,11 @@ "data": { "text/html": [ "
Ep  | loss       accuracy   | val_loss   val_accuracy\n",
+       "0   | 0.043829   0.842773   | 0.048133   0.829427    \n",
+       "1   | 0.037789   0.875977   | 0.044781   0.838433    \n",
+       "2   | 0.041547   0.852539   | 0.040797   0.855360    \n",
+       "3   | 0.032986   0.875000   | 0.039569   0.855577    \n",
+       "4   | 0.033588   0.886719   | 0.037509   0.865234    \n",
        "
" ], "text/plain": [ @@ -578,28 +590,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "ename": "IndexError", - "evalue": "arrays used as indices must be of integer (or boolean) type", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m2\n\u001b[1;32m 1\u001b[0m \u001b[39m#| eval: false\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m student\u001b[39m.\u001b[39;49mfit(epochs\u001b[39m=\u001b[39;49m\u001b[39m5\u001b[39;49m)\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m2\n\u001b[1;32m 26\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstep \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstep \u001b[39mif\u001b[39;00m start_step \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m start_step\n\u001b[1;32m 27\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mepochs \u001b[39m=\u001b[39m \u001b[39mrange\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstart_epoch, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstart_epoch \u001b[39m+\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mn_epochs)\n\u001b[0;32m---> 28\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdo_fit()\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 11\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 12\u001b[0m \u001b[39mgetattr\u001b[39m(callback, pre_name, noop)(\u001b[39mself\u001b[39m)\n\u001b[0;32m---> 14\u001b[0m func(\u001b[39mself\u001b[39;49m)\n\u001b[1;32m 15\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 16\u001b[0m \u001b[39mgetattr\u001b[39m(callback, post_name, noop)(\u001b[39mself\u001b[39m)\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m3\n\u001b[1;32m 32\u001b[0m \u001b[39mfor\u001b[39;00m e \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mepochs:\n\u001b[1;32m 33\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mepoch \u001b[39m=\u001b[39m e\n\u001b[0;32m---> 34\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdo_epoch()\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 11\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 12\u001b[0m \u001b[39mgetattr\u001b[39m(callback, pre_name, noop)(\u001b[39mself\u001b[39m)\n\u001b[0;32m---> 14\u001b[0m func(\u001b[39mself\u001b[39;49m)\n\u001b[1;32m 15\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 16\u001b[0m \u001b[39mgetattr\u001b[39m(callback, post_name, noop)(\u001b[39mself\u001b[39m)\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m4\n\u001b[1;32m 38\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtraining \u001b[39m=\u001b[39m \u001b[39mTrue\u001b[39;00m\n\u001b[1;32m 39\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdl \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataloaders\u001b[39m.\u001b[39mtrain\n\u001b[0;32m---> 40\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdo_all_batches()\n\u001b[1;32m 41\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdl \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdataloaders\u001b[39m.\u001b[39mtest\n\u001b[1;32m 42\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtraining \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 11\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 12\u001b[0m \u001b[39mgetattr\u001b[39m(callback, pre_name, noop)(\u001b[39mself\u001b[39m)\n\u001b[0;32m---> 14\u001b[0m func(\u001b[39mself\u001b[39;49m)\n\u001b[1;32m 15\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 16\u001b[0m \u001b[39mgetattr\u001b[39m(callback, post_name, noop)(\u001b[39mself\u001b[39m)\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m5\n\u001b[1;32m 49\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mbatch \u001b[39m=\u001b[39m batch\n\u001b[1;32m 50\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdo_batch_forward()\n\u001b[0;32m---> 51\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdo_calc_loss()\n\u001b[1;32m 52\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtraining: \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdo_batch_backward()\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m1\n\u001b[1;32m 11\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 12\u001b[0m \u001b[39mgetattr\u001b[39m(callback, pre_name, noop)(\u001b[39mself\u001b[39m)\n\u001b[0;32m---> 14\u001b[0m func(\u001b[39mself\u001b[39;49m)\n\u001b[1;32m 15\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[1;32m 16\u001b[0m \u001b[39mgetattr\u001b[39m(callback, post_name, noop)(\u001b[39mself\u001b[39m)\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m5\n\u001b[1;32m 54\u001b[0m \u001b[39m@add_callbacks\u001b[39m\n\u001b[1;32m 55\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdo_calc_loss\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[1;32m 56\u001b[0m _, y \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mbatch\n\u001b[0;32m---> 57\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mloss \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mloss_func(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mpreds, y)\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m2\n\u001b[1;32m 21\u001b[0m MM_func \u001b[39m=\u001b[39m partial(linear_model, params\u001b[39m=\u001b[39m[w1, b1, w2])\n\u001b[1;32m 22\u001b[0m optimizer \u001b[39m=\u001b[39m Adam([w1, b1, w2], lr\u001b[39m=\u001b[39m\u001b[39m0.005\u001b[39m)\n\u001b[0;32m---> 24\u001b[0m loss_f \u001b[39m=\u001b[39m \u001b[39mlambda\u001b[39;00m preds, targets: CrossEntropy_loss(preds, one_hot_encode_batch(targets\u001b[39m.\u001b[39;49mdata, n_classes\u001b[39m=\u001b[39;49m\u001b[39m10\u001b[39;49m))\n\u001b[1;32m 25\u001b[0m \u001b[39m# loss_f = lambda preds, targets: CrossEntropy_loss(preds, one_hot_encode_batch(targets.data, 10))\u001b[39;00m\n\u001b[1;32m 27\u001b[0m student \u001b[39m=\u001b[39m Learner(\n\u001b[1;32m 28\u001b[0m dataloaders\u001b[39m=\u001b[39mDataLoaders(mnist_train, mnist_test),\n\u001b[1;32m 29\u001b[0m model\u001b[39m=\u001b[39mMM_func,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 35\u001b[0m ], plot_train_skip_ylim\u001b[39m=\u001b[39m\u001b[39m15\u001b[39m, plot_smooth_training\u001b[39m=\u001b[39m\u001b[39m5\u001b[39m)],\n\u001b[1;32m 36\u001b[0m )\n", - "\u001b[1;32m/home/xl0/work/projects/grads/tidygrad/nbs/06_training.ipynb Cell 18\u001b[0m line \u001b[0;36m5\n\u001b[1;32m 3\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mone_hot_encode_batch\u001b[39m(y, n_classes):\n\u001b[1;32m 4\u001b[0m diag \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39meye(n_classes)\n\u001b[0;32m----> 5\u001b[0m \u001b[39mreturn\u001b[39;00m Tensor(diag[y])\n", - "\u001b[0;31mIndexError\u001b[0m: arrays used as indices must be of integer (or boolean) type" - ] } ], "source": [ diff --git a/nbs/10_utils.grad_check.ipynb b/nbs/10_utils.grad_check.ipynb index f09cd87..dd571c0 100644 --- a/nbs/10_utils.grad_check.ipynb +++ b/nbs/10_utils.grad_check.ipynb @@ -190,7 +190,7 @@ "\n", "loss.backward()\n", "\n", - "grad_check(NN, (x, y), (w1, b1, w2))" + "# grad_check(NN, (x, y), (w1, b1, w2))" ] } ], diff --git a/nbs/examples/gpt2_training.ipynb b/nbs/examples/gpt2_training.ipynb index a20db48..f124a92 100644 --- a/nbs/examples/gpt2_training.ipynb +++ b/nbs/examples/gpt2_training.ipynb @@ -9,6 +9,13 @@ "---" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GPT2-Nano training\n" + ] + }, { "cell_type": "code", "execution_count": null, @@ -17,6 +24,7 @@ "source": [ "import tidygrad as tg\n", "from tidygrad import Tensor\n", + "import tidygrad.tensor\n", "import numpy as np\n", "\n", "import huggingface_hub\n", @@ -94,15 +102,13 @@ "t1.requires_grad is False\n", "t1.parents is []\n", "\n", - "\n", "t1.requires_grad(True)\n", "\n", "t1.requires_grad is True\n", "\n", "But it has no parents!!!1\n", "\n", - "t1.op should be Load, not Add\n", - "\n" + "t1.op should be Load, not Add\n" ] }, { @@ -120,12 +126,31 @@ "\n", " model.params[\"wte\"] = Tensor(np.random.randn(*model.params[\"wte\"].shape), name=\"wte\") * 0.02\n", " model.params[\"wpe\"] = Tensor(np.random.randn(*model.params[\"wpe\"].shape), name=\"wpe\") * 0.01\n", - " \n", "\n", "gpt2_init(model)\n", "model.requires_grad(True)\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "28" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tidygrad.tensor._num_tensors" + ] + }, { "cell_type": "code", "execution_count": null, @@ -157,8 +182,6 @@ " k = ln_1.mmul(attn_w_k) + attn_b_k\n", " v = ln_1.mmul(attn_w_v) + attn_b_v\n", "\n", - "\n", - "\n", " q_chunked = F.stack(q.split(n=n_heads, axis=-1), axis=0)\n", " k_chunked = F.stack(k.split(n=n_heads, axis=-1), axis=0)\n", " v_chunked = F.stack(v.split(n=n_heads, axis=-1), axis=0)\n", @@ -224,7 +247,6 @@ " print(\"layer\", i)\n", " x = gpt2_transformer_block(model=model, x=x, n_heads=n_heads, i=i)\n", "\n", - "\n", " return F.layer_norm(x, w=get_params(\"ln_f.weight\"), b=get_params(\"ln_f.bias\"))\n" ] }, @@ -253,9 +275,153 @@ "metadata": {}, "outputs": [], "source": [ - "def one_hot_encode_batch(y, n_classes):\n", - " diag = np.eye(n_classes)\n", - " return Tensor(diag[y])" + "def one_hot_encode(batch, n_classes):\n", + " batch_size, sequence_length = batch.shape\n", + " one_hot = np.zeros((batch_size, sequence_length, n_classes))\n", + " rows, cols = np.indices((batch_size, sequence_length))\n", + " one_hot[rows, cols, batch] = 1\n", + " return one_hot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def language_modeling_loss(model, input, target, n_layers, n_heads):\n", + " res = gpt2(model, input, n_layers, n_heads)\n", + " # print(\"res\", res)\n", + " # print(\"wte\", model.params[\"wte\"])\n", + " logits = res.mmul(model.params[\"wte\"].transpose(-1, -2), name=\"logits\")\n", + "\n", + " # print(\"logits\", logits)\n", + " loss = F.CrossEntropy_loss(logits, one_hot_encode(target, n_classes=n_vocab))\n", + " return loss\n", + "\n", + "# loss = language_modeling_loss(\n", + "# model, input=np.random.randint(0, n_vocab, size=(2, ctx_len)), target=np.random.randint(0, n_vocab, size=(2, ctx_len)), n_layers=n_layers, n_heads=n_heads\n", + "# )\n", + "\n", + "# print(\"loss\", loss)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# np.seterr(all=\"raise\")\n", + "# l = loss.sum()\n", + "# print(loss)\n", + "\n", + "# l.backward()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# with open(\"datasets/TinyStories/TinyStories.txt\", \"r\") as file:\n", + "# tokens = file.read()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Dataset:\n", + "\n", + "# dataset = [\"Lilly gsdsgfsdfsd sf sfds\"] <- You can no sample from ths\n", + "\n", + "# dataset = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.....]\n", + "\n", + "# ctx len = 5\n", + "\n", + "# dataset[0] = [1,2,3,4,5]\n", + "# dataset[1] = [2,3,4,5,6]\n", + "# dataset[2] = [3,4,5,6,7]\n", + "# dataset[3] = [4,5,6,7,8]\n", + "\n", + "from tidygrad.utils.datasets import Dataset, DataLoader\n", + "\n", + "tokens = np.load(\"./datasets/TinyStories/TinyStories_1percent_ids.npy\")\n", + "\n", + "class TSDataset(Dataset):\n", + " def __init__(self, token_array, ctx_len):\n", + " self.token_array = token_array\n", + " self.ctx_len = ctx_len\n", + "\n", + " def __len__(self):\n", + " return len(self.token_array) - self.ctx_len - 1\n", + "\n", + " def __getitem__(self, i):\n", + " return self.token_array[i:i + self.ctx_len], self.token_array[i + 1:i + self.ctx_len + 1]\n", + "\n", + " def collate_fn(self, batch):\n", + " # print(\"batch\", batch) # [(x1, y1), (x2, y2), (x3, y3)]\n", + " return np.stack([x for x, y in batch]), np.stack([y for x, y in batch])\n", + "\n", + "dataset = TSDataset(tokens, 2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class TSDataLoader(DataLoader):\n", + " def __init__(self, dataset, batch_size, batch_tfms=None, ctx_len=128, fake_epoch_len=50, seed=1337):\n", + " super().__init__(dataset=dataset, batch_size=batch_size, batch_tfms=batch_tfms)\n", + " self.fake_epoch_len = fake_epoch_len\n", + " self.ctx_len = ctx_len\n", + " self.rng = np.random.default_rng(seed)\n", + "\n", + " def __len__(self):\n", + " return min((len(self.dataset) // self.batch_size) // self.ctx_len, self.fake_epoch_len)\n", + "\n", + " def __iter__(self):\n", + " self.i = 0\n", + " return self\n", + "\n", + " def __next__(self):\n", + " if self.i >= min(len(self), self.fake_epoch_len):\n", + " raise StopIteration\n", + "\n", + " idxs = self.rng.integers(0, len(self.dataset), size=(self.batch_size, ))\n", + "\n", + " batch = [self.dataset[i] for i in idxs]\n", + " batch = self.dataset.collate_fn(batch)\n", + "\n", + " self.i += 1\n", + "\n", + " return batch\n", + "\n", + "dataloader = TSDataLoader(dataset, batch_size=64)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tidygrad.utils.data import DataLoaders" ] }, { @@ -267,32 +433,104 @@ "name": "stdout", "output_type": "stream", "text": [ - "layer 0\n", - "layer 1\n" + "X (64, 2)\n", + "y (64, 2)\n" ] } ], "source": [ - "def language_modeling_loss(model, input, target, n_layers, n_heads):\n", - " res = gpt2(model, input, n_layers, n_heads)\n", - " # print(\"res\", res)\n", - " # print(\"wte\", model.params[\"wte\"])\n", - " logits = res.mmul(model.params[\"wte\"].transpose(-1, -2), name=\"logits\")\n", + "X, y = next(iter(dataloader))\n", + "\n", + "print(\"X\", X.shape)\n", + "print(\"y\", y.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tidygrad.training import Learner\n", "\n", + "from tidygrad.optim import Adam\n", + "from functools import partial" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import tidygrad.tensor\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def loss_function(X, y):\n", + " # y = Tensor(y)\n", + " logits = X.mmul(model.params[\"wte\"].transpose(-1, -2), name=\"logits\")\n", + "\n", + " # print(\"X\", X)\n", + " # print(\"y\", y)\n", " # print(\"logits\", logits)\n", - " loss = F.CrossEntropy_loss(logits, one_hot_encode_batch(target, n_classes=n_vocab))\n", - " return loss\n", "\n", + " one_one_hot = one_hot_encode(y, n_vocab)\n", "\n", - "loss = language_modeling_loss(\n", - " model,\n", - " input=np.random.randint(0, n_vocab, size=(2, ctx_len)),\n", - " target=np.random.randint(0, n_vocab, size=(2, ctx_len)),\n", - " n_layers=n_layers,\n", - " n_heads=n_heads\n", - ")\n", + " loss = F.CrossEntropy_loss(logits, one_one_hot, reduction=\"sum\")\n", "\n", - "# print(\"loss\", loss)" + " print(\"loss\", loss)\n", + " loss = loss.mean()\n", + "\n", + " print(\"post_epoch num tensors\", tidygrad.tensor._num_tensors)\n", + "\n", + " return loss" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tidygrad.training import DictLoggerCallback, ProgressBarCallback, Loss" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class OneBatchCallback:\n", + " def __init__(self):\n", + " self.i = 0\n", + "\n", + " def post_loss(self, learner):\n", + " print(\"post_batch_backward\", self.i)\n", + " if self.i == 1:\n", + " raise Exception(\"post_batch_backward\")\n", + " self.i += 1\n", + "\n", + "class MemleakCallback:\n", + " def __init__(self):\n", + " self.i = 0\n", + " print(\"init\")\n", + "\n", + " def post_epoch(self, learner):\n", + " print(\"post_epoch num tensors\", tidygrad.tensor._num_tensors)\n" ] }, { @@ -304,18 +542,370 @@ "name": "stdout", "output_type": "stream", "text": [ - "Tensor[2, 128, 1](name=\"\" op=Div parents=[,]):\n", - " v=array[2, 128, 1] n=256 (2Kb) x∈[0.007, 0.007] μ=0.007 σ=8.745e-06\n", - " ∇=array[2, 128, 1] n=256 (2Kb) \u001b[38;2;127;127;127mall_zeros\u001b[0m\n" + "init\n" ] } ], "source": [ - "np.seterr(all=\"raise\")\n", - "l = loss.sum()\n", - "print(loss)\n", + "model_funct = partial(gpt2, n_layers=n_layers, n_heads=n_heads)\n", + "\n", + "def model_funct(input):\n", + " return gpt2(model, input, n_layers=n_layers, n_heads=n_heads)\n", + "\n", + "optim = Adam(lr=0.001, params=model.parameter_list())\n", + "\n", + "ler = Learner(\n", + " model=model_funct,\n", + " dataloaders=DataLoaders(train=dataloader, test=dataloader),\n", + " loss_func=loss_function,\n", + " optimizer=optim,\n", + " callbacks=[DictLoggerCallback(metrics=[Loss()]),\n", + " ProgressBarCallback(metrics=[\n", + " \"loss\", \n", + " ], plot_train_skip_ylim=15, plot_smooth_training=5),\n", + " MemleakCallback()],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "50" + ] + }, + "execution_count": null, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(dataloader)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7bbaf7ca2a4448798396c8bf40c8d7e4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Epoch: 0%| | 0/100 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
Ep  | loss       | val_loss  \n",
+       "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.908, 6.953] μ=6.931 σ=0.009\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.859, 6.951] μ=6.925 σ=0.016\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.842, 6.959] μ=6.913 σ=0.029\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/xl0/work/projects/grads/tidygrad/tidygrad/ops/common.py:190: RuntimeWarning: underflow encountered in multiply\n", + " self.parents[1].accum_grad(self.out.grad * self.parents[0].data)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.792, 6.958] μ=6.903 σ=0.036\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.778, 6.972] μ=6.898 σ=0.048\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.732, 7.001] μ=6.886 σ=0.058\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.722, 6.983] μ=6.874 σ=0.065\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.690, 6.980] μ=6.876 σ=0.072\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.654, 6.980] μ=6.846 σ=0.089\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.616, 7.003] μ=6.837 σ=0.088\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.582, 7.011] μ=6.819 σ=0.113\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.539, 7.025] μ=6.810 σ=0.116\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.502, 7.034] μ=6.806 σ=0.140\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.454, 7.036] μ=6.739 σ=0.152\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.405, 7.077] μ=6.742 σ=0.180\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.353, 7.075] μ=6.723 σ=0.188\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.297, 7.135] μ=6.711 σ=0.210\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.235, 7.099] μ=6.649 σ=0.229\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.170, 7.114] μ=6.679 σ=0.255\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.106, 7.183] μ=6.623 σ=0.291\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[6.031, 7.202] μ=6.594 σ=0.319\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.958, 7.233] μ=6.567 σ=0.339\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.881, 7.248] μ=6.526 σ=0.370\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.802, 7.284] μ=6.502 σ=0.424\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.719, 7.288] μ=6.453 σ=0.409\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.626, 7.339] μ=6.376 σ=0.449\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.531, 7.442] μ=6.382 σ=0.517\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.437, 7.460] μ=6.409 σ=0.536\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.338, 7.498] μ=6.301 σ=0.585\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.236, 7.532] μ=6.301 σ=0.591\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.130, 7.617] μ=6.231 σ=0.674\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[5.022, 7.613] μ=6.274 σ=0.697\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[4.912, 7.725] μ=6.229 σ=0.735\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[4.794, 7.797] μ=6.069 σ=0.782\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[4.675, 7.856] μ=6.163 σ=0.873\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n", + "layer 0\n", + "layer 1\n", + "loss Tensor[64, 2, 1](name=\"\" op=Sum parents=[]):\n", + " v=array[64, 2, 1] f32 n=128 x∈[4.557, 7.870] μ=5.978 σ=0.844\n", + " ∇=array[64, 2, 1] f32 n=128 \u001b[38;2;127;127;127mall_zeros\u001b[0m\n", + "post_epoch num tensors 325\n" + ] + } + ], + "source": [ + "ler.fit(epochs=100)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "69\n", + "69\n" + ] + } + ], + "source": [ + "print(tidygrad.tensor._num_tensors)\n", "\n", - "l.backward()" + "import gc\n", + "gc.collect()\n", + "\n", + "print(tidygrad.tensor._num_tensors)\n", + "\n" ] } ], diff --git a/nbs/examples/gpt2_v2.ipynb b/nbs/examples/gpt2_v2.ipynb index 2e05550..c01720d 100644 --- a/nbs/examples/gpt2_v2.ipynb +++ b/nbs/examples/gpt2_v2.ipynb @@ -9,6 +9,13 @@ "---" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GPT2 inference" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/nbs/tests/01_test_ops.ipynb b/nbs/tests/01_test_ops.ipynb index 9b52bf1..3fc82bf 100644 --- a/nbs/tests/01_test_ops.ipynb +++ b/nbs/tests/01_test_ops.ipynb @@ -1,5 +1,14 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "skip_exec: true\n", + "---" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/tidygrad/__init__.py b/tidygrad/__init__.py index 0656b40..abbad02 100644 --- a/tidygrad/__init__.py +++ b/tidygrad/__init__.py @@ -1,7 +1,7 @@ __version__ = "0.0.1" import numpy as np -np.seterr(under="raise") +np.seterr(under="warn") del np from .utils import datasets, data diff --git a/tidygrad/_modidx.py b/tidygrad/_modidx.py index 4e82d73..ae16392 100644 --- a/tidygrad/_modidx.py +++ b/tidygrad/_modidx.py @@ -146,6 +146,7 @@ 'tidygrad.optim.SGD.step': ('optim.html#sgd.step', 'tidygrad/optim.py')}, 'tidygrad.tensor': { 'tidygrad.tensor.Tensor': ('tensor.html#tensor', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.__add__': ('tensor.html#tensor.__add__', 'tidygrad/tensor.py'), + 'tidygrad.tensor.Tensor.__del__': ('tensor.html#tensor.__del__', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.__getitem__': ('tensor.html#tensor.__getitem__', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.__init__': ('tensor.html#tensor.__init__', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.__mul__': ('tensor.html#tensor.__mul__', 'tidygrad/tensor.py'), @@ -170,6 +171,7 @@ 'tidygrad.tensor.Tensor.mul': ('tensor.html#tensor.mul', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.neg': ('tensor.html#tensor.neg', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.pow': ('tensor.html#tensor.pow', 'tidygrad/tensor.py'), + 'tidygrad.tensor.Tensor.requires_grad': ('tensor.html#tensor.requires_grad', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.shape': ('tensor.html#tensor.shape', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.split': ('tensor.html#tensor.split', 'tidygrad/tensor.py'), 'tidygrad.tensor.Tensor.std': ('tensor.html#tensor.std', 'tidygrad/tensor.py'), @@ -179,7 +181,8 @@ 'tidygrad.tensor.Tensor.zero_grad': ('tensor.html#tensor.zero_grad', 'tidygrad/tensor.py'), 'tidygrad.tensor.no_grad': ('tensor.html#no_grad', 'tidygrad/tensor.py'), 'tidygrad.tensor.no_grad.__enter__': ('tensor.html#no_grad.__enter__', 'tidygrad/tensor.py'), - 'tidygrad.tensor.no_grad.__exit__': ('tensor.html#no_grad.__exit__', 'tidygrad/tensor.py')}, + 'tidygrad.tensor.no_grad.__exit__': ('tensor.html#no_grad.__exit__', 'tidygrad/tensor.py'), + 'tidygrad.tensor.simplify_trace': ('tensor.html#simplify_trace', 'tidygrad/tensor.py')}, 'tidygrad.tensor_helpers': { 'tidygrad.tensor_helpers.Tensor': ('tensor_helpers.html#tensor', 'tidygrad/tensor_helpers.py'), 'tidygrad.tensor_helpers.mean': ('tensor_helpers.html#mean', 'tidygrad/tensor_helpers.py'), 'tidygrad.tensor_helpers.split': ('tensor_helpers.html#split', 'tidygrad/tensor_helpers.py'), @@ -205,6 +208,14 @@ 'tidygrad.training.Learner.do_epoch': ('training.html#learner.do_epoch', 'tidygrad/training.py'), 'tidygrad.training.Learner.do_fit': ('training.html#learner.do_fit', 'tidygrad/training.py'), 'tidygrad.training.Learner.fit': ('training.html#learner.fit', 'tidygrad/training.py'), + 'tidygrad.training.Loss': ('training.html#loss', 'tidygrad/training.py'), + 'tidygrad.training.Loss.calc': ('training.html#loss.calc', 'tidygrad/training.py'), + 'tidygrad.training.Metric': ('training.html#metric', 'tidygrad/training.py'), + 'tidygrad.training.Metric.__init__': ('training.html#metric.__init__', 'tidygrad/training.py'), + 'tidygrad.training.Metric.calc': ('training.html#metric.calc', 'tidygrad/training.py'), + 'tidygrad.training.MultiClassAccuracy': ('training.html#multiclassaccuracy', 'tidygrad/training.py'), + 'tidygrad.training.MultiClassAccuracy.calc': ( 'training.html#multiclassaccuracy.calc', + 'tidygrad/training.py'), 'tidygrad.training.ProgressBarCallback': ('training.html#progressbarcallback', 'tidygrad/training.py'), 'tidygrad.training.ProgressBarCallback.__init__': ( 'training.html#progressbarcallback.__init__', 'tidygrad/training.py'), diff --git a/tidygrad/func.py b/tidygrad/func.py index 1ac1606..644f80a 100644 --- a/tidygrad/func.py +++ b/tidygrad/func.py @@ -158,6 +158,7 @@ def CrossEntropy_loss(logits: Tensor, target: Tensor, reduction="mean"): target = Tensor(target) sm = softmax(logits) loss = -target * sm.log() + if reduction == "mean": return loss.mean(axis=-1, keepdims=True) if reduction == "sum": diff --git a/tidygrad/ops/conv.py b/tidygrad/ops/conv.py index 35dff41..0ccd523 100644 --- a/tidygrad/ops/conv.py +++ b/tidygrad/ops/conv.py @@ -3,7 +3,7 @@ # %% auto 0 __all__ = ['Pad'] -# %% ../../nbs/02_ops.conv.ipynb 2 +# %% ../../nbs/02_ops.conv.ipynb 3 import os import numpy as np @@ -12,10 +12,10 @@ BaseOp, ) -# %% ../../nbs/02_ops.conv.ipynb 3 +# %% ../../nbs/02_ops.conv.ipynb 4 from typing import Union, Tuple -# %% ../../nbs/02_ops.conv.ipynb 6 +# %% ../../nbs/02_ops.conv.ipynb 7 class Pad(UnaryElementwiseOp): """Pad a tensor""" diff --git a/tidygrad/tensor.py b/tidygrad/tensor.py index 3bd7c3a..a6b1cb3 100644 --- a/tidygrad/tensor.py +++ b/tidygrad/tensor.py @@ -1,7 +1,7 @@ # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/01_tensor.ipynb. # %% auto 0 -__all__ = ['Tensor'] +__all__ = ['alloc_log', 'Tensor', 'simplify_trace'] # %% ../nbs/01_tensor.ipynb 2 import numpy as np @@ -9,6 +9,7 @@ import tidygrad.ops as ops import tidygrad.tensor_helpers as helpers +import traceback # %% ../nbs/01_tensor.ipynb 3 class no_grad: @@ -28,22 +29,61 @@ class Tensor: pass +def simplify_trace(trace): + return " -> ".join( + f"{frame.name} at {frame.filename}:{frame.lineno}" + for frame in trace + if "/python" not in frame.filename + ) + + +alloc_log = {} + + class Tensor: - # op = "L" name: str = "" def __init__(self, data, name=None, op=None, eps=1e-8, requires_grad=False): global _num_tensors _num_tensors += 1 - self.data = np.asarray(data, dtype=np.float64) # , dtype=np.float32 + + trace = traceback.extract_stack() + simplified_trace = simplify_trace(trace) + alloc_log[id(self)] = simplified_trace + + # Increment allocation count + + # if _num_tensors > 620: + # raise Exception("Too many tensors") + + self.data = np.asarray(data) # , dtype=np.float32 + if self.data.dtype == np.float64: + self.data = self.data.astype(np.float32) self.grad = ( - np.zeros_like(self.data, dtype=np.float64) if requires_grad else None + np.zeros_like(self.data, dtype=np.float32) if requires_grad else None ) self.eps = eps self.op = op or ops.Load(name=name) self.name = name or self.op.name - self.requires_grad = requires_grad + self._requires_grad = requires_grad + + def __del__(self): + # print(f"Tensor {self.name} deleted") + del alloc_log[id(self)] + global _num_tensors + _num_tensors -= 1 + + @property + def requires_grad(self): + return self._requires_grad + + @requires_grad.setter + def requires_grad(self, requires_grad): + if requires_grad and self.grad is None: + self.grad = np.zeros_like(self.data) + + self._requires_grad = requires_grad def __repr__(self): value_str = f"v={lovely(self.data)}" @@ -57,7 +97,7 @@ def __repr__(self): return f'Tensor{list(self.data.shape)}(name="{self.name}" op={type(self.op).__name__}{parents}):\n {value_str}\n {grad_str}' def accum_grad(self, grad): - if not self.requires_grad: + if not self._requires_grad: return if self.grad is None: @@ -209,7 +249,8 @@ def walk(node): for n in nodes[::-1]: if hasattr(n.op, "backward"): n.op.backward() + n.op = None def zero_grad(self): - assert self.requires_grad, "Cannot zero grad on non-differentiable tensor" + assert self._requires_grad, "Cannot zero grad on non-differentiable tensor" self.grad.fill(0) diff --git a/tidygrad/training.py b/tidygrad/training.py index ec915dd..0277805 100644 --- a/tidygrad/training.py +++ b/tidygrad/training.py @@ -1,13 +1,16 @@ # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/06_training.ipynb. # %% auto 0 -__all__ = ['add_callbacks', 'DictLoggerCallback', 'Learner', 'one_hot_encode_batch', 'metrics_names_pretty', - 'metrics_last_pretty', 'print_metrics_header', 'print_metrics', 'ProgressBarCallback'] +__all__ = ['add_callbacks', 'Metric', 'MultiClassAccuracy', 'Loss', 'DictLoggerCallback', 'Learner', 'one_hot_encode_batch', + 'metrics_names_pretty', 'metrics_last_pretty', 'print_metrics_header', 'print_metrics', + 'ProgressBarCallback'] # %% ../nbs/06_training.ipynb 2 from . import Tensor from .utils import noop import numpy as np +import time +import gc # %% ../nbs/06_training.ipynb 4 def add_callbacks(func): @@ -32,6 +35,33 @@ def decorator(self): return decorator +# %% ../nbs/06_training.ipynb 5 +class Metric: + def __init__(self, train=True, valid=True): + self.train = train + self.valid = valid + + @staticmethod + def calc() -> float: + raise NotImplementedError + + +class MultiClassAccuracy(Metric): + name = "accuracy" + + @staticmethod + def calc(learner) -> float: + _, y = learner.batch + return float((learner.preds.data.argmax(axis=-1) == y.data).mean()) + + +class Loss(Metric): + name = "loss" + + @staticmethod + def calc(learner) -> float: + return float(learner.loss.data) + # %% ../nbs/06_training.ipynb 6 class DictLoggerCallback: val_loss = 0 @@ -148,6 +178,9 @@ def do_batch_forward(self): @add_callbacks def do_batch_backward(self): self.loss.backward() + f = float(self.loss.data) + self.loss = f + gc.collect() self.optimizer.step() self.optimizer.zero_grad() @@ -156,13 +189,9 @@ def do_batch_backward(self): # %% ../nbs/06_training.ipynb 9 def one_hot_encode_batch(y, n_classes): - diag = np.eye(n_classes) - return Tensor(diag[y]) - batch_size = y.shape[0] assert batch_size > 0 assert n_classes > 0 - # assert y.shape[0] == batch_size assert np.min(y) >= 0 # Initialize a zero matrix of shape (batch_size, num_classes) @@ -260,6 +289,8 @@ def plot_metrics(learner, metrics, plot_skip=5, x_lim=None, plot_smooth_training fig, ax = plt.subplots( 1, len(metrics), figsize=(4 * len(metrics), 4), tight_layout=True ) + if len(metrics) == 1: + ax = [ax] # wtf matplotlib??? plt.close(fig) for i, m in enumerate(metrics): train_metrics = []