Frage

Wenn ich an den oft als "mittleren Daten" -Projekte bezeichneten Projekten arbeitete, konnte ich meinen Code (hauptsächlich für die Modellierung und Vorhersage in Python) in einem einzigen System über 4 bis 32 Kerne parallelisieren. Jetzt möchte ich mich zu Clustern auf EC2 (wahrscheinlich mit StarCluster/Ipython, aber auch für andere Vorschläge) anschließen, und wurden verwirrt, wie man die Verteilungsarbeiten über Kerne in einer Instanz gegen Instanzen auf einem Cluster in Einklang bringt.

Ist es sogar praktisch, in jeder Instanz sowohl Instanzen als auch über Kerne parallel zu sein? Wenn ja, kann jemand einen kurzen Überblick über die Profis + -Kons geben, wenn viele Fälle mit wenigen Kernen jeweils ein paar Fälle mit vielen Kernen ausgeführt werden? Gibt es eine Faustregel für die Auswahl des richtigen Verhältnisses von Instanzen zu Kernen pro Instanz?

Bandbreite und RAM sind nicht triviale Bedenken in meinen Projekten, aber es ist leicht zu erkennen, wenn dies die Engpässe und die Neueinstellungen sind. Es ist viel schwieriger, die richtige Mischung aus Kernen für Instanzen ohne wiederholte Tests zu bewerten, und meine Projekte variieren zu sehr, damit jeder einzelne Test auf alle Umstände angewendet wird. Vielen Dank im Voraus, und wenn ich es einfach nicht richtig googeln habe, zögern Sie nicht, mich an die richtige Antwort zu verweisen!

War es hilfreich?

Lösung

Bei der Verwendung von Ipython müssen Sie sich fast keine Sorgen machen (auf Kosten eines gewissen Verlusts an Effizienz/größerer Kommunikationsaufwand). Das parallele IPython -Plugin in StarCluster startet standardmäßig einen Engine pro physischem Kern auf jedem Knoten (ich glaube, dies ist konfigurierbar, aber nicht sicher, wo). Sie führen einfach alles aus, was Sie über alle Motoren über die DirectView -API (MAP_SYNC, apply_sync, ...) oder die %PX Magic -Befehle übertragen möchten. Wenn Sie Ipython bereits parallel auf einem Computer verwenden, ist es nicht anders, wenn Sie es auf einem Cluster verwenden.

Einige Ihrer spezifischen Fragen angehen:

"Wie man die Verteilungsarbeit über Kerne in einem Instanz gegen Instanzen eines Clusters in Einklang bringt" - Sie erhalten (zumindest) einen Motor pro Kern; Die Arbeiten werden automatisch über alle Kerne und alle Fälle hinweg verteilt.

"Ist es sogar praktisch, in jeder Instanz sowohl über Instanzen als auch über Kerne hinweg parallel zu sein?" - Ja :) Wenn der Code, den Sie ausführen, peinlich parallel ist (genau das gleiche Algo für mehrere Datensätze), können Sie meistens ignorieren, wo eine bestimmte Engine ausgeführt wird. Wenn der Kern viel Kommunikation zwischen Motoren erfordert, müssen Sie ihn natürlich strukturieren, damit Motoren hauptsächlich mit anderen Motoren auf derselben physischen Maschine kommunizieren. Aber diese Art von Problem ist nicht ideal für Ipython geeignet, denke ich.

"Wenn ja, kann jemand einen kurzen Überblick über die Profis + -Kons geben, wenn viele Fälle mit wenigen Kernen jeweils ein paar Fälle mit vielen Kernen ausgeführt werden? Gibt es eine Faustregel für die Auswahl des richtigen Verhältnisses von Instanzen zu Kernen pro Instanz? " -Verwenden Sie die größten C3-Instanzen für rechengebundene und die kleinsten für Probleme mit der Speicherbänder. Verwenden Sie für Probleme mit Nachrichtenübergängen auch die größten Instanzen, aber versuchen Sie, das Problem zu partitionieren, damit jede Partition auf einer physischen Maschine ausgeführt wird und die meisten Nachrichtenübergaben innerhalb derselben Partition liegen. Probleme, die bei N -Vierfach -C3 -Instanzen erheblich langsamer werden würden als bei 2n Double C3 sind selten (ein künstliches Beispiel besteht darin Gleiches Bild). Die Verwendung größter Instanzen ist eine gute Faustregel.

Andere Tipps

Eine allgemeine Faustregel ist, sich erst zu verteilen, wenn Sie müssen. Es ist normalerweise effizienter, N -Server mit einer bestimmten Kapazität zu haben als 2n -Server mit der Hälfte dieser Kapazität. Mehr des Datenzugriffs ist lokal und daher schnell im Speicher im Netzwerk im Netzwerk.

Zu einem bestimmten Zeitpunkt wird die Skalierung einer Maschine unwirtschaftlich, da die Kosten für zusätzliche Ressourcen mehr als linear skaliert werden. Dieser Punkt ist jedoch immer noch erstaunlich hoch.

Insbesondere bei Amazon kann die Ökonomie jedes Instanztyps jedoch sehr unterschiedlich sein, wenn Sie Spot -Marktinstanzen verwenden. Die Standardpreise mehr oder weniger bedeutet, dass die gleiche Menge an Ressourcen ungefähr gleich kostet, unabhängig vom Instanztyp, der sehr unterschiedlich ist. Große Instanzen können billiger sein als kleine, oder n kleine Instanzen können viel billiger sein als eine große Maschine mit äquivalenten Ressourcen.

Eine massive Überlegung ist hier, dass sich das Berechnungsparadigma beim Wechsel von einer Maschine zu mehreren Maschinen stark ändern kann. Die Kompromisse, die der Kommunikationsaufwand hervorruft, können Sie beispielsweise ein datenparalleles Paradigma zum Maßstab verfolgen. Das bedeutet eine andere Auswahl an Werkzeugen und Algorithmus. Zum Beispiel sieht SGD in Memory und in Python ganz anders aus als auf MapReduce. Sie müssten dies also vor der Parallelisierung berücksichtigen.

Sie können sich dafür entscheiden, die Arbeiten über einen Cluster zu verteilen, auch wenn ein einzelner Knoten und nicht verteilte Paradigmen für Sie für Sie funktionieren. Wenn ein einzelner Knoten fehlschlägt, verlieren Sie die gesamte Berechnung. Eine verteilte Berechnung kann möglicherweise nur den Teil der verlorenen Berechnung wiederherstellen und vervollständigen.

Alle Dinge, die als gleich betrachtet werden (Kosten, CPU -Perf usw.) Sie können die kleinste Instanz auswählen, die meinen gesamten Datensatz im Speicher halten und skalieren kann. Dieser Weg

  • Sie stellen sicher, dass Sie aufgrund von Netzwerkkommunikation keine unnötigen Latenzen induzieren und
  • Sie neigen dazu, die gesamte verfügbare Speicherbandbreite für Ihre Prozesse zu maximieren.

Angenommen, Sie führen eine Art von einer Art aus Kreuzvalidierungsschema einige zu optimieren Meta -Parameter Weisen Sie jedem Kern von Ihrem Modell einen Wert zum Testen zu und wählen Sie nach Bedarf viele Instanzen aus, um den gesamten Parameterraum in so wenigen Runden zu decken, wie Sie es für richtig halten.

Wenn Ihre Daten nicht in den Speicher eines Systems passen, müssen Sie natürlich über Instanzen verteilen. Dann geht es darum, die Gedächtnislatenz (besser mit vielen Instanzen) mit Netzwerklatenz (besser mit weniger Instanzen) auszugleichen, aber angesichts der Art von EC2 würde ich wetten, dass Sie oft lieber mit wenigen Fettinstanzen arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top