Skip to content

Instantly share code, notes, and snippets.

@gregcaporaso
Created September 10, 2012 20:06
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 gregcaporaso/3693491 to your computer and use it in GitHub Desktop.
Save gregcaporaso/3693491 to your computer and use it in GitHub Desktop.
IPython notebooks corresponding to Reagan et al, ISME Journal 2012
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Timing"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Timings of the parallel calculation"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Note:** The Timing notebook is for reference as related to the paper only - it will not be directly reproducible on re-runs of the above notebooks as it relies on the semi-manual creation of the <tt>tasks.log</tt> file. The <tt>tasks.log</tt> file used to generate the original timing data is available for <a href=\"./tasks.log\">download here</a>."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import time",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Generate labels in the proper order, in case we want to match labels to times (we don't at this point):"
},
{
"cell_type": "code",
"collapsed": true,
"input": "percentages = range(76,99,3)\nregion_boundaries = [\n ('v2', 136, 1868), #27f-338r\n ('v2.v3', 136, 2232),\n ('v2.v4', 136, 4051),\n ('v2.v6', 136, 4932),\n ('v2.v8', 136, 6426),\n ('v2.v9', 136, 6791),\n ('v3', 1916, 2232),\n ('v3.v4', 1916, 4051),\n ('v3.v6', 1916, 4932),\n ('v3.v8', 1916, 6426),\n ('v3.v9', 1916, 6791),\n ('v4', 2263, 4051), #515f-806r\n ('v4.v6', 2263, 4932),\n ('v4.v8', 2263, 6426),\n ('v4.v9', 2263, 6791),\n ('v6', 4653, 4932), #967f-1046r\n ('v6.v8', 4653, 6426),\n ('v6.v9', 4653, 6791),\n ('v9', 6450, 6791),\n ('full.length', 0, 7682), # Start 150, 250, 400 base pair reads\n ('v2.150', 136, 702),\n ('v2.250', 136, 1752),\n ('v2.v3.400', 136, 2036), # Skips reads that are larger than amplicon size\n ('v3.v4.150', 1916, 2235),\n ('v3.v4.250', 1916, 2493),\n ('v3.v4.400', 1916, 4014),\n ('v4.150', 2263, 3794),\n ('v4.250', 2263, 4046),\n ('v4.v6.400', 2263, 4574),\n ('v6.v8.150', 4653, 5085),\n ('v6.v8.250', 4653, 5903),\n ('v6.v8.400', 4653, 6419)\n]",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": true,
"input": "labels = []\nfor p in percentages:\n for rb in region_boundaries:\n labels.append(\"%i.%s\" % (p,rb[0]))",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": "ntasks = len(labels)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": "# Extract times from log\n\nDue to a [bug](https://github.com/ipython/ipython/pull/1556) in the Hub,\nwe can't use the standard approach to extracting metadata about execution time.\n\nFortunately, we can extract most of what we want from the controller's log.\n\nI made a filtered version of the log that only has the relevant lines for the real computation,\nwhich we will use here.\n\nWe have the arrival and completion time of each task, and since the Scheduler was run with HWM=1,\nand the IPython overhead of these tasks is so very small, this maps very closely to the actual\nruntime of each task."
},
{
"cell_type": "code",
"collapsed": false,
"input": "stages = ['Load Subalignments', 'Filter', 'Build Trees', 'Compute Distances']\n\nwith open('tasks.log') as f:\n lines = f.readlines()\n\nlog_segments = [ lines[i*ntasks*2:(i+1)*ntasks*2] for i in range(len(stages)) ]",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": "from datetime import datetime\n\ntfmt = \"%Y-%m-%d %H:%M:%S.%f\"\n\ndef parse_logline(line):\n parts = line.split()\n timestamp = ' '.join(parts[:2])\n dt = datetime.strptime(timestamp, tfmt)\n msg_id = parts[4][1:-1]\n which = parts[5]\n engine_id = int(parts[7])\n \n return msg_id, dt, which, engine_id\n\ndef parse_log(lines):\n history = [] # ordered, to match labels, if we care\n started = {}\n finished = {}\n for line in lines:\n msg_id, dt, which, engine_id = parse_logline(line)\n if which == 'arrived':\n started[msg_id] = dt\n history.append(msg_id)\n elif which == 'finished':\n finished[msg_id] = dt\n else:\n raise ValueError(\"expected arrived or finished, got %s\" % which)\n \n # list ordered by start time:\n runtimes = [ (finished[msg_id] - started[msg_id]).total_seconds() for msg_id in history ]\n wall = (max(finished.values()) - min(started.values())).total_seconds()\n \n return runtimes, wall",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": true,
"input": "def hms(t):\n \"\"\"render time as HH:MM:SS\"\"\"\n it = int(t)\n h = it / 3600\n m = (it % 3600) / 60\n s = (t % 60)\n return \"%3i:%02i:%02i\" % (h,m,s)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": "serial_times = {}\nparallel_times = {}\n\nfor stage, segment in zip(stages, log_segments):\n fig = plt.figure()\n times, wall = parse_log(segment)\n serial = sum(times)\n serial_times[stage] = serial\n parallel_times[stage] = wall\n \n plt.title(\"min = %is | %s | max =%s\" % (min(times),stage,hms(max(times))))\n n = len(times)\n stimes = sorted(times)\n plt.plot(sorted(times))\n plt.fill(range(n)+[n-1,0], sorted(times)+[0,0], alpha=0.8)\n # plt.hist(times, 25)\n plt.ylabel(\"time (s)\")\n plt.xlabel(\"task\")\n plt.xlim(0,n-1)\n display(fig)\n print \"%s:\" % stage\n print \" serial calculation: %s\" % hms(serial)\n print \" parallel calculation: %s\" % hms(wall)\n print \" serial / parallel : %8.1fx\" % (serial / wall)\n sys.stdout.flush()\n\n# avoid double-plot, because we used display()\nplt.close('all')\n ",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\nuL4LDg5WM2fOVBaLRQUGBqoJEybU+f5cdYlE8c4777g+T5o0Sf3hD39wff7Xv/6lxo4dq5Q6c4cT\nHx+vnn76aVfZl19+WY0cOdItcZ4tUZSWlqoePXqoDz/8UJWXl59X++5IFD/99JPy8vKqE9usWbPU\nlClTztrOP//5T5WQkKCUUuq1115TV155ZZ3vo6Oj600UZWVl6sknn1QDBw5Unp6eKjo6Wn3yySf1\nxnd6oujVq1ed9oYPH65ef/31s85r4sSJav78+UqphhNFRESEWr9+veu7ZcuWnVF2+fLlrs9//vOf\n1V133eVq19fX17VTKS0tVZqmqc2bN7vKDxkyRP3nP/9RSin1m9/8xjVfpZQ6fPiw0uv1qqKiwrX8\nOTk5ru+HDh2qUlJSlFLqjJ1Oe9uuDh8+7JoWHBysVq5c6fo8adIk9fzzz5+1/qeffqr69etXZ9q4\nceNU//791YABA1R1dXWz4moOq9WqIiMj1Xvvvdek8kuWLFFRUVGqsLDQNS05OVk999xzSqna5H7q\n/1lDjh8/ru666y41btw41zSdTqd++9vfun7k3nzzzWrChAnnsER1dfqhJ4DQ0FDXe29v7zqfvby8\n6gyHnC4sLMz13tfXt8GyLa179+688847/POf/yQiIoIxY8awe/fuVpt/Y3JzcwkMDMTX19c1LSoq\nytX13r17N9deey1BQUH06NGDGTNmUFZWBkBeXh6RkZF12jOZTPXOq1u3bsyaNYusrCyKi4tJSkri\n5ptvdg2/NOZs88rLywPgww8/ZPDgwfTo0YOePXvyySefuOJsyOnLcPo8oOHtJzAw0DUO7e3tDZy5\nrZ4sn52dzY033kjPnj3p2bMnMTExeHl5UVhYeNZ5devWrd5ttb1tVw39fZ66DqxWKzfddBOhoaH0\n6NGDqVOnnvH/dPfdd7N7924efPBBPD09WyX+goICRo0axf3338/kyZMbLf/xxx/z+OOPs3r1agIC\nAgDYtm0b69at46GHHgI4pzMvjUYj8+fP59NPP+X48eOuaXfccQe9evXCx8eHGTNmsHr16mYsXa0u\nkShOdy7/CU118tTa+l7vvvtus9pNSEhg3bp15ObmYrFYuPvuu1s48uYLDQ2lsLDQNe4OtTu0kzus\ne+65hyFDhmC1WikpKWH+/Pmu4wihoaHk5OTUac9qtTZpvt27d+evf/0rVVVV7N27Fy8vLwDKy8td\n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\n",
"text": "<matplotlib.figure.Figure at 0x3d6e810>"
},
{
"output_type": "stream",
"stream": "stdout",
"text": "Load Subalignments:\n serial calculation: 40:57:31\n parallel calculation: 2:46:24\n serial / parallel : 14.8x"
},
{
"output_type": "display_data",
"png": "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\n1AAAAABJRU5ErkJggg==\n",
"text": "<matplotlib.figure.Figure at 0x3d6ead0>"
},
{
"output_type": "stream",
"stream": "stdout",
"text": "Filter:\n serial calculation: 0:33:21\n parallel calculation: 0:01:15\n serial / parallel : 26.4x"
},
{
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x3d97b90>"
},
{
"output_type": "stream",
"stream": "stdout",
"text": "Build Trees:\n serial calculation: 44:36:14\n parallel calculation: 2:44:40\n serial / parallel : 16.3x"
},
{
"output_type": "display_data",
"png": "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\n",
"text": "<matplotlib.figure.Figure at 0x3dc1650>"
},
{
"output_type": "stream",
"stream": "stdout",
"text": "Compute Distances:\n serial calculation: 733:25:48\n parallel calculation: 19:51:29\n serial / parallel : 36.9x"
}
],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": "# Stats on total calculation time, and fraction in each major step.\n\nThis time, computing the distance matrices totally dominates the runtime (90% serial, 80% real)"
},
{
"cell_type": "code",
"collapsed": false,
"input": "total_serial = sum(serial_times.values())\ntotal_wall = sum(parallel_times.values())\n\nprint \"total calculation time: %s (%.1f days)\" % (hms(total_serial), total_serial / (3600*24))\nprint \"total parallel runtime: %s\" % hms(total_wall)\nprint \" serial / parallel: %8.1fx\" % (total_serial / total_wall)\nprint\n\nfor stage in stages:\n serial = serial_times[stage]\n wall = parallel_times[stage]\n print \"%s:\" % stage\n print \"\\t serial runtime: %s\" % (hms(serial))\n print \"\\t serial percent: %8.1f%%\" % (100 * serial / total_serial)\n print \"\\tparallel runtime: %s\" % (hms(wall))\n print \"\\tparallel percent: %8.1f%%\" % (100 * wall / total_wall)\n print",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "total calculation time: 819:32:55 (34.1 days)\ntotal parallel runtime: 25:23:50\n serial / parallel: 32.3x\n\nLoad Subalignments:\n\t serial runtime: 40:57:31\n\t serial percent: 5.0%\n\tparallel runtime: 2:46:24\n\tparallel percent: 10.9%\n\nFilter:\n\t serial runtime: 0:33:21\n\t serial percent: 0.1%\n\tparallel runtime: 0:01:15\n\tparallel percent: 0.1%\n\nBuild Trees:\n\t serial runtime: 44:36:14\n\t serial percent: 5.4%\n\tparallel runtime: 2:44:40\n\tparallel percent: 10.8%\n\nCompute Distances:\n\t serial runtime: 733:25:48\n\t serial percent: 89.5%\n\tparallel runtime: 19:51:29\n\tparallel percent: 78.2%"
}
],
"prompt_number": 14
}
],
"metadata": {}
}
]
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment