{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Tutorial on Parallel Parcels with MPI and `dask` field-chunking" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Parcels can be run in Parallel with MPI. To do this, first follow the installation instructions at http://oceanparcels.org/#parallel_install." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Splitting the ParticleSet with MPI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once you have installed a parallel version of Parcels, you can simply run your script with\n", "\n", "```\n", "mpirun -np python \n", "```\n", "Where `` is the number of processors you want to use\n", "\n", "Parcels will then split the `ParticleSet` into `` smaller ParticleSets, based on a `sklearn.cluster.KMeans` clustering. Each of those smaller `ParticleSets` will be executed by one of the `` MPI processors.\n", "\n", "Note that in principle this means that all MPI processors need access to the full `FieldSet`, which can be Gigabytes in size for large global datasets. Therefore, efficient parallelisation only works if at the same time we also chunk the `FieldSet` into smaller domains" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Chunking the FieldSet with dask" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The basic idea of field-chunking in Parcels is that we use the `dask` library to load only these regions of the `Field` that are occupied by `Particles`. The advantage is that if different MPI procesors take care of Particles in different parts of the domain, each only needs to load a small section of the full `FieldSet` (although note that this load-balancing functionality is still in [development](#Future-developments:-load-balancing)). Furthermore, the field-chunking in principle makes the `indices` keyword superfluous, as Parcels will determine which part of the domain to load itself." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The default behaviour is for `dask` to control the chunking, via a call to `da.from_array(data, chunks='auto')`. The chunksizes are then determined by the layout of the NetCDF files. \n", "\n", "However, in tests we have experienced that this may not necessarily be the most efficient chunking. Therefore, Parcels provides control over the chunksize via the `field_chunksize` keyword in `Field` creation, which requires a tuple that sets the typical size of chunks for each dimension.\n", "\n", "It is strongly encouraged to explore what the best value for chunksize is for your experiment, which will depend on the `FieldSet`, the `ParticleSet` and the type of simulation (2D versus 3D). As a guidance, we have found that chunksizes in the zonal and meridional direction of approximately around 128 to 512 are typically most effective. The binning relates to the size of the model and its data size, so power-of-two values are advantageous but not required." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The notebook below shows an example script to explore the scaling of the time taken for `pset.execute()` as a function of zonal and meridional `field_chunksize` for a dataset from the [CMEMS](http://marine.copernicus.eu/) portal." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline\n", "from parcels import FieldSet, ParticleSet, JITParticle, AdvectionRK4\n", "from datetime import timedelta as delta\n", "import numpy as np\n", "from glob import glob\n", "import os\n", "import time\n", "import psutil\n", "import matplotlib.pyplot as plt\n", "\n", "def set_cmems_fieldset(cs):\n", " data_dir_head = \"/data/oceanparcels/input_data\"\n", " data_dir = os.path.join(data_dir_head, \"CMEMS/GLOBAL_REANALYSIS_PHY_001_030/\")\n", " files = sorted(glob(data_dir+\"mercatorglorys12v1_gl12_mean_201607*.nc\"))\n", " variables = {'U': 'uo', 'V': 'vo'}\n", " dimensions = {'lon': 'longitude', 'lat': 'latitude', 'time': 'time'}\n", "\n", " if cs not in ['auto', False]:\n", " cs = (1, cs, cs)\n", " return FieldSet.from_netcdf(files, variables, dimensions, field_chunksize=cs)\n", "\n", "func_time = []\n", "mem_used_GB = []\n", "chunksize = [128, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2610, 'auto', False]\n", "for cs in chunksize:\n", " \n", " fieldset = set_cmems_fieldset(cs)\n", " pset = ParticleSet(fieldset=fieldset, pclass=JITParticle, lon=[0], lat=[0], repeatdt=delta(hours=1))\n", "\n", " tic = time.time()\n", " pset.execute(AdvectionRK4, dt=delta(hours=1))\n", " func_time.append(time.time()-tic)\n", " process = psutil.Process(os.getpid())\n", " mem_B_used = process.memory_info().rss\n", " mem_used_GB.append(mem_B_used / (1024 * 1024))\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(15, 7)) \n", "\n", "ax.plot(chunksize[:-2], func_time[:-2], 'o-')\n", "ax.plot([0, 2800], [func_time[-2], func_time[-2]], '--', label=chunksize[-2])\n", "ax.plot([0, 2800], [func_time[-1], func_time[-1]], '--', label=chunksize[-1])\n", "plt.xlim([0, 2800])\n", "plt.legend()\n", "ax.set_xlabel('field_chunksize')\n", "ax.set_ylabel('Time spent in pset.execute() [s]')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plot above shows that in this case, `field_chunksize='auto'` and `field_chunksize=False` (the two dashed lines) are roughly the same speed, but that the fastest run is for `field_chunksize=(1, 256, 256)`. But note that the actual thresholds and numbers depend on the `FieldSet` used and the specifics of your experiment.\n", "\n", "Furthermore, one of the major advantages of field chunking is the efficient utilization of memory. This permits the distribution of the particle advection to many cores, as otherwise the processing unit (e.g. a CPU core; a node in a cluster) would exhaust the memory rapidly. This is shown in the following plot of the memory behaviour." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "data": { "image/png": "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1VdfsXr1arp27Upubi4AZlay34m2yjZs2DBmzpxJfHw89erVO+N+rVq1IiYm5rzuRZSyKQSKiIiIiFR3P6woDn4nRv4SLi9+/sOK8z7l4cOHiYyMpG7dumzatImvv/66ZFtMTAwbN26kqKioZKQQIDw8nCNHjgAQERFBZGQkX3zxBQAzZ84sGRWsiJCQEJ5++ml++9vflrtfRkYG33//Pc2bNz+Xtyfl0OWgIiIiIiLV3WX3nd6WcPkFXQ569dVX88orr9C5c2fatWtH7969S7Y99dRTDB06lLi4ODp16lQyScyoUaO44447eOGFF5g9ezbTp08vmRimZcuWp13SeTajRo0647aBAwfi7+9Pfn4+Tz31FDExupWpsigEioiIiIj4oKCgID788MMyt914440lk7+U1rdv39Muyyw9glgRjz32WJntn3/+ecnj1NTUczqnnBtdDioiIiIiIhdNREQEjzzySMli8RfixGLx+fn5+PkpypwvjQSKiIiIiMhF8/zzz1fauU4sFi8XRvFZRERERETEhygEioiIiIiI+BCFQBERERERER+iECgiIiIiIuJDFAJFRERERKRSpKam0qlTp0o7X1hY2Glte/bsKXP5ivPx2GOPERsby6OPPgrAtGnTMDMWLFhQss+7776LmTF79mwABgwYQLt27UhKSqJ9+/ZMnjy5ZN+BAwcSFhbGsmXLKqW+i0UhUEREREREaoymTZuWBLLK8Ktf/Yrf//73Jc8TExN58803S57PmjWLLl26nHTM66+/zqpVq1iyZAm//vWvOX78OAALFy4kOTm50mq7WLREhIiIiIhINfDzj35+WttVLa5i1CWjOFZwjF/M/8Vp269vfT3DWw/nYO5B7v/8/pO2Tb16armvl5qayjXXXMNll13G0qVLiY2NZc6cOSXLMEyYMIGjR4/SqlUrpkyZQmRk5EnHp6enM2HCBHbs2AHApEmTaNq0KYWFhdxxxx2nnXPAgAH85S9/ITk5mczMTJKTk0lNTWXatGnMnTuXo0ePsn37dkaMGMGf/vSnk14rMzOTYcOG8fDDD9OxY0eGDh3KunXryj321Vdf5emnn6Zp06a0adOGoKAgXnrppbP+O/Tr148vvviC/Px88vLy2LZtG0lJSWXum52dTWhoKP7+/mc9b3WikUARERERER+1detWJk6cyPr166lfvz7v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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(15, 12))\n", "ax.plot(chunksize[:-2], mem_used_GB[:-2], '--', label=\"memory_blocked [MB]\")\n", "ax.plot([0, 2800], [mem_used_GB[-2], mem_used_GB[-2]], 'x-', label=\"auto [MB]\")\n", "ax.plot([0, 2800], [mem_used_GB[-1], mem_used_GB[-1]], '--', label=\"no chunking [MB]\")\n", "plt.legend()\n", "ax.set_xlabel('field_chunksize')\n", "ax.set_ylabel('Memory blocked in pset.execute() [MB]')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It can clearly be seen that with `field_chunksize=False` (green line), all Field data are loaded in full directly into memory, which can lead to MPI-run simulations being aborted for memory reasons. Furthermore, one can see that even the automatic method is not optimal, and optimizing the chunksize for a specific hydrodynamic dataset can make a large difference to the memory used. \n", "\n", "It may - depending on your simulation goal - be necessary to tweak the chunksize to leave more memory space for additional particles that are being simulated. Since particles and fields share the same memory space, lower memory utilisation by the `FieldSet` means more memory available for a larger `ParticleSet`. \n", "\n", "Also note that the above example is for a 2D application. For 3D applications, the `field_chunksize=False` will almost always be slower than `field_chunksize='auto'` or any tuple, and is likely to run into insufficient memory issues, raising a `MemoryError`. The plot below shows the same analysis as above, but this time for a set of simulations using the full 3D CMEMS code. In this case, the `field_chunksize='auto'` is about two orders of magnitude faster than running without chunking, and about 7.5 times faster than with minimal chunk capacity (i.e. `chunksize=(1, 128, 128)`). \n", "\n", "Choosing too small chunksizes can make the code slower, again highlighting that it is wise to explore which chunksize is best for your experiment before you perform it." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Computed 3D field advection.\n" ] } ], "source": [ "from parcels import AdvectionRK4_3D\n", "def set_cmems_fieldset_3D(cs):\n", " data_dir_head = \"/data/oceanparcels/input_data\"\n", " data_dir = os.path.join(data_dir_head, \"CMEMS/GLOBAL_REANALYSIS_PHY_001_030/\")\n", " files = sorted(glob(data_dir+\"mercatorglorys12v1_gl12_mean_201607*.nc\"))\n", " variables = {'U': 'uo', 'V': 'vo'}\n", " dimensions = {'lon': 'longitude', 'lat': 'latitude', 'depth': 'depth', 'time': 'time'}\n", "\n", " if cs not in ['auto', False]:\n", " #cs = (1, cs, cs)\n", " cs = {dimensions['time']: 1, dimensions['depth']: 1, dimensions['lon']: cs, dimensions['lat']: cs}\n", " return FieldSet.from_netcdf(files, variables, dimensions, field_chunksize=cs)\n", "\n", "chunksize_3D = [128, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2610, 'auto', False]\n", "func_time3D = []\n", "for cs in chunksize_3D:\n", " \n", " fieldset = set_cmems_fieldset_3D(cs)\n", " pset = ParticleSet(fieldset=fieldset, pclass=JITParticle, lon=[0], lat=[0], repeatdt=delta(hours=1))\n", "\n", " tic = time.time()\n", " pset.execute(AdvectionRK4_3D, dt=delta(hours=1))\n", " func_time3D.append(time.time()-tic)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "is_executing": true } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(15, 7)) \n", "\n", "ax.plot(chunksize[:-2], func_time3D[:-2], 'o-')\n", "ax.plot([0, 2800], [func_time3D[-2], func_time3D[-2]], '--', label=chunksize_3D[-2])\n", "plt.xlim([0, 2800])\n", "plt.legend()\n", "ax.set_xlabel('field_chunksize')\n", "ax.set_ylabel('Time spent in pset.execute() [s]')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Future developments: load-balancing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The current implementation of MPI parallelisations in Parcels is still fairly rudimentary. In particular, we will continue to develop the load-balancing of the `ParticleSet`.\n", "\n", "With load-balancing we mean that `Particles` that are close together are ideally on the same MPI processor. Practically, it means that we need to take care how `Particles` are spread over chunks and processors. See for example the two figures below:\n", "\n", "![](http://oceanparcels.org/images/parcelsParallel.png)\n", "*Example of load-balancing for Particles. The domain is chunked along the thick lines, and the orange and blue particles are on separate MPI processors. Before load-balancing (left panel), two chuncks in the centre of the domain have both orange and blue particles. After the load-balancing (right panel), the Particles are redistributed over the processors so that the number of chunks and particles per processor is optimised.*\n", "\n", "The difficulty is that since we don't know how the `ParticleSet` will disperse over time, we need to do this load-balancing 'on the fly'. If you to contribute to the optimisation of the load-balancing, please leave a message on [github](https://github.com/OceanParcels/parcels/issues)!" ] } ], "metadata": { "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.6.7" } }, "nbformat": 4, "nbformat_minor": 2 }