{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Support for dask arrays\n", "\n", "It is possible to operate on dask arrays and spare the memory (or perhaps even time)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Necessary imports\n", "import dask.multiprocessing\n", "import numpy as np\n", "\n", "import dask.array as da\n", "from physt import h1, h2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Create two arrays\n", "np.random.seed(42)\n", "\n", "SIZE = 2 ** 21\n", "CHUNK = int(SIZE / 16)\n", "\n", "million = np.random.rand(SIZE)#.astype(int)\n", "million2 = (3 * million + np.random.normal(0., 0.3, SIZE))#.astype(int)\n", "\n", "# Chunk them for dask\n", "chunked = da.from_array(million, chunks=(CHUNK))\n", "chunked2 = da.from_array(million2, chunks=(CHUNK))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create histograms\n", "\n", "`h1`, `h2`, ... have their alternatives in `physt.dask_compat`. They should work similarly. Although, they are not complete and unexpected errors may occur." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from physt.compat.dask import h1 as d1\n", "from physt.compat.dask import h2 as d2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check: True\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Use chunks to create a 1D histogram\n", "ha = d1(chunked2, \"fixed_width\", bin_width=0.2)\n", "check_ha = h1(million2, \"fixed_width\", bin_width=0.2)\n", "ok = (ha == check_ha)\n", "print(\"Check: \", ok)\n", "ha.plot()\n", "ha" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/honza/code/my/physt/src/physt/util.py:81: FutureWarning:\n", "\n", "histogramdd is deprecated, use h instead\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Check: True\n" ] }, { "data": { "text/plain": "Histogram2D(bins=(5, 28), total=2097152, dtype=int64)" }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": "
", "image/png": "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v23//v2qq6trseehxYrjvbYzZ85U586dNXbs2JYIM2Ydz/V9+eWXlZWVpdzcXKWkpKhXr1667777FA6HWyrsmHE813fw4MHasGFDdPjy008/1YoVK3TZZZe1SMzxjt+22BI3C7p++eWXCofDh6yqm5KSorKyssN+pry8/LDty8vLmy3OWHU81/fbbrvtNqWlpR3yBeF2x3Nt33zzTf3+97/Xpk2bWiDC2HY81/fTTz/V66+/rlGjRmnFihX65JNPdPPNN6uurk7Tp09vibBjxvFc36uvvlpffvmlvv/978uyLNXX1+umm27S7bff3hIhx70j/baFQiFVV1crMTHRUGQ4nLipiOHEdv/99+v555/XkiVLjD0oNl7s3btX11xzjZ566imdfPLJpsOJS5FIRJ07d9aTTz6p/v37a8SIEbrjjjs0f/5806HFhVWrVum+++7T448/ro0bN+rPf/6zli9frt/+9remQwNaXNxUxE4++WT5fD5VVFQ02l9RUaHU1NTDfiY1NdVWezc7nuvb4MEHH9T999+vv/3tb+rTp09zhhmT7F7bf/7zn/rss890xRVXRPdFIhFJUqtWrbRlyxadeeaZzRt0DDmev90uXbqodevW8vl80X1nn322ysvLVVtbK7/f36wxx5Ljub533XWXrrnmGt1www2SpN69e6uqqkrjxo3THXfcIa+XGkFTHOm3LRgMUg07AcXNX7vf71f//v1VVFQU3ReJRFRUVKSsrKzDfiYrK6tRe0lauXLlEdu72fFcX0maNWuWfvvb36qwsFAZGRktEWrMsXtte/ToodLSUm3atCm6/dd//Zcuuugibdq0Senp6S0Z/gnveP52hwwZok8++SSa4ErSRx99pC5dupCEfcvxXN/9+/cfkmw1JL0WT91rMn7bYozpuwWc9Pzzz1uBQMBasGCB9cEHH1jjxo2z2rdvb5WXl1uWZVnXXHONNWXKlGj7tWvXWq1atbIefPBB68MPP7SmT5/O8hVHYff63n///Zbf77deeukl64svvohue/fuNXUKJyy71/bbuGvy6Oxe323btllJSUlWXl6etWXLFmvZsmVW586drXvuucfUKZzQ7F7f6dOnW0lJSdaf/vQn69NPP7Vee+0168wzz7R+9rOfmTqFE9revXutd99913r33XctSdZDDz1kvfvuu9a//vUvy7Isa8qUKdY111wTbd+wfMWtt95qffjhh9bcuXNZvuIEFleJmGVZ1mOPPWadeuqplt/vtwYOHGi99dZb0fcuuOACa/To0Y3av/DCC9b3vvc9y+/3W+ecc461fPnyFo44tti5vqeddpol6ZBt+vTpLR94DLD7t/tNJGLfze71XbdunZWZmWkFAgHrjDPOsO69916rvr6+haOOHXaub11dnTVjxgzrzDPPtBISEqz09HTr5ptvtnbv3t3ygceAv//974f9Lm24pqNHj7YuuOCCQz7Tt29fy+/3W2eccYb1zDPPtHjcODYey6IODAAAYELczBEDAACINSRiAAAAhpCIAQAAGEIiBgAAYAiJGAAAgCEkYgAAAIaQiAEAABhCIgYAAGAIiRgAAIAhJGIAAACGkIgBAAAYQiIGwDG7du1Samqq7rvvvui+devWye/3q6ioyGBkAHBi4qHfABy1YsUKDR8+XOvWrVP37t3Vt29f/ehHP9JDDz1kOjQAOOGQiAFwXG5urv72t78pIyNDpaWlKikpUSAQMB0WAJxwSMQAOK66ulq9evXS9u3btWHDBvXu3dt0SABwQmKOGADH/fOf/9SOHTsUiUT02WefmQ4HAE5YVMQAOKq2tlYDBw5U37591b17d82ePVulpaXq3Lmz6dAA4IRDIgbAUbfeeqteeukl/eMf/1C7du10wQUXKDk5WcuWLTMdGgCccBiaBOCYVatWafbs2frjH/+oYDAor9erP/7xj1qzZo3mzZtnOjwAOOFQEQMAADCEihgAAIAhJGIAAACGkIgBAAAYQiIGAABgCIkYAACAISRiAAAAhpCIAQAAGEIiBgAAYAiJGAAAgCEkYgAAAIaQiAEAABhCIgYAAGDI/wc6sJydaeq+AQAAAABJRU5ErkJggg==\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Use chunks to create a 2D histogram\n", "hb = d2(chunked, chunked2, \"fixed_width\", bin_width=.2, axis_names=[\"x\", \"y\"])\n", "check_hb = h2(million, million2, \"fixed_width\", bin_width=.2, axis_names=[\"x\", \"y\"])\n", "hb.plot(show_zero=False, cmap=\"rainbow\")\n", "ok = (hb == check_hb)\n", "print(\"Check: \", ok)\n", "hb" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Check: True\n" ] }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# And another cross-check\n", "hh = hb.projection(\"y\")\n", "hh.plot()\n", "print(\"Check: \", np.array_equal(hh.frequencies, ha.frequencies)) # Just frequencies" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": "True" }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Use dask for normal arrays (will automatically split array to chunks)\n", "d1(million2, \"fixed_width\", bin_width=0.2) == ha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some timings\n", "\n", "Your results may vary substantially. These numbers are just for illustration, on 4-core (8-thread) machine. The real gain comes when we have data that don't fit into memory." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Efficiency" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 399 ms, sys: 3.75 ms, total: 403 ms\n", "Wall time: 442 ms\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Standard\n", "%time h1(million2, \"fixed_width\", bin_width=0.2)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 368 ms, sys: 4.08 ms, total: 372 ms\n", "Wall time: 84.5 ms\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Same array, but using dask\n", "%time d1(million2, \"fixed_width\", bin_width=0.2)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 343 ms, sys: 4.18 ms, total: 347 ms\n", "Wall time: 64.5 ms\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Most efficient: dask with already chunked data\n", "%time d1(chunked2, \"fixed_width\", bin_width=0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Different scheduling" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 337 ms, sys: 14.1 ms, total: 351 ms\n", "Wall time: 88.3 ms\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time d1(chunked2, \"fixed_width\", bin_width=0.2)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 317 ms, sys: 9.95 ms, total: 327 ms\n", "Wall time: 98.6 ms\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "# Hyper-threading or not?\n", "graph, name = d1(chunked2, \"fixed_width\", bin_width=0.2, compute=False)\n", "dask.threaded.get(graph, name, num_workers=4)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 22.8 ms, sys: 8.53 ms, total: 31.3 ms\n", "Wall time: 1.65 s\n" ] }, { "data": { "text/plain": "Histogram1D(bins=(28,), total=2097152, dtype=int64)" }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Multiprocessing not so efficient for small arrays?\n", "%time d1(chunked2, \"fixed_width\", bin_width=0.2, dask_method=dask.multiprocessing.get)" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }