Skip to content

Instantly share code, notes, and snippets.

@aphearin
Created February 15, 2023 19:42
Show Gist options
  • Save aphearin/84f0d8890e0178e925bb0803de2eb5dc to your computer and use it in GitHub Desktop.
Save aphearin/84f0d8890e0178e925bb0803de2eb5dc to your computer and use it in GitHub Desktop.
Quick overview of JAX
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "afa7c7be",
"metadata": {},
"source": [
"# Quick Intro to JAX\n",
"\n",
"JAX is a python library for automatic differentiation. There is by now quite a lot of well-presented material about JAX available online; [the JAX docs](https://jax.readthedocs.io/en/latest/) are generally very accessible and helpful, and there are also some excellent tutorials floating around (I particularly like [this one](https://ericmjl.github.io/dl-workshop/index.html) on Differentiable Programming with JAX). This notebook just gives a quick overview of some of the core features in JAX: `jax.numpy`, `jax.jit`, `jax.grad`, and `jax.vmap`."
]
},
{
"cell_type": "markdown",
"id": "20aa5319",
"metadata": {},
"source": [
"## JAX as Numpy that runs on GPUs\n",
"\n",
"The JAX API will be familiar to people used to performing bulk-array calculations with Numpy. Even when not using autodiff, writing Numpy-like programs in JAX is a great way to write fast python code that targets GPUs, since JAX's backend is the [XLA](https://www.tensorflow.org/xla) library for accelerated linear algebra. As they say in the JAX docs, you can think of JAX as a differentiable Numpy that runs on accelerators. JAX provides its own implementation of most of the functionality in Numpy, using the same syntax:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "607e555d",
"metadata": {},
"outputs": [],
"source": [
"from jax import numpy as jnp\n",
"\n",
"nx = 30\n",
"xarr = jnp.linspace(0, 2*jnp.pi, nx)\n",
"yarr = jnp.cos(xarr)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "d1ed9555",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD/CAYAAAD8MdEiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAAsTAAALEwEAmpwYAAAqB0lEQVR4nO3deVyUdeIH8M8AwykwjHgh54B4XwOa91FQ+euuEau1skPIrN2ujdx2V7d+u+ZsuVmaP9isdmu3FcjuSwavrEyBVLy4BgVEEBgGUESOmd8fBhseyDEz35l5Pu/Xy9erZw74OGPPZ77zfZ7nKzObzWYQEZFkuYgOQEREYrEIiIgkjkVARCRxLAIiIoljERARSRyLgIhI4txEB+iLwMBAhIeHi45BROQwjh8/jpqamsve55BFEB4ejuzsbNExiIgcRmxs7BXv41dDREQSxyIgIpI4FgERkcRZZY7AaDQiNTUVtbW1WLNmzVUfr9VqoVKpYDAYAACJiYnWiEVERJdh8RGBTqeDTqdDcXExjEbjVR+fnJwMlUoFjUaDxMREFBcXIyMjw9KxiIjoCixeBHFxcdBoNFAoFD16fGpqKjQaTef2okWLkJKSYulYRER0BULnCHJzcy+5TaFQQKfTCUhDRCRNQs8jMBgMUCqVXW67eNtSzGYzbtvwHcIG+iAmVAF1WABGD/OD3JXz5URkn5pb23HoZD1yS+uQc6IOre1mvL1kisV/j9Ai6G4OwWg0XvHrpYqKCshkss7tlStXYtWqVd3+rqaWdoQovbGvxIDPDlQAADzlLpgQrEBMWABiQgOgDguA0se9t38NIiKLqKxv7tzp55yow+GKerS2X1g7LGygN6aGK2E2m7vs/yxBaBEoFIrOI4U6XLx9OUFBQaioqOjV7/LxcMOGe9UAgArjuc4XO/dEHf6+S4+NpgsvdkSgDyaHKjBnxCDcOjEILi6WfcGJiDq0tJmQnlOGPXoDck/U4aTxHADAw80FE4L98dCsCMSEBmByaAAG+XpYLYfQIlAqlZeMCjq2ezrZ3BdBCi8EKbxw84QgABeGXwfL/zv82plfjS25J/HvvaX4q2YCwgb6WC0LEUnToZP1eDb9AI5VNmKYvyfUYQEXdvxhARgzzA/ubrb72lpoEajV6kt2+AaDAXFxcTbN4Sl3xdQIJaZGXJifMJvNSM8px0ufHcGNr32L524ciQemh3N0QET91tJmwvpthdiwoxhKH3f8/f5YxI8ZIjSTzWdK9Xp9l/MEEhISumxnZmYiKSnJ1rG6kMlkSIgNwdan5+AalRJ/+uwI7k7dg+M1Z4XmIiLHlldej1vX78br24pw26QgZD41R3gJAIDMbDabLfkDc3NzodPpOs8FSEpKQlxcHNTqC9/Pa7VaZGZmIjMzs/M5Wq0WarUaer0ewNXPLI6NjbXZ1UfNZjMycsrx4udH0NpuwnM3jMKSGRwdEFHPnW9rx/ptRXhzRzEG+rhj9Z3jcd1o2xZAd/tNixeBLdiyCDpU1jdjxZaD2J5fjanhSmg1ExAeyLkDIupeXvmFuYD8qkbcpQ7GH28eA39vuc1zdLff5EH0PTTU3xNvL5mCVxZOxNHKBty4bhc27S6ByeRwPUpENnC+rR2vfJOP29/8DsZzLXh7SSxeTZgopASuxiEXphFFJpNBExOMWVGB+N1HeXjp8yP4+tAprE2YhBClt+h4RGQnjp5qwJP/2Y/8qkZoYoLxh5vHwN/L/gqgA0cEfTDU3xObHojF2oSJOFbZiHvf2oOqhmbRsYjIDhRWNeKev+9BXVML3vn5WwR7LgGARdBnMpkMd6qD8f7D18BwpgX3bfoRxqYW0bGISKAyQxMWb/oRclcXpD86HfNHDRYdqUdYBP00MUSBvz8Qi+O1TVjyzj6cPd8mOhIRCXC6sRmLN/2I5lYT3n/4Goc6EZVFYAEzIgOx/p7JyDtZj8T3snG+rV10JCKyofqmVty/aS9ON5zHOw9OwcihvqIj9QqLwEKuHzsU2rsm4LuiWvzmg/1oazeJjkRENtDU0oaH/rEP+uqzSL0/BurQANGReo1FYEF3xVw4Rvjrw5VYsSWPh5YSObmWNhMefT8XP5XW4fV7JmH2iEGiI/UJDx+1sIdmRaD+XCvWZRXCz0uO39802uKXjCUi8dpNZjy1eT92FVRDe9cE3DhumOhIfcYisIIn40ag/lwrNu0uQYC3HI9fO0J0JCKyILPZjN9/nIcv8k7hhf8ZjYQpIaIj9QuLwApkMhn+ePMYNJxrxStbC+DnJcf908NFxyIiC3n562P4YG8ZHp8fhaVzVKLj9BuLwEpcXGRYo5mAhuY2/PGTw/DzlOP2ycNFxyKiftq4oxgpO/VYPC0Uz1wfLTqORXCy2Irkri5Yf+9kTFMp8Uz6AWQdrRIdiYj64d8/lmLN18dw68QgvHjrOKeZ/2MRWJmn3BVvPTAFY4P8sPzfuSg6fUZ0JCLqgx/1tXjh4zxcO2owXk2Y6FSXomcR2MAADze8dX8sPOWueDptP1p5jgGRQ2lobsXTaQcQpvTGG/dMhtzVuXadzvW3sWOD/Tyx+o7xOFhejzeyCkXHIaJeWPXpYVQ2NGPtoknw8XC+qVUWgQ0tGD8Md6mDsX57EXJO1ImOQ0Q98GXeKWzJPYnl86Mc8qzhnmAR2NiqW8cgSOGFp9P28wJ1RHauqqEZv/soDxOD/fHEtVGi41gNi8DGfD3lWJswCaWGJrz0+RHRcYjoCkwmM55NP4Dm1nb8bdEkp5sX+CXn/ZvZsakRSiTNicR/9pUh8wgPKSWyR+/tOYFvC2vwwk1joBo0QHQcq2IRCPJ0fDTGDPPD8x8eRHXjedFxiOgXik434i9fHsX8kYOw+JpQ0XGsjkUgiLubC167exIaz7fh+Q8PwmzmlUqJ7EFLmwlPbt4PHw83rNFMcJqTxrrDIhAoeogvnr9xFLKOncYHe8tExyEiAOuyCnDoZAP+csd4DPb1FB3HJlgEgi2ZEY6ZUQPx0udHUFJzVnQcIknLPm7Axh3FWBgTjBvHDRUdx2ZYBIK5uMjwysKJkLvK8NRmrmxGJMqZ8214Km0/hgd4YeWtY0XHsSkWgR0Y5u+FP98xHvvLjNiwvVh0HCJJevGzwzhZdw5/S5iEAU549nB3WAR24paJQbh9UhBe31aI/WVG0XGIJOWbw5VIyy7HsnmRiA1Xio5jcywCO/Kn28ZhiK8Hntq8H00tPOuYyBZONzZjxZY8jBvuh99c5xzrC/QWi8CO+HvJ8UrCRByvPYu1WwtExyGShFWfHsbZ8214bdEkuLtJc5cozb+1HZsRGYhFsSF49/vjKK7m2gVE1vR9cQ2+zKvE8vlRiBrsKzqOMCwCO/TsDSPhJXfltYiIrKit3YQXPzuC4AAvJDrBusP9wSKwQ4EDPPCbuBHYkV+N7cdOi45D5JQ+2FeGY5WNeOF/RsNT7io6jlAsAjt1//RwqAb54KXPj6CljecWEFmSsakFr27NxzSVUlInjl0Ji8BOubu54A83j4G+5iz+8f1x0XGInMprukI0nGvFylvGSuJaQlfDIrBj80cOxvyRg/B6ViGvUEpkIfmVjXhvzwnce00oRg/zEx3HLrAI7Nwfbh6Dc63teOWbfNFRiBye2WzGi58fxgAPNzwTP1J0HLvBIrBzqkED8ODMcKTllCGvvF50HCKHtvVIFb4rqsVTcSMQ4OMuOo7dYBE4gCeuG4GBPu5Y9dlhrltA1EfNre348xdHET1kABZPCxMdx65Y7cpKWq0WKpUKBoMBAJCYmHjFx6ampiInJwcLFy4EAKSnpyM5ORkqlbSP7e3g5ynHb28YieQP8/DpgQrcNmm46EhEDmfT7hKUGprw/sPXwM2J1x/uC6u8Gh07cY1Gg8TERBQXFyMjI6Pb56SlpSE+Ph7JyclISkpiCVxkYUwIxg/3x+ovj/E6RES9VNXQjA3bi3D9mCGYNSJQdBy7Y5UiSE1NhUaj6dxetGgRUlJSun1OXV0dzGYzcnJyoFarrRHLobm4yLDyljGobGjGxh28VDVRb6z56hja2s144abRoqPYJYsXQW5u7iW3KRQK6HQ6S/8qyYkNV+K2SUFI2aVHmaFJdBwih5BbWoctP53EI7MjEDbQR3Qcu2TxOQKDwQClsuv1vC/evpzU1FQolcoezSlI2fMLRmHr4Sr85cuj2Lg4RnQcIrtmMpnxp08PY7CvBx6bHyU6jt2y+IjAaDT2+r7Y2FjExcV1zilkZmZ2O6dQUVEBmUzW+WfVqlX9C+1Ahvl74bF5kfjqUCW+L64RHYfIrm356SQOlNfj+QWjJLfqWG9YvAgUCkXnp/oOF29fTK1Wd5kcnjJlClavXn3FxwcFBcFsNnf+kVIRAMDSOSoMV3jhxc+OcI1jois4c74Na74+hkkhCtzOI+26ZfEiUCqVl3zy79hWKBSXfc7F8wcqleqycw10gafcFS/cNBrHKhvxwb4y0XGI7NL6bUWobjyPlbeMgYsLryfUHYsXgVqtvmSHbzAYEBcXd9nH6/V6xMfHX1IePHy0ewvGDcU0lRJrt+ajoblVdBwiu1JmaMLbu0twlzoYk0MDRMexe1Y5fDQhIaHLd/yZmZlISkrq3Nbr9Z33q1QqrFmzpkt5bN68GcnJydaI5jRkMhle+J8xqGtqxdu7S0THIbIrr2cVAjLg2RukuQZxb1ll9iQlJQVarRY6nQ56vR6RkZFdzivIyMhAZmZm520ajQZarRYAUFtbi/j4eB411APjg/1x49ih2PRtCR6YHs5rpxAB0FefwYe55XhwZgSG+XuJjuMQZGYHvHhNbGwssrOzRcewC/mVjbhx3S4kzYnE8wtGiY5DJNwTH/wE3ZEqfJs8H4EDPETHsRvd7Td5wQ0HN3KoL26dGIR3vy/B6cZm0XGIhDp6qgGfHajAgzPDWQK9wCJwAk/GRaO13cxLT5Dk/S2zAL6ebkiaEyk6ikNhETiBiEAfaNTB+NeeUlQYz4mOQyTEgTIjth6pwtLZKvh7y0XHcSgsAifxxHVRMMOMN7YViY5CJMSrmQUI8JbjwZnhoqM4HBaBkwgO8Ma9U0ORnl2GE7VnRcchsqm9JQbsKqjGsnmR8PXkaKC3WAROZPn8KLi6yLBOVyg6CpHNmM1mvLI1H4N8PXDftHDRcRwSi8CJDPbzxAMzwvHR/pMorGoUHYfIJnYX1WBviQGPz4+Cl7ur6DgOiUXgZB6dGwlvuSte46iAJODCaKAAwxVeuHtqiOg4DotF4GSUPu54eFYEvsg7hUMn60XHIbIq3dHTOFBmxK+vi4KHG0cDfcUicEIPz1bBz9MNf8ssEB2FyGpMJjNe3ZqP8IHeuFMdLDqOQ2MROCF/LzmS5kYi69hp5JbWiY5DZBVfHjqFY5WNeCo+GnJX7sr6g6+ek1oyIxwDfdyxditHBeR82tpNWJtZgOghA3DzhCDRcRwei8BJ+Xi4Ydm8SOwuqsEPxbWi4xBZ1Mf7K6CvPoun46PhykVn+o1F4MQWTwvDUD9PvLo1Hw54kVmiy2ppM2FdVgHGDffDDWOHio7jFFgETsxT7orHr41C9ok67CyoFh2HyCLSc8pQZjiHZ64fCZmMowFLYBE4uYTYEAQHeOHVrQUcFZDDa25txxtZRYgJC8C86EGi4zgNFoGTc3dzwZNx0cg7WY9vDleJjkPUL//6sRSVDc14lqMBi2IRSMDtk4IQEeiDN7YVclRADqu5tR0pO4sxXTUQ0yMHio7jVFgEEuDm6oLH5kXicEUDtuefFh2HqE/Ss8twuvE8nrguSnQUp8MikIjbJw9HcIAXXs8q4qiAHE5LmwkbdxQjNiwA01UcDVgai0Ai5K4uWDYvEvvLjNhdVCM6DlGvbMktR0V9Mx6/NopzA1bAIpAQTUwwhvp5chUzciht7Sa8uaMYE4L9MZdHClkFi0BCPNxckTRXhb0lBvyo59nG5Bg+PVCBUkMTHp/P0YC1sAgk5p6poQgc4I712zkqIPvXbjJjw/YijBrqi7jRQ0THcVosAonxlLti6WwVvi2swU+8MinZua8OnUJx9Vk8fm0UXHhNIathEUjQ4mlhUHjLsZ5zBWTHTCYz1m8rQuQgHywYN0x0HKfGIpAgHw83PDwzAlnHTnMVM7JbuqNVOFbZiOXzo3iFUStjEUjUAzPD4evphg2cKyA7ZDabsX57EUKV3rh1ItcbsDYWgUT5ecqxZEY4vjpUiYKqRtFxiLrYWVCNg+X1eGxeJNy4+pjV8RWWsIdmRsDb3ZWjArIrZrMZb2wrQpC/J9cithEWgYQF+Ljjvmlh+OxABUpqzoqOQwQA+EFfi5wTdXh0XiTc3biLsgW+yhL3yGwV5K4uHBWQ3XgjqwiDfD2QEBsiOopksAgkbpCvB+6ZGoqPfjqJMkOT6DgkcdnHDfhBX4ukOSp4yl1Fx5EMFgEhaa4KrjIZNu4sFh2FJO6NbUVQ+rjj3mtCRUeRFBYBYZi/FzSxwcjILsep+nOi45BEHSw3YmdBNR6eFQFvdzfRcSSFRUAAgGVzI9FuNiNlp150FJKoN7YVwc/TDfdPDxMdRXJYBAQACFF6447Jw/HB3lJUN54XHYck5uipBmQeqcKDMyPg6ykXHUdyWATU6bF5kWhtN+GtbzkqINtav70IAzzc8ODMcNFRJIlFQJ1Ugwbg5glBeG/PCdSdbREdhySiuPoMvsw7hfumh0Hh7S46jiRZbUZGq9VCpVLBYDAAABITEy36eLKO5fOj8OmBCrzz/XE8HR8tOg5JwJvbi+Hh5oJHZkWIjiJZVhkRJCcnQ6VSQaPRIDExEcXFxcjIyLDY48l6Rg71xfVjhuDd70rQ2NwqOg45uTJDEz7efxL3TA3FwAEeouNIllWKIDU1FRqNpnN70aJFSElJsdjjyboevzYKDc1teH9Pqego5ORSdhXDRQYkzlGJjiJpFi+C3NzcS25TKBTQ6XQWeTxZ34RgBWaPCMSm3Xo0t7aLjkNO6nRDM9Kyy6GJCcYwfy/RcSTN4kVgMBigVCq73Hbxdn8eT7bx+Pwo1JxpwX/2clRA1vH3b/Voazfh0bmRoqNInsWLwGg09uq+3j4eACoqKiCTyTr/rFq1qlcZ6equUQ3ElPAApOzSo6XNJDoOORnD2Ra8v6cUt04MQthAH9FxJM/iRaBQKDqP/Olw8XZ/Hg8AQUFBMJvNnX9YBNaxfH4UTtU3Y0tuuego5GTe+a4E51rb8dj8KNFRCFYoAqVSeckn+Y5thULR78eT7cyNHoTxw/2xcWcx2to5KiDLaGhuxbvfH8cNY4cgeoiv6DgEKxSBWq2+ZAduMBgQFxdnkceT7chkMiyfH4kTtU34Iu+U6DjkJN774QQam9vw+PwRoqPQz6xy+GhCQkKX8wAyMzORlJTUua3X67vcf7XHkzjXjxmKEYMHYMP2IphMZtFxyMGda2nH27tLMCd6EMYH+4uOQz+zShGkpKRAr9dDp9MhNTUVkZGRXc4TyMjI6HKewNUeT+K4uMjw2PxIFFSdQebRKtFxyMF9sLcUtWdb8DjnBuyKzGw2O9zHvNjYWGRnZ4uOIRlt7SZc++pOKLzl+GT5TMhkMtGRyAGdb2vHXO0OhCq9kfbodNFxJKe7/SYvOkdX5ebqgmXzInGwvB7fFtaIjkMOakvuSVQ2NOPxazkasDcsAuqRO9XDMdTPE+u5yD31QVu7CRt3FGNCsD9mjwgUHYcuwiKgHvFwc0XiHBX2lhiw73j353kQXezzg6dQamjC8vlR/GrRDrEIqMfumRqKgT7uWL+NowLqOZPJjA3bixA9ZADiRw8RHYcug0VAPebl7oqHZkVgZ0E18srrRcchB7H1SBUKT5/B8vlRcHHhaMAesQioV+6bHgZfTzds4FwB9YDZfGE0EDbQGzeNHyY6Dl0Bi4B6xc9TjiUzwvH14UoUVjWKjkN2bldhDfJO1mPZ3Ei4uXJ3Y6/4zlCvPTgzAl5yV7y5o1h0FLJzG7YVYZi/J+5UB4uOQt1gEVCvKX3c8atrQvHpgQqU1jaJjkN2am+JAXuPG5A4RwV3N+5q7BnfHeqTpXNUcHWRca6AruiNbYUY6OOOu6eEio5CV8EioD4Z4ueJe6aE4MPccpQZOCqgrnJOGPBtYQ2S5qrg5e4qOg5dBYuA+mzZvCi4yGR4cwdHBdTVa7oLo4HF08JER6EeYBFQnw3198TdU0OQns1RAf1Xzok6fFtYg8Q5Kni7u4mOQz3AIqB+WTYv8udRAY8gogvWZRVC6eOO+6ZzNOAoWATUL8P8vbBoSgjSs8tQXsdRgdTlltZhV0E1RwMOhkVA/cZRAXVYp/t5NMC5AYfCIqB+C1J4IWFKMEcFEpdbWoedBdVYOlsFHw+OBhwJi4As4rF5FxYb4ahAutbpChHgLcf9nBtwOCwCsoggxX/nCk4az4mOQzb208+jgcQ5kRwNOCAWAVnMso5RAc82lpx1WRwNODIWAVnMcIUXEmJDkJZdhgqOCiRjf5kRO/KrsXQO5wYcFYuALOqx+R1zBRwVSMU6XQEU3nLcPz1cdBTqIxYBWdRwhRcWxoYgbV85RwUScKDMiO35F44UGsDRgMNiEZDFPTYvEmaYsZFHEDm9dVmFUHjL8cCMcNFRqB9YBGRxwQHe0MSEYPO+Mpyq56jAWR0oM2LbsdMcDTgBFgFZxfL5kTCZOSpwZq//PBrgkUKOj0VAVhEc4I2FscH4z16OCpzRwXIjso6dxiOzIuDrKRcdh/qJRUBW89i8KJjMZvwfRwVO5/WsQvh7cW7AWbAIyGpClN7QxATjg71lqKxvFh2HLCSvvB66oxwNOBMWAVnV8vk/jwp2clTgLNZ1jAZmhouOQhbCIiCr6hgV/PvHUl6Z1An8VFoH3dEqPDwrAn4cDTgNFgFZ3a+vGwGZDFi7tUB0FOoHs9mM1V8dQ+AAdzw0K0J0HLIgFgFZXZDCC0tmhuOj/SdxpKJBdBzqo23HTmNviQG/uW4EzxtwMiwCsonH5kbBz1OOl78+JjoK9UG7yYw1Xx9DRKAP7p4aKjoOWRiLgGzC31uOx+dHYVdBNb4rqhEdh3rpw5xyFFSdwW9vGAm5K3cbzobvKNnMfdPDMFzhhdVfHYXJZBYdh3roXEs71mYWYFKIAgvGDRUdh6yARUA24yl3xTPXR+PQyQZ8drBCdBzqoXe+L0FlQzNWLBgFmUwmOg5ZAYuAbOr2ScMxepgfXtmaj/Nt7aLj0FXUnW3Bxh3FiBs9GNeoBoqOQ1Zi8al/rVYLlUoFg8EAAEhMTLziY1NTU5GTk4OFCxcCANLT05GcnAyVSmXpWGQnXFxkWLFgFO5/ey/+taeUhyHaufXbi3D2fBuSbxwlOgpZkUVHBB07cY1Gg8TERBQXFyMjI6Pb56SlpSE+Ph7JyclISkpiCUjAnOhBmBUViDe2FaKhuVV0HLqCMkMT/vnDcSyMCcGIIb6i45AVWbQIUlNTodFoOrcXLVqElJSUbp9TV1cHs9mMnJwcqNVqS8YhO/b8glGoa2rlBens2Ctb8+HqIsNT8dGio5CVWawIcnNzL7lNoVBAp9NZ6leQExk33B+3TQrC29+V8IJ0dujQyXp8sr8CD82MwFB/T9FxyMosNkdgMBigVCq73Hbx9uWkpqZCqVT2aE6BnMuz14/EV3mV+FtmAdZoJoiOQ7/w8lfHEOAtx6PzIkVHIRuwWBEYjcZu71MoFJfcHhsbC4VC0TkvsHDhQiiVyi5fL5HzClF6Y/G0MLz7fQkemR3B76HtxK6CauwuqsEfbh7DC8tJhMW+GlIoFJ2f6jtcvH0xtVrdZXJ4ypQpWL169VV/V0VFBWQyWeefVatW9SkziffEtVHw8XDDGl56wi6YTGa8/NUxhCi9sHgaLyUhFd2OCDIyMrB58+Zuf4BSqURKSgqUSuUlo4KO7cuNBgBAp9MhLi6uc1ulUl12ruFiQUFBqKjgCUnOIMDHHcvmRUL7dT72lhgwNeLqXyeS9Xxy4CSOnGrAursnwcPNVXQcspFui0Cj0fT4axq1Wn3JDt9gMHTZ0f+SXq9HfHw86urqujyPh49Kz0MzI/DP709g9VdHsWXZDJ69Kkhzazte+aYA44f745YJQaLjkA1Z9PDRhISELucNZGZmIikpqXNbr9d33q9SqbBmzZouJbB582YkJydbMhI5AE+5K56Oj8ZPpUZ8fahSdBzJen/PCZw0nsPzC0bBxYVlLCUys9ls0at/abVaqNVq6PV6AF2PAtJqtcjMzERmZiaArsVQW1uLyMjIHh01FBsbi+zsbEvGJsHaTWYsWLcLre1mbH1qDq9waWP1Ta2Y89ftmBiiwD8fmio6DllBd/tNixeBLbAInFPW0So8/I9srLxlDB6cyUtP2NKfvziCt3aX4IsnZmNMkJ/oOGQF3e03+bGL7Ma1owZj9ohAvLq1gCeZ2dDhinq8/d1x3D0lhCUgUSwCshsymQx/vn082kwmrPz0kOg4ktBuMmPFljwEeLvj+RtHi45DgrAIyK6EDvTGb66LxjeHq/DNYU4cW9s/fziOg+X1+OMtY+DvzZPHpIpFQHbnkdkRGDXUFys/OYxGXp3UaiqM5/DKN/mYN3IQbpkwTHQcEohFQHZH7uqCl++agKrGZry6tUB0HKdkNpvxx08Ow2QGXrptHM/dkDgWAdmlSSEK3D8tDP/44Tj2lxlFx3E63xyuhO5oFZ6KH4EQpbfoOCQYi4Ds1rM3jMQQX088/+FBtLabRMdxGg3NrfjjJ4cxZpgfHuJhugQWAdkxX085/nTbWByrbMSm3SWi4ziNv36dj5oz57H6zvFw44l7BBYB2bkbxg7F9WOG4DVdAcoMTaLjOLycE3V4/8cTeGBGOCaGKETHITvBIiC796fbxsLNxQUvfHwIDngivN1obTfhd1vyMNTPE89cP1J0HLIjLAKye8P8vfDs9dHYVVCNTw/w8uN9lbpLj/yqRrx42zgM8LDYmlTkBFgE5BDum37hq4wXPzsCY1OL6DgO50TtWbyeVYgF44YifswQ0XHIzrAIyCG4usjw8p3jYTzXitVfcjWz3jCbzXjho0Nwd3XBqlvHio5DdohFQA5j9DA/PDI7Apuzy7BHXys6jsP4eP9J7C6qwXM3jsQQP0/RccgOsQjIoTx5XTRClF743Ud5ON/WLjqO3TOcbcFLnx/F5FAFfnVNmOg4ZKdYBORQvNxd8b+3j4e++ize3F4sOo7d+8uXR9FwrhWr7xzPVcfoilgE5HDmRg/CbZOCsGF7EfYdN4iOY7c+P1iBjJxyLJ2jwqihXGeAroxFQA7pxdvGIUTpjcf+lYuqBi5ic7H8ykY8l3EQMWEBeCouWnQcsnMsAnJI/l5ypNwXg7Pn27Ds/Ry0tPFaRB3qz7Ui6b1s+Hi44c1fqeHuxv/NqXv8F0IOK3qIL/6qmYjcUiP+9Nlh0XHsgslkxpP/+Qnldeew8VdqHiVEPcIiIId204RhSJqrwr9+LMXmfaWi4wj3WlYhtudXY+UtYxAbrhQdhxwEi4Ac3nM3jMLsEYH4w8eHJb12wdbDlXg9qxALY4KxeBoPFaWeYxGQw3N1keH1uydjsJ8Hlr2fg5oz50VHsrni6jN4Ou0AJgT746XbueIY9Q6LgJxCgI87/m9xDAxnW7D8X7mSWsjmzPk2JL2XA3c3F2xcHANPuavoSORgWATkNMYN98fLd43HjyUGyVyPyGw249m0AyipOYv1907GcIWX6EjkgFgE5FTumByMJTPC8fZ3Jfhk/0nRcazuzR3F+PpwJVYsGIUZkYGi45CDYhGQ03nhptGYGqFE8ocHcbiiXnQcq9lZUI1XtubjlolBeHgW1x6mvmMRkNORu7pgw71qKLzc8ej7OU65fkFpbRN+/cFPGDnEF2vuGs/JYeoXFgE5pUG+Hti4WI2q+vN44oOf0G5yniUum1rakPheNgAg5b4YeLtztTHqHxYBOa3JoQF48bax+LawBr9NP+AUl6HoOEIov6oR6+6ehLCBPqIjkRPgRwlyandPDcXpxvNYm1mAqsZmbFwcAz9PuehYfVLV0Iwl7+xDQVUj1tw5AfNGDhYdiZwERwTk9H593Qi8snAiftQbsHDjD6gwnhMdqdfyKxtxx4bvUFp7FpseiEXClBDRkciJsAhIEjQxwXj3wamoMJ7DHW9+hyMVDaIj9dj3RTXQbPwebSYz0h6dzpEAWRyLgCRj1ohApC+bDhlkSEj5AbsKqkVHuqotueV44J29GKbwxEfLZ2JskL/oSOSEWAQkKaOG+uGj5TMQHOCFB9/dh7R9ZaIjXZbZbMbrWYV4Ou0AYsOUSH90Bs8aJqthEZDkDPP3Qvqj0zEjciCe+/Ag1m7Nh9lsP4eXtrab8PyHeVibWYA7Jw/HPx6aCn8vx5zgJsfAIiBJ8vWU4+0lU7AwJhivbyvCM3ZyeGljcyse/kc2NmeX4Ylro/BqwkSuMEZWx8NHSbLkri7QaiYgROmNtZkFqKxvxv/dJ+7w0sr6Zjz47s+Hh941HoumhArJQdLDIiBJk8lk+PV1IxCk8MLzHx7ELW/sxrK5kbh98nCbXc65sbkVm/eVIWWXHk3n2/D2kimYGz3IJr+bCLBCERiNRqSmpqK2thZr1qy56uO1Wi1UKhUMBgMAIDEx0dKRiK5KExOMIIUn/vfzo3h+Sx7++k0+7psehvumhWHgAA+r/M6TxnN497sS/GdvGRrPt2FquBIrbx3DI4PI5ixaBDqdDkajEcXFxT16fHJyMqZMmQKNRtO5nZGR0blNZEszIgPxxa9n4YfiWry1uwSv6QqxcUcx7lQH4+FZEYgaPMAiv+dAmRFv7S7Bl3mnAAA3jR+GR2ZHYEKwwiI/n6i3ZGYrHC6RnJwMo9GIlJSUbh8XEBCAurq6zu3c3FwkJycjMzOz2+fFxsYiOzvbIlmJrqTodCM27T6OLbnlON9mwrWjBuOR2RGYrhrY66t9tpvMyDpahbe+LcHe4wb4erjhnmtC8cCMcB4WSjbR3X5T2BxBbm7uJbcpFArodDoBaYguFTXYF6vvHI9nr4/G+3tK8c8fjuPev/+IsUF+eHhWBEYM9u3Rz9lfVodNu0twvLYJwxVe+P1No7FoSgh8HfSaR+R8hBWBwWCAUqnsctvF20T2YOAAD/wmbgSS5qrw8U8n8dbuEjyddqBXP2NiiALrbxiJG8cOhZsrDwcl+yKsCIxGY7f3KRSKK95fUVHRZWi+cuVKrFq1ynLhiC7DU+6Ku6eGIiE2BDmldahvau3R8wb7eWD8cH8uHkN2S1gRKBSKziOFOly8fSVBQUGoqKiwRiyiq3JxkWFKOEev5Dy6LYKMjAxs3ry52x+gVCqvOil8peddPCro2O5uNEBERJbVbRFoNBqrHcqpVqsv2eEbDAbExcVZ5fcREdHl2XTWSq/XIyMjo3M7ISGhy3ZmZiaSkpJsGYmISPIsWgS5ubnQarXIyMiATqeDVqvtcphoRkZGl6+RUlJSoNfrodPpkJqaisjISJ5MRkRka2YHFBMT0+fnrly50nJBqE/4HojH90AsEa9/d/tNq5xZbG39ObNYJpPZ1bXnpYjvgXh8D8QS8fp3t9/kmS1ERBLHIiAikjiH/GooMDAQ4eHhfXpuRUUFgoKCLBuIeoXvgXh8D8QS8fofP34cNTU1l73PIYuAiIgsh18NERFJHIuAiEjiWARERBInmcXruTayWB1rWQPAvn37EB8fz/dAsKSkpD5dMJL6x2g0YvXq1YiMjARw4fh+tVotNJMkioBrI4u3evVqrFmzpnO7438CloEYycnJ0Ov1omNIjtFoxMKFCzuX401NTcXq1auRnp4uNJckvhpKTU3tstNftGgRPwnZkNFovGSnk5SU1KUYyHYut0ws2cbSpUu7XFgzISHBLv4/cPoi4NrI9kGn03UpA4VCwU+kgmRnZyM+Pl50DEnKyMhAXFwc9Ho9cnNzoVAooFKpRMdy/iLg2sjiKRQK1NXVdfkHn5mZybUnBMjIyEBCQoLoGJLU8aH0l9f7WbhwYbfL9tqK088R9GdtZLIOo9EInU6HrKws0VEkpePfO//Ni/HLEXDHh6JFixZh6dKlnCOwtv6sjUzW0fEPX/SRElKTlpbGUZhAHQUcGxvbeZtKpeqyOJcoTl8EXBvZvmi1WiQlJXGHZGO5ubl8zQXrGAX8cr/T8d+ivx5y+q+GuDay/cjIyIBare587XU6Hd8HGzEYDF0OkNi3bx/0ej20Wi00Go1dTFg6O5VKBYVC0eUraXv5us7piwD479rIHYeQcm1k29PpdJ0FbDQaYTAY+CnVhuLi4rq81qmpqdDr9XjuuecEppKeFStWIC0trfP8mc2bN2PFihWCU0no6qNarRZqtbpzwoYnMtmO0WhEQEDAJbdrNBrhk2RSlJqaivT0dGRnZ2PFihVITEwU/olUSrRabZdteyhjyRQBERFdntNPFhMRUfdYBEREEsciICKSOBYBEZHEsQiIiCSORUBEJHEsAiIiiWMREBFJHIuAiEji/h/8FFKlw7reIwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"mred = u'#d62728' \n",
"mgreen = u'#2ca02c'\n",
"mblue = u'#1f77b4' \n",
"\n",
"fig, ax = plt.subplots(1, 1)\n",
"__=ax.plot(xarr, yarr)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "95c06934",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray([0. , 0.21666157, 0.43332314, 0.6499847 , 0.8666463 ,\n",
" 1.0833079 , 1.2999694 , 1.516631 , 1.7332926 , 1.9499542 ,\n",
" 2.1666157 , 2.3832774 , 2.5999389 , 2.8166003 , 3.033262 ,\n",
" 3.2499237 , 3.4665852 , 3.6832466 , 3.8999083 , 4.11657 ,\n",
" 4.3332314 , 4.549893 , 4.766555 , 4.9832163 , 5.1998777 ,\n",
" 5.416539 , 5.6332006 , 5.8498626 , 6.066524 , 6.2831855 ], dtype=float32)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xarr"
]
},
{
"cell_type": "markdown",
"id": "bcbb60d8",
"metadata": {},
"source": [
"Notice how `xarr` shows up as a \"DeviceArray\". This is our first indicator that JAX targets GPUs. In GPU programming, one of the primary performance concerns is minimizing transfers of data from CPU to GPU memory; the default behavior of JAX is \"lazy\", so that whenever possible, JAX never returns data from the GPU back to the CPU unless requested, such as the above print statement. This is especially convenient because it means you don't need to rewrite your code to gain major performance benefits from running your programs on a GPU-accelerated machine."
]
},
{
"cell_type": "markdown",
"id": "6cf9b209",
"metadata": {},
"source": [
"## Fast code using JAX's just-in-time compiler\n",
"\n",
"Under the hood, JAX builds a computational trace of all the JAX operations that will be performed during the execution of a function. This trace is used by JAX in gradient calculations with autodiff, and but also more generally to map python code onto a set of array transformations that are efficient to evaluate using the core linear algebra transformations in XLA. This is true for the `jax.numpy` functions above, and also for custom functions you write yourself that use the `jax.jit` decorator to compile the function.\n",
"\n",
"First let's define a simple python function and time it:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "b1159605",
"metadata": {},
"outputs": [],
"source": [
"def func(x):\n",
" for i in range(10):\n",
" x = x - i*0.1*x + i*i\n",
" return np.mean(x[:100])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9219a8dc",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"xarr_timeit = np.random.uniform(0, 1, int(1e6))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "b4ca18fe",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"31.9 ms ± 249 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"%timeit func(xarr_timeit)"
]
},
{
"cell_type": "markdown",
"id": "ca967022",
"metadata": {},
"source": [
"### The `@jax.jit` decorator\n",
"\n",
"Now let's use `jax.jit` to build a fast-evaluating compiled version of our function. `jax.jit` is a _decorator_, so it accepts a function as input and returns another function. In our case, `jax.jit` accepts a slow pure-python version of our function, and the function we get back is a fast-evaluating version that gets compiled down to XLA. The phrase \"just-in-time\" just means that this compilation will not happen until the first time we actually call the function. \n",
"\n",
"You can use `jax.jit` with functional syntax like this: `new_func = jax.jit(orig_func)`.\n",
"\n",
"Or you can adorn your function with the decorator syntax `@jax.jit` like in the cell below."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "7670626a",
"metadata": {},
"outputs": [],
"source": [
"from jax import jit as jjit\n",
"\n",
"@jjit\n",
"def jax_func(x):\n",
" for i in range(10):\n",
" x = x - i*0.1*x + i*i\n",
" return jnp.mean(x[:100])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "4d1cff43",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray(88.68427, dtype=float32)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jax_func(xarr_timeit)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "2165d7b7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"655 µs ± 5.26 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n"
]
}
],
"source": [
"%timeit jax_func(xarr_timeit)"
]
},
{
"cell_type": "markdown",
"id": "c0dfa2b4",
"metadata": {},
"source": [
"Our implementation of `jax_func` is almost 50x faster than its pure python equivalent."
]
},
{
"cell_type": "markdown",
"id": "f08e5397",
"metadata": {},
"source": [
"## But wait, there are some gotchas\n",
"\n",
"In many situations, speeding up your code and making it GPU portable is as simple as the above examples. But there are some gotchas to be aware of, in which you need to implement your code in a particular way in order for JAX to be able to compile it. This is written about extensively in [this section of the JAX docs](https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html); here I'll only cover a couple of commonly encountered examples.\n",
"\n",
"First of all, it's necessary to write \"pure functions\" whose behavior is free of side-effects: the returned values of your function cannot depend on a mutable state defined elsewhere in the program. This is because at compile-time, JAX builds a computational trace of the flow of data through your function, which requires that your function must have deterministic behavior w/r/t each of its arguments. This is why libraries and programs based on JAX tend to be written in a functional style, since this make it simpler to guarantee that we only ever ask JAX to apply its transformations on side-effect-free functions. This can take some getting used to if you're more familiar with object-oriented machine learning libraries like `scikit-learn`, `pytorch` and `tensorflow`. The pure-function requirement of JAX requires you to implement _everything_ in JAX in order to use `jax.jit`. The behavior of your function cannot arbitrarily depend on some other external library such as `numpy` or `scipy`. That brings us to Gotcha #1."
]
},
{
"cell_type": "markdown",
"id": "87ca5efd",
"metadata": {},
"source": [
"### Gotcha 1: Everything inside a jitted function must be implemented in JAX"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "6a7109d1",
"metadata": {},
"outputs": [],
"source": [
"from scipy.special import erf as erf_scipy\n",
"\n",
"\n",
"@jjit\n",
"def jax_func_whoops(x):\n",
" return erf_scipy(x) + x**2"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "382d32d1",
"metadata": {},
"outputs": [],
"source": [
"xarr = np.linspace(0, 2*np.pi, nx)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "305111c8",
"metadata": {},
"outputs": [
{
"ename": "TracerArrayConversionError",
"evalue": "The numpy.ndarray conversion method __array__() was called on the JAX Tracer object Traced<ShapedArray(float32[30])>with<DynamicJaxprTrace(level=0/1)>\nThe error occurred while tracing the function jax_func_whoops at /var/folders/vp/g9zy6vt17h18h2dnpqxz6j1w0000gn/T/ipykernel_1727/1702647558.py:4 for jit. This concrete value was not available in Python because it depends on the value of the argument 'x'.\nSee https://jax.readthedocs.io/en/latest/errors.html#jax.errors.TracerArrayConversionError",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTracerArrayConversionError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn [12], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m jax_func_whoops(xarr)\n",
" \u001b[0;31m[... skipping hidden 14 frame]\u001b[0m\n",
"Cell \u001b[0;32mIn [10], line 6\u001b[0m, in \u001b[0;36mjax_func_whoops\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;129m@jjit\u001b[39m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mjax_func_whoops\u001b[39m(x):\n\u001b[0;32m----> 6\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43merf_scipy\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;241m+\u001b[39m x\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m2\u001b[39m\n",
"File \u001b[0;32m~/opt/miniconda3/envs/ht081/lib/python3.9/site-packages/jax/core.py:540\u001b[0m, in \u001b[0;36mTracer.__array__\u001b[0;34m(self, *args, **kw)\u001b[0m\n\u001b[1;32m 539\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__array__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkw):\n\u001b[0;32m--> 540\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m TracerArrayConversionError(\u001b[38;5;28mself\u001b[39m)\n",
"\u001b[0;31mTracerArrayConversionError\u001b[0m: The numpy.ndarray conversion method __array__() was called on the JAX Tracer object Traced<ShapedArray(float32[30])>with<DynamicJaxprTrace(level=0/1)>\nThe error occurred while tracing the function jax_func_whoops at /var/folders/vp/g9zy6vt17h18h2dnpqxz6j1w0000gn/T/ipykernel_1727/1702647558.py:4 for jit. This concrete value was not available in Python because it depends on the value of the argument 'x'.\nSee https://jax.readthedocs.io/en/latest/errors.html#jax.errors.TracerArrayConversionError"
]
}
],
"source": [
"jax_func_whoops(xarr)"
]
},
{
"cell_type": "markdown",
"id": "33577f6f",
"metadata": {},
"source": [
"The error message is telling us that the input argument `x` depends upon `scipy.special.erf` and so the function cannot be traced. But JAX has its own implementations of a portion of the functions in the `scipy` library as well. The cell below instead uses the JAX version of this same function."
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "d97df4e3",
"metadata": {},
"outputs": [],
"source": [
"from jax.scipy.special import erf as erf_jax\n",
"\n",
"\n",
"@jjit\n",
"def jax_func_roger(x):\n",
" return erf_jax(x) + x**2"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "4474ed54",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray([ 0. , 0.28764644, 0.6477679 , 1.0644981 ,\n",
" 1.530735 , 2.0480406 , 2.6239219 , 3.2682035 ,\n",
" 3.9900665 , 4.796499 , 5.69204 , 6.67926 ,\n",
" 7.7594447 , 8.933169 , 10.200659 , 11.561998 ,\n",
" 13.01721 , 14.566305 , 16.209284 , 17.946144 ,\n",
" 19.776896 , 21.701525 , 23.720041 , 25.83244 ,\n",
" 28.038723 , 30.338898 , 32.73295 , 35.220886 ,\n",
" 37.802708 , 40.47842 ], dtype=float32)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jax_func_roger(xarr)"
]
},
{
"cell_type": "markdown",
"id": "722c3f19",
"metadata": {},
"source": [
"### Gotcha 2: JAX arrays are immutable\n",
"\n",
"Another feature to be aware of is that you cannot do in-place operations on a JAX DeviceArray. That means that the same syntax you may be used to with numpy indexing arrays is not supported by JAX, and a different syntax is required. The few cells below give a common example."
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "7e588211",
"metadata": {},
"outputs": [],
"source": [
"def numpy_clip_allgood(x):\n",
" msk = x < 0.5\n",
" x[msk] = 0.5\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "c4ed3dd5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([0.5 , 0.5 , 0.5 , 0.64998469, 0.86664625,\n",
" 1.08330781, 1.29996937, 1.51663094, 1.7332925 , 1.94995406,\n",
" 2.16661562, 2.38327719, 2.59993875, 2.81660031, 3.03326187,\n",
" 3.24992343, 3.466585 , 3.68324656, 3.89990812, 4.11656968,\n",
" 4.33323125, 4.54989281, 4.76655437, 4.98321593, 5.1998775 ,\n",
" 5.41653906, 5.63320062, 5.84986218, 6.06652374, 6.28318531])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numpy_clip_allgood(xarr)"
]
},
{
"cell_type": "markdown",
"id": "ce10b494",
"metadata": {},
"source": [
"The Numpy function above just clips its input array from below at 0.5. The line `x[msk] = 0.5` modifies the array `x` in-place, but JAX DeviceArrays are immutable, and so this operation is not supported."
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "1d96d4bf",
"metadata": {},
"outputs": [],
"source": [
"@jjit\n",
"def jax_clip_whoops(x):\n",
" msk = x < 0.5\n",
" x[msk] = 0.5\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "001b5bc5",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "'<class 'jax.interpreters.partial_eval.DynamicJaxprTracer'>' object does not support item assignment. JAX arrays are immutable. Instead of ``x[idx] = y``, use ``x = x.at[idx].set(y)`` or another .at[] method: https://jax.readthedocs.io/en/latest/_autosummary/jax.numpy.ndarray.at.html",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn [18], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m jax_clip_whoops(xarr)\n",
" \u001b[0;31m[... skipping hidden 14 frame]\u001b[0m\n",
"Cell \u001b[0;32mIn [17], line 4\u001b[0m, in \u001b[0;36mjax_clip_whoops\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;129m@jjit\u001b[39m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mjax_clip_whoops\u001b[39m(x):\n\u001b[1;32m 3\u001b[0m msk \u001b[38;5;241m=\u001b[39m x \u001b[38;5;241m<\u001b[39m \u001b[38;5;241m0.5\u001b[39m\n\u001b[0;32m----> 4\u001b[0m \u001b[43mx\u001b[49m\u001b[43m[\u001b[49m\u001b[43mmsk\u001b[49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.5\u001b[39m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m x\n",
" \u001b[0;31m[... skipping hidden 1 frame]\u001b[0m\n",
"File \u001b[0;32m~/opt/miniconda3/envs/ht081/lib/python3.9/site-packages/jax/_src/numpy/lax_numpy.py:4696\u001b[0m, in \u001b[0;36m_unimplemented_setitem\u001b[0;34m(self, i, x)\u001b[0m\n\u001b[1;32m 4691\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_unimplemented_setitem\u001b[39m(\u001b[38;5;28mself\u001b[39m, i, x):\n\u001b[1;32m 4692\u001b[0m msg \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m object does not support item assignment. JAX arrays are \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 4693\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mimmutable. Instead of ``x[idx] = y``, use ``x = x.at[idx].set(y)`` \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 4694\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mor another .at[] method: \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 4695\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhttps://jax.readthedocs.io/en/latest/_autosummary/jax.numpy.ndarray.at.html\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 4696\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(msg\u001b[38;5;241m.\u001b[39mformat(\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)))\n",
"\u001b[0;31mTypeError\u001b[0m: '<class 'jax.interpreters.partial_eval.DynamicJaxprTracer'>' object does not support item assignment. JAX arrays are immutable. Instead of ``x[idx] = y``, use ``x = x.at[idx].set(y)`` or another .at[] method: https://jax.readthedocs.io/en/latest/_autosummary/jax.numpy.ndarray.at.html"
]
}
],
"source": [
"jax_clip_whoops(xarr)"
]
},
{
"cell_type": "markdown",
"id": "5649754d",
"metadata": {},
"source": [
"A common code pattern to address this kind of calculation is to use the `jnp.where` function as below."
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "ebe1c5cb",
"metadata": {},
"outputs": [],
"source": [
"@jjit\n",
"def jax_clip_roger(x):\n",
" msk = x < 0.5\n",
" x = jnp.where(msk, x - 1.0, x)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "f7687e94",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DeviceArray([0.5 , 0.5 , 0.5 , 0.64998466, 0.86664623,\n",
" 1.0833079 , 1.2999693 , 1.5166309 , 1.7332925 , 1.949954 ,\n",
" 2.1666157 , 2.3832772 , 2.5999386 , 2.8166003 , 3.0332618 ,\n",
" 3.2499235 , 3.466585 , 3.6832466 , 3.899908 , 4.1165695 ,\n",
" 4.3332314 , 4.549893 , 4.7665544 , 4.983216 , 5.1998773 ,\n",
" 5.416539 , 5.6332006 , 5.849862 , 6.0665236 , 6.2831855 ], dtype=float32)"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"jax_clip_roger(xarr)"
]
},
{
"cell_type": "markdown",
"id": "c8bc89a6",
"metadata": {},
"source": [
"## Computing gradients with `jax.grad`\n",
"\n",
"The cell below shows how to use the autodiff functionality of JAX to calculate the derivative of an input function. The `jax.grad` transformation accepts a input function $f$ and returns a function $f'$ that computes the derivative of $f$."
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "ef3ccd89",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.9238795325112867, DeviceArray(0.9238795, dtype=float32, weak_type=True))"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from jax import grad\n",
"\n",
"sin_deriv = jjit(grad(jnp.sin))\n",
"\n",
"np.cos(np.pi/8), sin_deriv(np.pi/8)"
]
},
{
"cell_type": "markdown",
"id": "fa17c566",
"metadata": {},
"source": [
"Whether the cosine function is implemented via `np.cos` or via the autodiff-calculated gradient of the sin function, the results agree to `float32` precision.\n",
"\n",
"The code above evaluated `sin_deriv` with a scalar value $x=\\pi/8$. Now let's try calculating the gradients for an array of inputs:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "77a001f7",
"metadata": {},
"outputs": [],
"source": [
"cos_result_numpy = np.cos(xarr)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "f15d9168",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "Gradient only defined for scalar-output functions. Output had shape: (30,).",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn [23], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m cos_result_jax \u001b[38;5;241m=\u001b[39m sin_deriv(xarr)\n",
" \u001b[0;31m[... skipping hidden 18 frame]\u001b[0m\n",
"File \u001b[0;32m~/opt/miniconda3/envs/ht081/lib/python3.9/site-packages/jax/_src/api.py:1166\u001b[0m, in \u001b[0;36m_check_scalar\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1164\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(aval, ShapedArray):\n\u001b[1;32m 1165\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m aval\u001b[38;5;241m.\u001b[39mshape \u001b[38;5;241m!=\u001b[39m ():\n\u001b[0;32m-> 1166\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(msg(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhad shape: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00maval\u001b[38;5;241m.\u001b[39mshape\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m))\n\u001b[1;32m 1167\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1168\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(msg(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhad abstract value \u001b[39m\u001b[38;5;132;01m{\u001b[39;00maval\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m))\n",
"\u001b[0;31mTypeError\u001b[0m: Gradient only defined for scalar-output functions. Output had shape: (30,)."
]
}
],
"source": [
"cos_result_jax = sin_deriv(xarr)"
]
},
{
"cell_type": "markdown",
"id": "18593460",
"metadata": {},
"source": [
"The function input to `jax.grad` must return a scalar, not an array. To efficiently evaluate the gradient of a function for arrays, we need to use the `jax.vmap` function."
]
},
{
"cell_type": "markdown",
"id": "b4e8eabc",
"metadata": {},
"source": [
"## Vectorizing functions with `jax.vmap`\n",
"\n",
"\n",
"The `jax.vmap` function accepts transforms the behavior of an input function to operate on arrays of its inputs and to return result arrays of higher dimension. The gradient of the sin function we wrote above accepts and returns scalars, so we can use `jax.vmap` to transform this function to accept and return one-dimensional arrays."
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "ebc65002",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from jax import vmap \n",
"\n",
"sin_deriv_vmap = jjit(vmap(grad(jnp.sin)))\n",
"\n",
"cos_result_jax = sin_deriv_vmap(xarr)\n",
"\n",
"fig, ax = plt.subplots(1, 1)\n",
"__=ax.plot(xarr, cos_result_numpy)\n",
"__=ax.plot(xarr, cos_result_jax, '--')"
]
},
{
"cell_type": "markdown",
"id": "dca4a794",
"metadata": {},
"source": [
"### `jax.vmap` in multiple dimensions\n",
"\n",
"The example of `jax.vmap` above showed how to transform a scalar-valued function into a function that accepts and returns 1d vectors. This same vectorization transformation can be used to construct higher-dimensional operations by composing successive vmap calls.\n",
"\n",
"First we define a $f(x, A, B)=A{\\rm sin}(Bx)$, and then use `jax.grad` to define a new function that calculates $\\partial f/\\partial x$.\n",
"\n",
"Note that we now pass the `argnums` keyword argument to `jax.grad` to specify that we gradient we are interested in is with respect to the first positional argument, $x.$"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "e03c7a3f",
"metadata": {},
"outputs": [],
"source": [
"@jjit\n",
"def some_func(x, a, b):\n",
" return a*jnp.sin(b*x)\n",
"\n",
"\n",
"some_func_deriv = jjit(grad(some_func, argnums=0))"
]
},
{
"cell_type": "markdown",
"id": "88d0569c",
"metadata": {},
"source": [
"The function `some_func_deriv` is defined as $\\frac{\\partial}{\\partial x} A\\cdot{\\rm sin}(B\\cdot x)=A\\cdot B\\cdot{\\rm cos}(B\\cdot x).$ We have defined `some_func_deriv` based on `jax.grad`, and so it accepts scalars for all its arguments and returns a scalar. We can use the `in_axes` keyword argument of `jax.vmap` to get the corresponding function that accepts an array input for its first argument, `x`, and scalars for the remaining two input arguments, `a` and `b`. For the `in_axes` argument you pass in a tuple with one entry for each positional argument, using a `0` for the entry of an argument that you want vectorized, and `None` for arguments whose form should remain unchanged."
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "a327ed05",
"metadata": {},
"outputs": [],
"source": [
"some_func_deriv_vmap0 = jjit(vmap(some_func_deriv, in_axes=(0, None, None)))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "dc29bef8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 1)\n",
"\n",
"a, b = 1/3, 3\n",
"__=ax.plot(xarr, some_func_deriv_vmap0(xarr, a, b))\n",
"__=ax.plot(xarr, a*b*np.cos(b*xarr), '--')"
]
},
{
"cell_type": "markdown",
"id": "857111c4",
"metadata": {},
"source": [
"We can use `vmap` again if we want to construct a function that accepts an array for the input argument `a`"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "38168dab",
"metadata": {},
"outputs": [],
"source": [
"some_func_deriv_vmap1 = jjit(vmap(some_func_deriv_vmap0, in_axes=(None, 0, None)))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "16b64474",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(5, 30)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_a = 5\n",
"a_arr = np.linspace(1, 10, n_a)\n",
"result = some_func_deriv_vmap1(xarr, a_arr, b)\n",
"result.shape"
]
},
{
"cell_type": "markdown",
"id": "f8631bfb",
"metadata": {},
"source": [
"Notice that the returned dimension is `(n_a, n_x)`. This would be flipped if we had applied our vmapping in the reverse order. Each new vmapped argument(s) appears as the first dimension of the returned shape. "
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "ef3bb85c",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 1)\n",
"for ia in range(result.shape[0]):\n",
" __=ax.plot(xarr, result[ia, :])"
]
},
{
"cell_type": "markdown",
"id": "99860319",
"metadata": {},
"source": [
"Using `vmap` once more we can vectorize the `b` argument"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "b64218e3",
"metadata": {},
"outputs": [],
"source": [
"some_func_deriv_vmap2 = jjit(vmap(some_func_deriv_vmap1, in_axes=(None, None, 0)))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "89aa9f15",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(7, 5, 30)"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_b = 7\n",
"b_arr = np.linspace(0.5, 2, n_b)\n",
"result = some_func_deriv_vmap2(xarr, a_arr, b_arr)\n",
"result.shape"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "5a994849",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 1)\n",
"\n",
"ia_fixed = 0\n",
"for ib in range(result.shape[0]):\n",
" __=ax.plot(xarr, result[ib, ia_fixed, :])"
]
},
{
"cell_type": "markdown",
"id": "4372dc3d",
"metadata": {},
"source": [
"The arguments `a` and `b` can also be vectorized together in situations where these arguments vary within the same dimension"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "d7497b32",
"metadata": {},
"outputs": [],
"source": [
"some_func_deriv_vmap3 = jjit(vmap(some_func_deriv_vmap0, in_axes=(None, 0, 0)))"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "d29acf87",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(5, 30)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"n_b = n_a\n",
"b_arr = np.linspace(0.5, 2, n_b)\n",
"result = some_func_deriv_vmap3(xarr, a_arr, b_arr)\n",
"result.shape"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "3e8bb18a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 1)\n",
"\n",
"for iab in range(result.shape[0]):\n",
" __=ax.plot(xarr, result[iab, :])"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "01a57392",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment