Einfache Möglichkeit zur Verwendung von parallel-Optionen von scikit-learn-Funktionen auf HPC
In vielen Funktionen von scikit-learn implementiert benutzerfreundliche Parallelisierung. Zum Beispiel in
sklearn.cross_validation.cross_val_score
Sie übergeben Sie einfach die gewünschte Anzahl der computational jobs in n_jobs
argument. Und für den PC mit multi-core-Prozessor, es wird funktionieren, sehr nett. Aber wenn ich verwenden möchten, die entsprechende option im high-performance-cluster (mit installiertem OpenMPI-Paket und mit SLURM für die Ressource-management) ? Ich weiß sklearn
verwendet joblib
für die Parallelisierung, die verwendet multiprocessing
. Und, wie ich weiß, (aus dieser, zum Beispiel, Python multiprocessing innerhalb mpi) Python-Programme parallelisiert mit multiprocessing
einfach zu skalieren oh gesamten MPI-Architektur mit mpirun
- Dienstprogramm. Kann ich verbreiten Berechnung der sklearn
Funktionen auf mehrere computational nodes nur mit mpirun
und n_jobs
argument?
- Möchten Sie vielleicht zu prüfen, dask-sklearn mit dem dezentralen scheduler, können in einem cluster ausgeführt: jcrist.github.io/dask-sklearn-part-1.html
- können Sie ein Beispiel für die Verwendung der distributed scheduler? Die verteilte dask Beispiele, die ich gesehen habe beinhalten manuelles erstellen von Arbeitern auf jede Maschine und deren Zuordnung zu den scheduler. Ich bin mir nicht sicher, ich sehe, wie diese Bindungen in der dask-sklearn Funktionen. Würde ich nur erstellen die Planer und Arbeiter wie hier: dask.pydata.org/en/doc-test-build/distributed.html dann legen Sie die Standard-scheduler so wie in deinem link (wobei 10.0.0.3:8786 ist die Adresse der Planer erstellt habe ich wie im ersten link)?
- Ja. Der setup-Prozess ist genau so, wie Sie beschreiben. Siehe distributed.readthedocs.io/en/latest/setup.html
- das scheint nicht für mich arbeiten. Es scheint, dass nichts ausgeführt wird, auf die Arbeiter, obwohl Sie erfolgreich erstellt wurde. Können Sie die Antwort Lesen unten und meine Kommentare zu es und sehen, wenn Sie irgendwelche Ideen, bitte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
SKLearn verwaltet seine Parallelität mit Joblib. Joblib kann die swap-multiprocessing-backend für andere verteilte Systeme, wie dask.verteilt oder IPython Parallel. Sehen dieses Problem auf die
sklearn
github-Seite für details.Beispiel mit Joblib mit Dask.verteilt
Code genommen von der Problem-Seite oben verlinkten.
Dies erfordert, dass Sie einen
dask.distributed
Planer und Arbeiter auf den cluster. Allgemeine Hinweise sind hier verfügbar: http://distributed.readthedocs.io/en/latest/setup.htmlBeispiel mit Joblib mit
ipyparallel
Code stammt aus der gleichen Ausgabe Seite.
Hinweis: in beiden der oben genannten Beispiele, die
n_jobs
parameter scheint nicht mehr wichtig.Eingerichtet dask.verteilt mit SLURM
Für SLURM der einfachste Weg, dies zu tun, ist wahrscheinlich zu verwenden, die dask-jobqueue Projekt
Könnten Sie auch dask-mpi oder mehrere andere Methoden erwähnt, Dask setup-Dokumentation
Verwenden dask.direkt verteilt
Alternativ können Sie eine dask.verteilt oder IPyParallel-cluster und verwenden Sie dann diese Schnittstellen direkt zu parallelisieren SKLearn code. Hier ist ein Beispiel video von SKLearn und Joblib-Entwickler Olivier Grisel, tut genau das an PyData Berlin: https://youtu.be/Ll6qWDbRTD0?t=1561
Versuchen Dask-ML
Könnte man auch versuchen, die Dask-ML-Packung, die eine
RandomizedSearchCV
Objekt, das ist API-kompatibel mit scikit-learn, aber rechnerisch umgesetzt auf der Oberseite von Daskhttps://github.com/dask/dask-ml
dask-ssh
einrichten, meine Planer und Arbeiter. Das funktioniert, wenn ich drucken Sie das scheduler-Objekt bekomme ich die richtige Anzahl an Kernen (240
). Als Nächstes wickelte ich den Aufruf der randomizedsearch istfit
imwith
- Anweisung. Wenn ich in der Konsole-Fenster, in dem ich ausgeführtdask-ssh
sehe ich eine Verbindung vom Knoten I führen Sie das python-Skript in. Es gibt jedoch keine verteilte Arbeit Los. Es ist nicht skalierbar, und es schadet auch nicht, siehe die GPUs, die die Arbeiter haben.n_jobs
parameter, Einstellung-1
,1
,100
,240
. Jeder Wert über20
führt zu etwa der gleichen Leistung, die lässt mich denken, dass nichts auf die Arbeitnehmer verteilt, sondern auf die Knoten I führen Sie das python-Skript auf (gensim auch druckt eine Meldung, dass es keine GPU. Es ist eine GPU, die auf den worker-Knoten, aber es ist nicht ein auf die Knoten I führen Sie das Skript aus).ipyparallel
, gleiche, was ich beschrieben mitdask
. Die Arbeiter (Motoren in ipyparallel) erfolgreich erstellt, der Kunde sieht Sie, aber meine Netz-Recherchen nicht auf Ihnen laufen.sklearn
Beispiele, wie ich Sie herausfinden mit Hilfe vonsklearn
Entwickler. Bitte lassen Sie mich wissen, wenn du glücklich bist mit ihm, in dem Fall werde ich award der bounty.register_parallel_backend('distributed', DistributedBackend)
. Dies sollte schon behandelt werden, indistributed.joblib
. Vielleicht sklearn ist die Verpackung entlang Ihrer eigenen version der joblib-Bibliothek jetzt?