Inhaltsverzeichnis:
Video: Execute Jars and Python scripts on Azure Databricks using Data Factory | Azure Friday 2024
Die meisten Computer sind heute Multicore (zwei oder mehr Prozessoren in einem einzigen Paket), einige mit mehreren physischen CPUs. Eine der wichtigsten Einschränkungen von Python ist, dass standardmäßig ein einzelner Kern verwendet wird. (Es wurde zu einer Zeit erstellt, als einzelne Kerne die Norm waren.)
Data-Science-Projekte erfordern eine ganze Reihe von Berechnungen. Insbesondere ein Teil des wissenschaftlichen Aspekts der Datenwissenschaft beruht auf wiederholten Tests und Experimenten mit verschiedenen Datenmatrizen. Vergessen Sie nicht, dass das Arbeiten mit großen Datenmengen bedeutet, dass die meisten zeitaufwändigen Transformationen die Beobachtung nach der Beobachtung wiederholen (zum Beispiel identische und nicht verwandte Operationen an verschiedenen Teilen einer Matrix).
Die Verwendung von mehr CPU-Kernen beschleunigt eine Berechnung um einen Faktor, der fast der Anzahl der Kerne entspricht. Wenn Sie zum Beispiel vier Kerne haben, bedeutet dies, dass Sie höchstens vier Mal schneller arbeiten. Sie erhalten keine volle Vervierfachung, da beim Starten eines parallelen Prozesses ein Overhead entsteht - neue laufende Python-Instanzen müssen mit den richtigen In-Memory-Informationen eingerichtet und gestartet werden. Folglich wird die Verbesserung geringer sein als potentiell erreichbar, aber immer noch signifikant.
Das Wissen, wie man mehr als eine CPU verwendet, ist daher eine fortgeschrittene, aber unglaublich nützliche Fähigkeit, um die Anzahl der durchgeführten Analysen zu erhöhen und Ihre Operationen sowohl beim Einrichten als auch bei der Verwendung Ihrer Datenprodukte zu beschleunigen.
Multiprocessing funktioniert durch Replizieren desselben Codes und Speicherinhalts in verschiedenen neuen Python-Instanzen (den Workern), Berechnen des Ergebnisses für jedes von ihnen und Zurückgeben der gepoolten Ergebnisse an die Haupt-Originalkonsole. Wenn Ihre ursprüngliche Instanz bereits einen großen Teil des verfügbaren RAM-Speichers belegt, können keine neuen Instanzen erstellt werden, und Ihr Computer verfügt möglicherweise nicht über genügend Arbeitsspeicher.
Multicore-Parallelität ausführen
Um eine Multicore-Parallelität mit Python durchzuführen, integrieren Sie das Scikit-learn-Paket mit dem joblib-Paket für zeitaufwändige Operationen wie Replizieren von Modellen zur Validierung von Ergebnissen oder zum Suchen nach die besten Hyper-Parameter. Insbesondere ermöglicht Scikit-learn Multiprocessing, wenn
-
Cross-Validierung: Testen der Ergebnisse einer Machine-Learning-Hypothese mit verschiedenen Trainings- und Testdaten
-
Grid-Searching: Systematische Änderung der Hyper-Parameter einer maschinellen Lernhypothese und Testen der daraus resultierenden Ergebnisse
-
Multilabel-Vorhersage: Ausführen eines Algorithmus mehrere Male gegen mehrere Ziele, wenn viele verschiedene Zielergebnisse gleichzeitig vorhergesagt werden können
-
Ensemble-Maschinenlernmethoden: Modellieren eines großen Hosts von Klassifikatoren, jeder unabhängig vom anderen, z. B. bei der Verwendung von RandomForest-basierter Modellierung
Sie müssen nichts Besonderes tun, um parallele Berechnungen zu nutzen - Sie können die Parallelität aktivieren, indem Sie der Parameter n_jobs zu einer Anzahl von Kernen größer als 1 oder durch Setzen des Werts auf -1, was bedeutet, dass Sie alle verfügbaren CPU-Instanzen verwenden möchten.
Wenn Sie Ihren Code nicht von der Konsole oder einem IPython Notebook aus ausführen, ist es äußerst wichtig, dass Sie Ihren Code von jedem Paketimport oder einer globalen Variablenzuweisung in Ihrem Skript trennen, indem Sie if __name __ == '__ main__' verwenden.: Befehl am Anfang jedes Codes, der Multicore-Parallelität ausführt. Die if -Anweisung überprüft, ob das Programm direkt ausgeführt wird oder von einer bereits laufenden Python-Konsole aufgerufen wird, um Verwechslungen oder Fehler durch den multiparallelen Prozess (z. B. rekursives Aufrufen der Parallelität) zu vermeiden.
Demonstrieren von Multiprocessing
Es ist eine gute Idee, IPython zu verwenden, wenn Sie eine Demonstration ausführen, wie Multiprocessing Ihnen bei Data Science-Projekten wirklich Zeit sparen kann. Die Verwendung von IPython bietet den Vorteil, den Befehl "% timeit magic" für die zeitgesteuerte Ausführung zu verwenden. Sie beginnen mit dem Laden eines Multiclass-Datasets, eines komplexen Machine-Learning-Algorithmus (des Support Vector Classifier oder SVC) und eines Kreuzvalidierungsverfahrens zur Schätzung zuverlässiger resultierender Scores aus allen Prozeduren.
Das Wichtigste zu wissen ist, dass die Prozeduren ziemlich groß werden, weil der SVC 10 Modelle erzeugt, die er 10 mal mit Kreuzvalidierung wiederholt, für insgesamt 100 Modelle.
von sklearn. Datensätze import load_digits Ziffern = load_digits () X, y = Ziffern. Daten, Ziffern. Ziel von sklearn. svm importiert SVC aus sklearn. cross_validation import cross_val_score% timeit single_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = 1) Out [1]: 1 Schleifen, bestes von 3: 17. 9 s pro Schleife
Nach diesem Test Sie müssen die Multicore-Parallelität aktivieren und die Ergebnisse mit den folgenden Befehlen einstufen:
% timeit multi_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = -1) Out [2]: 1 Schleifen, best of 3: 11. 7 s pro Schleife
Die Beispielmaschine demonstriert einen positiven Vorteil bei der Multicore-Verarbeitung, obwohl ein kleines Dataset verwendet wird, in dem Python die meiste Zeit damit verbringt, Konsolen zu starten und einen Teil des Codes in jedem auszuführen. Dieser Overhead, einige Sekunden, ist immer noch signifikant, wenn man bedenkt, dass sich die Gesamtausführung für eine Handvoll von Sekunden erstreckt. Stellen Sie sich vor, was passieren würde, wenn Sie mit größeren Datenmengen arbeiten würden - Ihre Ausführungszeit könnte leicht um zwei- oder dreimal verkürzt werden.
Obwohl der Code gut mit IPython funktioniert, kann es in einem Skript abgelegt werden und Python dazu auffordern, es in einer Konsole auszuführen oder eine IDE zu verwenden, da dies aufgrund der internen Operationen einer Multicore-Task zu Fehlern führen kann. Die Lösung besteht darin, den gesamten Code unter eine if-Anweisung zu stellen, die prüft, ob das Programm direkt gestartet wurde und danach nicht aufgerufen wurde. Hier ist ein Beispielskript:
von sklearn. Datensätze importieren load_digits aus sklearn. svm importiert SVC aus sklearn. cross_validation import cross_val_score wenn __name__ == '__main__': Ziffern = load_digits () X, y = Ziffern. Daten, Ziffern. Ziel multi_core_learning = Cross_val_score (SVC (), X, y, cv = 20, n_jobs = -1)