Skip to content

Instantly share code, notes, and snippets.

@shoyer
Created July 18, 2020 18:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shoyer/6826d02949e4d2ce82122a8bd5c62cf7 to your computer and use it in GitHub Desktop.
Save shoyer/6826d02949e4d2ce82122a8bd5c62cf7 to your computer and use it in GitHub Desktop.
Poisson pytree benchmark
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Poisson pytree benchmark",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/shoyer/6826d02949e4d2ce82122a8bd5c62cf7/poisson-pytree-benchmark.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xBlNAa_KLVlO",
"colab_type": "text"
},
"source": [
"# Compare the performance of pytree vs raveled `cg` for solving the Poisson equation\n",
"\n",
"https://github.com/google/jax/issues/1531"
]
},
{
"cell_type": "code",
"metadata": {
"id": "egEvCSidFx-y",
"colab_type": "code",
"colab": {}
},
"source": [
"# Copyright 2020 Google LLC.\n",
"# SPDX-License-Identifier: Apache-2.0\n",
"\n",
"import jax.numpy as jnp\n",
"import numpy as np\n",
"import scipy.sparse.linalg\n",
"import jax\n",
"from functools import partial\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def axis_slice(ndim, index, axis):\n",
" slices = [slice(None)] * ndim\n",
" slices[axis] = index\n",
" return tuple(slices)\n",
"\n",
"def slice_along_axis(array, index, axis):\n",
" return array[axis_slice(array.ndim, index, axis)]\n",
"\n",
"def shift(array, offset, axis):\n",
" index = slice(offset, None) if offset >= 0 else slice(None, offset)\n",
" sliced = slice_along_axis(array, index, axis)\n",
" padding = [(0, 0)] * array.ndim\n",
" padding[axis] = (-min(offset, 0), max(offset, 0))\n",
" return jnp.pad(sliced, padding, mode='constant', constant_values=0)\n",
"\n",
"def laplacian(array):\n",
" # note: I believe this is faster than a convolution (at least on most platforms)\n",
" left = shift(array, +1, axis=0)\n",
" right = shift(array, -1, axis=0)\n",
" up = shift(array, +1, axis=1)\n",
" down = shift(array, -1, axis=1)\n",
" convolved = -(left + right + up + down) + 4 * array\n",
" return convolved\n",
"\n",
"def laplacian_flat(array):\n",
" size = int(array.shape[0] ** 0.5)\n",
" array = array.reshape(size, size)\n",
" convolved = laplacian(array)\n",
" return convolved.reshape(-1)\n",
"\n",
"def make_source(shape):\n",
" assert len(shape) == 2\n",
" x = np.linspace(0, 1, num=shape[0])\n",
" y = np.linspace(0, 1, num=shape[1])\n",
" source = np.zeros(shape)\n",
" source[0, :] = x\n",
" source[-1, :] = x\n",
" source[:, 0] = 4 * y * (1 - y)\n",
" source[:, -1] = 1 - 4 * y * (1 - y)\n",
" return source\n",
"\n",
"# The functions we'll be benchmarking\n",
"def jax_poisson_cg_solve(b, x0):\n",
" solution, info = jax.scipy.sparse.linalg.cg(\n",
" laplacian, b, x0, tol=0, atol=0, maxiter=MAX_ITER)\n",
" return solution\n",
"\n",
"def jax_poisson_cg_solve_flat(b, x0):\n",
" solution, info = jax.scipy.sparse.linalg.cg(\n",
" laplacian_flat, b.ravel(), x0.ravel(), tol=0, atol=0, maxiter=MAX_ITER)\n",
" return solution\n",
"\n",
"# simulation parameters\n",
"MAX_ITER = 500\n",
"shape = (512, 512)"
],
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "3oz_t6TGLWYY",
"colab_type": "text"
},
"source": [
"# Benchmark SciPy"
]
},
{
"cell_type": "code",
"metadata": {
"id": "MOj6Cx9QGF7n",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
},
"outputId": "f83cec55-8993-40d4-987b-c134102bc160"
},
"source": [
"@jax.jit\n",
"def matvec(x):\n",
" return laplacian(jnp.reshape(x, shape)).ravel()\n",
"\n",
"source = make_source(shape)\n",
"x0 = np.zeros(shape).ravel()\n",
"b = -source.ravel()\n",
"A = scipy.sparse.linalg.LinearOperator(\n",
" (int(np.prod(shape)),) * 2, matvec, dtype=np.float32)\n",
"solution, info = scipy.sparse.linalg.cg(A, b, x0=x0, tol=0, atol=0, maxiter=MAX_ITER)\n",
"%timeit scipy.sparse.linalg.cg(A, b, x0=x0, tol=0, atol=0, maxiter=MAX_ITER)\n",
"print(f'Error: {np.linalg.norm(matvec(solution) - b)}')"
],
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": [
"1 loop, best of 3: 2.05 s per loop\n",
"Error: 0.037856701761484146\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TilfAxiKLX92",
"colab_type": "text"
},
"source": [
"# Benchmark solving with 2D arrays\n",
"\n",
"On CPU, we're about 2.5x faster than SciPy.\n",
"\n",
"On GPU, 30x faster still."
]
},
{
"cell_type": "code",
"metadata": {
"id": "QpObg6D3JYD1",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
},
"outputId": "bff04ec9-9f2c-4067-97d7-f370154c261d"
},
"source": [
"for backend in ['cpu', 'gpu']:\n",
" source = make_source(shape)\n",
" b = jnp.asarray(-source).block_until_ready()\n",
" x0 = jnp.zeros_like(source).block_until_ready()\n",
" cg_solve = jax.jit(jax_poisson_cg_solve, backend=backend)\n",
" solution = cg_solve(b, x0).block_until_ready()\n",
" print(f\"{backend.upper()} test:\")\n",
" %timeit cg_solve(b, x0).block_until_ready()\n",
" print(f'Error: {np.linalg.norm(laplacian(solution) + source)}')"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"CPU test:\n",
"1 loop, best of 3: 813 ms per loop\n",
"Error: 0.03532074764370918\n",
"GPU test:\n",
"10 loops, best of 3: 28.2 ms per loop\n",
"Error: 0.03786032646894455\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "duh2QcQcLcBu",
"colab_type": "text"
},
"source": [
"# Benchmark flattened arrays\n",
"\n",
"On CPU, we're 57% slower\n",
"\n",
"On GPU, we're 90% slower"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Gu5QQwcvMgjZ",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 119
},
"outputId": "68fc1b2d-2ca0-49ea-d914-ccd42aedbf04"
},
"source": [
"for backend in ['cpu', 'gpu']:\n",
" source = make_source(shape)\n",
" b = jnp.asarray(-source).block_until_ready()\n",
" x0 = jnp.zeros_like(source).block_until_ready()\n",
" cg_solve = jax.jit(jax_poisson_cg_solve_flat, backend=backend)\n",
" solution = cg_solve(b, x0).block_until_ready()\n",
" print(f\"{backend.upper()} test:\")\n",
" %timeit cg_solve(b, x0).block_until_ready()\n",
" print(f'Error: {np.linalg.norm(laplacian_flat(solution) + source.ravel())}')"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"CPU test:\n",
"1 loop, best of 3: 1.28 s per loop\n",
"Error: 0.03532460331916809\n",
"GPU test:\n",
"10 loops, best of 3: 53.6 ms per loop\n",
"Error: 0.03785990551114082\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iR0zyObSP_Aj",
"colab_type": "text"
},
"source": [
"## Make a pretty picture\n",
"\n",
"Verify that we did, indeed, approximately solve the Poisson equation"
]
},
{
"cell_type": "code",
"metadata": {
"id": "kEHiGHlDQg1-",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 286
},
"outputId": "c477f1d3-59e0-4cc8-8759-ffe3ae28ed1f"
},
"source": [
"import matplotlib.pyplot as plt\n",
"plt.imshow(solution.reshape(shape))\n",
"plt.colorbar()"
],
"execution_count": 9,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.colorbar.Colorbar at 0x7f1e70ef0eb8>"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4-l8j-44QhPj",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment