{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Parallelization with QInfer #" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup ##" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We begin by enabling Python 3–style division, as is recommended for use in Python 2.7." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import division" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we import the IPython parallelization library ``ipyparallel``, as well as QInfer itself and some useful things from the Python standard library." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/cgranade/anaconda/lib/python2.7/site-packages/matplotlib/__init__.py:872: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", " warnings.warn(self.msg_depr % (key, alt_key))\n" ] } ], "source": [ "import ipyparallel as ipp\n", "import qinfer as qi\n", "from functools import partial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll make some nice graphical examples later, so we also import Matplotlib and point it to the ``ggplot`` stylesheet if available. We'll also tell Matplotlib to plot inline in our notebook." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "try:\n", " plt.style.use('ggplot')\n", "except:\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we setup the parallelization client. To start a cluster running, it's convienent to use the Jupyter Notebook extension. If you're running ``ipyparallel`` 5.0 or later, you can install the Notebook extension by running:\n", "```\n", "$ ipcluster nbextension enable\n", "```\n", "Full instructions for installing the Jupyter Notebook extension are available on the [``ipyparallel`` site](https://github.com/ipython/ipyparallel). In any case, once a cluster has been started, we can make a client that connects to it by using the ``Client()`` class." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "client = ipp.Client()\n", "print(client)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once we get a client up and running, the next step is to make a *direct view* of its engines. Since we want to use all of the engines provided by the client, we index it by a slice ``[:]``." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "dview = client[:]\n", "print(dview)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we'll create a simple test model to try out parallelization support." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " BinomialModel at 0x7fde65b4f090: 1 model parameter\n", "
\n", "

Model chain:

\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "serial_model = qi.BinomialModel(qi.SimplePrecessionModel())\n", "serial_model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Having made this model, we can then wrap it in ``DirectViewParallelizedModel`` to parallelize its likelihood function." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " DirectViewParallelizedModel at 0x7fde8e765890: 1 model parameter\n", "
\n", "

Model chain:

\n", "
  • \n", " BinomialModel at 0x7fde65b4f090: 1 model parameter\n", "
  • \n", "
  • \n", " SimplePrecessionModel at 0x7fde65b4f190: 1 model parameter\n", "
  • \n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parallel_model = qi.DirectViewParallelizedModel(serial_model, dview)\n", "parallel_model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try it out by making a prior and specifying an experiment design heuristic." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "prior = qi.UniformDistribution([0, 1])\n", "heuristic_class = partial(qi.ExpSparseHeuristic, t_field='x', other_fields={'n_meas': 20})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The rest is handled by ``perf_test_multiple``, which will run our example many times and report on its performance. In this case, parallelizing an individual model is a bit silly, since the simple precession likelihood is fast enough that communication costs blow away the savings from parallelization. That said, it makes an illustrative example. In practice, running a parallel model makes the most sense if the model likelihood is slow to evaluate, and if you're interested in a small number of runs." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/cgranade/anaconda/lib/python2.7/site-packages/qinfer/utils.py:109: ApproximationWarning: Numerical error in covariance estimation causing positive semidefinite violation.\n", " warnings.warn('Numerical error in covariance estimation causing positive semidefinite violation.', ApproximationWarning)\n", "/home/cgranade/anaconda/lib/python2.7/site-packages/qinfer/resamplers.py:219: ResamplerWarning: Covariance has zero norm; adding in small covariance in resampler. Consider increasing n_particles to improve covariance estimates.\n", " ResamplerWarning\n", "/home/cgranade/anaconda/lib/python2.7/site-packages/qinfer/smc.py:264: ApproximationWarning: Extremely small n_ess encountered (1.25962954805). Resampling is likely to fail. Consider adding particles, or resampling more often.\n", " ApproximationWarning\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Time elapsed: 277.54 s\n" ] } ], "source": [ "with qi.timing() as t:\n", " performance = qi.perf_test_multiple(\n", " 100, parallel_model, 6000, prior, 200,\n", " heuristic_class, progressbar=qi.IPythonProgressBar\n", " )\n", "print(\"Time elapsed: {:0.2f} s\".format(t.delta_t))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the performance data to make sure that our test actually works." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nXu333bx5M3fccUfFf8uXL6/42p133snu3buZM2cOkZGRXHbZZZVeGxsbi5+fH8HBwVx33XWkpaUB\n8P777xMbG0ubNm0wDIPY2FhycnIqTeX+l7/8hebNm1dcL/pfvXv3pmPHjnh6etK7d2+8vb3p168f\nSin69OlDTk4OUL5ybVFRETfddBOGYRAaGsqgQYMqskD5SpiXXnopSimio6PZt2/fGevh4eFBUVER\nP/30E0opLrjggirXQxFNm5xGE27p6NGj3HvvvWitKSkpYc6cOZw6dQqlFHfccQe33HJLpenSf3X4\n8OGKU1O/atWqVY1WbrzxxhvPeM3Gz8+Pyy+/nH/+859MmzbttK//ft2PVq1acfjwYaD8WlFKSgov\nvPBCpec7nc6KvOdaM+T3awl5e3uf9vjXJSIKCgpwOp3ccccdFV83TZOLLrqo4vGvsyUD+Pj4cPLk\nyTNeK+rfvz+HDh1iyZIlFBcX069fP0aOHCnXlUQl0myEW/L392f16tVs27aNzMxMxo4dy8KFC7nm\nmmvOep0lKCiI/Pz8StsOHTp02hFIbeXk5LBlyxaioqJYtWoVM2fOPO29fr2+VFBQULEgXXBwMDfd\ndBN9+/Y9476tWskzODiY0NBQkpKSavX6/81hGAZDhw5l6NChFBQU8Pjjj9OmTRtiYmKsiCsaCfnT\nQ7i177//vmJAwN69e885Eq1Hjx789NNPpKWlYZom27ZtY//+/fTs2bPOWU6ePMnSpUu57bbbuOee\nezh8+DDvvfdepeds3ryZY8eOUVBQwNtvv01UVBQAV155JRs3bmT//v0AFBcXs3379jpnqkp4eDjN\nmjXj9ddfrzhi+fHHH/nuu++q9fqWLVvy888/VzzOzMxk3759mKaJr68vHh4essS1OI0c2Qi3tnfv\nXvr06cPRo0fx8PDAz8/vrM/39/dn+vTprF69mhUrVtC6dWtmzJiBv79/td9z8+bNvPXWW0D5fTbe\n3t6sWLGCl156iZCQEAYPHgzApEmTmDt3Lt27d6d169YAREZGMn36dIqLi4mJian46793796UlJSw\nZMkSCgoK8PPzo3v37lx++eW1KctZGYbB9OnTWbNmDZMmTaK0tJQ2bdowYsSIar0+NjaWVatW8eKL\nL3LzzTcTFBTE888/j9PpxNfXlz59+hAdHW15buHe5KZOIerJ74cqC9HUyGk0IYQQLifNRgghhMvJ\naTQhhBAuJ0c2QgghXE6ajRBCCJeTZiOEEMLlpNkIIYRwOWk2QgghXE6ajRBCCJf7fxflYidva919\nAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.semilogy(performance['loss'].mean(axis=0))\n", "plt.xlabel('# of Experiments')\n", "plt.ylabel('Bayes Risk')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, in the above plot, we see both the exponential scaling we expect as well the errors caused by numerical precision once we get very close to the true model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As an alternative to parallelizing over model parameters, we can parallelize over trials instead. That is, we send each trial to a different engine as they are able to handle new tasks. To do so, we'll use the ``LoadBalancedView`` offered by ``ipyparallel``. Parallelizing at the trial level instead is a much faster approach in this case, as it requires much less communication between the engines and the main process." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "lbview = client.load_balanced_view()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time elapsed: 14.55 s\n" ] } ], "source": [ "with qi.timing() as t:\n", " performance = qi.perf_test_multiple(\n", " 100, serial_model, 6000, prior, 200, heuristic_class,\n", " progressbar=qi.IPythonProgressBar, apply=lbview.apply\n", " )\n", "print(\"Time elapsed: {:0.2f} s\".format(t.delta_t))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\naTRCCCHc6v8A5OJa8EeDoVMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.semilogy(performance['loss'].mean(axis=0))\n", "plt.xlabel('# of Experiments')\n", "plt.ylabel('Bayes Risk')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.5.1" }, "widgets": { "state": {}, "version": "1.1.1" } }, "nbformat": 4, "nbformat_minor": 0 }