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.
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.
Tags und Links r parallel-processing cluster-computing