在scikit-learn的许多功能中实现了用户友好的并行化。例如在
sklearn.cross_validation.cross_val_score
您只需在n_jobs
参数中传递所需数量的计算作业。对于具有多核处理器的PC,它将非常好用。但是,如果我想在高性能集群中使用这样的选项(安装OpenMPI包并使用SLURM进行资源管理)?据我所知,sklearn
使用joblib
进行并行化,使用multiprocessing
。而且,据我所知(例如,Python multiprocessing within mpi)与multiprocessing
并行化的Python程序易于扩展整个MPI架构,并具有mpirun
实用程序。我可以使用sklearn
和mpirun
参数在几个计算节点上传播n_jobs
函数的计算吗?
答案 0 :(得分:22)
SKLearn使用Joblib管理其并行性。 Joblib可以为其他分布式系统(例如dask.distributed或IPython Parallel)交换多处理后端。有关详细信息,请参阅sklearn
github页面上的this issue。
从上面链接的问题页面中获取的代码。
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
代码来自同一问题页面。
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-jobqueue项目
>>> from dask_jobqueue import SLURMCluster
>>> cluster = SLURMCluster(project='...', queue='...', ...)
>>> cluster.scale(20)
您还可以使用dask-mpi或Dask's setup documentation
中提到的其他几种方法或者,您可以设置dask.distributed或IPyParallel集群,然后直接使用这些接口来并行化您的SKLearn代码。以下是SKLearn和Joblib开发人员Olivier Grisel的示例视频,正是在柏林PyData上做的那样:https://youtu.be/Ll6qWDbRTD0?t=1561
您还可以尝试使用Dask-ML包,该包具有与scikit-learn API兼容的RandomizedSearchCV
对象,但在Dask之上计算实现
https://github.com/dask/dask-ml
pip install dask-ml