{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Performance of Randperm on CPU/GPU" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Node Random perm on host: host duration 6384.1ms, device duration 6384.4ms\n", "Node Random perm on device: host duration 2525.0ms, device duration 2525.0ms\n" ] } ], "source": [ "from common import *\n", "from utils.profile import debug_profile\n", "from utils.mem_profiler import MemProfiler\n", "\n", "with debug_profile(\"Random perm on host\"):\n", " torch.randperm(1024 * 1024 * 100)\n", "\n", "with debug_profile(\"Random perm on device\"),\\\n", " MemProfiler(\"Random perm on host\", device=\"cuda:3\"):\n", " torch.randperm(1024 * 1024 * 100, device=\"cuda:3\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# \\_\\_getattribute\\_\\_ Method" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a.a: 1\n", "a.b: 2\n" ] }, { "ename": "AttributeError", "evalue": "'A' object has no attribute 'c'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"a.a:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"a.b:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"a.c:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36m__getattribute__\u001b[0;34m(self, _A__name)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0merr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36m__getattribute__\u001b[0;34m(self, _A__name)\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m__name\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getattribute__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m__name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'A' object has no attribute 'c'" ] } ], "source": [ "class A(object):\n", "\n", "\n", " def __init__(self, a, **extra) -> None:\n", " super().__init__()\n", " self.a = a\n", " self.extra = extra\n", "\n", " def __getattribute__(self, __name: str):\n", " try:\n", " return super().__getattribute__(__name)\n", " except AttributeError as e:\n", " try:\n", " return self.extra[__name]\n", " except KeyError:\n", " pass\n", " err = e\n", " raise err\n", "\n", "\n", "a = A(a=1, b=2)\n", "\n", "\n", "print(\"a.a:\", a.a)\n", "print(\"a.b:\", a.b)\n", "print(\"a.c:\", a.c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Performance of Various Select/Scatter Methods" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.010159730911254883 tensor(100., device='cuda:0')\n", "0.011237859725952148 tensor(1400., device='cuda:0')\n", "0.032263755798339844 tensor(2700., device='cuda:0')\n", "0.02148723602294922 tensor(4.1723e-07, device='cuda:0')\n", "0.009927511215209961 tensor(4.1723e-07, device='cuda:0')\n", "Mask set 0.02173590660095215\n", "Inplace mask scatter 0.0041882991790771484\n", "Mask scatter 0.00580906867980957\n", "Index set 0.03358888626098633\n", "Index put 0.01044917106628418\n" ] } ], "source": [ "from common import *\n", "from time import time\n", "\n", "a = torch.zeros(200000, device=\"cuda\")\n", "i = torch.randint(0, a.shape[0], [500000], device=\"cuda\")\n", "start = time()\n", "for _ in range(100):\n", " a[i] += 1\n", "end = time()\n", "print(end - start, a.max())\n", "start = time()\n", "for _ in range(100):\n", " a.index_add_(0, i, torch.ones_like(i, dtype=torch.float))\n", "end = time()\n", "print(end - start, a.max())\n", "\n", "start = time()\n", "for _ in range(100):\n", " ui, n = i.unique(return_counts=True)\n", " a[ui] += n\n", "end = time()\n", "print(end - start, a.max())\n", "\n", "\n", "a = torch.rand(2000, 2000, device=\"cuda\") - .5\n", "m = a > 0\n", "\n", "start = time()\n", "for _ in range(100):\n", " b = a[m]\n", "end = time()\n", "print(end - start, b.min())\n", "\n", "start = time()\n", "for _1 in range(20):\n", " m1 = m.nonzero(as_tuple=True)\n", " for _ in range(5):\n", " b = a[m1]\n", "end = time()\n", "print(end - start, b.min())\n", "\n", "\n", "c = torch.rand_like(b)\n", "\n", "start = time()\n", "for _ in range(100):\n", " a[m] = c\n", "end = time()\n", "print(\"Mask set\", end - start)\n", "\n", "start = time()\n", "for _ in range(100):\n", " a.masked_scatter_(m, c)\n", "end = time()\n", "print(\"Inplace mask scatter\", end - start)\n", "\n", "\n", "start = time()\n", "for _ in range(100):\n", " a = a.masked_scatter(m, c)\n", "end = time()\n", "print(\"Mask scatter\", end - start)\n", "\n", "start = time()\n", "for _1 in range(20):\n", " m1 = m.nonzero(as_tuple=True)\n", " for _ in range(5):\n", " a[m1] = b\n", "end = time()\n", "print(\"Index set\", end - start)\n", "\n", "\n", "start = time()\n", "for _1 in range(20):\n", " m1 = m.nonzero(as_tuple=True)\n", " for _ in range(5):\n", " a.index_put_(m1, b)\n", "end = time()\n", "print(\"Index put\", end - start)" ] } ], "metadata": { "interpreter": { "hash": "65406b00395a48e1d89cf658ae895e7869e05878f5469716b06a752a3915211c" }, "kernelspec": { "display_name": "Python 3.8.12 ('base')", "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.8.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }