{ "metadata": { "gist_id": "ee14af5220bc3512131f", "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" }, "name": "", "signature": "sha256:ca9e8a1ad4990322c6d9c464fcd313d87f0ad02d1e688a11487ffc1f0d07f9b1" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "name = '2015-10-12-cython_nogil'\n", "title = \"Update on optimizing code for iso-surfaces using cython\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "\n", "import warnings\n", "warnings.simplefilter(\"ignore\")\n", "\n", "import os\n", "from datetime import datetime\n", "from IPython.core.display import HTML\n", "\n", "with open('creative_commons.txt', 'r') as f:\n", " html = f.read()\n", "\n", "\n", "hour = datetime.utcnow().strftime('%H:%M')\n", "comments=\"true\"\n", "\n", "\n", "date = '-'.join(name.split('-')[:3])\n", "slug = '-'.join(name.split('-')[3:])\n", "\n", "metadata = dict(title=title,\n", " date=date,\n", " hour=hour,\n", " comments=comments,\n", " slug=slug,\n", " name=name)\n", "\n", "markdown = \"\"\"Title: {title}\n", "date: {date} {hour}\n", "comments: {comments}\n", "slug: {slug}\n", "\n", "{{% notebook {name}.ipynb cells[2:] %}}\n", "\"\"\".format(**metadata)\n", "\n", "content = os.path.abspath(os.path.join(os.getcwd(),\n", " os.pardir,\n", " os.pardir, \n", " '{}.md'.format(name)))\n", "with open('{}'.format(content), 'w') as f:\n", " f.writelines(markdown)\n", " \n", "html = '''\n", "\n", "
This post was written as an IPython notebook.\n", " It is available for download\n", " or as a static html.
\n", "\n", "%s''' % (name, name, html)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This post is an update on of the previous iso-surface [post](https://ocefpaf.github.io/python4oceanographers/blog/2015/10/05/isosurfaces/).\n", "\n", "After reading a little bit more on cython I found out that,\n", "when using memory views,\n", "we can release the [GIL](https://wiki.python.org/moin/GlobalInterpreterLock) using the [nogil](http://docs.cython.org/src/userguide/memoryviews.html) annotation.\n", "I wonder if releasing the GIL can get the cython performance closer to numba's.\n", "\n", "First let's set the same data as before up to run some tests." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "\n", "\n", "p = np.linspace(-100, 0, 30)[:, None, None] * np.ones((50, 70))\n", "x, y = np.mgrid[0:20:50j, 0:20:70j]\n", "\n", "q = np.sin(x) + p\n", "p0 = -50." ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The two cells below will compiled two versions of the `zslice` function.\n", "The first with the GIL and the second releasing during the loop." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext Cython" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "%%cython\n", "\n", "cimport cython\n", "import numpy as np\n", "cimport numpy as np\n", "\n", "NaN = np.NaN\n", "\n", "@cython.boundscheck(False)\n", "@cython.wraparound(False)\n", "def gil_zslice(double[:, :, ::1] q,\n", " double[:, :, ::1] p,\n", " double p0,\n", " mask_val=NaN):\n", " cdef int L = q.shape[2]\n", " cdef int M = q.shape[1]\n", " cdef int N = q.shape[0]\n", " cdef double dp, dq, dq0\n", " cdef int i, j, k\n", " \n", " cdef np.ndarray[double, ndim=2, mode='c'] q_iso = np.empty((M, L), dtype=np.float64)\n", " \n", " for i in range(L):\n", " for j in range(M):\n", " q_iso[j, i] = mask_val\n", " for k in range(N-1):\n", " if (((p[k, j, i] < p0) and (p[k+1, j, i] > p0)) or\n", " ((p[k, j, i] > p0) and (p[k+1, j, i] < p0))):\n", " dp = p[k+1, j, i] - p[k, j, i]\n", " dp0 = p0 - p[k, j, i]\n", " dq = q[k+1, j, i] - q[k, j, i]\n", " q_iso[j, i] = q[k, j, i] + dq*dp0/dp\n", " return q_iso" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "%%cython\n", "\n", "cimport cython\n", "\n", "import numpy as np\n", "cimport numpy as np\n", "\n", "NaN = np.NaN\n", "\n", "\n", "@cython.boundscheck(False)\n", "@cython.wraparound(False)\n", "def nogil_zslice_2D(double[:, ::1] q,\n", " double[:, ::1] p,\n", " double p0,\n", " double mask_val=NaN):\n", "\n", " cdef int IJ = q.shape[1]\n", " cdef int K = q.shape[0]\n", " cdef int ij, k\n", "\n", " cdef np.ndarray[double, ndim=1, mode='c'] q_iso = np.empty(IJ, dtype=np.float64)\n", "\n", " with nogil:\n", " for ij in range(IJ):\n", " q_iso[ij] = mask_val\n", " for k in range(K-1):\n", " if (((p[k, ij] < p0) and (p[k+1, ij] > p0)) or\n", " ((p[k, ij] > p0) and (p[k+1, ij] < p0))):\n", " q_iso[ij] = (q[k, ij] +\n", " (q[k+1, ij] - q[k, ij]) * # dq\n", " (p0 - p[k, ij]) / # dp0\n", " (p[k+1, ij] - p[k, ij])) # dp\n", " return q_iso" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that cython won't allow any conversion to Python objects without GIL.\n", "That is why we had to eliminate the temporary variables (`dq`, `dp0`, and `dp`).\n", "Hopefully we are sacrificing readability to gain some speed.\n", "\n", "The second difference has nothing to do with the GIL!\n", "I modified the code to work with 2D arrays (depth, y_x_space) instead of 3D\n", "arrays (depth, y, x).\n", "The reason is to make this code more\n", "[UGRID](http://ocefpaf.github.io/ugrid-conventions/) friendly.\n", "\n", "Again we will use our poor man's benchmarking." ] }, { "cell_type": "code", "collapsed": false, "input": [ "K, J, I = q.shape\n", "\n", "qr = q.reshape(K, -1)\n", "pr = p.reshape(K, -1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "gil = %timeit -n1000 -o gil_zslice(q, p, p0)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000 loops, best of 3: 477 \u00b5s per loop\n" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "nogil = %timeit -n1000 -o nogil_zslice_2D(qr, pr, p0)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000 loops, best of 3: 151 \u00b5s per loop\n" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "gil.best / nogil.best" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "3.1497008061938865" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, under the same test conditions, we got a slightly better performance\n", "than numba (175 \u00b5s).\n", "\n", "\n", "Due to the the input shape change and the fact that the cython code expects only `np.float64` we need to wrap the cython function to prepare the input.\n", "That is a small price to pay to have a single code that can deal with any ocean model grid.\n", "\n", "The two functions below should take care of the input for us." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def _save_typecast(arr):\n", " if arr.dtype is not 'float64' and np.can_cast(arr, np.float64):\n", " arr = arr.astype(np.float64)\n", " return arr\n", "\n", "\n", "def zslice(q, p, p0):\n", " q = _save_typecast(q)\n", " p = _save_typecast(p)\n", " p0 = -abs(p0)\n", "\n", " if q.ndim == 3:\n", " K, J, I = q.shape\n", " iso = nogil_zslice_2D(q.reshape(K, -1), p.reshape(K, -1), p0)\n", " return iso.reshape(J, I)\n", " elif q.ndim == 2:\n", " return nogil_zslice_2D(q, p, p0)\n", " else:\n", " msg = \"Expected 2 (ugrid) or 3 (r-/s-grid) dimensions. Got {}.\"\n", " raise ValueError(msg(q.ndim))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "All that is left is to test the nogil and UGRID friendly version against real\n", "data. First some UGRID (FVCOM) data." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import iris\n", "\n", "url = ('http://crow.marine.usf.edu:8080/thredds/dodsC/'\n", " 'FVCOM-Nowcast-Agg.nc')\n", "\n", "cubes = iris.load_raw(url)\n", "\n", "# Last time step.\n", "temp = cubes.extract_strict('sea_water_potential_temperature')[-1, ...]\n", "\n", "p = temp.coord('sea_surface_height_above_reference_ellipsoid').points\n", "\n", "q = temp.data" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "(In the future iris will use `pyugrid` and the next cell won't be necessary.)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pyugrid\n", "\n", "ugrid = pyugrid.UGrid.from_ncfile(url)\n", "\n", "lon = ugrid.nodes[:, 0]\n", "lat = ugrid.nodes[:, 1]\n", "triangles = ugrid.faces[:]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.tri as tri\n", "\n", "triang = tri.Triangulation(lon, lat, triangles=triangles)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "\n", "import cartopy.crs as ccrs\n", "from cartopy.io import shapereader\n", "from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\n", "\n", "cmap = plt.cm.viridis\n", "\n", "def make_map(projection=ccrs.PlateCarree()):\n", " fig, ax = plt.subplots(figsize=(9, 13),\n", " subplot_kw=dict(projection=projection))\n", " gl = ax.gridlines(draw_labels=True)\n", " gl.xlabels_top = gl.ylabels_right = False\n", " gl.xformatter = LONGITUDE_FORMATTER\n", " gl.yformatter = LATITUDE_FORMATTER\n", " ax.coastlines('50m')\n", " return fig, ax" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compute a slice of potential temperature at -25 meters.\n", "\n", "I could not figure out how to use masked array and `tricontourf`.\n", "The code was segfaulting!\n", "I ended up filling the data with `-999` and specifying the contour levels instead." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy.ma as ma\n", "\n", "temp_slice = zslice(q, p, -25)\n", "\n", "\n", "mask = temp_slice = ma.masked_invalid(temp_slice)\n", "vmin, vmax = temp_slice.min(), temp_slice.max()\n", "temp_slice = temp_slice.filled(fill_value=-999)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "fig, ax = make_map()\n", "extent = [lon.min(), lon.max(),\n", " lat.min(), lat.max()]\n", "ax.set_extent(extent)\n", "\n", "levels = np.arange(vmin, vmax, 0.5)\n", "\n", "kw = dict(cmap=cmap, alpha=0.9, levels=levels)\n", "cs = ax.tricontourf(triang, temp_slice, **kw)\n", "\n", "kw = dict(shrink=0.5, orientation='vertical')\n", "cbar = fig.colorbar(cs, **kw)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "This post was written as an IPython notebook.\n", " It is available for download\n", " or as a static html.
\n", "\n", "