web-dev-qa-db-ja.com

HPCでscikit-learn関数の並列オプションを使用する簡単な方法

Scikit-learnの多くの機能では、ユーザーフレンドリーな並列化が実装されています。たとえば、sklearn.cross_validation.cross_val_scoreでは、n_jobs引数に必要な数の計算ジョブを渡すだけです。また、マルチコアプロセッサを搭載したPCでは、非常に優れた動作をします。しかし、高性能クラスターでそのようなオプションを使用したい場合(OpenMPIパッケージがインストールされ、リソース管理にSLURMを使用)?私が知っているように、sklearnjoblibを使用する並列化にmultiprocessingを使用します。そして、私が知っているように(たとえば、これから mpi内のPythonマルチプロセッシング )Pythonmultiprocessingで並列化されたプログラムは、全体を簡単にスケーリングできますMPImpirunユーティリティを使用したアーキテクチャ。 sklearnおよびn_jobs引数を使用して、いくつかの計算ノードでmpirun関数の計算を広げることはできますか?

30
user3271237

SKLearnは、その並列性を Joblib で管理します。 Joblibは、 dask.distributed または IPython Parallel のような他の分散システムのマルチプロセッシングバックエンドを交換できます。詳細については、sklearn githubページの この問題 を参照してください。

Dask.distributedでJoblibを使用する例

上記にリンクされている問題ページから取られたコード。

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-mpi または Daskのセットアップドキュメント で言及されている他のいくつかの方法のいずれかを使用することもできます。

Dask.distributedを直接使用する

または、dask.distributedまたはIPyParallelクラスターをセットアップし、これらのインターフェイスを直接使用してSKLearnコードを並列化することもできます。以下は、SKLearnとJoblibの開発者Olivier GriselがPyData Berlinでまさにそれを行っているサンプルビデオです。 https://youtu.be/Ll6qWDbRTD0?t=1561

Dask-MLをお試しください

Dask-MLパッケージを試すこともできます。これは、scikit-learnとAPI互換ですが、Daskの上に計算的に実装されたRandomizedSearchCVオブジェクトを持っています

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

pip install dask-ml
24
MRocklin