use*_*237 31 python parallel-processing cluster-computing multiprocessing scikit-learn
在scikit-learn的许多功能中实现了用户友好的并行化.例如,
sklearn.cross_validation.cross_val_score您只需在n_jobs参数中传递所需数量的计算作业.对于具有多核处理器的PC,它将非常好用.但是,如果我想在高性能集群中使用这样的选项(安装OpenMPI包并使用SLURM进行资源管理)?据我所知,sklearn使用joblib并行化multiprocessing.并且,正如我所知(例如,在这里,例如,mpi中的Python多处理)Python程序并行化,具有multiprocessing易于扩展的整个MPI架构和mpirun实用程序.我可以sklearn使用mpirun和n_jobs参数在几个计算节点上传播函数的计算吗?
MRo*_*lin 25
SKLearn管理其与Joblib的并行性.Joblib可以为其他分布式系统(如dask.distributed或IPython Parallel)交换多处理后端.有关详细信息,请参阅github页面上的此问题sklearn.
代码取自上面链接的问题页面.
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)
Run Code Online (Sandbox Code Playgroud)
这要求您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)
Run Code Online (Sandbox Code Playgroud)
注意:在上面的两个例子中,n_jobs参数似乎都不重要了.
对于SLURM,最简单的方法是在RandomizedSearchCV本地运行
>>> from dask_jobqueue import SLURMCluster
>>> cluster = SLURMCluster(project='...', queue='...', ...)
>>> cluster.scale(20)
Run Code Online (Sandbox Code Playgroud)
然后使用SLURM提交许多sklearn指向此过程的作业.
pip install dask-ml
Run Code Online (Sandbox Code Playgroud)
(我实际上并不了解SLURM,所以上面的语法可能不正确,希望意图明确)
或者,您可以设置dask.distributed或IPyParallel集群,然后直接使用这些接口来并行化您的SKLearn代码.以下是SKLearn和Joblib开发人员Olivier Grisel的示例视频,正好在柏林PyData公司做了这样的视频:https://youtu.be/Ll6qWDbRTD0 ? t = 1561
dask.distributed您还可以尝试实验 ipyparallel包,其中包含n_jobs与scikit-learn API兼容的对象,但在Dask之上进行计算实现
https://github.com/dask/dask-learn
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)
Run Code Online (Sandbox Code Playgroud)