在HPC上使用scikit-learn功能的并行选项的简便方法

时间:2016-07-26 22:43:35

标签: python parallel-processing scikit-learn multiprocessing cluster-computing

在scikit-learn的许多功能中实现了用户友好的并行化。例如在 sklearn.cross_validation.cross_val_score您只需在n_jobs参数中传递所需数量的计算作业。对于具有多核处理器的PC,它将非常好用。但是,如果我想在高性能集群中使用这样的选项(安装OpenMPI包并使用SLURM进行资源管理)?据我所知,sklearn使用joblib进行并行化,使用multiprocessing。而且,据我所知(例如,Python multiprocessing within mpi)与multiprocessing并行化的Python程序易于扩展整个MPI架构,并具有mpirun实用程序。我可以使用sklearnmpirun参数在几个计算节点上传播n_jobs函数的计算吗?

1 个答案:

答案 0 :(得分:22)

SKLearn使用Joblib管理其并行性。 Joblib可以为其他分布式系统(例如dask.distributedIPython Parallel)交换多处理后端。有关详细信息,请参阅sklearn github页面上的this issue

使用Joblib和Dask.distributed

的示例

从上面链接的问题页面中获取的代码。

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)

这要求您在群集上设置dask.distributed调度程序和工作程序。一般说明可在此处获取:http://distributed.readthedocs.io/en/latest/setup.html

使用带有ipyparallel

的Joblib的示例

代码来自同一问题页面。

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)

注意:在上述两个示例中,n_jobs参数似乎无关紧要。

使用SLURM

设置dask.distributed

对于SLURM,最简单的方法是使用dask-jobqueue项目

>>> from dask_jobqueue import SLURMCluster
>>> cluster = SLURMCluster(project='...', queue='...', ...)
>>> cluster.scale(20)

您还可以使用dask-mpiDask's setup documentation

中提到的其他几种方法

直接使用dask.distributed

或者,您可以设置dask.distributed或IPyParallel集群,然后直接使用这些接口来并行化您的SKLearn代码。以下是SKLearn和Joblib开发人员Olivier Grisel的示例视频,正是在柏林PyData上做的那样:https://youtu.be/Ll6qWDbRTD0?t=1561

尝试Dask-ML

您还可以尝试使用Dask-ML包,该包具有与scikit-learn API兼容的RandomizedSearchCV对象,但在Dask之上计算实现

https://github.com/dask/dask-ml

pip install dask-ml