SKLearn manages its parallelism with Joblib. Joblib can swap out the multiprocessing backend for other distributed systems like dask.distributed or IPython Parallel. See this issue on the sklearn
github page for details.
Example using Joblib with Dask.distributed
Code taken from the issue page linked above.
from sklearn.externals.joblib import parallel_backend
search = RandomizedSearchCV(model, param_space, cv=10, n_iter=1000, verbose=1)
with parallel_backend('dask', scheduler_host='your_scheduler_host:your_port'):
search.fit(digits.data, digits.target)
This requires that you set up a dask.distributed
scheduler and workers on your cluster. General instructions are available here: http://dask.readthedocs.io/en/latest/setup.html
Example using Joblib with ipyparallel
Code taken from the same issue page.
from sklearn.externals.joblib import Parallel, parallel_backend, register_parallel_backend
from ipyparallel import Client
from ipyparallel.joblib import IPythonParallelBackend
digits = load_digits()
c = Client(profile='myprofile')
print(c.ids)
bview = c.load_balanced_view()
# this is taken from the ipyparallel source code
register_parallel_backend('ipyparallel', lambda : IPythonParallelBackend(view=bview))
...
with parallel_backend('ipyparallel'):
search.fit(digits.data, digits.target)
Note: in both the above examples, the n_jobs
parameter seems to not matter anymore.
Set up dask.distributed with SLURM
For SLURM the easiest way to do this is probably to use the dask-jobqueue project
>>> from dask_jobqueue import SLURMCluster
>>> cluster = SLURMCluster(project='...', queue='...', ...)
>>> cluster.scale(20)
You could also use dask-mpi or any of several other methods mentioned at Dask's setup documentation
Use dask.distributed directly
Alternatively you can set up a dask.distributed or IPyParallel cluster and then use these interfaces directly to parallelize your SKLearn code. Here is an example video of SKLearn and Joblib developer Olivier Grisel, doing exactly that at PyData Berlin: https://youtu.be/Ll6qWDbRTD0?t=1561
Try Dask-ML
You could also try the Dask-ML package, which has a RandomizedSearchCV
object that is API compatible with scikit-learn but computationally implemented on top of Dask
https://github.com/dask/dask-ml
pip install dask-ml