Langsame Performance mit Apache Spark Gradient Boosted Tree Trainingsläufen

9

Ich experimentiere mit Gradienten Boosted Trees Lernalgorithmus aus der ML-Bibliothek von Spark 1.4. Ich löse ein binäres Klassifizierungsproblem, bei dem meine Eingabe ~ 50.000 Samples und ~ 500.000 Features ist. Mein Ziel ist es, die Definition des resultierenden GBT-Ensembles in einem für Menschen lesbaren Format auszugeben. Meine bisherige Erfahrung ist, dass für mein Problem das Hinzufügen von mehr Ressourcen zu dem Cluster keinen Einfluss auf die Länge des Laufs hat. Ein 10-Iterations-Trainingslauf dauert ungefähr 13 Stunden. Dies ist nicht akzeptabel, da ich versuche, 100-300 Iterationen durchzuführen, und die Ausführungszeit scheint mit der Anzahl der Iterationen zu explodieren.

Meine Spark-Anwendung

Dies ist nicht der genaue Code, aber er kann reduziert werden auf:

%Vor%

Frage

Was ist der Leistungsengpass bei meiner Spark-Anwendung (oder mit dem GBT-Lernalgorithmus selbst) bei der Eingabe dieser Größe und wie kann ich eine größere Ausführungsparallelität erzielen?

Ich bin immer noch ein Novize-Spark-Entwickler, und ich würde mich über Tipps zur Clusterkonfiguration und Profilerstellung freuen.

Weitere Details zum Cluster-Setup

Ich verwende diese App auf einem AWS EMR-Cluster (emr-4.0.0, YARN-Cluster-Modus) von r3.8xlarge-Instanzen (32 Kerne, jeweils 244 GB RAM). Ich verwende so große Instanzen, um die Flexibilität der Ressourcenzuweisung zu maximieren. Bis jetzt habe ich versucht, 1-3 r3.8xlarge-Instanzen mit einer Vielzahl von Ressourcenzuordnungsschemata zwischen dem Fahrer und den Arbeitern zu verwenden. Für einen Cluster von 1 x 3.8x großen Instanzen sende ich die App beispielsweise wie folgt:

%Vor%

Für einen Cluster von 3 r3.8xlarge Instanzen optimiere ich die Ressourcenzuweisung:

%Vor%

Ich habe keine klare Vorstellung davon, wie viel Speicher jedem Executor nützlich ist, aber ich fühle, dass ich in beiden Fällen großzügig bin. Wenn ich durch die Spark UI schaue, sehe ich keine Aufgabe mit einer Eingabegröße von mehr als ein paar GB. Ich bin auf der sicheren Seite, wenn ich dem Treiber so viel Speicher zur Verfügung stelle, um sicherzustellen, dass er keine Zwischenspeicherung für Zwischenergebnis-Aggregationsoperationen benötigt.

Ich versuche, die Anzahl der Kerne pro Executor gemäß den Vorschlägen in sollte bereits gut darauf abgestimmt sein. Mein eigener Code, der das GBT-Modell auf S3 ausgibt, sollte eine kurze Zeit in Anspruch nehmen.

    
Vlad Kutsenko 21.09.2015, 19:22
quelle

0 Antworten