Skip to content

Instantly share code, notes, and snippets.

@markusbaden
Last active December 15, 2015 15:09
Show Gist options
  • Save markusbaden/5279896 to your computer and use it in GitHub Desktop.
Save markusbaden/5279896 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "getting_started_on_picloud"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "heading",
"level": 1,
"source": [
"QuTiP on PiCloud"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%pylab inline"
],
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n",
"For more information, type 'help(pylab)'.\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"source": [
"Simulating large quantum systems with QuTiP can take a long\n",
"time. Especially if the computer you are using is not exactly a state\n",
"of the art supercomputer. So what if you had access to such a\n",
"supercomputer, whenever you wanted to perform bigger simulations using\n",
"QuTiP? Well as it turns out, you do. Since QuTiP is written in python\n",
"you can easily use the service provided\n",
"[PiCloud](http://www.picloud.com) to offload heavy computation to the\n",
"cloud.\n",
"\n",
"[PiCloud](http://www.picloud.com) let's you compute in the cloud via\n",
"an easy to use interface. You are charged by the time your jobs\n",
"actually take and you don't need to worry about managing hardware or\n",
"the cloud resources yourself. To get started,\n",
"[PiCloud](http://www.picloud.com) even provides you with 20 compute\n",
"hours for free every month. In this post, I'll show you how you can\n",
"get started in no time to use [PiCloud](http://www.picloud.com)\n",
"together with QuTiP."
]
},
{
"cell_type": "heading",
"level": 2,
"source": [
"Getting Started"
]
},
{
"cell_type": "markdown",
"source": [
"In order to use QuTiP on the PiCloud, you need both a working\n",
"installation of QuTiP and an account at\n",
"[picloud.com](http://www.picloud.com. Let's have a look at the local\n",
"QuTiP installation first."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from qutip.ipynbtools import version_table\n",
"version_table()"
],
"language": "python",
"outputs": [
{
"html": [
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>Cython</td><td>0.18</td></tr><tr><td>SciPy</td><td>0.11.0</td></tr><tr><td>QuTiP</td><td>2.3.0.dev-f19dd9e</td></tr><tr><td>Python</td><td>2.7.3 |Anaconda 1.4.0 (x86_64)| (default, Feb 25 2013, 18:45:56) \n",
"[GCC 4.0.1 (Apple Inc. build 5493)]</td></tr><tr><td>IPython</td><td>0.13.1</td></tr><tr><td>OS</td><td>posix [darwin]</td></tr><tr><td>Numpy</td><td>1.7.0</td></tr><tr><td>matplotlib</td><td>1.2.0</td></tr><tr><td colspan='2'>Tue Apr 02 21:30:16 2013 SGT</td></tr></table>"
],
"output_type": "pyout",
"prompt_number": 2,
"text": [
"<IPython.core.display.HTML at 0x107da2dd0>"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"source": [
"As you can see, I am using the free [Anaconda python\n",
"distribution](https://store.continuum.io/cshop/anaconda) and a recent\n",
"development version of QuTiP. Next you are going to need an account on\n",
"[picloud.com](http://www.picloud.com) and follow the easy installation\n",
"instructions on the web site. When you are done with that you are\n",
"ready to perform computations on the cloud."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import cloud\n",
"def add(x, y):\n",
" return x + y\n",
"\n",
"jid = cloud.call(add, 1, 2)\n",
"\n",
"cloud.result(jid)\n"
],
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 3,
"text": [
"3"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"source": [
"PiCloud tries to provide you with the ability to do computations on\n",
"the cloud as you would do them locally, without you having to do\n",
"anything. For example you don't have to worry about using common\n",
"modules on the cloud such as numpy."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"jid = cloud.call(add, np.arange(9.0), np.arange(9.0))\n",
"\n",
"cloud.result(jid)"
],
"language": "python",
"outputs": [
{
"output_type": "pyout",
"prompt_number": 4,
"text": [
"array([ 0., 2., 4., 6., 8., 10., 12., 14., 16.])"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"source": [
"If your code uses less common modules that are not preinstalled on the\n",
"cloud, then PiCloud will try to send all necessary information from\n",
"your computer to the cloud. This works really well unless you try to\n",
"use modules which have non-python code in them. Unfortunately qutip is\n",
"such a module, because some of its functions are compiled in c for\n",
"speed. So in in order to use qutip on the cloud, you have to make\n",
"PiCloud aware of qutip. PiCloud provides environments for this\n",
"purposes. Environments are customizable machine images, where you can\n",
"install all the modules your code needs. When you want to make use of\n",
"this environment later on, you just pass its name as an argument to\n",
"the functions provided by the cloud module. And what is even better,\n",
"once created environments can be easily shared among users. So to get\n",
"you started I shared made an environment public in which I installed\n",
"qutip, which is called \"/mbaden/precise_with_qutip\". If you are\n",
"curious how I did that, or want to create your own environment, take a\n",
"look at the very last section of this post.\n",
"\n",
"But first let's simulate something on the cloud, using the public\n",
"environment. Let's start by having a look at our QuTiP installation in\n",
"the cloud."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"jid = cloud.call(version_table, _env='/mbaden/precise_with_qutip')\n",
"cloud.result(jid)"
],
"language": "python",
"outputs": [
{
"html": [
"<table><tr><th>Software</th><th>Version</th></tr><tr><td>Cython</td><td>0.17.1</td></tr><tr><td>SciPy</td><td>0.11.0</td></tr><tr><td>QuTiP</td><td>2.2.0</td></tr><tr><td>Python</td><td>2.7.3 (default, Aug 1 2012, 05:14:39) \n",
"[GCC 4.6.3]</td></tr><tr><td>IPython</td><td>0.13</td></tr><tr><td>OS</td><td>posix [linux2]</td></tr><tr><td>Numpy</td><td>1.6.2</td></tr><tr><td>matplotlib</td><td>1.1.1</td></tr><tr><td colspan='2'>Tue Apr 2 13:31:07 2013</td></tr></table>"
],
"output_type": "pyout",
"prompt_number": 5,
"text": [
"<IPython.core.display.HTML at 0x109ac6210>"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"source": [
"Note that the versions of qutip and some of the other packages differ\n",
"on my machine and the cloud. This can be the case for any extensions\n",
"with non-python code, such as numpy. It is probably a good idea to\n",
"work in a virtual environment on your local machine that has the same\n",
"versions of all packages as the environment in picloud to ensure\n",
"consistency. For now, we will just ignore this."
]
},
{
"cell_type": "heading",
"level": 2,
"source": [
"A simple example"
]
},
{
"cell_type": "markdown",
"source": [
"Now that we have QuTiP up and running on PiCloud let's look at a\n",
"simple example on how we can use the cloud to do actual computations.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from qutip import *\n",
"import time"
],
"language": "python",
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"source": [
"In this example we are interested in the steady state intra-cavity\n",
"photon number for a single atom couple to a cavity as a function of\n",
"the coupling strength. First we define the relevant operators, and\n",
"construct the Hamiltonian. One part of the Hamiltonian is static,\n",
"since only another part depends on the coupling strength. We will\n",
"state the problem in such a form, that we have a function iterating\n",
"over the problem for various coupling strength with as little overhead\n",
"as possible."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"wc = 1.0 * 2 * pi # cavity frequency\n",
"wa = 1.0 * 2 * pi # atom frequency\n",
"N = 25 # number of cavity fock states\n",
"kappa = 0.05 # cavity decay rate\n",
"n_th = 0.5\n",
" \n",
"a = tensor(destroy(N), qeye(2))\n",
"sm = tensor(qeye(N), destroy(2))\n",
"nc = a.dag() * a\n",
"na = sm.dag() * sm\n",
"\n",
"c_ops = [sqrt(kappa * (1 + n_th)) * a, sqrt(kappa * n_th) * a.dag()]\n",
"\n",
"H0 = wc * nc + wa * na\n",
"H1 = (a.dag() + a) * (sm + sm.dag())\n",
"\n",
"args = {\n",
" 'H0': H0,\n",
" 'H1': H1,\n",
" 'c_ops': c_ops\n",
"}\n",
"\n",
"# Create a list of 400 coupling strengths If you have a slow computer\n",
"# you want to decrease that number to ~50 first.\n",
"g_vec = linspace(0, 2.5, 400) * 2 * pi\n",
"\n",
"def compute_task(g_vec, args):\n",
" H0, H1, c_ops = args['H0'], args['H1'], args['c_ops']\n",
" n_vec = zeros(g_vec.shape)\n",
" for k, g in enumerate(g_vec):\n",
"\tH = H0 + g * H1\n",
" \n",
"\trho_ss = steadystate(H, c_ops)\n",
"\tn_vec[k] = expect(nc, rho_ss)\n",
" return n_vec"
],
"language": "python",
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "markdown",
"source": [
"Here, the important function is compute_task, which takes the list\n",
"(numpy array) over which we iterate and some static arguments hidden\n",
"in the args dictionary. Let's also define a useful function for\n",
"plotting the results."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def visualize_results(g_vec, n_vec):\n",
" \n",
" fig, ax = subplots()\n",
" ax.plot(g_vec, n_vec, lw=2)\n",
" ax.set_xlabel('Coupling strength (g)')\n",
" ax.set_ylabel('Photon Number')\n",
" ax.set_title('# of photons in the steady state')"
],
"language": "python",
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "markdown",
"source": [
"Ok, no we are ready to do the calculation, both locally, and on the\n",
"cloud. Let's start with the local calculation. Note that above I made\n",
"the list of coupling strength 400 entries long, in order to get the\n",
"next calculation to take roughly a minute on my local\n",
"machine. Depending on how fast or slow your machine is your results\n",
"may vary significantly, so if you repeat the example yourself you might\n",
"want to go back and set the list to 50 entries only at first."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t0 = time.time()\n",
"n_vec = compute_task(g_vec, args)\n",
"t1 = time.time()\n",
"\n",
"print \"elapsed =\", (t1-t0)"
],
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"elapsed = 70.7504220009\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"visualize_results(g_vec / (2 * pi), n_vec)"
],
"language": "python",
"outputs": [
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 10
},
{
"cell_type": "markdown",
"source": [
"So far so good. Now let's move the calculation on to the cloud. We\n",
"have to break down the calculation into a number of jobs that can be\n",
"run in parallel and submit them to PiCloud. There scheduler will\n",
"estimate the workload and distribute the jobs among different\n",
"machines. In the common case of iterating over a list of parameters\n",
"and then solving the same problem over and over breaking the task into\n",
"independent chunks is quite easy.\n",
"\n",
"We will use numpy's array_split function to create a number of chunks\n",
"from our coupling strength array, create a function that takes only\n",
"one argument, that is the list of input parameters, from our compute\n",
"task and submit it to the cloud via cloud.map. In a last step we use\n",
"numpy's concatenate to create a single output array again."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t0 = time.time()\n",
"no_chunks = 10\n",
"g_chunks = array_split(g_vec, no_chunks)\n",
"single_variable_task = lambda g: compute_task(g, args=args)\n",
"jids = cloud.map(single_variable_task, g_chunks,\n",
"\t\t _env='/mbaden/precise_with_qutip',\n",
"\t\t _type='c2')\n",
"n_chunks = cloud.result(jids)\n",
"n_vec = concatenate(n_chunks)\n",
"t1 = time.time()\n",
"\n",
"print \"elapsed =\", (t1-t0)\n"
],
"language": "python",
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"elapsed = 39.917057991\n"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"visualize_results(g_vec / (2 * pi), n_vec)"
],
"language": "python",
"outputs": [
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 12
},
{
"cell_type": "markdown",
"source": [
"Yes, we have successfully sped up our calculation using PiCloud. Note\n",
"that this example is a bit artificial, since calculations taking just\n",
"a minute are nothing you usually would have the need to delegate to a\n",
"fast computer. As your job gets longer and longer and as you submit\n",
"more of them, PiCloud will keep increasing the number of cores\n",
"available to you and you will see more significant speed ups. Plus\n",
"there are many more ways to tweak PiCloud to your liking.\n",
"\n",
"Happy simulating!"
]
},
{
"cell_type": "heading",
"level": 2,
"source": [
"Footnote: Creating a QuTiP Environment"
]
},
{
"cell_type": "markdown",
"source": [
"There are two easy ways to get your own environment with qutip\n",
"installed. The first way is to clone the public environment I\n",
"created. It is named /mbaden/precise_with_qutip and you should be able\n",
"to find it if you do a search for qutip. The second way is to create\n",
"the environment yourself. To do so go to [the environments\n",
"page](https://www.picloud.com/accounts/environment/) of your PiCloud\n",
"account, select Ubuntu Precise as base environment and log in via the\n",
"web console. To install QuTiP type\n",
"\n",
" sudo apt-get install python-software-properties\n",
" sudo add-apt-repository ppa:jrjohansson/qutip-releases\n",
" sudo apt-get update\n",
" sudo apt-get install python-qutip\n",
"\n",
"Here, the first step is an additional step as compared to the\n",
"installation instructions in the QuTiP documentation, which installs\n",
"add-apt-repository, which is not installed in the base environment. By\n",
"the way, these steps are exactly what I did to create\n",
"/mbaden/precise_with_ubuntu.\n",
"\n",
"Now you can customize your new qutip environment to your liking.\n"
]
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment