webentwicklung-frage-antwort-db.com.de

Verwenden des Multiprocessing-Moduls für das Cluster-Computing

Ich bin daran interessiert, ein Python-Programm mit einem Computer-Cluster auszuführen. Ich habe in der Vergangenheit Python MPI - Schnittstellen verwendet, aber aufgrund von Schwierigkeiten beim Kompilieren/Installieren dieser würde ich Lösungen bevorzugen, die integrierte Module verwenden, wie das Python-Modul multiprocessing .

Was ich wirklich gerne machen würde, ist einfach eine multiprocessing.Pool-Instanz einzurichten, die sich über den gesamten Computer-Cluster erstreckt, und eine Pool.map(...) ausführen. Ist das etwas, das möglich/leicht zu machen ist?

Wenn dies nicht möglich ist, möchte ich zumindest Process-Instanzen auf einem der Knoten von einem zentralen Skript aus mit unterschiedlichen Parametern für jeden Knoten starten können.

48
astrofrog

Wenn Sie unter Cluster-Computing verteilte Speichersysteme (mehrere Knoten statt SMP) verstehen, ist die Multiprozessierung von Python möglicherweise keine geeignete Wahl. Es können mehrere Prozesse erzeugt werden, die jedoch immer noch an einen einzelnen Knoten gebunden sind.

Sie benötigen ein Framework, das das Spawing von Prozessen über mehrere Knoten hinweg übernimmt und einen Mechanismus für die Kommunikation zwischen den Prozessoren bietet. (ziemlich genau das, was MPI macht).

Auf der Seite Parallel Processing im Python-Wiki finden Sie eine Liste von Frameworks, die beim Cluster-Computing hilfreich sind. 

Aus der Liste sehen pp , jug , pyro und cellery sinnvolle Optionen aus, obwohl ich für keine davon persönlich verbürgen kann, Ich verwende hauptsächlich MPI).

Wenn eine einfache Installation/Verwendung wichtig ist, würde ich zunächst jug erkunden. Es ist easy zu installieren , unterstützt gängige Batch-Cluster-Systeme und sieht gut dokumentiert aus.

43
Shawn Chin

In der Vergangenheit habe ich Pyro verwendet, um dies recht erfolgreich zu machen. Wenn Sie mobilen Code aktivieren, werden die erforderlichen Module, die die Knoten noch nicht haben, automatisch über das Kabel gesendet. Ziemlich schick.

13
chmullig

Ich habe Glück mit SCOOP als Alternative zu Multiprocessing für die Verwendung mit einem oder mehreren Computern und profitiere von der Jobübergabe für Cluster sowie vielen anderen Funktionen wie verschachtelten Karten und minimalen Codeänderungen, um mit Map arbeiten zu können ().

Die source ist auf Github verfügbar. Ein schnelles Beispiel zeigt, wie einfach die Implementierung sein kann! 

1
DMTishler

Wenn Sie bereit sind, ein Open-Source-Paket per Pip-Installation zu installieren, sollten Sie Ray in Betracht ziehen, wobei die Option aus dem Python-Cluster-Framework wahrscheinlich die Option ist, die der Python-Erfahrung mit einem einzelnen Thread am nächsten kommt. Sie können sowohl Funktionen (als Aufgaben) als auch Stateful-Klassen (als Akteure) parallelisieren und führt den gesamten Datenversand und die Serialisierung sowie die Weitergabe von Ausnahmenachrichten automatisch aus. Es ermöglicht auch eine ähnliche Flexibilität wie normales Python (Akteure können herumgereicht werden, Aufgaben können andere Aufgaben aufrufen, es können willkürliche Datenabhängigkeiten usw. sein). Mehr dazu in der Dokumentation .

So würden Sie beispielsweise Ihr Beispiel für eine Multiprocessing-Karte in Ray ausführen:

import ray
ray.init()

@ray.remote
def mapping_function(input):
    return input + 1

results = ray.get([mapping_function.remote(i) for i in range(100)])

Die API unterscheidet sich ein wenig von Pythons Multiprocessing-API, sollte jedoch einfacher zu verwenden sein. Es gibt ein begehbares Tutorial , das beschreibt, wie mit Datenabhängigkeiten und Akteuren umgegangen wird.

Sie können Ray mit "pip install ray" installieren und dann den obigen Code auf einem einzelnen Knoten ausführen. Sie können auch einen Cluster einrichten. Weitere Informationen finden Sie unter Cloud-Unterstützung und Cluster-Unterstützung

Haftungsausschluss: Ich bin einer der Ray-Entwickler.

0
Philipp Moritz