Skip to content

Instantly share code, notes, and snippets.

@TAdeJong
Last active November 9, 2023 09:32
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TAdeJong/abc70b33f54c4230e3da1119c7a20609 to your computer and use it in GitHub Desktop.
Save TAdeJong/abc70b33f54c4230e3da1119c7a20609 to your computer and use it in GitHub Desktop.
A simple notebook show casing a quick hack to visualize a dask array computation as it completes.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dask array visualization during compute\n",
"\n",
"This notebook shows a quick hack to visualize a Dask array as computation progresses. It uses the futures in the return of a `.persist()` call. Only works for end results that are small enough to fit in local memory of course! The plotting should be possible in a much nicer way, for example using Bokeh, but I am more familiar with matplotlib, so this is a quick first proof of principle. First needed imports:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import dask\n",
"import dask.array as da\n",
"from dask.distributed import Client, as_completed\n",
"from IPython.display import display, clear_output\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<table style=\"border: 2px solid white;\">\n",
"<tr>\n",
"<td style=\"vertical-align: top; border: 0px solid white\">\n",
"<h3 style=\"text-align: left;\">Client</h3>\n",
"<ul style=\"text-align: left; list-style: none; margin: 0; padding: 0;\">\n",
" <li><b>Scheduler: </b>tcp://127.0.0.1:36659</li>\n",
" <li><b>Dashboard: </b><a href='http://127.0.0.1:8787/status' target='_blank'>http://127.0.0.1:8787/status</a>\n",
"</ul>\n",
"</td>\n",
"<td style=\"vertical-align: top; border: 0px solid white\">\n",
"<h3 style=\"text-align: left;\">Cluster</h3>\n",
"<ul style=\"text-align: left; list-style:none; margin: 0; padding: 0;\">\n",
" <li><b>Workers: </b>1</li>\n",
" <li><b>Cores: </b>24</li>\n",
" <li><b>Memory: </b>33.67 GB</li>\n",
"</ul>\n",
"</td>\n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<Client: 'tcp://127.0.0.1:36659' processes=1 threads=24, memory=33.67 GB>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Only works with the distributed scheduler. Open the Dashboard to compare.\n",
"Client(n_workers=1, nthreads=1)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Create some work\n",
"D = da.random.random((50,80,8000), chunks=(5,4,2000))\n",
"Dt = D * D\n",
"Dt = Dt.std(axis=-1)\n",
"#Dt.__dask_graph__().layers"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"#Definition of the useful function\n",
"def persist_and_visualize(dA):\n",
" A = dA.persist()\n",
" res = np.full(A.shape, np.nan)\n",
" chunksize= np.array(A.chunksize)\n",
" futures = next(iter(A.__dask_graph__().layers.values())).values()\n",
" fig, ax = plt.subplots()\n",
" for batch in as_completed(futures, with_results=True).batches():\n",
" for future, result in batch:\n",
" index = np.array(future.key[1:])*chunksize\n",
" res[tuple(slice(i,j) for i,j in zip(tuple(index), tuple(index+chunksize)))] = result\n",
" ax.imshow(res)\n",
" display(fig)\n",
" clear_output(wait=True)\n",
" plt.pause(0.01)\n",
" return res"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Actual live visualization of results as they come in now:\n",
"persist_and_visualize(Dt);"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:root] *",
"language": "python",
"name": "conda-root-py"
},
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
numpy
matplotlib
ipywidgets
dask
distributed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment