Deploy Dask on DRMAA clusters
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
ci/scripts
dask_drmaa
scratch
.gitattributes
.gitignore
.travis.yml
Dockerfile-master
Dockerfile-slave
LICENSE.txt
MANIFEST.in
README.rst
add_worker.sh
docker-compose.yml
env.yml
hosts.txt
queue.txt
requirements.txt
run-master.sh
run-slave.sh
scheduler.txt
setup-master.sh
setup-slave.sh
setup.cfg
setup.py
start-sge.sh
versioneer.py

README.rst

Dask on DRMAA

Build Status PyPI Release conda-forge Release

Deploy a Dask.distributed cluster on top of a cluster running a DRMAA-compliant job scheduler.

Example

Launch from Python

from dask_drmaa import DRMAACluster
cluster = DRMAACluster()

from dask.distributed import Client
client = Client(cluster)
cluster.start_workers(2)

>>> future = client.submit(lambda x: x + 1, 10)
>>> future.result()
11

Or launch from the command line:

$ dask-drmaa 10  # starts local scheduler and ten remote workers

Install

Python packages are available from PyPI and can be installed with pip:

pip install dask-drmaa

Also conda packages are available from conda-forge:

conda install -c conda-forge dask-drmaa

Additionally the package can be installed from GitHub with the latest changes:

pip install git+https://github.com/dask/dask-drmaa.git --upgrade

or:

git clone git@github.com:dask/dask-drmaa.git
cd dask-drmaa
pip install .

You must have the DRMAA system library installed and be able to submit jobs from your local machine. Please make sure to set the environment variable DRMAA_LIBRARY_PATH to point to the location of libdrmaa.so for your system.

Testing

This repository contains a Docker-compose testing harness for a Son of Grid Engine cluster with a master and two slaves. You can initialize this system as follows:

docker-compose build
./start-sge.sh

If you have done this previously and need to refresh your solution you can do the following

docker-compose stop
docker-compose build --no-cache
./start-sge.sh

And run tests with py.test in the master docker container

docker exec -it sge_master /bin/bash -c "cd /dask-drmaa; python setup.py develop"
docker exec -it sge_master /bin/bash -c "cd /dask-drmaa; py.test dask_drmaa --verbose"

Adaptive Load

Dask-drmaa can adapt to scheduler load, deploying more workers on the grid when it has more work, and cleaning up these workers when they are no longer necessary. This can simplify setup (you can just leave a cluster running) and it can reduce load on the cluster, making IT happy.

To enable this, call the adapt method of a DRMAACluster. You can submit computations to the cluster without ever explicitly creating workers.

from dask_drmaa import DRMAACluster
from dask.distributed import Client

cluster = DRMAACluster()
cluster.adapt()
client = Client(cluster)

futures = client.map(func, seq)  # workers will be created as necessary

Extensible

The DRMAA interface is the lowest common denominator among many different job schedulers like SGE, SLURM, LSF, Torque, and others. However, sometimes users need to specify parameters particular to their cluster, such as resource queues, wall times, memory constraints, etc..

DRMAA allows users to pass native specifications either when constructing the cluster or when starting new workers:

cluster = DRMAACluster(template={'nativeSpecification': '-l h_rt=01:00:00'})
# or
cluster.start_workers(10, nativeSpecification='-l h_rt=01:00:00')

Related Work

  • DRMAA: The Distributed Resource Management Application API, a high level API for general use on traditional job schedulers
  • drmaa-python: The Python bindings for DRMAA
  • DaskSGE: An earlier dask-drmaa implementation
  • Son of Grid Engine: The default implementation used in testing
  • Dask.distributed: The actual distributed computing library this launches