From 87908a995882a43739d2912fce07e9d7976e1969 Mon Sep 17 00:00:00 2001 From: Navjot Kukreja Date: Thu, 16 Feb 2017 18:51:49 +0000 Subject: [PATCH 1/2] Added notebook with basic explanation --- conway.ipynb | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 conway.ipynb diff --git a/conway.ipynb b/conway.ipynb new file mode 100644 index 0000000..268b966 --- /dev/null +++ b/conway.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Installation\n", + "To use tikzmagic simply run: pip install git+git://github.com/robjstan/tikzmagic.git" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import tikzmagic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conway (working title) : Generic Seismic Application using Devito" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Following the redesign and rework of code inside Devito, we wish to extend a good structure to application code as well. The objectives here are two-fold: \n", + "* Provide a set of seismic abstractions that help set up a problem quickly \n", + " * This ensures that an example can be set up in as few lines as possible\n", + "* Provide a set of \"Execution Engine\" abstractions that the seismic code above uses.\n", + " * This ensure that the same code set up for demo inside an IPython notebook can run at scale on Amazon or on a large cluster\n", + " \n", + "## Seismic Abstractions\n", + "In terms of seismic, we need: \n", + "* Seismic Data Reader / Writer\n", + "* Container objects for Shot Data - `Source` and `Receiver` can be thin abstractions over the existing `SourceLike` class in Devito. These should be sufficient for holding the data for a shot. \n", + "* An encapsulation for the actual physics - This is where the equation will live. This is the only object that changes to switch from Acoustic to TTI, for example. (Please suggest a name)\n", + "* Operator builders (Propagators) - These will be instances of Devito's `Operator`/`StencilKernel` class. We will provide functions to build these given the \"Physics\" object from above. There could be one builder each for `Forward`/`Backward`/`Gradient`/`Born`\n", + "\n", + "## Execution Engine\n", + "I expect this to be a thin wrapper over ipyparallel to begin with, but with plans to extend support for Amazon AWS/dedicated clusters. Note that to support running over AWS/clusters it should be possible to add [Celery](http://www.celeryproject.org) or [RQ](http://python-rq.org) as a backend to this execution engine and the rest should be quite straightforward.\n", + "The Execution Engine has 3 basic components like any other similar engine:\n", + "* Controller\n", + "* Worker \n", + "* Reducer\n", + "\n", + "The assumption is that the communication between these happens via queues which will be handled internally by the execution engine. The engine needs to handle nodes dying out in the middle of a shot - just restart the entire shot when that happens. \n", + "\n", + "The flowchart below attempts to explain the planned information/logic flow:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%tikz -s 0.4 \n", + "\n", + "%# Style definitions\n", + "\\tikzstyle{line} = [draw, thick];\n", + "\\tikzstyle{arrow} = [-stealth, line];\n", + "\\tikzstyle{box} = [draw, thick, rectangle, rounded corners, font=\\sffamily];\n", + "\n", + "\\node (controller) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (0, 6) {Controller};\n", + "\\node (worker) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (0, 4) {Worker};\n", + "\\node (reducer) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (0, 2) {Reducer};\n", + "\n", + "\n", + "\\node (datareader) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (10, 6) {Seismic Data Reader};\n", + "\\node (stencilkernel) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (10, 4) {StencilKernel};\n", + "\\node (abstractions) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (18, 4) {Physics Abstraction};\n", + "\n", + "\\node (execution) [minimum height=20ex, minimum width=23ex,font=\\sffamily\\bfseries, fill=red!30, text depth=1cm] at (0, 8) {Execution Engine};\n", + "\\node (seismic) [minimum height=20ex, minimum width=23ex,font=\\sffamily\\bfseries, fill=blue!30] at (8, 8) {Seismic};\n", + "\n", + "\n", + "\\draw[arrow] (datareader) -- node[anchor=south] {Metadata (No. of shots + Size of model)} (controller) ;\n", + "\\draw[arrow] (controller) -- node[anchor=east] {Shot number} (worker) ;\n", + "\\draw[arrow] (datareader) -- node[anchor=south, rotate=10] {Shot Data ( Source+ Receivers)} (worker) ;\n", + "\\draw[arrow] (abstractions) -- node[anchor=north] {via builder functions} (stencilkernel) ;\n", + "\\draw[arrow] (stencilkernel) -- node[anchor=north] {execution} (worker) ;\n", + "\\draw[arrow] (worker) -- node[anchor=west] {Gradient/Correlation} (reducer) ;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.11" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From ddeb5737d9d4c6074c8ac6f72228e8537a415f23 Mon Sep 17 00:00:00 2001 From: Navjot Kukreja Date: Fri, 17 Feb 2017 12:05:02 +0000 Subject: [PATCH 2/2] Finally managed to complete the flowchart --- conway.ipynb | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/conway.ipynb b/conway.ipynb index 268b966..4f49cfb 100644 --- a/conway.ipynb +++ b/conway.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -57,19 +57,19 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] }, - "execution_count": 51, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -80,20 +80,24 @@ "%# Style definitions\n", "\\tikzstyle{line} = [draw, thick];\n", "\\tikzstyle{arrow} = [-stealth, line];\n", - "\\tikzstyle{box} = [draw, thick, rectangle, rounded corners, font=\\sffamily];\n", + "\\tikzstyle{box} = [draw, thick, rectangle, rounded corners, font=\\sffamily, yshift=-10ex];\n", "\n", - "\\node (controller) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (0, 6) {Controller};\n", - "\\node (worker) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (0, 4) {Worker};\n", - "\\node (reducer) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (0, 2) {Reducer};\n", + "\\node (execution) [minimum height=40ex, minimum width=30ex,fill=red!30] at (0,6) {};\n", "\n", + "\\node (seismic) [minimum height=40ex, minimum width=40ex,fill=blue!30] at (10, 6) {};\n", "\n", - "\\node (datareader) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (10, 6) {Seismic Data Reader};\n", - "\\node (stencilkernel) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (10, 4) {StencilKernel};\n", - "\\node (abstractions) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (18, 4) {Physics Abstraction};\n", + "\\node (controller) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (execution.north) {Controller};\n", + "\\node (worker) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (controller.south) {Worker};\n", + "\\node (reducer) [box, minimum height=4ex, minimum width=20ex,font=\\sffamily\\bfseries] at (worker.south) {Reducer};\n", "\n", - "\\node (execution) [minimum height=20ex, minimum width=23ex,font=\\sffamily\\bfseries, fill=red!30, text depth=1cm] at (0, 8) {Execution Engine};\n", - "\\node (seismic) [minimum height=20ex, minimum width=23ex,font=\\sffamily\\bfseries, fill=blue!30] at (8, 8) {Seismic};\n", "\n", + "\\node (datareader) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (seismic.north) {Seismic Data Reader};\n", + "\\node (stencilkernel) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (datareader.south) {StencilKernel};\n", + "\\node (abstractions) [box, minimum height=4ex, minimum width=23ex,font=\\sffamily\\bfseries] at (stencilkernel.south) {Physics Abstraction};\n", + "\n", + "\n", + "\\node (execution_label) [font=\\sffamily\\bfseries, yshift=5ex] at (controller.north) {Execution Engine};\n", + "\\node (seismic_label) [font=\\sffamily\\bfseries, yshift=5ex] at (datareader.north) {Seismic Abstractions};\n", "\n", "\\draw[arrow] (datareader) -- node[anchor=south] {Metadata (No. of shots + Size of model)} (controller) ;\n", "\\draw[arrow] (controller) -- node[anchor=east] {Shot number} (worker) ;\n",