Skip to content

Instantly share code, notes, and snippets.

@jkminder
Last active June 21, 2024 12:47
Show Gist options
  • Save jkminder/d05d708f3f93c66037ac7f0c352eefa4 to your computer and use it in GitHub Desktop.
Save jkminder/d05d708f3f93c66037ac7f0c352eefa4 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0d99bcc4264645cebfdce8e48699baa0",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Loading checkpoint shards: 0%| | 0/4 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b70c6a933cc7432dba1cfad042f1021f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"Loading checkpoint shards: 0%| | 0/4 [00:00<?, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loaded pretrained model meta-llama/Meta-Llama-3-8B-Instruct into HookedTransformer\n"
]
}
],
"source": [
"from nnsight import NNsight\n",
"from matplotlib import pyplot as plt\n",
"import seaborn as sns\n",
"import torch\n",
"from transformer_lens import HookedTransformer\n",
"from transformers import AutoTokenizer, LlamaForCausalLM\n",
"\n",
"MODEL_PATH = 'meta-llama/Meta-Llama-3-8B-Instruct'\n",
"\n",
"# Load huggingface model and tokenizer using LlamaForCausalLM and shard it on 8 gpus\n",
"\n",
"hf_model = LlamaForCausalLM.from_pretrained(\n",
" MODEL_PATH\n",
").to('cuda:0')\n",
"hf_tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)\n",
"\n",
"# Load HookedTransformer model \n",
"hooked_model = HookedTransformer.from_pretrained_no_processing(\n",
" MODEL_PATH,\n",
" device=\"cuda\",\n",
" dtype=torch.float32,\n",
" default_padding_side='left',\n",
" n_devices=1,\n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TF Greedy: tensor([4815], device='cuda:0') Logit: tensor(13.3366, device='cuda:0')\n",
"TL Greedy: tensor([4815], device='cuda:0') Logit: tensor(13.6355, device='cuda:0')\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAAGxCAYAAACZR4umAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABV4ElEQVR4nO3deVxVdf7H8fdV4YKIV5bgCiIiKmpiGc0otKi5ZmZlyzROpGVquaXm1DS2YFNaVmppLm1qqVkz41ZTpGY5Ne40FJrjb9zCDTVlUUNE+P7+KM54Wbyg6AV8PR+P+6j7vZ97zucczvLx3O/5HpsxxggAAABAmWp5OgEAAACgqqNoBgAAANygaAYAAADcoGgGAAAA3KBoBgAAANygaAYAAADcoGgGAAAA3KBoBgAAANygaAYAAADcqFDRPHfuXNlsNuvl4+Mjp9Opzp07a+LEiTp8+HCJ7yQlJclms7m0nT59Wg8//LAaNmyo2rVr6+qrr5YkHTt2TPfee69CQkJks9l0++23n/eC1QQ2m03Dhw+vtOn9/PPPSkpK0ldffVVp06xqStveKtuePXtks9k0d+5cq23t2rVKSkpSVlZWpc4rPz9fLVu21Isvvmi1Fe2He/bsqdR5FVm4cKGmTp1aoj0zM1MNGjTQ0qVLyz2tL774Qtdee638/Pxks9kq9N1L7YcfflBSUlKp67VTp05q06bNRc/hUs2nNJV9vCnNgAED1KRJk4s6j8pwIceRqriMNptNSUlJ54w5cOCAkpKSlJqaWuKzAQMGqF69ehcnOQ/M50JdivOMVHathP/p1KmTOnXqdF7fbdKkiQYMGFCh79Q5nxnNmTNHLVu2VH5+vg4fPqxvvvlGL730kl555RV9+OGH6tq1qxX70EMPqWfPni7fnzlzpmbPnq1p06YpLi7O2kn+8pe/aMmSJXr33XcVHR2twMDA80kPZfj55581fvx4STrvjQxSw4YNtW7dOkVHR1tta9eu1fjx4zVgwAA1aNCg0uY1Y8YMZWZmasSIEZU2TXcWLlyoLVu2aNSoUS7tAQEBGj16tP74xz+qV69e8vb2Pud0jDG655571KJFCy1fvlx+fn6KiYm5iJlfmB9++EHjx49Xp06dqlzRA1xsBw4c0Pjx49WkSROKMzdKq2suhrJqJXjOeRXNbdq00bXXXmu9v/POOzV69Ghdf/316tu3r/773/8qNDRUktSoUSM1atTI5ftbtmyRr69viasaW7ZsUXR0tP7whz+cT1qlys3Nla+vb6VND7Db7erQocNFn8+ZM2f08ssv68EHH5Sfn99Fn195PPzww3r++ef1t7/9Tf369Ttn7IEDB3Ts2DHdcccd6tKlyzljf/75Z9WtW7cyUwWAi6K0uuZiKKtWgudUWp/mxo0b69VXX9Xx48c1e/Zsq734zxg2m01vv/22cnNzrW4eRT83r1q1Stu2bbPai7oRnD59Ws8//7xatmwpu92uK664Qg888ICOHDnikkOTJk3Uu3dvLV68WO3atZOPj491ZTUjI0NDhgxRo0aN5O3traioKI0fP15nzpyxvl/0s/srr7yiyZMnKyoqSvXq1VN8fLzWr19fYpk3bNigW2+9VUFBQfLx8VF0dHSJq3P//e9/1a9fP4WEhMhut6tVq1Z64403KrRuZ8+erRYtWshut6t169ZatGhRiRh3y7dnzx5dccUVkqTx48db63jAgAHaunWrbDab/vrXv1rTS0lJkc1m05VXXukynz59+iguLs6l7cMPP1R8fLz8/PxUr1499ejRQ//+979L5Lh582b16dNHgYGB8vHxUbt27fTRRx+5xBRtC19++aUeeeQRBQcHKygoSH379tWBAwcqtN6KFBYWatKkSdb2ExISovvvv1/79u1ziTPGaMKECYqMjJSPj4+uvfZarVy5ssTPP8W7ZyQlJemPf/yjJCkqKqrE9rt69Wp16tRJQUFB8vX1VePGjXXnnXfq559/Pmfey5cv1/79+5WYmOh2GVeuXKnbbrtNjRo1ko+Pj5o1a6YhQ4bop59+cok7cuSIBg8erIiICGtfuu6667Rq1SpJv/wC8Y9//EM//vijS1esIqGhoerWrZtmzZp1znySkpKsk8oTTzwhm81mXb0tOiZ8++23uuuuuxQQEGBdtT916pSefPJJRUVFydvbW+Hh4Ro2bFiJbi9F+/onn3yidu3aydfXV61atdInn3wi6ZftqFWrVvLz89Nvf/tbbd68+Zz5zp07V3fffbckqXPnzi7HprNt2rRJN9xwg+rWraumTZvqxRdfVGFhoUtMTk6Oxo4d67IMo0aN0smTJ8+ZQ0Xnk56ervvuu8/l2PLqq6+WiDt27JiGDh2q8PBweXt7q2nTpho3bpzy8vLOmYMxRn/+85/l5eWlt956y2ov7/4+d+5cxcTEWLm999575V7+yvj7Ll++XPHx8apbt678/f3VrVs3rVu3rkTcP/7xD1199dWy2+2KiorSK6+8Uub6mDFjhq6++mr5+voqICBAd911l3bt2lXu5TpbeffZov1l69at+v3vfy+Hw6HQ0FA9+OCDys7OdonNycnRoEGDFBQUpHr16qlnz576v//7P7e5fPXVV/rNb34jSXrggQes7b94l44dO3aoV69eqlevniIiIvTYY4+V2I7Ke74+F3fz+eqrr1yOsUVK6zonSW+99ZbLOXThwoWldqPZt2+f7rrrLvn7+6tBgwb6wx/+oE2bNpWYZmndM4q22eTkZF1zzTXy9fVVy5Yt9e6775ZYvm+++Ubx8fHy8fFReHi4nn76ab399tsu3e7KqpUk6Y033tCNN96okJAQ+fn5KTY2VpMmTVJ+fn6JeSUnJ6tLly5yOByqW7euWrVqpYkTJ7rElOfcXJqi9f3yyy/rpZdeUpMmTeTr66tOnTrp//7v/5Sfn68//elPCgsLk8Ph0B133FGiG29Fzs+TJk2yzs/XXHONPvvss1LzqoxjcJlMBcyZM8dIMps2bSr18xMnTpjatWubLl26WG3PPvusOXs269atM7169TK+vr5m3bp1Zt26dSYjI8OsW7fOtGvXzjRt2tRqz87ONgUFBaZnz57Gz8/PjB8/3qxcudK8/fbbJjw83LRu3dr8/PPP1rQjIyNNw4YNTdOmTc27775rvvzyS7Nx40Zz8OBBExERYSIjI83s2bPNqlWrzF/+8hdjt9vNgAEDrO/v3r3bSDJNmjQxPXv2NEuXLjVLly41sbGxJiAgwGRlZVmxycnJxsvLy7Rt29bMnTvXrF692rz77rvm3nvvtWK2bt1qHA6HiY2NNe+9955ZsWKFeeyxx0ytWrVMUlKS2/UtyURERJjWrVubDz74wCxfvtz07NnTSDJ//etfrbjyLN+pU6dMcnKykWQGDhxoreMdO3YYY4xp2LChGTx4sDXNF1980fj6+hpJZv/+/cYYY/Lz8039+vXN448/bsW98MILxmazmQcffNB88sknZvHixSY+Pt74+fmZrVu3WnGrV6823t7e5oYbbjAffvihSU5ONgMGDDCSzJw5c6y4om2sadOmZsSIEebzzz83b7/9tgkICDCdO3d2u86Kb2/GGDN48GAjyQwfPtwkJyebWbNmmSuuuMJERESYI0eOWHFPPvmkkWQGDx5skpOTzVtvvWUaN25sGjZsaDp27GjFFW0nRXnv3bvXjBgxwkgyixcvdtl+d+/ebXx8fEy3bt3M0qVLzVdffWUWLFhgEhMTTWZm5jmX5cEHHzQhISEl2ovW0e7du622mTNnmokTJ5rly5ebNWvWmHnz5pmrrrrKxMTEmNOnT1txPXr0MFdccYV58803zVdffWWWLl1qnnnmGbNo0SJjzC/b7HXXXWecTqe1HOvWrXOZ/0svvWRq1ap1zvz37t1rFi9ebCSZESNGmHXr1plvv/3WGPO/v1FkZKR54oknzMqVK83SpUtNYWGh6dGjh6lTp455+umnzYoVK8wrr7xi/Pz8TLt27cypU6es6UdGRppGjRqZNm3amA8++MB8+umnpn379sbLy8s888wz5rrrrjOLFy82S5YsMS1atDChoaEux4riDh8+bCZMmGAkmTfeeMNa7sOHDxtjjOnYsaMJCgoyzZs3N7NmzTIrV640Q4cONZLMvHnzrOmcPHnSXH311SY4ONhMnjzZrFq1yrz22mvG4XCYm266yRQWFpaZQ0Xmc/jwYRMeHm6uuOIKM2vWLJOcnGyGDx9uJJlHHnnEisvNzTVt27Y1fn5+5pVXXjErVqwwTz/9tKlTp47p1auXy7wlmWHDhhljfjle3Hvvvcbf39989tlnVkx59/eibfS2224zH3/8sZk/f75p1qyZdZxy50L/vgsWLDCSTPfu3c3SpUvNhx9+aOLi4oy3t7f5+uuvrbhVq1aZ2rVrm+uvv94sXrzY/PWvfzW/+c1vTOPGjUscRwYNGmS8vLzMY489ZpKTk83ChQtNy5YtTWhoqMnIyLDi+vfvX65lLO8+W7S/xMTEmGeeecasXLnSTJ482djtdvPAAw9YcYWFhaZz587GbrebF154waxYscI8++yzpmnTpkaSefbZZ8vMJTs72/qbPfXUU9b2v3fvXmuZvL29TatWrcwrr7xiVq1aZZ555hljs9nM+PHjrelU5HxdmvLO58svvzSSzJdffuny/eLHZmOMmT17tpFk7rzzTvPJJ5+YBQsWmBYtWpjIyEiXv9OJEydMs2bNTGBgoHnjjTfM559/bkaPHm2ioqJKTLO080zRNtu6dWvz3nvvmc8//9zcfffdRpJZs2aNFffdd98ZHx8f07ZtW7No0SKzfPly06tXL9OkSROX43pptVLR8Wj06NFm5syZJjk52axevdpMmTLFBAcHu2wPxhjz9ttvG5vNZjp16mQWLlxoVq1aZWbMmGGGDh1qxZT33FyaovUdGRlpbr31VvPJJ5+Y+fPnm9DQUNOiRQuTmJhoHnzwQfPZZ5+ZWbNmmXr16plbb73VZRrlPT8XrfOBAweazz77zLz55psmPDzcOJ1Ol/NzRY7BkZGRpn///udcxuIqtWg2xpjQ0FDTqlUr631pG1f//v2Nn59fie927NjRXHnllS5tH3zwgZFk/v73v7u0b9q0yUgyM2bMsNoiIyNN7dq1zfbt211ihwwZYurVq2d+/PFHl/ZXXnnFSLIO9kUbQGxsrDlz5owVt3HjRiPJfPDBB1ZbdHS0iY6ONrm5uWWuix49ephGjRqZ7Oxsl/bhw4cbHx8fc+zYsTK/a8wvJzFfX1+XA/KZM2dMy5YtTbNmzSq8fEeOHCnz4HnfffeZpk2bWu+7du1qBg0aZAICAqyT9b/+9S8jyaxYscIYY0x6erqpU6eOGTFihMu0jh8/bpxOp7nnnnustpYtW5p27dqZ/Px8l9jevXubhg0bmoKCAmPM/7axs3dqY4yZNGmSkWQOHjx4znVWfHvbtm1bqdPbsGGDkWT+/Oc/G2OMOXbsmLHb7eZ3v/udS9y6deuMpHMWzcYY8/LLL5coZI0x5m9/+5uRZFJTU8+Zd2latWplevbsWaK9tKL5bIWFhSY/P9/8+OOPRpJZtmyZ9Vm9evXMqFGjzjnfW2655Zwn/ZUrVxpJLsVUaYrW08svv+zSXvQ3euaZZ1zai/5RN2nSJJf2Dz/80Egyb775ptUWGRlpfH19zb59+6y21NRUI8k0bNjQnDx50mpfunSpkWSWL19+znz/+te/lnoiNuaXY5Mks2HDBpf21q1bmx49eljvJ06caGrVqlXiGFm0HXz66afnzKG88/nTn/5UatwjjzxibDabdQycNWuWkWQ++ugjl7iXXnrJZV825n9F89GjR831119vwsPDXbbb8u7vBQUFJiwszFxzzTUuJ6g9e/YYLy+vchfN5/v3LZp/bGysdVwpyjMkJMQkJCRYbe3btzdhYWEux/GcnBwTGBhY4mKPJPPqq6+65Ll3717j6+vrciGhvEXz2c61zxbtL8X3i6FDhxofHx9rHX/22WdGknnttddc4l544QW3RbMx/zunllYo9e/fv9TtqFevXiYmJsZ6X5HzdWnKO5/yFs0FBQXG6XSa9u3bu8T9+OOPJbbFN954o9Tj2pAhQ8pdNPv4+Lich3Nzc01gYKAZMmSI1Xb33XcbPz8/l4KwoKDAtG7dusRxvaxa6WwFBQUmPz/fvPfee6Z27dpWXXH8+HFTv359c/3115/zH+vlPTeXpmh9X3XVVS5xU6dONZJMnz59XOJHjRplJFk1UXnPz5mZmcbHx8fccccdLnFFNcnZ5+eKHIPPp2iu9CHnjDGVOr1PPvlEDRo00K233qozZ85Yr6uvvlpOp7PEzzNt27ZVixYtSkyjc+fOCgsLc5nGzTffLElas2aNS/wtt9yi2rVru0xTkn788UdJ0v/93/9p586dGjhwoHx8fErN+9SpU/riiy90xx13qG7dui7z7dWrl06dOlVql4/iunTpYvUPl6TatWvrd7/7nXbs2GH9fFHR5StrPrt27dLu3bt16tQpffPNN+rZs6c6d+6slStXSpJWrVolu92u66+/XpL0+eef68yZM7r//vtd5uvj46OOHTtaf5sdO3boP//5j9VXvfi6OHjwoLZv3+6ST58+fVzeF/8blNeXX34pSSXukP3tb3+rVq1a6YsvvpAkrV+/Xnl5ebrnnntc4jp06HBBN4VdffXV8vb21uDBgzVv3rwK/ZR74MABhYSElCv28OHDevjhhxUREaE6derIy8tLkZGRkqRt27ZZcb/97W81d+5cPf/881q/fn2pP+e5U5TT/v37K/zds915550u71evXi2p5N/q7rvvlp+fn/W3KnL11VcrPDzcet+qVStJv3QxObt/dFF7Rbed4pxOp37729+6tLVt29Zlup988onatGmjq6++2mU779GjR6k/J5/vfFavXq3WrVuXiBswYICMMda6XL16tfz8/HTXXXeViJNUYp3u3r1b8fHxysnJ0fr163XVVVdZn5V3f9++fbsOHDigfv36ufyEHRkZqYSEBLfLX+R8/75F809MTFStWv87xdWrV0933nmn1q9fr59//lknT57Upk2b1LdvX5fjuL+/v2699VaXXD755BPZbDbdd999LsvudDp11VVXndeIROXdZ4uUdkw8deqU9XN30bGu+D1B7u49KC+bzVZivZS2/VfkfH2+8ymv7du3KyMj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hgwZory8PL388svKyspyebrmX/7yF/Xs2VPdunXTY489poKCAr300kvy8/Nz+ZXnuuuu0+DBg/XAAw9o8+bNuvHGG+Xn56eDBw/qm2++UWxsrB555JFy51jefbYiunfvrhtvvFGPP/64Tp48qWuvvVb/+te/9P7775fr+9HR0fL19dWCBQvUqlUr1atXT2FhYRX6R05lnK/Lw+l0qmvXrtbxOjIyUl988YUWL17sElerVi2NHz9eQ4YM0V133aUHH3xQWVlZpR7X+/fvrylTpui+++7T888/r2bNmumzzz7T559/bk2rMowbN04ff/yxunTponHjxsnX11ezZs2yhkNzN59u3brJ29tbv//97/X444/r1KlTmjlzpjIzM13i6tWrp1dffVUPPfSQunbtqkGDBik0NFQ7duzQd999p+nTp0vy3LlZKv/5OSAgQGPHjtXzzz+vhx56SHfffbf27t1b6jHloh+DK3LXYNFd+0Uvb29vExISYjp27GgmTJhgDYdytgsdPcOYX4Y6e+WVV8xVV11lfHx8TL169UzLli3NkCFDzH//+18rLjIy0txyyy2l5n7kyBEzcuRIExUVZby8vExgYKCJi4sz48aNMydOnDDGlH23vzGm1LuP161bZ26++WbjcDiM3W430dHRZvTo0S4xu3fvNg8++KAJDw83Xl5e5oorrjAJCQnm+eefLzXP4vMcNmyYmTFjhomOjjZeXl6mZcuWZsGCBee1fMb8MsRSu3btjN1uN5Jc7hzNzMw0tWrVMn5+fi5DHhUN39S3b99S81y6dKnp3LmzqV+/vrHb7SYyMtLcddddZtWqVS5x3333nbnnnntMSEiI8fLyMk6n09x0001m1qxZVkxZI7SUdbd0caVtbwUFBeall14yLVq0MF5eXiY4ONjcd9991nBKRQoLC83zzz9vGjVqZLy9vU3btm3NJ598Yq666iqXu3ZLGz3DmF+GrAsLCzO1atWycl23bp254447TGRkpLHb7SYoKMh07NjR7UgOxhizY8cOY7PZStxJXtroGT/88IPp1q2b8ff3NwEBAebuu+826enpLtvtqVOnzMMPP2zatm1r6tevb3x9fU1MTIx59tlnXUYjOHbsmLnrrrtMgwYNjM1mc1mfhYWFJjIyssQICqVxN3rG2XePF8nNzTVPPPGEiYyMNF5eXqZhw4bmkUceKTG8XVn7etE+U548SjN16lQTFRVlateu7fI3LuvYVNpICSdOnDBPPfWUiYmJMd7e3tawk6NHj3YZCac0FZnPjz/+aPr162eCgoKMl5eXiYmJMS+//HKJu92PHj1qHn74YdOwYUNTp04dExkZaZ588kmXIfyMKX3dffDBB6ZOnTrmgQcesKZb3v397bffNs2bNzfe3t6mRYsW5t133y33yBKV8fddunSpad++vfHx8TF+fn6mS5cu5l//+leJaS5fvty0bdvWeHt7m8aNG5sXX3yx1OOIMca8++67pn379sbPz8/4+vqa6Ohoc//995vNmzdbMeVdxvLss8aUvb+UdhzIysoyDz74oGnQoIGpW7eu6datm/nPf/5TrtEzjPnl792yZUvj5eXl8p2yztmlrafynq9LU5H5HDx40Nx1110mMDDQOBwOc99995nNmzeXemx+8803TbNmzVy2xdtuu820a9fOJS49Pd307dvX1KtXz/j7+5s777zTfPrpp2WOaHK2srbZjh07uozuYIwxX3/9tWnfvr2x2+3G6XSaP/7xj9aINmcPbVvW+vj444+t9RseHm7++Mc/WqOnFD9Hfvrpp6Zjx47Gz8/P1K1b17Ru3dq89NJLLjHlOTeXpqx9r+h8ffbQuMaUfn6vyPl54sSJJiIiwjo/f/zxx6Wu3/Ieg89n9AybMZU83AVQg+zevVstW7bUs88+qz//+c+XfP5Fd6GXNYj7pfbFF1+oe/fu2rp1q1q2bOnpdACgwrKystSiRQvdfvvtevPNN88ZO2HCBD311FNKT0+/qE8B7N69u/bs2VOuh9HAcyr1RkCgOvvuu+/0wQcfKCEhQfXr19f27ds1adIk1a9fXwMHDvRIThMnTlS7du20adOmKnEj3PPPP68HH3yQghlAtZCRkaEXXnhBnTt3VlBQkH788UdNmTJFx48fLzGCUVGXhZYtWyo/P1+rV6/W66+/rvvuu69SC+YxY8aoXbt2ioiI0LFjx7RgwQKtXLlS77zzTqXNAxcHRTPwKz8/P23evFnvvPOOsrKy5HA41KlTJ73wwgsXNOzchWjTpo3mzJlzSe+AL0tmZqY6duyooUOHejoVACgXu92uPXv2aOjQoTp27Jjq1q2rDh06aNasWbryyitdYuvWraspU6Zoz549ysvLU+PGjfXEE0+4jCJTGQoKCvTMM88o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0uwhY8aMUWJioq699lrFx8frzTffVHp6uh5++GFPpwYAAIBiKJo95He/+52OHj2q5557TgcPHlSbNm306aefKjIy0tOpnZPdbtezzz7LEESVgHVZeViXlYd1WXlYl5WHdYmqgNEzAAAAADfo0wwAAAC4QdEMAAAAuEHRDAAAALhB0QwAAAC4QdEMAAAAuEHRjPPWp08fNW7cWD4+PmrYsKESExN14MABT6dV7ezZs0cDBw5UVFSUfH19FR0drWeffVanT5/2dGrV0gsvvKCEhATVrVvXo0/NrK5mzJihqKgo+fj4KC4uTl9//bWnU6p2/vnPf+rWW29VWFiYbDabli5d6umUqq2JEyfqN7/5jfz9/RUSEqLbb79d27dv93RauExRNOO8de7cWR999JG2b9+uv//979q5c6fuuusuT6dV7fznP/9RYWGhZs+era1bt2rKlCmaNWuW/vznP3s6tWrp9OnTuvvuu/XII494OpVq58MPP9SoUaM0btw4/fvf/9YNN9ygm2++Wenp6Z5OrVo5efKkrrrqKk2fPt3TqVR7a9as0bBhw7R+/XqtXLlSZ86cUffu3XXy5ElPp4bLEOM0o9IsX75ct99+u/Ly8uTl5eXpdKq1l19+WTNnztSuXbs8nUq1NXfuXI0aNUpZWVmeTqXaaN++va655hrNnDnTamvVqpVuv/12TZw40YOZVV82m01LlizR7bff7ulUaoQjR44oJCREa9as0Y033ujpdHCZ4UozKsWxY8e0YMECJSQkUDBXguzsbAUGBno6DVxGTp8+rZSUFHXv3t2lvXv37lq7dq2HsgJcZWdnSxLHR3gERTMuyBNPPCE/Pz8FBQUpPT1dy5Yt83RK1d7OnTs1bdo0Pfzww55OBZeRn376SQUFBQoNDXVpDw0NVUZGhoeyAv7HGKMxY8bo+uuvV5s2bTydDi5DFM1wkZSUJJvNds7X5s2brfg//vGP+ve//60VK1aodu3auv/++0WPn19UdF1K0oEDB9SzZ0/dfffdeuihhzyUedVzPusS58dms7m8N8aUaAM8Yfjw4fr+++/1wQcfeDoVXKbqeDoBVC3Dhw/Xvffee86YJk2aWP8fHBys4OBgtWjRQq1atVJERITWr1+v+Pj4i5xp1VfRdXngwAF17txZ8fHxevPNNy9ydtVLRdclKi44OFi1a9cucVX58OHDJa4+A5faiBEjtHz5cv3zn/9Uo0aNPJ0OLlMUzXBRVASfj6IrzHl5eZWZUrVVkXW5f/9+de7cWXFxcZozZ45q1eJHoLNdyHaJ8vH29lZcXJxWrlypO+64w2pfuXKlbrvtNg9mhsuZMUYjRozQkiVL9NVXXykqKsrTKeEyRtGM87Jx40Zt3LhR119/vQICArRr1y4988wzio6O5ipzBR04cECdOnVS48aN9corr+jIkSPWZ06n04OZVU/p6ek6duyY0tPTVVBQoNTUVElSs2bNVK9ePc8mV8WNGTNGiYmJuvbaa61fPNLT0+lfX0EnTpzQjh07rPe7d+9WamqqAgMD1bhxYw9mVv0MGzZMCxcu1LJly+Tv72/9EuJwOOTr6+vh7HC5Ycg5nJe0tDQ9+uij+u6773Ty5Ek1bNhQPXv21FNPPaXw8HBPp1etzJ07Vw888ECpn7F7VtyAAQM0b968Eu1ffvmlOnXqdOkTqmZmzJihSZMm6eDBg2rTpo2mTJnC0F4V9NVXX6lz584l2vv376+5c+de+oSqsbL608+ZM0cDBgy4tMngskfRDAAAALhBx0kAAADADYpmAAAAwA2KZgAAAMANimYAAADADYpmAAAAwA2KZgAAAMANimYAAADADYpmAAAAwA2KZgAAAMANimYAAADADYpmAAAAwI3/B5UymFMS6KwaAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"with torch.no_grad():\n",
" a_large_chunk_of_text = \"Generate is not a good way to check a model is running properly. Can you run the following and share the results?\"\n",
" tokens = hf_tokenizer(a_large_chunk_of_text, return_tensors=\"pt\").input_ids.to('cuda:0')\n",
" logits_hf = hf_model(tokens).logits\n",
" logits_tl = hooked_model(tokens, return_type=\"logits\")\n",
"\n",
" logits_diff = (logits_hf - logits_tl)\n",
" logits_diff_last = logits_diff[:, -1, :]\n",
" print(\"TF Greedy:\", logits_hf[:, -1, :].argmax(dim=-1), \"Logit:\", logits_hf[:, -1, :].max())\n",
" print(\"TL Greedy:\", logits_tl[:, -1, :].argmax(dim=-1), \"Logit:\", logits_tl[:, -1, :].max())\n",
" # histogram of the difference between the logits from the hooked model and the huggingface model\n",
" sns.histplot(logits_diff_last.flatten().cpu().numpy(), bins=100)\n",
" # set title\n",
" plt.title(\"Difference between logits (last) from the hooked model and the huggingface model\")\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0.98, 'Difference between outputs from the hooked model and the huggingface model in layer 0')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABnMAAAHeCAYAAABAA/4hAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAC640lEQVR4nOzdfXyP9f////vLzjf2shM7YzaUIcNSMertfDNnSZLUshJKkZN14tNbUUnOOvlSkdIJKyon5aSZs068zXn0HlJ6E94Mb2ZDbDPP3x/9duS1ExvGpm7Xy2WXHM/jcRzH8zh/djyO4/myGWOMAAAAAAAAAAAAUCFVKu8KAAAAAAAAAAAAoHgkcwAAAAAAAAAAACowkjkAAAAAAAAAAAAVGMkcAAAAAAAAAACACoxkDgAAAAAAAAAAQAVGMgcAAAAAAAAAAKACI5kDAAAAAAAAAABQgZHMAQAAAAAAAAAAqMBI5gAAAAAAAAAAAFRgJHMAACjBhx9+KJvNZv25u7srKChIbdq00bhx43TkyJFC04wePVo2m82hLCcnR48++qiCg4Pl5OSkJk2aSJKOHz+u3r17KyAgQDabTd27d78Ga1Vx2Ww2PfHEE2U2v99//12jR4/WN998U2bz/Dt45ZVXtHDhwmuyrIMHD2r06NHaunVrmc53ypQpuuGGG+Tq6iqbzaYTJ06U6fzL0tKlSzV69Ogix5X1OVGca7Wcgr755hvZbDZ98cUXV3U54eHhSkhIuKrLKAutW7dW69atL2vairaO+fu2pOvv2rVrNXr06CLP0fDwcHXp0uXqVLAclnOlruT4uBR79+5V586d5evrK5vNpqFDh171ZV5vbDZbsdfti9m7d69sNps+/PDDMom7FAkJCQoPDy+z+V1rp06d0tChQxUSEiJ3d3c1adJEc+bMKe9qAQBwzTiXdwUAALhefPDBB6pXr55yc3N15MgRrVmzRuPHj9ekSZM0d+5ctW/f3op95JFH1LFjR4fp33nnHU2fPl1TpkxR06ZNVblyZUnSSy+9pAULFmjmzJmqU6eOfH19r+l6/dX9/vvvGjNmjCRdkwdgfxWvvPKKevbseU2SiwcPHtSYMWMUHh5uJTmv1NatWzVkyBA98sgj6tu3r5ydnVWlSpUymffVsHTpUr311luX9WAQuN6tXbtWY8aMUUJCgqpWrVre1anQ3n777WuynGHDhmn9+vWaOXOmgoKCFBwcfE2Wiz8FBwcrNTVVderUKe+qVBg9evTQxo0b9eqrr6pu3br65JNPdN999+n8+fPq06dPeVcPAICrjmQOAACl1LBhQ91yyy3W8N13361hw4bp9ttvV48ePfTLL78oMDBQklSjRg3VqFHDYfq0tDR5eHgUevM9LS1NderU0f33319mdT1z5ow8PDzKbH7A9Wb79u2SpP79++u22267aOzvv/8uT0/Pa1EtALgiDRo0uCbLSUtL02233fa3/1q4PLm5ual58+blXY1r6mL346VLl2r58uVWAkeS2rRpo99++01PPfWU7r33Xjk5OV3L6gIAcM3RzRoAAFegZs2amjx5sk6ePKnp06db5QW7WbPZbHrvvfd05swZq7u2/O7bVqxYoZ07d1rl+d3R5OTk6OWXX1a9evXk5uamatWq6aGHHtLRo0cd6pDfNcz8+fMVFRUld3d360uU9PR0DRw4UDVq1JCrq6tq1aqlMWPG6Ny5c9b0+d14TJo0Sa+99ppq1aqlypUrKzo6WuvWrSu0zuvXr1fXrl3l5+cnd3d31alTp1D3K7/88ov69OmjgIAAubm5qX79+nrrrbcuadtOnz5ddevWlZubmxo0aFBkNxolrd/evXtVrVo1SdKYMWOsbZyQkKDt27fLZrPp888/t+a3efNm2Ww23XTTTQ7L6datm5o2bepQNnfuXEVHR8vLy0uVK1dWbGysfvjhh0J13LRpk7p16yZfX1+5u7srKipKn332mUNM/rGwevVqPfbYY/L395efn5969OihgwcPlmp7ffXVV4qOjpanp6eqVKmiDh06KDU11SGmuO5VijpeT58+rY8++sjaZvlfNeXXdfny5XrooYfk6+srLy8vde3aVf/5z38c5ltcl08XdhP0zTff6NZbb5UkPfTQQ9by8r9Q+c9//qPevXsrJCREbm5uCgwMVLt27S7aJVvr1q31wAMPSJKaNWtm7fP8cQ0bNtR3332nFi1ayNPTUw8//LAkad++fXrggQccjtvJkyfr/Pnz1rzzz5eJEydq/PjxCg8Pl4eHh1q3bq2ff/5Zubm5evbZZxUSEiK73a677rqryK4YL5SQkGCdHxd26bh3716HuFmzZql+/fry9PRU48aNtXjx4kLzKotzrzTLWbNmjdq1a6cqVarI09NTLVq00JIlSwrFpaWl6c4775SPj4/VJc5HH31UYh2ysrIUGxurwMBAbdiwQVLpr4m5ubl6+umnFRQUJE9PT91+++3WPEpSFvv3/PnzmjBhglXPgIAAPfjggzpw4IBDnDFGEyZMUFhYmNzd3XXzzTfr66+/LnZ7JCYmqlatWnJ1dVX16tU1dOhQnT59ulTrVdBbb72lf/zjHwoICJCXl5ciIyM1YcIE5ebmOsTlny8bN27UHXfcIU9PT9WuXVuvvvqqw3khST/99JM6duwoT09P+fv769FHH9XJkydLrMvo0aP11FNPSZJq1apV6F6YLzk5WTfffLM8PDxUr149zZw5s9C8SnPPK0lJyymqG1Xpz2vjhedtdna2RowYYR2L//jHP7R58+Yir41r1qxRdHS03N3dVb16dY0aNUrvvfdeoXkW7GbtUu/hM2bMcLi3fvLJJw73hvyu8Xbv3q2vv/7a4Xp09uxZjRgxQk2aNJHdbpevr6+io6P15ZdfFlrO+fPnNWXKFDVp0kQeHh6qWrWqmjdvrq+++sohrrT30uK296pVq9S/f3/5+fnJ29tbDz74oE6fPq309HT16tVLVatWVXBwsBITEwsd38ePH9egQYNUvXp1ubq6qnbt2nruueeUnZ3tEJeVlWUto3LlyurYsaN+/vnnIutVFtfgfEV1s5Z//G3fvl333Xef7Ha7AgMD9fDDDyszM/OyllOa68FLL70kZ2dn7d+/v9D0Dz/8sPz8/HT27FmrrDT7NSEhQZUrV9a///1vxcTEqEqVKmrXrl2x9VywYIEqV66se+65x6H8oYce0sGDB7V+/frLWn8AAK4rBgAAXNQHH3xgJJmNGzcWOf7UqVPGycnJtGvXzip74YUXzIW32dTUVNOpUyfj4eFhUlNTTWpqqklPTzepqakmKirK1K5d2yrPzMw0eXl5pmPHjsbLy8uMGTPGLF++3Lz33numevXqpkGDBub333+35h0WFmaCg4NN7dq1zcyZM83q1avNhg0bzKFDh0xoaKgJCwsz06dPNytWrDAvvfSScXNzMwkJCdb0e/bsMZJMeHi46dixo1m4cKFZuHChiYyMND4+PubEiRNWbHJysnFxcTGNGjUyH374oVm1apWZOXOm6d27txWzfft2Y7fbTWRkpPn4449NSkqKGTFihKlUqZIZPXp0idtbkgkNDTUNGjQwn376qfnqq69Mx44djSTz+eefW3GlWb+zZ8+a5ORkI8n069fP2sa7d+82xhgTHBxsBgwYYM3z1VdfNR4eHkaS+e9//2uMMSY3N9d4e3ubp59+2oobO3assdls5uGHHzaLFy828+fPN9HR0cbLy8ts377dilu1apVxdXU1d9xxh5k7d65JTk42CQkJRpL54IMPrLj8Y6x27dpm8ODBZtmyZea9994zPj4+pk2bNiVus6SkJCPJxMTEmIULF5q5c+eapk2bGldXV/P9999bcX379jVhYWGFpi/qePXw8DCdOnWytln+euXXNTQ01Dz88MPm66+/Nu+++64JCAgwoaGhJiMjw5pPWFiY6du3b6HltWrVyrRq1coYY0xmZqY1z3/+85/W8vbv32+MMSYiIsLccMMNZtasWebbb7818+bNMyNGjDCrV68udnts377d/POf/7S284X7vFWrVsbX19eEhoaaKVOmmNWrV5tvv/3WHDlyxFSvXt1Uq1bNTJs2zSQnJ5snnnjCSDKPPfaYNe/88yUsLMx07drVLF682MyePdsEBgaaunXrmvj4eGu7TJs2zVSuXNl07dr1ovtv9+7dpmfPnkaStf6pqanm7NmzxhhjnZ+33Xab+eyzz8zSpUtN69atjbOzs/n1118d1vtKz73SLOebb74xLi4upmnTpmbu3Llm4cKFJiYmxthsNjNnzhwr7qeffjJVqlQxderUMR9//LFZsmSJue+++4wkM378eCtu9erVDuf3/v37TWRkpImIiLCWeynXxL59+xqbzWaeeuopk5KSYl577TVTvXp14+3tXeTxeKGy2L8DBgwwkswTTzxhkpOTzbRp00y1atVMaGioOXr0qBWXf97169fPOo+qV69ugoKCrPPDGGNOnz5tmjRpYvz9/c1rr71mVqxYYd58801jt9tN27Ztzfnz563Y4s65goYNG2beeecdk5ycbFatWmVef/114+/vbx566CGHuFatWhk/Pz9z4403mmnTppnly5ebQYMGGUnmo48+suLS09NNQECAqV69uvnggw/M0qVLzf33329q1qxpJF30fN2/f78ZPHiwkWTmz5/vcC/MX6caNWqYBg0amI8//tgsW7bM3HPPPUaS+fbbb635lPaeV5zSLqfg9TJf/nVsz549Vtl9991nKlWqZJ599lmTkpJi3njjDRMaGmrsdrvDftq2bZtx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rP/atWv122+/6ZFHHrHKwsPD9eOPPzpM9/PPP2vXrl0OD6BL+0Zx3bp19c9//lPz5s3Tli1bLhp7qdq1a6dx48Zpy5Ytuvnmm63yjz/+WDabTW3atCnT5RV04TbI/wrsUpTVuVcSLy8vNWvWTPPnz9ekSZOsup4/f16zZ8+2EqTSH9t0wYIFOnjwoMOD9I8//lienp5q3ry5w7zd3d01f/58PfDAA+rWrZvmzp2rO++8U1Lpr4n5SfWkpCQ1bdrUKv/ss8907ty5MtkGF5Pffd/s2bMd3kzfuHGjdu7cqeeee06S1Lx5c7m7uxd7Hl2YzOnSpYteeeUV+fn5lcnD4PxrxIXXcGOMZsyYcdnzbNOmjSZMmKBt27Y5dLX2ySeflGr6y/2q4EJlfc8rTv6++fHHHx328aJFixzi/vGPf0iS5s6d63BN+eKLLwodi61atdLSpUsdEt3nz5+3urMqCxEREQoKCtJnn32m4cOHW+X79u3T2rVrS5XsstlscnV1dXgAn56eri+//NIhLi4uTuPGjdM777yjF198sch5lfZeerW0a9dOn332mRYuXKi77rrLKv/444+t8dKfx3ZSUpKGDBlixRU8tq/VNbisXer14K677lLNmjU1YsQIffvtt3r99dcdjoeruV/vuusuzZgxQ/PmzdO9995rlX/00UcKCQm57PYyAADXE5I5AACUUlpamtX395EjR/T999/rgw8+kJOTkxYsWGB9uVIWevfuraSkJHXq1ElPPvmkbrvtNrm4uOjAgQNavXq17rzzToeHD0V58cUXtXz5crVo0UJDhgxRRESEzp49q71792rp0qWaNm3aRbtMK8pbb72lrl27qnnz5ho2bJhq1qypffv2admyZUpKSpIkvfnmm7r99tt1xx136LHHHlN4eLhOnjyp3bt3a9GiRYV+e6Qo/v7+atu2rUaNGiUvLy+9/fbb+umnnzRnzpxLXr8qVaooLCxMX375pdq1aydfX1/5+/tbD+TatWunt99+W//73//0xhtvWPNv166dPvjgA/n4+Dg8FA4PD9eLL76o5557Tv/5z3/UsWNH+fj46PDhw9qwYYO8vLysL3mmT5+uuLg4xcbGKiEhQdWrV9fx48e1c+dObdmypUwe1FWqVEkTJkzQ/fffry5dumjgwIHKzs7WxIkTdeLECb366qtW7L333qvnn39evXv31lNPPaWzZ8/q//2//6e8vLxC842MjNQ333yjRYsWKTg4WFWqVHH4kmjTpk165JFHdM8992j//v167rnnVL16dQ0aNMiKiY+P1wMPPKBBgwbp7rvv1m+//aYJEyYUOlfq1KkjDw8PJSUlqX79+qpcubJCQkL0v//9T0888YTuuece3XjjjXJ1ddWqVav0448/6tlnn73ibXehYcOG6eOPP1bnzp314osvKiwsTEuWLNHbb7+txx57rNBvUpW1/G4ax48fr7i4ODk5OV3yA8GyOPdKY9y4cerQoYPatGmjxMREubq66u2331ZaWpo+/fRT68HeCy+8YP2OyfPPPy9fX18lJSVpyZIlmjBhgux2e6F5u7i46NNPP9Ujjzyinj176uOPP9Z9991X6mti/fr19cADD+iNN96Qi4uL2rdvr7S0NE2aNKnUXflciYiICA0YMEBTpkxRpUqVFBcXp71792rUqFEKDQ3VsGHDJP3xFn9iYqJefvllh/No9OjRhbpvGjp0qObNm6d//OMfGjZsmBo1aqTz589r3759SklJ0YgRIy7pIWaHDh3k6uqq++67T08//bTOnj2rd955RxkZGZe93kOHDtXMmTPVuXNnvfzyywoMDFRSUpJ++umnUk2ff/y/+eab6tu3r1xcXBQREXFJXSlejXteUTp16iRfX1/169dPL774opydnfXhhx9q//79DnE33XST7rvvPk2ePFlOTk5q27attm/frsmTJ8tutzt0N/Xcc89p0aJFateunZ577jl5eHho2rRpOn36tKTSdzl2MZUqVdKYMWM0cOBA9ezZUw8//LBOnDihMWPGKDg4uFTL6NKli+bPn69BgwapZ8+e2r9/v1566SUFBwfrl19+seLuuOMOxcfH6+WXX9bhw4fVpUsXubm56YcffpCnp6cGDx58SffSq+HBBx/UW2+9pb59+2rv3r2KjIzUmjVr9Morr6hTp07WSxwxMTH6xz/+oaefflqnT5/WLbfcon/961+aNWtWoXleq2twWbrU64GTk5Mef/xxPfPMM/Ly8ir0+2BXc7/GxcWpQ4cOeuyxx5SVlaUbbrhBn376qZKTkzV79myH34wCAOAvywAAgIv64IMPjCTrz9XV1QQEBJhWrVqZV155xRw5cqTQNC+88IIpeJvt27ev8fLyKhTbqlUrc9NNNxUqz83NNZMm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nDljnn32WRMeHm5cXFxMSEiIGTRokMnIyLjk5V/MsWPHzGOPPWZCQkKMi4uLqVWrlvm///s/c/bsWSsm/5jKr++FJJkXXnjBGPPnNaC48zu/rvPnzzeRkZHGzc3N1KpVy7z55psO88zfXnv27HEoX716tcP8StqHAFAU2jiOaOP8oSK1cfr27Wu8vLzMzp07TUxMjPH09DRBQUFm3LhxxhhjUlNTTcuWLY2np6e58cYbzYcffugwfcH75YXzTEtLM23btjWenp7G39/fPP744+b06dMl1skYY95//33TqFEj4+bmZnx8fEz37t3Njh07HGJatWplWrVqVeQ65bd1LrYfjfnzfNuyZYu56667TJUqVYy3t7e5//77C50vF7ZDLhQWFmbNr6R2GIC/Lu75jrjn/6Ei3vN//PFH06FDB1O5cmXTvHlzY0zpj6OVK1eaVq1aGV9fX+Pu7m5CQ0NNjx49HO7vRd0vU1NTTYsWLYybm5sJDg42zz77rHn33XcL/b94ae61xhhz5MgR89hjj5n69esbLy8vU61aNdOmTRvz3XffFZq2uHleKP8YGD9+vHn55ZdNaGiocXNzM02bNjUrVqwoFP/999+btm3bmsqVKxsPDw8THR1tFi9e7BBz+vRpM2LECBMeHm61Z5o2bWo++eQTY8wf+6Oo467gs4mCaCPBGGN4GoVyVVKj59SpU8bJycm0a9fOKivY6ElNTTWdOnUyHh4eJjU11aSmppr09HSTmppqoqKiTO3ata3yzMxMk5eXZzp27Gi8vLzMmDFjzPLly817771nqlevbho0aGB+//13a95hYWEmODjY1K5d28ycOdOsXr3abNiwwRw6dMiEhoaasLAwM336dLNixQrz0ksvGTc3N5OQkGBNn3+BDA8PNx07djQLFy40CxcuNJGRkcbHx8ecOHHCik1OTjYuLi6mUaNG5sMPPzSrVq0yM2fONL1797Zitm/fbux2u4mMjDQff/yxSUlJMSNGjDCVKlUyo0ePLnF7SzKhoaGmQYMG5tNPPzVfffWV6dixo5FkPv/8cyuuNOt39uxZk5ycbCSZfv36Wdt49+7dxhhjgoODzYABA6x5vvrqq8bDw8NIshobubm5xtvb2zz99NNW3NixY43NZjMPP/ywWbx4sZk/f76Jjo42Xl5eZvv27VbcqlWrjKurq7njjjvM3Llz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bXJxcdGBAwe0evVq3XnnnQ4PnIvy4osvavny5WrRooWGDBmiiIgInT17Vnv37tXSpUs1bdq0i35aXJS33npLXbt2VfPmzTVs2DDVrFlT+/bt07Jly5SUlCRJevPNN3X77bfrjjvu0GOPPabw8HCdPHlSu3fv1qJFi6zfQLkYf39/tW3bVqNGjZKXl5fefvtt/fTTT5ozZ84lr1+VKlUUFhamL7/8Uu3atZOvr6/8/f2th+Tt2rXT22+/rf/973964403rPm3a9dOH3zwgXx8fBxuDOHh4XrxxRf13HPP6T//+Y86duwoHx8fHT58WBs2bLDebpCk6dOnKy4uTrGxsUpISFD16tV1/Phx7dy5U1u2bNHnn39+Sdu/KN7e3vrHP/6hiRMnWuv17bff6v3331fVqlUdYhs2bChJevfdd1WlShW5u7urVq1a8vPzU2RkpObPn6933nlHTZs2VaVKlXTLLbeUybFY0MXqUVCHDh0UGxurZ555RllZWWrZsqV+/PFHvfDCC4qKilJ8fPzlbbgCHnzwQb311lvq27ev9u7dq8jISK1Zs0avvPKKOnXqZDV8bTabHnjgAc2cOVN16tRR48aNtWHDBusB0IXyuyh488031bdvX7m4uCgiIsJ6cygkJETdunXT6NGjFRwcrNmzZ2v58uUaP368PD09Jf3x2XtERIQSExN17tw5+fj4aMGCBVqzZk2RyytqHwJASWjj0MaRKl4b52pydXXV5MmTderUKd16661au3atXn75ZcXFxVm/J1CUqlWratSoUfq///s/Pfjgg7rvvvt07NgxjRkzRu7u7nrhhRes2Pj4eE2fPl0PPPCA+vfvr2PHjmnChAmFuo8paT9Kfzy8cXZ2VocOHbR9+3aNGjVKjRs3Vq9evRyWN2rUKD3//PNq1aqVduzYoalTp8putzss71LaYQD+erjnc8+Xrq97fmmPo2nTpmnVqlXq3LmzatasqbNnz2rmzJmS5JDIKuif//ynvvrqK7Vt21bPP/+8PD099dZbb+n06dOFYkt7r+3SpYteeuklvfDCC2rVqpV27dqlF198UbVq1dK5c+cue1s4OTmpQ4cOGj58uM6fP6/x48crKyvL4aurcePGqUOHDmrTpo0SExPl6uqqt99+W2lpafr000+tr5+aNWumLl26qFGjRvLx8dHOnTs1a9YsRUdHW88j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",
"text/plain": [
"<Figure size 2000x500 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"hf_model_nnsight = NNsight(hf_model)\n",
"\n",
"with hf_model_nnsight.trace(tokens):\n",
" hf_attn_out = hf_model_nnsight.model.layers[0].self_attn.output.save()\n",
" hf_mlp_out = hf_model_nnsight.model.layers[0].mlp.output.save()\n",
" hf_resid_post = hf_model_nnsight.model.layers[0].output.save()\n",
"_, cache = hooked_model.run_with_cache(tokens)\n",
"\n",
"layer0_attn_out_diff = hf_attn_out[0] - cache[\"blocks.0.hook_attn_out\"]\n",
"layer0_mlp_out_diff = hf_mlp_out[0] - cache[\"blocks.0.hook_mlp_out\"]\n",
"layer0_resid_post_diff = hf_resid_post[0] - cache[\"blocks.0.hook_resid_post\"]\n",
"\n",
"# histogram of the difference between the attention output from the hooked model and the huggingface model\n",
"fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(20, 5))\n",
"sns.histplot(layer0_attn_out_diff.detach().flatten().cpu().numpy(), bins=100, ax=ax1)\n",
"ax1.set_title(\"Difference between attention output\")\n",
"# histogram of the difference between the mlp output from the hooked model and the huggingface model\n",
"sns.histplot(layer0_mlp_out_diff.detach().flatten().cpu().numpy(), bins=100, ax=ax2)\n",
"ax2.set_title(\"Difference between mlp output\")\n",
"# histogram of the difference between the residual post output from the hooked model and the huggingface model\n",
"sns.histplot(layer0_resid_post_diff.detach().flatten().cpu().numpy(), bins=100, ax=ax3)\n",
"ax3.set_title(\"Difference between residual post output\")\n",
"plt.suptitle(\"Difference between outputs from the hooked model and the huggingface model in layer 0\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(True, device='cuda:0'),\n",
" tensor(True, device='cuda:0'),\n",
" tensor(True, device='cuda:0'))"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(hooked_model.blocks[0].mlp._parameters[\"W_gate\"] == hf_model.model.layers[0].mlp.gate_proj.weight.T).all(), (hooked_model.blocks[0].mlp._parameters[\"W_in\"] == hf_model.model.layers[0].mlp.up_proj.weight.T).all(), (hooked_model.blocks[0].mlp._parameters[\"W_out\"] == hf_model.model.layers[0].mlp.down_proj.weight.T).all()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(119), tensor(False))"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test_in = torch.ones(1, 1, 4096).to('cuda:0')\n",
"hf_out = hf_model.model.layers[0].mlp(test_in).detach().cpu()\n",
"hooked_out = hooked_model.blocks[0].mlp(test_in).detach().cpu()\n",
"isclose = torch.isclose(hf_out,hooked_out)\n",
"(~isclose).sum(), isclose.all()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(9), torch.Size([1, 1, 14336]))"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from fancy_einsum import einsum\n",
"hf_w_gate_out = hf_model.model.layers[0].mlp.gate_proj(test_in).detach().cpu()\n",
"# https://github.com/TransformerLensOrg/TransformerLens/blob/318236402ddcc9cabace3f2fca40c71f0c2e9e57/transformer_lens/components/gated_mlp.py#L102C13-L107C18\n",
"hooked_w_gate_out = einsum(\n",
" \"batch pos d_model, d_model d_mlp -> batch pos d_mlp\",\n",
" test_in,\n",
" hooked_model.blocks[0].mlp.W_gate,\n",
" ).detach().cpu()\n",
"is_close = torch.isclose(hf_w_gate_out, hooked_w_gate_out)\n",
"(~is_close).sum(), is_close.shape"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(9), torch.Size([1, 1, 14336]))"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from opt_einsum import contract\n",
"hf_w_gate_out = hf_model.model.layers[0].mlp.gate_proj(test_in).detach().cpu()\n",
"# https://github.com/TransformerLensOrg/TransformerLens/blob/318236402ddcc9cabace3f2fca40c71f0c2e9e57/transformer_lens/components/gated_mlp.py#L102C13-L107C18\n",
"hooked_w_gate_out = contract(\"bpk, kd -> bpd\",\n",
" test_in,\n",
" hooked_model.blocks[0].mlp.W_gate,\n",
" ).detach().cpu()\n",
"is_close = torch.isclose(hf_w_gate_out, hooked_w_gate_out)\n",
"(~is_close).sum(), is_close.shape"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(9), torch.Size([1, 1, 14336]))"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hooked_w_gate_out = (test_in @ hooked_model.blocks[0].mlp.W_gate).detach().cpu()\n",
"is_close = torch.isclose(hf_w_gate_out, hooked_w_gate_out)\n",
"(~is_close).sum(), is_close.shape"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(9), torch.Size([1, 1, 14336]))"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lin = torch.nn.Linear(4096, 14336, bias=False)\n",
"lin.weight = torch.nn.Parameter(hooked_model.blocks[0].mlp.W_gate.T)\n",
"hooked_w_gate_out = lin(test_in).detach().cpu()\n",
"is_close = torch.isclose(hf_w_gate_out, hooked_w_gate_out)\n",
"(~is_close).sum(), is_close.shape"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(9), tensor(4819))"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hooked_w_gate_out = torch.nn.functional.linear(test_in, hooked_model.blocks[0].mlp.W_gate.T).detach().cpu()\n",
"hf_w_gate_out = torch.nn.functional.linear(test_in, hf_model.model.layers[0].mlp.gate_proj.weight).detach().cpu()\n",
"is_close = torch.isclose(hf_w_gate_out, hooked_w_gate_out)\n",
"(~is_close).sum(), (hf_w_gate_out != hooked_w_gate_out).sum()"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(tensor(0), torch.Size([1, 1, 14336]))"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hooked_model.blocks[0].mlp.W_gate.data = hf_model.model.layers[0].mlp.gate_proj.weight.T\n",
"hf_w_gate_out = hf_model.model.layers[0].mlp.gate_proj(test_in).detach().cpu()\n",
"# https://github.com/TransformerLensOrg/TransformerLens/blob/318236402ddcc9cabace3f2fca40c71f0c2e9e57/transformer_lens/components/gated_mlp.py#L102C13-L107C18\n",
"hooked_w_gate_out = einsum(\n",
" \"batch pos d_model, d_model d_mlp -> batch pos d_mlp\",\n",
" test_in,\n",
" hooked_model.blocks[0].mlp.W_gate,\n",
" ).detach().cpu()\n",
"is_close = torch.isclose(hf_w_gate_out, hooked_w_gate_out)\n",
"(~is_close).sum(), is_close.shape"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor(True, device='cuda:0')"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(hooked_model.blocks[0].mlp.W_gate == hf_model.model.layers[0].mlp.gate_proj.weight.T).all()"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"tensor([[True, True, True, ..., True, True, True],\n",
" [True, True, True, ..., True, True, True],\n",
" [True, True, True, ..., True, True, True],\n",
" ...,\n",
" [True, True, True, ..., True, True, True],\n",
" [True, True, True, ..., True, True, True],\n",
" [True, True, True, ..., True, True, True]], device='cuda:0')"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"torch.isclose(hooked_model.blocks[0].mlp.W_gate, hf_model.model.layers[0].mlp.gate_proj.weight.T)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "default",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment