So verbessern Sie die Geschwindigkeit bei der parallelen Clusterverarbeitung

8

Ich bin neu in der Clusterverarbeitung und könnte einige Ratschläge dazu verwenden, wie Daten und / oder Aufrufe von Funktionen besser aus dem Paket parallel vorbereitet werden können. Ich habe durch die parallels Paket Vignetten gelesen, also habe eine vage Idee, was los ist.

Die Funktion, die ich parallelisieren möchte, ruft das 2D-Interpolationswerkzeug akima::interp auf. Meine Eingabe besteht aus 3 Matrizen (oder Vektoren - alle gleich in R ): eins enthält die x-Koordinaten, eins die y-Koordinaten und eins das "z", oder Datenwerte, für eine Menge von Abtastpunkten . interp verwendet dies, um interpolierte Daten in einem regelmäßigen Raster zu erzeugen, so dass ich beispielsweise das Feld grafisch darstellen kann. Sobald ich diese 3 Elemente eingerichtet habe, schneide ich sie in "Chunks" und führe sie zu clusterApply , um interp Chunk für Chunk auszuführen.

Ich verwende eine Windows7, i7 CPU (8-Core) Maschine. Hier ist die Zusammenfassung von Rprof für einen Eingabedatensatz mit 1e6 Punkten (1000x1000, wenn Sie möchten) und auf ein 1000x1000 Ausgabegitter abgebildet.

Also meine Fragen sind: 1) Es scheint, dass "unserialize" die meiste Zeit dauert. Was ist diese Operation und wie könnte sie reduziert werden? 2) Im Allgemeinen, da jeder Arbeiter die Standard-Datei .Rdata lädt, gibt es irgendeine Geschwindigkeit, wenn ich zuerst alle Eingabedaten in .Rdata speichere, damit sie nicht an die Arbeiter weitergegeben werden müssen? 3) Gibt es noch etwas, von dem ich einfach nicht weiß, dass ich anders hätte machen sollen?

Hinweis: Die sin, atan2, cos, +, max, min -Funktionen finden vor dem Aufruf von clusterApply statt.

%Vor%     
Carl Witthoft 15.10.2013, 12:13
quelle

1 Antwort

9

Wenn clusterApply aufgerufen wird, sendet es zuerst eine Aufgabe an jeden der Cluster-Arbeiter und wartet dann, bis jeder von ihnen das entsprechende Ergebnis zurückgibt. Wenn weitere Aufgaben zu erledigen sind, wird diese Prozedur wiederholt, bis alle Aufgaben abgeschlossen sind.

Die Funktion, die verwendet wird, um auf ein Ergebnis von einem bestimmten Worker zu warten, ist recvResult , das schließlich unserialize aufruft, um Daten aus dem Socket zu lesen, der mit diesem Worker verbunden ist. Wenn also der Master-Prozess die meiste Zeit in unserialize verbringt, wartet er die meiste Zeit darauf, dass die Cluster-Mitarbeiter die Aufgabenergebnisse zurückgeben, was Sie auf dem Master erwarten würden. Wenn es viel Zeit in serialize verbringen würde, würde das bedeuten, dass es viel Zeit damit verschwendet hätte, die Aufgaben an die Arbeiter zu senden, was ein schlechtes Zeichen wäre.

Leider können Sie nicht sagen, wie viel Zeit unserialize für das Blockieren, Warten auf das Eintreffen der Ergebnisdaten und wie viel Zeit es tatsächlich für die Übertragung dieser Daten aufwendet. Die Ergebnisse können leicht von den Arbeitern berechnet werden und sehr groß sein, oder sie können lange dauern, um zu berechnen und winzig zu sein: Es gibt keine Möglichkeit, aus den Profilerstellungsdaten zu erfahren.

Damit unserialize schneller ausgeführt wird, müssen Sie die Worker dazu bringen, ihre Ergebnisse schneller zu berechnen, oder die Ergebnisse, falls möglich, kleiner machen. Außerdem könnte es hilfreich sein, die Option makeCluster useXDR=FALSE zu verwenden. Es könnte Ihre Leistung verbessern, indem Sie XDR nicht verwenden, um Ihre Daten zu codieren, wodurch sowohl serialize als auch unserialize schneller werden.

Ich denke nicht, dass es helfen wird, alle Eingabedaten in .Rdata zu speichern, da Sie nicht viel Zeit damit verbringen, Daten an die Worker zu senden, wie die kurze Zeit in der Funktion serialize zeigt. Ich vermute, das würde dich ein wenig verlangsamen.

Der einzige andere Rat, den ich mir vorstellen kann, ist, dass Sie parLapply oder clusterApplyLB anstelle von clusterApply verwenden. Ich empfehle, parLapply zu verwenden, es sei denn, Sie haben einen bestimmten Grund, eine der anderen Funktionen zu verwenden, da parLapply oft am effizientesten ist. clusterApplyLB ist nützlich, wenn Sie Aufgaben haben, die eine lange, aber variable Zeit zur Ausführung benötigen.

    
Steve Weston 15.10.2013, 14:13
quelle