Parallel Magics.ipynb
474 lines
| 10.8 KiB
| text/plain
|
TextLexer
MinRK
|
r7053 | { | |
"metadata": { | |||
"name": "Parallel Magics" | |||
}, | |||
"nbformat": 3, | |||
MinRK
|
r7739 | "nbformat_minor": 0, | |
MinRK
|
r7053 | "worksheets": [ | |
{ | |||
"cells": [ | |||
{ | |||
"cell_type": "heading", | |||
"level": 1, | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
"Using Parallel Magics" | |||
] | |||
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
MinRK
|
r7477 | "IPython has a few magics for working with your engines.\n", | |
"\n", | |||
"This assumes you have started an IPython cluster, either with the notebook interface,\n", | |||
MinRK
|
r7053 | "or the `ipcluster/controller/engine` commands." | |
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "from IPython import parallel\n", | |
"rc = parallel.Client()\n", | |||
"dv = rc[:]\n", | |||
"rc.ids" | |||
MinRK
|
r7053 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
Olivier Grisel
|
r10208 | "outputs": [] | |
MinRK
|
r7053 | }, | |
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
MinRK
|
r7498 | "Creating a Client registers the parallel magics `%px`, `%%px`, `%pxresult`, `pxconfig`, and `%autopx`. \n", | |
MinRK
|
r7477 | "These magics are initially associated with a DirectView always associated with all currently registered engines." | |
MinRK
|
r7053 | ] | |
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
"Now we can execute code remotely with `%px`:" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
"%px a=5" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
"%px print a" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
"%px a" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
MinRK
|
r7239 | "cell_type": "code", | |
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7239 | "input": [ | |
MinRK
|
r7477 | "with dv.sync_imports():\n", | |
MinRK
|
r7250 | " import sys" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7250 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7250 | "input": [ | |
MinRK
|
r7239 | "%px print >> sys.stderr, \"ERROR\"" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "outputs": [] | |
}, | |||
{ | |||
MinRK
|
r7053 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
MinRK
|
r7477 | "You don't have to wait for results. The `%pxconfig` magic lets you change the default blocking/targets for the `%px` magics:" | |
MinRK
|
r7053 | ] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "%pxconfig --noblock" | |
MinRK
|
r7053 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "%px import time\n", | |
"%px time.sleep(5)\n", | |||
MinRK
|
r7053 | "%px time.time()" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
MinRK
|
r7477 | "But you will notice that this didn't output the result of the last command.\n", | |
MinRK
|
r7498 | "For this, we have `%pxresult`, which displays the output of the latest request:" | |
MinRK
|
r7053 | ] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7498 | "%pxresult" | |
MinRK
|
r7053 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
"Remember, an IPython engine is IPython, so you can do magics remotely as well!" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "%pxconfig --block\n", | |
MinRK
|
r7053 | "%px %pylab inline" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
MinRK
|
r7477 | "`%%px` can also be used as a cell magic, for submitting whole blocks.\n", | |
"This one acceps `--block` and `--noblock` flags to specify\n", | |||
"the blocking behavior, though the default is unchanged.\n" | |||
MinRK
|
r7053 | ] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "dv.scatter('id', dv.targets, flatten=True)\n", | |
MinRK
|
r7053 | "dv['stride'] = len(dv)" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "%%px --noblock\n", | |
"x = linspace(0,pi,1000)\n", | |||
"for n in range(id,12, stride):\n", | |||
" print n\n", | |||
" plt.plot(x,sin(n*x))\n", | |||
MinRK
|
r7053 | "plt.title(\"Plot %i\" % id)" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7498 | "%pxresult" | |
MinRK
|
r7053 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "source": [ | |
MinRK
|
r7477 | "It also lets you choose some amount of the grouping of the outputs with `--group-outputs`:\n", | |
"\n", | |||
"The choices are:\n", | |||
"\n", | |||
"* `engine` - all of an engine's output is collected together\n", | |||
"* `type` - where stdout of each engine is grouped, etc. (the default)\n", | |||
"* `order` - same as `type`, but individual displaypub outputs are interleaved.\n", | |||
" That is, it will output the first plot from each engine, then the second from each,\n", | |||
MinRK
|
r7053 | " etc." | |
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "%%px --group-outputs=engine\n", | |
"x = linspace(0,pi,1000)\n", | |||
"for n in range(id+1,12, stride):\n", | |||
" print n\n", | |||
" plt.figure()\n", | |||
" plt.plot(x,sin(n*x))\n", | |||
" plt.title(\"Plot %i\" % n)" | |||
MinRK
|
r7053 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
}, | |||
{ | |||
MinRK
|
r7239 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "source": [ | |
MinRK
|
r7477 | "When you specify 'order', then individual display outputs (e.g. plots) will be interleaved.\n", | |
"\n", | |||
MinRK
|
r7498 | "`%pxresult` takes the same output-ordering arguments as `%%px`, \n", | |
"so you can view the previous result in a variety of different ways with a few sequential calls to `%pxresult`:" | |||
MinRK
|
r7239 | ] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7239 | "input": [ | |
MinRK
|
r7498 | "%pxresult --group-outputs=order" | |
MinRK
|
r7239 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "heading", | |||
"level": 2, | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "source": [ | |
"Single-engine views" | |||
] | |||
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "source": [ | |
"When a DirectView has a single target, the output is a bit simpler (no prefixes on stdout/err, etc.):" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7239 | "input": [ | |
MinRK
|
r7477 | "def generate_output():\n", | |
" \"\"\"function for testing output\n", | |||
" \n", | |||
" publishes two outputs of each type, and returns something\n", | |||
" \"\"\"\n", | |||
" \n", | |||
" import sys,os\n", | |||
" from IPython.core.display import display, HTML, Math\n", | |||
" \n", | |||
" print \"stdout\"\n", | |||
" print >> sys.stderr, \"stderr\"\n", | |||
" \n", | |||
" display(HTML(\"<b>HTML</b>\"))\n", | |||
" \n", | |||
" print \"stdout2\"\n", | |||
" print >> sys.stderr, \"stderr2\"\n", | |||
" \n", | |||
" display(Math(r\"\\alpha=\\beta\"))\n", | |||
" \n", | |||
" return os.getpid()\n", | |||
"\n", | |||
MinRK
|
r7239 | "dv['generate_output'] = generate_output" | |
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "outputs": [] | |
}, | |||
{ | |||
MinRK
|
r7477 | "cell_type": "markdown", | |
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7477 | "source": [ | |
"You can also have more than one set of parallel magics registered at a time.\n", | |||
"\n", | |||
"The `View.activate()` method takes a suffix argument, which is added to `'px'`." | |||
] | |||
}, | |||
{ | |||
MinRK
|
r7053 | "cell_type": "code", | |
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7053 | "input": [ | |
MinRK
|
r7477 | "e0 = rc[-1]\n", | |
"e0.block = True\n", | |||
"e0.activate('0')" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7477 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7477 | "input": [ | |
"%px0 generate_output()" | |||
MinRK
|
r7239 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7239 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7239 | "input": [ | |
"%px generate_output()" | |||
MinRK
|
r7053 | ], | |
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7053 | "outputs": [] | |
MinRK
|
r7477 | }, | |
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7477 | "source": [ | |
"As mentioned above, we can redisplay those same results with various grouping:" | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7477 | "input": [ | |
"%pxresult --group-outputs order" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7477 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7477 | "input": [ | |
"%pxresult --group-outputs engine" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7477 | "outputs": [] | |
}, | |||
{ | |||
MinRK
|
r7498 | "cell_type": "heading", | |
"level": 2, | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7498 | "source": [ | |
"Parallel Exceptions" | |||
] | |||
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7498 | "source": [ | |
"When you raise exceptions with the parallel exception,\n", | |||
"the CompositeError raised locally will display your remote traceback." | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7498 | "input": [ | |
"%%px\n", | |||
"from numpy.random import random\n", | |||
"A = random((100,100,'invalid shape'))" | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7498 | "outputs": [] | |
}, | |||
{ | |||
"cell_type": "heading", | |||
"level": 2, | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7498 | "source": [ | |
"Remote Cell Magics" | |||
] | |||
}, | |||
{ | |||
"cell_type": "markdown", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7498 | "source": [ | |
"Remember, Engines are IPython too, so the cell that is run remotely by %%px can in turn use a cell magic." | |||
] | |||
}, | |||
{ | |||
"cell_type": "code", | |||
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r7498 | "input": [ | |
"%%px\n", | |||
"%%timeit\n", | |||
"from numpy.random import random\n", | |||
"from numpy.linalg import norm\n", | |||
"A = random((100,100))\n", | |||
"norm(A, 2) " | |||
], | |||
"language": "python", | |||
MinRK
|
r7739 | "metadata": {}, | |
MinRK
|
r7498 | "outputs": [] | |
}, | |||
{ | |||
MinRK
|
r9022 | "cell_type": "heading", | |
"level": 2, | |||
"metadata": {}, | |||
"source": [ | |||
"Local Execution" | |||
] | |||
}, | |||
{ | |||
"cell_type": "markdown", | |||
"metadata": {}, | |||
"source": [ | |||
"As of IPython 0.14, you can instruct `%%px` to also execute the cell locally.\n", | |||
"This is useful for interactive definitions,\n", | |||
"or if you want to load a data source everywhere,\n", | |||
"not just on the engines." | |||
] | |||
}, | |||
{ | |||
MinRK
|
r7477 | "cell_type": "code", | |
MinRK
|
r7739 | "collapsed": false, | |
MinRK
|
r9022 | "input": [ | |
"%%px --local\n", | |||
Olivier Grisel
|
r10208 | "import os\n", | |
MinRK
|
r9022 | "thispid = os.getpid()\n", | |
"print thispid" | |||
], | |||
MinRK
|
r7477 | "language": "python", | |
MinRK
|
r7739 | "metadata": {}, | |
Olivier Grisel
|
r10208 | "outputs": [] | |
MinRK
|
r7053 | } | |
MinRK
|
r7739 | ], | |
"metadata": {} | |||
MinRK
|
r7053 | } | |
] | |||
} |