Skip to content

Instantly share code, notes, and snippets.

@cemlyn007
Created October 31, 2022 15:08
Show Gist options
  • Save cemlyn007/78873b2d37647d0b64fcec599d6b8aad to your computer and use it in GitHub Desktop.
Save cemlyn007/78873b2d37647d0b64fcec599d6b8aad to your computer and use it in GitHub Desktop.
JitRlaxLambdaReturnsBenchmark.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyMvg/5R6yDGp3kaFijZN9aM",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/cemlyn007/78873b2d37647d0b64fcec599d6b8aad/jitrlaxlambdareturnsbenchmark.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"source": [
"!pip install -q -U pip jax\n",
"!pip install -q rlax"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "mqC6Zd9FV03w",
"outputId": "f226da0e-61e7-4336-b9a5-6b48d1ca9688"
},
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m"
]
}
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "JLJjYbYwVleB",
"outputId": "ed778f68-0026-4e42-e67e-dfed9061773e"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"JAX Version: 0.3.23\n",
"Size, Time taken to execute 100 times\n",
"2 0.004910496920001606 0.061564857000121265 5.2999499985162405e-06\n",
"4 0.007591661210003622 0.08067618299992318 6.602229996133247e-06\n",
"8 0.013084104059998936 0.13883926699963922 8.437299998149683e-06\n",
"16 0.023296493190000548 0.2841104499998437 5.7832109996525104e-05\n",
"32 0.043934581620001155 0.49321855699963635 5.813510001644317e-06\n",
"64 0.08431943933000184 1.075515901000017 6.881499998598883e-06\n",
"128 0.16692044445000193 2.5870816419997027 7.299479998437164e-06\n",
"256 0.3538112200400019 8.227743565999845 1.0447419999763951e-05\n",
"512 0.6520403084700002 40.382920166000076 1.3444420001178513e-05\n",
"1024 1.4777235191299996 269.793594882 2.5668820003375005e-05\n"
]
}
],
"source": [
"import functools\n",
"import jax\n",
"import rlax\n",
"import jax.numpy as jnp\n",
"import timeit\n",
"import gc\n",
"import matplotlib.pyplot as plt\n",
"\n",
"print(f'JAX Version: {jax.__version__}', flush=True)\n",
"\n",
"number = 100\n",
"lambda_returns = functools.partial(rlax.lambda_returns, stop_target_gradients=True)\n",
"jitted_lambda_returns = jax.jit(lambda_returns)\n",
"sizes = []\n",
"mean_time_takens = []\n",
"jit_first_time_takens = []\n",
"mean_jit_exec_time_takens = []\n",
"print(f'Size, Time taken to execute {number} times')\n",
"for n in range(1, 11):\n",
" jitted_lambda_returns.clear_cache()\n",
" gc.collect()\n",
" size = 2 ** n\n",
" arr = jnp.zeros((size,), float)\n",
" mean_time_taken = timeit.timeit('lambda_returns(r_t, discount_t, v_t, 1.).block_until_ready()',\n",
" number=number,\n",
" globals={\n",
" 'lambda_returns': lambda_returns,\n",
" 'r_t': arr,\n",
" 'discount_t': arr,\n",
" 'v_t': arr\n",
" }) / number\n",
" jit_first_time_taken = timeit.timeit(\n",
" 'jitted_lambda_returns.clear_cache(); jitted_lambda_returns(r_t, discount_t, v_t, 1.).block_until_ready()',\n",
" number=1,\n",
" globals={\n",
" 'jitted_lambda_returns': jitted_lambda_returns,\n",
" 'r_t': arr,\n",
" 'discount_t': arr,\n",
" 'v_t': arr\n",
" })\n",
" mean_jit_exec_time_taken = timeit.timeit('jitted_lambda_returns(r_t, discount_t, v_t, 1.).block_until_ready()',\n",
" number=number,\n",
" globals={\n",
" 'jitted_lambda_returns': jitted_lambda_returns,\n",
" 'r_t': arr,\n",
" 'discount_t': arr,\n",
" 'v_t': arr\n",
" }) / number\n",
" print(str(size).ljust(6), mean_time_taken, jit_first_time_taken, mean_jit_exec_time_taken, flush=True)\n",
" sizes.append(size)\n",
" mean_time_takens.append(mean_time_taken)\n",
" jit_first_time_takens.append(jit_first_time_taken)\n",
" mean_jit_exec_time_takens.append(mean_jit_exec_time_taken)\n"
]
},
{
"cell_type": "code",
"source": [
"plt.figure(figsize=(12, 6))\n",
"plt.subplot(1, 2, 1)\n",
"plt.plot(sizes, mean_time_takens, label='Mean Normal', color='blue')\n",
"plt.plot(sizes, mean_jit_exec_time_takens, label='Mean JIT Exec', color='red')\n",
"plt.yscale('log')\n",
"plt.ylabel(f'Time Taken to execute {number} times (s)')\n",
"plt.xlabel('Size')\n",
"plt.legend()\n",
"plt.subplot(1, 2, 2)\n",
"plt.plot(sizes, jit_first_time_takens, label='JIT Compile & Exec', color='red')\n",
"plt.ylabel(f'Time Taken to execute {number} times (s)')\n",
"plt.xlabel('Size')\n",
"plt.legend()\n",
"plt.tight_layout()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 441
},
"id": "YLScDcrfV2Bp",
"outputId": "c0d742dd-6f69-45b2-8e33-c891ac0b88ea"
},
"execution_count": 30,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA1gAAAGoCAYAAABbkkSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde5zOdf7/8cfLpEiokDBpiMqZDCWUDtLKYTsnbdvaL0nlEOmAXw61UZRj26rQASnaXdTmUKntoJBDTluqqcYpoRExjHn//vjMjBnmcM3Mdc3nOjzvt9vczPW5Ptf1eQ7tvud1vd+f19ucc4iIiIiIiEjxlfI7gIiIiIiISLRQgSUiIiIiIhIkKrBERERERESCRAWWiIiIiIhIkKjAEhERERERCZKT/A4QCpUrV3YJCQl+xxARkSBYtWrVL865Kn7nCAaNTyIi0SOv8SkqC6yEhARWrlzpdwwREQkCM/vB7wzBovFJRCR65DU+aYmgiIiIiIhIkKjAEhERERERCRIVWCIiIiIiIkESlfdg5ebIkSMkJydz6NAhv6NILsqUKUN8fDylS5f2O4qISInS+BTbNP6JRJ+YKbCSk5MpX748CQkJmJnfcSQb5xy7d+8mOTmZWrVq+R1HRKREaXyKXRr/RKJTzCwRPHToEJUqVdLgFYbMjEqVKunTWxGJSRqfYpfGP5HoFDMFFqDBK4zp30ZEYpn+PzB26d9eJPpEVYFlZp3NbGpKSorfUUREREREJAZFVYHlnFvgnOtVsWJFv6Pkysy44447sh6npaVRpUoVOnXqFNLr3nXXXdSoUYPU1FQAfvnlFxISEkJ6zePNmDGD++67r0SvKSIigTnttNNISkqiYcOGLFq0iKZNm9K0aVNOO+00LrjgApo2bcqdd955wuu+/vprOnbsSN26dbnooou45ZZb2LlzZ8hyzp8/n9GjRwMwfPhwxo4dW6jXL1iwgPr169OwYUOGDBmS53kzZsygSpUqWX8PTZs2ZePGjcXKLiKxI2aaXISDcuXKsX79eg4ePEjZsmVZsmQJNWrUKJFrx8XFMW3aNO65555CvzYtLY2TTtJ/KiIisaBDhw506NABgHbt2jF27FgSExNPOO/QoUNcd911PPPMM3Tu3BmAZcuWsWvXLqpWrRqSbF26dKFLly5Ffn3//v1ZunQptWrV4vvvv8/33FtvvZXJkycX+VoiEruiagYrEnTs2JG3334bgNmzZ9OtW7es5w4cOECPHj1o2bIlzZo149///jcASUlJtG3blosuuoiLLrqITz/9FPAGsnbt2nHTTTdx4YUX0r17d5xzuV63f//+PPvss6SlpeU47pzjwQcfpGHDhjRq1Ig5c+ZkvXfbtm3p0qUL9evXZ9myZVx++eV07dqV2rVr8/DDDzNz5kxatmxJo0aN+PbbbwHv08GLL76YZs2acfXVV4f0k0wREfHPrFmzaNWqVVZxBV5B1rBhQw4dOsRf/vIXGjVqRLNmzfjggw8Ab2boj3/8I+3btychIYHJkyfzzDPP0KxZMy655BL27NmT9T79+vWjadOmNGzYkC+++CLr9bmthvj222+59tprad68OW3btmXz5s25Zj755JNJTk4GKFLXvn/+859cddVVOOfYvn07559/Pjt27GDXrl3ceOONtGjRghYtWvDJJ58AsH///qy/h8aNGzNv3rxCX1NEIk9MTkv07w9r1gT3PZs2hfHjCz7vtttuY+TIkXTq1Il169bRo0cP/vvf/wLwxBNPcOWVVzJt2jR+/fVXWrZsydVXX81ZZ53FkiVLKFOmDN988w3dunVj5cqVAKxevZoNGzZQvXp1WrduzSeffEKbNm1OuG7NmjVp06YNr776ao7B8K233mLNmjWsXbuWX375hRYtWnDZZZcB8OWXX7J+/Xpq1arFsmXLWLt2LZs2beLMM8+kdu3a/N///R9ffPEFEyZMYNKkSYwfP542bdqwfPlyzIwXX3yRp556inHjxgXhb1hEJAb4OUAV0vr162nevHmuz02ZMgUz46uvvmLz5s1cc801fP3111mvW716NYcOHaJOnTqMGTOG1atXM2DAAF555RX69+8PwO+//86aNWv46KOP6NGjB+vXr88zS69evXj++eepW7cun3/+OX369OH999/PcU56ejr169enR48eLFmypMCl8nPmzOHjjz/OevzZZ59x/fXXM2/ePKZMmcK7777LiBEjOPvss7n99tsZMGAAbdq04ccff6RDhw5s2rSJUaNGUbFiRb766isA9u7dW+Dfq4hEvpgssPzUuHFjkpKSmD17Nh07dszx3OLFi5k/f37WmvJDhw7x448/Ur16de677z7WrFlDXFxc1iAF0LJlS+Lj4wFo2rQpSUlJuRZYAI888ghdu3bluuuuyzr28ccf061bN+Li4qhatSqXX345K1asoEKFCrRs2TLHJ3wtWrSgWrVqAJx33nlcc801ADRq1Cjr08nk5GRuvfVWtm/fzuHDh7Wvh4hIDPr444+5//77Abjwwgs599xzs8auK664gvLly1O+fHkqVqyY9aFfo0aNWLduXdZ7ZK7wuOyyy9i3bx+//vprrtfav38/n376KTfffHPWscx7jrObNGkSTZo04Z577qFz5868//77JCUlMWbMGObOnXvC+XktEZw0aRINGzbkkksuycq4dOnSHPdo7du3j/3797N06VJef/31rONnnHFGHn9jIhJNYrLACsEHeYXSpUsXBg0axLJly9i9e3fWcecc8+bN44ILLshx/vDhw6latSpr164lPT2dMmXKZD13yimnZH0fFxd3whLA7OrWrUvTpk154403AspZrly5HI+zX6tUqVJZj0uVKpV13fvvv58HHniALl26sGzZMoYPHx7QtUREBP8HqEJo0KABH374YaFfF8hYAie2L8+rnXl6ejqnn346awqY+Vu0aBGDBw+mXbt2DBs2jOuuu46WLVty2223FSp/cnIypUqVYufOnaSnp1OqVCnS09NZvnx5jvFZRGKX7sHyQY8ePXjsscdo1KhRjuMdOnRg0qRJWfdRrV69GoCUlBSqVatGqVKlePXVVzl69GiRrz1kyJAcXZfatm3LnDlzOHr0KLt27eKjjz6iZcuWRX7/lJSUrMYdL7/8cpHfR0QiX0oK7NjhdwoJldtvv51PP/00675igI8++oj169fTtm1bZs6cCXidBn/88ccTPjwsSOY9wR9//DEVK1Ykrw7BFSpUoFatWrz55puA92Hl2rVrTzivWbNmvPbaa6Snp3PLLbdQt25dZs2alWNVR0HS0tLo0aMHs2fPpl69ejzzzDMAXHPNNUyaNCnrvMxir3379kyZMiXruJYIioSJDRsgj74FwaACywfx8fH07dv3hOPDhg3jyJEjNG7cmAYNGjBs2DAA+vTpw8svv0yTJk3YvHnzCTNLhdGgQQMuuuiirMfXX389jRs3pkmTJlx55ZU89dRTnH322UV+/+HDh3PzzTfTvHlzKleuXOT3EZHwd+QIfPcdLF0KU6fCI4/ArbdCixZQqRKcfjoMGuR3SilIWlpajlmlQJUtW5aFCxcy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/ec/cPnlUKYMfPKJiisRERERiRAHDngtr5s39/YVijEqsMLQtGnQuTOcf75331W9en4nEhEREREJ0JgxsHUrTJwIpWKv3Ii9nziMOQcjRsBf/wpXXQUffqg9rkREREQkgiQlwdNPw+23w6WX+p3GF7oHK0wcOQL33OMtU/3zn+GFF2JiHzYRERERiSYPPujNWo0Z43cS34T9DJaZ1Tazl8xsrt9ZQmX/fuja1Suuhg3zulmquBIRERGRiLJsGcydCw8/DPHxfqfxTUgLLDObZmY/m9n6445fa2b/M7MtZvZwfu/hnPvOOffXUOb0064oWIgAACAASURBVM6d0K4dLFoE//gHjBwJZn6nEhEREREphKNHvbbs557r7XsVw0K9RHAGMBl4JfOAmcUBU4D2QDKwwszmA3HAk8e9vodz7ucQZ/TN1197e1zt3An//jd06uR3IhERERGRInjxRVi3Dt58E8qW9TuNr0JaYDnnPjKzhOMOtwS2OOe+AzCz14GuzrkngZgpMT77zOsUWKqUN5vaooXfiUREREREimDvXhgyxNtj6MYb/U7jOz/uwaoB/JTtcXLGsVyZWSUzex5oZmaP5HNeLzNbaWYrd+3aFby0IfCvf8GVV8IZZ3iFloorEREREYlYI0Z4RdaECbrXhQjoIuic2w30DuC8qcBUgMTERBfqXEU1ZQr07esVVQsWQJUqficSERERESmijRth8mTo1QuaNPE7TVjwYwZrK3BOtsfxGceiWnq611Dlvvu8e63ef1/FlYiIiIhEMOdgwAAoX97r1CaAPwXWCqCumdUys5OB24D5wXhjM+tsZlNTUlKC8XZBc/gw3Hmntx1A794wbx6ceqrfqUREREREimHhQli8GIYP18xBNqFu0z4b+Ay4wMySzeyvzrk04D5gEbAJeMM5tyEY13POLXDO9apYsWIw3i5oxoyBmTPhb3+D556Dk8J+YaaIiIiISD5SU+GBB+DCC6FPH7/ThJVQdxHslsfxd4B3QnntcJGU5BVWt9wCj+TZokNEREREJIJMnAhbtsC770Lp0n6nCSt+LBEMmXBcIjhwoNeKfexYv5OIiIiIiATBjh0wapS351CHDn6nCTtRVWCF2xLBJUvgrbe8bQHOOafg80VEREREwt6QIXDoEIwb53eSsBRVBVY4OXzYa8d+3nneLJaIiIiISMRbuRKm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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
}
]
}
@cemlyn007
Copy link
Author

I should have also plotted the memory usage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment