Python 在HPC上使用scikit学习函数并行选项的简便方法

Python 在HPC上使用scikit学习函数并行选项的简便方法,python,parallel-processing,scikit-learn,multiprocessing,cluster-computing,Python,Parallel Processing,Scikit Learn,Multiprocessing,Cluster Computing,在scikit的许多函数中,learn实现了用户友好的并行化。例如在 sklearn.cross\u validation.cross\u val\u score您只需在n\u jobs参数中通过所需数量的计算作业即可。对于带有多核处理器的个人电脑来说,这将非常好用。但如果我想在高性能集群中使用这样的选项(安装了OpenMPI包并使用SLURM进行资源管理)?据我所知,sklearn使用joblib进行并行化,它使用多处理。而且,正如我所知道的(例如,从这里),Python程序与多处理并行,易于

在scikit的许多函数中,learn实现了用户友好的并行化。例如在
sklearn.cross\u validation.cross\u val\u score
您只需在
n\u jobs
参数中通过所需数量的计算作业即可。对于带有多核处理器的个人电脑来说,这将非常好用。但如果我想在高性能集群中使用这样的选项(安装了OpenMPI包并使用SLURM进行资源管理)?据我所知,
sklearn
使用
joblib
进行并行化,它使用
多处理
。而且,正如我所知道的(例如,从这里),Python程序与
多处理
并行,易于使用
mpirun
实用程序扩展整个MPI体系结构。我是否可以仅使用
mpirun
n_jobs
参数将
sklearn
函数的计算分散到几个计算节点上

SKLearn使用管理其并行性。Joblib可以将多处理后端替换为其他分布式系统,如或。有关详细信息,请参见
sklearn
github页面上的

将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
调度程序和工作程序。一般说明如下:

将Joblib与
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\u jobs
参数似乎不再重要

设置dask。使用SLURM分发 对于SLURM,最简单的方法可能是使用项目

您还可以使用中提到的方法或其他任何方法

使用dask.com直接分发 或者,您可以设置一个dask.distributed或IPyParallel集群,然后直接使用这些接口来并行化SKLearn代码。以下是SKLearn和Joblib开发人员Olivier Grisel在柏林PyData的视频示例:

试试Dask ML 您还可以尝试Dask ML包,它有一个
RandomizedSearchCV
对象,该对象与scikit learn API兼容,但在Dask之上以计算方式实现


您可能希望使用分布式调度器检查dask sklearn,该调度器可以在集群中运行:@dukebody您可以发布一个使用分布式调度器的示例吗?我看到的分布式dask示例涉及在每台机器上手动创建工人并将他们分配给调度程序。我不确定我是否看到了它与dask sklearn函数的联系。我是否只需要在这里创建调度器和工作程序:然后在链接中设置默认的调度器(其中10.0.0.3:8786是我在第一个链接中创建的调度器的地址)?是的。设置过程与您描述的完全相同。看@MRocklin,这似乎对我不起作用。似乎工人们没有得到任何执行,尽管他们已经成功地创建了。你能阅读下面的答案和我对它的评论,看看你是否有什么想法吗?我正在努力让第一个例子起作用,这里也描述了这个例子:。我使用
daskssh
设置我的调度程序和工作程序。这很好,如果我打印scheduler对象,我会得到正确数量的内核(
240
)。接下来,我将对randomizedsearch的
fit
的调用包装在
with
语句中。如果我查看执行
dask ssh
的控制台窗口,我会看到运行python脚本的节点的连接。但是,没有分布式工作正在进行。它不可缩放,甚至看不到工作人员拥有的GPU。我还尝试修改随机搜索CV的
n_jobs
参数,设置为
-1
1
100
240
。上面的每个值
20
都会产生大致相同的性能,这使我认为分布式工作程序上实际上没有运行任何东西,但在我运行python脚本的节点上(gensim还打印一条消息,表示没有GPU。工作程序节点上有GPU,但在我运行脚本的节点上没有GPU).在这一点上你超出了我的专业范围。您可能会向joblib维护人员提出问题。我发了一封电子邮件提醒他这个问题,但他们都很忙。我还将答案附加到了实验性dask学习包中,谢谢。我试着学习,但不幸的是,它只是卡在我身上,似乎永远不会结束。更新:也尝试了
ipyparallel
,和我用
dask
描述的一样。worker(ipyparallel中的引擎)已成功创建,客户端可以看到它们,但我的网格搜索不会在它们上运行。
>>> from dask_jobqueue import SLURMCluster
>>> cluster = SLURMCluster(project='...', queue='...', ...)
>>> cluster.scale(20)
pip install dask-ml