Python Multiprocessing, Verteilte Cluster
Ich bin auf der Suche nach einem python-Paket, das tun können, multiprocessing, nicht nur zwischen verschiedenen Kernen in einem einzigen computer, sondern auch mit einem cluster, verteilt auf mehrere Maschinen. Es gibt eine Menge von verschiedenen Pakete für python, für distributed computing, aber die meisten scheinen zu erfordern eine änderung im code ausführen (zum Beispiel ein Präfix, der angibt, dass das Objekt auf einer remote-Maschine). Insbesondere möchte ich etwas so nah wie möglich an die multiprocessing pool.map
Funktion. So, zum Beispiel, wenn auf einer einzigen Maschine ist das Skript:
from multiprocessing import Pool
pool = Pool(processes = 8)
resultlist = pool.map(function, arglist)
Dann der pseudocode für eine verteilte cluster wäre:
from distprocess import Connect, Pool, Cluster
pool1 = Pool(processes = 8)
c = Connect(ipaddress)
pool2 = c.Pool(processes = 4)
cluster = Cluster([pool1, pool2])
resultlist = cluster.map(function, arglist)
- Wahrscheinlich erfordert mehr setup als du suchst, aber man kann einen Blick auf Sellerie für eine verteilte Warteschlange Aufgabe. docs.celeryproject.org/en/latest/getting-started/...
- Ich würde check out Krug
- Ich kann am Ende mit Sellerie, aber es erfordert eine ganze Menge, und die Hilfe-Dateien sind schwer zu Folgen (disjunkt, anstatt klare Anweisungen Schritt für Schritt mit einer Kopie des gesamten Skript am Ende). Kanne docs reden parallelisieren, aber nicht die Parallelisierung auf verschiedenen Computern.
- Es gibt auch eine Recht umfassende Liste von Lösungen: wiki.python.org/moin/ParallelProcessing
- Erwähnenswert ist auch, dass es eine neuere Lösung, die ähnlich ist
pathos
-- ein Paket namensdask
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, dass Sie einen Blick auf Ray, die darauf abzielt, genau das zu tun.
Ray verwendet die gleiche syntax zu parallelisieren code in der einzigen Maschine, die multicore-Einstellung, wie es in der dezentralen Einstellung. Wenn Sie bereit sind, verwenden Sie eine for-Schleife statt einer Karte nennen, dann ist dein Beispiel würde wie folgt Aussehen.
Ausgeführt werden vier Aufgaben parallel über wie viele Kerne Sie haben lokal. Zum ausführen der gleichen Beispiel auf einem cluster, die einzige Linie, die ändern würde, wäre der Aufruf
ray.init()
. Die entsprechende Dokumentation finden hier.Beachten Sie, dass ich einen Beitrag zur Entwicklung Ray.
Wenn Sie möchten, eine einfache Lösung gibt es nicht.
Allerdings gibt es eine Lösung, die die
multiprocessing
Schnittstelle --pathos
-- hat die Fähigkeit, um verbindungen zu remote-Servern über eine parallel-Karte, und multiprocessing.Wenn Sie möchten, um eine ssh-Getunnelte Verbindung, die Sie tun können, dass... " oder, wenn Sie sind ok mit einer weniger sicheren Methode können Sie das auch tun.
Oder, statt Sie konfigurieren können für eine direkte Verbindung (kein ssh)
Es ist alles ein bisschen pingelig, für die remote-server zu arbeiten, müssen Sie starten Sie einen server läuft auf
remote.computer.com
am angegebenen port, Voraus-und Sie haben zu stellen Sie sicher, dass die Einstellungen auf deinem localhost und dem remote-host zu, dass entweder die direkte Verbindung oder die ssh-Getunnelte Verbindung. Plus, Sie müssen die gleiche version vonpathos
und derpathos
Gabelpp
auf jedem host laufen. Auch für ssh, müssen Sie einen ssh-agent laufen zu allow password-less login mit ssh.Aber dann, hoffentlich funktioniert es... wenn Ihr die Funktion code transportiert werden können, kann über die remote-host mit
dill.source.importable
.FYI,
pathos
ist überfällig, eine Veröffentlichung, und im Grunde, es gibt ein paar bugs und interface-änderungen, die gelöst werden müssen, bevor eine neue stabile Version ist geschnitten.pathos
Autor.tunnel
Objekt wird nie wieder benutzt undremote.computer.com
ist nicht enthalten in der next pool, die Sie erstellen. Es wird in der "statt, die Sie konfigurieren können für eine direkte Verbindung (kein ssh)" aber ich verstehe wirklich nicht, wie das funktioniert, denn ohne SSH wie kann ich die Authentifizierung gegenüber dem server?pp
zu sprechen, um die remote-server müssen Sie eineppserver
läuft auf dem remote-host. Wenn Sie etwas anderes (zmq, ...), dann benötigen Sie einen server dieser Art zu laufen. Pathos hat einige code, können Sie einen server für Sie auf einem remote-host, aber es ist nicht völlig robust, dass Sie brauchen, um zu speichern Sie die jobid Referenz, es herunterzufahren, oder sonst müssen Sie sich dort einloggen und herausfinden, welche Laufenden job ist Ihr server. Sie können dies aus der Ferne mit pathos, aber es ist nicht wirklich etwas ein, Sie würden wollen, um in zu erhalten, wenn Sie sich nicht wohlfühlen töten unix-Prozesse.__repr__
des Tunnels... es zeigt den Befehl, derpathos
ist mit unter der Decke. Mit, dass, können Sie die SSH-docs, um zu sehen, was der Befehl tut.Ein wenig spät zur party hier, aber da war ich auch auf der Suche für eine ähnliche Lösung, und diese Frage noch nicht als beantwortet markiert, ich dachte, ich würde tragen meine Erkenntnisse.
Landete ich mit SCOOP. Es bietet eine parallele map-Implementierung, die können die Arbeit auf mehrere Kerne, über mehrere hosts hinweg. Es können auch wieder zurückgehen, um Python-serial
map
- Funktion, wenn gewünscht, während der Anrufung.Vom SCOOP-Einführung Seite, es führt die folgenden Funktionen:
Es hat einige Macken (Funktionen/Klassen müssen pickleable), und das setup, um die Dinge reibungslos laufen über mehrere hosts hinweg mühsam sein kann, wenn Sie nicht alle teilen die gleichen filesystem-schema, aber insgesamt bin ich Recht zufrieden mit den Ergebnissen. Für unsere Zwecke tut ziemlich viel von Numpy & Cython, es bietet eine hervorragende performance.
Hoffe, das hilft.
SCOOP
ist weniger fähig, aber besser unterstützt als Paketpathos
... aber dennoch ist es keine schlechte Wahl. Soweit ich weiß,pathos
undSCOOP
sind nur zwei solcher Pakete, hierarchische parallele/verteilte Karten.pathos
oderSCOOP
. Es bietet Parallelität auf viele verschiedene backends, jedoch glaube ich nicht, es bietet hierarchisch parallel, wiepathos
undSCOOP
tun.map
,pipe
etc Art der Konstrukte, die in standard-python.... und Sie müssen nicht ändern Sie Ihren code wirklich auf allen zu gehen, um verteilte/parallele.pathos
ist wohl der einfachste in diesem Zusammenhang, wie das ist, wie es entworfen war, um zu arbeiten.SCOOP
hat eine ähnliche Philosophie, aber erfordert etwas mehr Aufwand für die parallele Programmiermodelle. Im wesentlichen, sowohl Sie als auchpathos
betreiben, auf die Idee der Einrichtung und Durchführung eines AST. Diepathos
' API ist nahezu identisch mit dermultiprocessing
--- aber funktioniert für beliebige backends.from scoop import futures
) und das andere ersetzen von Python ' s built-in serielle Karte mit SCOOP-Karte (futures.map(func,arraydata)
). Könnte nicht einfacher sein.SCOOP
, und es ist nicht immer so einfach, wie die beiden obigen Zeilen. Das ist das, was ein "Programmiermodell" macht, es macht Parallelität transparent. Was ich damit sagen will ist, dasspathos
hat die gleichen zwei line-Philosophie, aberpathos
hat mehr Fälle, die es behandeln kann, wo es wirklich funktioniert in zwei Zeilen... wo Sie nicht haben, ändern Sie Ihren code auf alle von serial-nur import-und überlastung dermap
ich bin froh, dass Sie hatte eine gute Erfahrung mitSCOOP
. Es ist ein gutes Paket. Wenn ich hätte, etwas zu verwenden, abgesehen vonpathos
, das ist, was würde ich wählen.Haben Sie sah disco?
Features:
Einem einfachen Beispiel aus der disco in der Dokumentation: