6 Python-Bibliotheken für die Parallelverarbeitung

Python setzt auf Bequemlichkeit und Programmiererfreundlichkeit, ist jedoch nicht die schnellste Programmiersprache. Einige seiner Geschwindigkeitsbeschränkungen sind darauf zurückzuführen, dass die Standardimplementierung cPython Single-Threaded ist. Das heißt, cPython verwendet nicht mehr als einen Hardware-Thread gleichzeitig.

Und während Sie threadingdas in Python integrierte Modul verwenden können, um die Dinge zu beschleunigen, erhalten Sie threadingnur Parallelität , keine Parallelität . Es eignet sich gut zum Ausführen mehrerer Aufgaben, die nicht CPU-abhängig sind, beschleunigt jedoch nicht mehrere Aufgaben, für die jeweils eine vollständige CPU erforderlich ist. 

Python enthält eine native Methode zum Ausführen einer Python-Workload auf mehreren CPUs. Das multiprocessingModul startet mehrere Kopien des Python-Interpreters, jede auf einem separaten Kern, und bietet Grundelemente für die Aufteilung von Aufgaben auf mehrere Kerne. Aber manchmal reicht es sogar  multiprocessing nicht.

Manchmal erfordert der Job die Verteilung der Arbeit nicht nur auf mehrere Kerne , sondern auch auf mehrere Computer . Hier kommen diese sechs Python-Bibliotheken und Frameworks ins Spiel. Mit allen sechs folgenden Python-Toolkits können Sie eine vorhandene Python-Anwendung verwenden und die Arbeit auf mehrere Kerne, mehrere Computer oder beide verteilen.

Strahl

Ray wurde von einem Forscherteam der University of California in Berkeley entwickelt und unterstützt eine Reihe verteilter Bibliotheken für maschinelles Lernen. Ray beschränkt sich jedoch nicht nur auf maschinelle Lernaufgaben, auch wenn dies der ursprüngliche Anwendungsfall war. Alle Python-Aufgaben können mit Ray aufgeteilt und systemübergreifend verteilt werden.

Die Syntax von Ray ist minimal, sodass Sie vorhandene Apps nicht umfassend überarbeiten müssen, um sie zu parallelisieren. Der @ray.remoteDecorator verteilt diese Funktion auf alle verfügbaren Knoten in einem Ray-Cluster mit optional angegebenen Parametern für die Anzahl der zu verwendenden CPUs oder GPUs. Die Ergebnisse jeder verteilten Funktion werden als Python-Objekte zurückgegeben, sodass sie einfach zu verwalten und zu speichern sind und der Kopieraufwand über oder innerhalb von Knoten auf ein Minimum beschränkt wird. Diese letzte Funktion ist beispielsweise beim Umgang mit NumPy-Arrays nützlich.

Ray enthält sogar einen eigenen integrierten Cluster-Manager, mit dem Knoten bei Bedarf automatisch auf lokaler Hardware oder gängigen Cloud-Computing-Plattformen hochgefahren werden können.

Zugehöriges Video: Verwenden multiprocessing, um Python zu beschleunigen

Dask

Von außen sieht Dask Ray sehr ähnlich. Es ist auch eine Bibliothek für verteiltes paralleles Rechnen in Python mit einem eigenen Taskplanungssystem, Kenntnis von Python-Datenframeworks wie NumPy und der Möglichkeit, von einem Computer auf mehrere zu skalieren.

Dask arbeitet auf zwei grundlegende Arten. Die erste Möglichkeit besteht in parallelisierten Datenstrukturen - im Wesentlichen in Dasks eigenen Versionen von NumPy-Arrays, Listen oder Pandas DataFrames. Tauschen Sie die Dask-Versionen dieser Konstruktionen gegen ihre Standardeinstellungen aus, und Dask verteilt ihre Ausführung automatisch auf Ihren Cluster. Dies beinhaltet normalerweise nur das Ändern des Namens eines Imports, erfordert jedoch manchmal ein Umschreiben, um vollständig zu funktionieren.

Der zweite Weg führt über die Low-Level-Parallelisierungsmechanismen von Dask, einschließlich Funktionsdekoratoren, die Jobs über Knoten verteilen und Ergebnisse synchron ("Sofort" -Modus) oder asynchron ("Faul") zurückgeben. Beide Modi können auch nach Bedarf gemischt werden.

Ein wesentlicher Unterschied zwischen Dask und Ray ist der Planungsmechanismus. Dask verwendet einen zentralen Scheduler, der alle Aufgaben für einen Cluster erledigt. Ray ist dezentralisiert, dh jeder Computer führt einen eigenen Scheduler aus, sodass Probleme mit einer geplanten Aufgabe auf der Ebene des einzelnen Computers und nicht des gesamten Clusters behandelt werden.

Dask bietet auch eine erweiterte und noch experimentelle Funktion namens "Schauspieler". Ein Akteur ist ein Objekt, das auf einen Job auf einem anderen Dask-Knoten verweist. Auf diese Weise kann ein Job, der viel lokalen Status erfordert, direkt ausgeführt und von anderen Knoten remote aufgerufen werden, sodass der Status für den Job nicht repliziert werden muss. Ray fehlt so etwas wie Dasks Schauspielermodell, um eine anspruchsvollere Jobverteilung zu unterstützen.

Dispy

Mit Dispy können Sie ganze Python-Programme oder nur einzelne Funktionen zur parallelen Ausführung auf mehrere Computer verteilen. Es verwendet plattformeigene Mechanismen für die Netzwerkkommunikation, um die Dinge schnell und effizient zu halten, sodass Linux-, MacOS- und Windows-Computer gleich gut funktionieren.

Die Dispy-Syntax ähnelt etwas multiprocessing darin, dass Sie explizit einen Cluster erstellen (wo multiprocessingSie einen Prozesspool erstellen würden), Arbeit an den Cluster senden und dann die Ergebnisse abrufen. Möglicherweise ist etwas mehr Arbeit erforderlich, um Jobs für die Arbeit mit Dispy zu ändern. Sie können jedoch auch genau steuern, wie diese Jobs versendet und zurückgegeben werden. Beispielsweise können Sie vorläufige oder teilweise abgeschlossene Ergebnisse zurückgeben, Dateien im Rahmen des Jobverteilungsprozesses übertragen und beim Übertragen von Daten die SSL-Verschlüsselung verwenden.

Pandaral·lel

Pandaral·lel ist, wie der Name schon sagt, eine Möglichkeit, Pandas-Jobs über mehrere Knoten hinweg zu parallelisieren. Der Nachteil ist, dass Pandaral·lel nur  mit Pandas funktioniert . Wenn Sie jedoch Pandas verwenden und nur eine Möglichkeit benötigen, Pandas-Jobs über mehrere Kerne auf einem einzigen Computer zu beschleunigen, konzentriert sich Pandaral·lel auf die Aufgabe.

Beachten Sie, dass Pandaral·lel zwar unter Windows ausgeführt wird, jedoch nur in Python-Sitzungen, die im Windows-Subsystem für Linux gestartet wurden. MacOS- und Linux-Benutzer können Pandaral·lel unverändert ausführen. 

Ipyparallel

Ipyparallel ist ein weiteres eng fokussiertes Multiprozessor- und Aufgabenverteilungssystem, das speziell für die Parallelisierung der Ausführung von Jupyter-Notebook-Code in einem Cluster entwickelt wurde. Projekte und Teams, die bereits in Jupyter arbeiten, können Ipyparallel sofort verwenden.

Ipyparallel unterstützt viele Ansätze zur Parallelisierung von Code. Am einfachen Ende gibt es map, das jede Funktion auf eine Sequenz anwendet und die Arbeit gleichmäßig auf verfügbare Knoten aufteilt. Für komplexere Arbeiten können Sie bestimmte Funktionen so dekorieren, dass sie immer remote oder parallel ausgeführt werden.

Jupyter-Notizbücher unterstützen „magische Befehle“ für Aktionen, die nur in einer Notizbuchumgebung möglich sind. Ipyparallel fügt einige eigene magische Befehle hinzu. Sie können beispielsweise jeder Python-Anweisung ein Präfix voranstellen, %pxum sie automatisch zu parallelisieren.

Joblib

Joblib hat zwei Hauptziele: Jobs parallel ausführen und Ergebnisse nicht neu berechnen, wenn sich nichts geändert hat. Aufgrund dieser Effizienz eignet sich Joblib gut für das wissenschaftliche Rechnen, bei dem reproduzierbare Ergebnisse unantastbar sind. Die Dokumentation von Joblib enthält zahlreiche Beispiele für die Verwendung aller Funktionen.

Die Joblib-Syntax zum Parallelisieren von Arbeiten ist einfach genug - es handelt sich um einen Dekorator, mit dem Jobs auf Prozessoren aufgeteilt oder Ergebnisse zwischengespeichert werden können. Parallele Jobs können Threads oder Prozesse verwenden.

Joblib enthält einen transparenten Festplatten-Cache für Python-Objekte, die durch Rechenjobs erstellt wurden. Dieser Cache hilft Joblib nicht nur dabei, wiederholte Arbeiten zu vermeiden, wie oben erwähnt, sondern kann auch verwendet werden, um Jobs mit langer Laufzeit anzuhalten und fortzusetzen oder dort fortzufahren, wo ein Job nach einem Absturz aufgehört hat. Der Cache ist auch intelligent für große Objekte wie NumPy-Arrays optimiert. Datenbereiche können mithilfe von im Speicher zwischen Prozessen auf demselben System gemeinsam genutzt werden numpy.memmap.

Eine Sache, die Joblib nicht bietet, ist die Möglichkeit, Jobs auf mehrere separate Computer zu verteilen. Theoretisch ist es möglich, die Joblib-Pipeline zu verwenden, aber es ist wahrscheinlich einfacher, ein anderes Framework zu verwenden, das dies nativ unterstützt. 

Lesen Sie mehr über Python

  • Was ist Python? Leistungsstarke, intuitive Programmierung
  • Was ist PyPy? Schnelleres Python ohne Schmerzen
  • Was ist Cython? Python mit der Geschwindigkeit von C.
  • Cython-Tutorial: So beschleunigen Sie Python
  • So installieren Sie Python auf intelligente Weise
  • Die besten neuen Funktionen in Python 3.8
  • Besseres Python-Projektmanagement mit Poetry
  • Virtualenv und venv: Erklärte virtuelle Python-Umgebungen
  • Python virtualenv und venv tun und nicht tun
  • Python-Threading und Unterprozesse erklärt
  • Verwendung des Python-Debuggers
  • Verwendung von timeit zum Profilieren von Python-Code
  • Verwendung von cProfile zum Profilieren von Python-Code
  • Beginnen Sie mit Async in Python
  • So verwenden Sie Asyncio in Python
  • So konvertieren Sie Python in JavaScript (und wieder zurück)
  • Python 2 EOL: Wie man das Ende von Python 2 überlebt
  • 12 Pythons für jeden Programmierbedarf
  • 24 Python-Bibliotheken für jeden Python-Entwickler
  • 7 süße Python-IDEs, die Sie vielleicht verpasst haben
  • 3 Hauptmängel von Python - und ihre Lösungen
  • 13 Python-Webframeworks verglichen
  • 4 Python-Test-Frameworks, um Ihre Fehler zu beseitigen
  • 6 großartige neue Python-Funktionen, die Sie nicht missen möchten
  • 5 Python-Distributionen zur Beherrschung des maschinellen Lernens
  • 8 großartige Python-Bibliotheken für die Verarbeitung natürlicher Sprache