Scikit-learnの多くの機能では、ユーザーフレンドリーな並列化が実装されています。たとえば、sklearn.cross_validation.cross_val_score
では、n_jobs
引数に必要な数の計算ジョブを渡すだけです。また、マルチコアプロセッサを搭載したPCでは、非常に優れた動作をします。しかし、高性能クラスターでそのようなオプションを使用したい場合(OpenMPIパッケージがインストールされ、リソース管理にSLURMを使用)?私が知っているように、sklearn
はjoblib
を使用する並列化にmultiprocessing
を使用します。そして、私が知っているように(たとえば、これから mpi内のPythonマルチプロセッシング )Pythonmultiprocessing
で並列化されたプログラムは、全体を簡単にスケーリングできますMPImpirun
ユーティリティを使用したアーキテクチャ。 sklearn
およびn_jobs
引数を使用して、いくつかの計算ノードでmpirun
関数の計算を広げることはできますか?
SKLearnは、その並列性を Joblib で管理します。 Joblibは、 dask.distributed または IPython Parallel のような他の分散システムのマルチプロセッシングバックエンドを交換できます。詳細については、sklearn
githubページの この問題 を参照してください。
上記にリンクされている問題ページから取られたコード。
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-jobqueue プロジェクトを使用することです。
>>> from dask_jobqueue import SLURMCluster
>>> cluster = SLURMCluster(project='...', queue='...', ...)
>>> cluster.scale(20)
dask-mpi または Daskのセットアップドキュメント で言及されている他のいくつかの方法のいずれかを使用することもできます。
または、dask.distributedまたはIPyParallelクラスターをセットアップし、これらのインターフェイスを直接使用してSKLearnコードを並列化することもできます。以下は、SKLearnとJoblibの開発者Olivier GriselがPyData Berlinでまさにそれを行っているサンプルビデオです。 https://youtu.be/Ll6qWDbRTD0?t=1561
Dask-MLパッケージを試すこともできます。これは、scikit-learnとAPI互換ですが、Daskの上に計算的に実装されたRandomizedSearchCV
オブジェクトを持っています
https://github.com/dask/dask-ml
pip install dask-ml