Parallele E / A-Optionen, insbesondere paralleles HDF5

20

Ich habe eine Anwendung, die trivial parallelisiert werden kann, deren Leistung jedoch weitgehend E / A-gebunden ist. Die Anwendung liest ein einzelnes Eingabearray, das in einer Datei gespeichert ist, die normalerweise 2 bis 5 GB groß ist (ich erwarte jedoch, dass diese Zahl in Zukunft zunimmt). Eine typische Berechnung wendet dieselbe Operation auf jede Zeile oder Spalte dieses Arrays an. Bei rechenintensiven Vorgängen ist die Skalierung auf ca. 100 Prozessoren sehr gut, bei langsameren Vorgängen dominieren E / A und die damit verbundene Kommunikation (NFS-Zugriff) und ich kann nicht mehr als einige Prozessoren effizient einsetzen.

Was sind effiziente und tragbare (idealerweise tragbare) Optionen für eine solche Situation? Paralleles HDF5 scheint vielversprechend. Hat jemand echte Erfahrungen damit?

Wäre MPI-I / O eine Prüfung wert? Kann es mit einem bestimmten Dateilayout effizient funktionieren oder muss ich alles anpassen?

khinsen
quelle
4
Gute Frage. Wir haben das gleiche Problem, und unsere grobe Lösung besteht darin, das in Domänen zerlegte Array in N Dateien für N Prozessoren zu schreiben / aus diesen zu lesen. Ich mag das nicht wirklich, aber es ist einfach. Ich würde gerne Antworten sehen, die sich auch mit der Komplexität verschiedener Bibliotheksschnittstellen befassen ...
Yann
Wie verteilen Sie das Array auf die Prozessoren? Was verwenden Sie jetzt für die Parallelität? Schreiben Sie in Dateien über NFS als Kommunikationsform?
Dan
2
Möglicherweise müssen Sie Ihren Code nicht sehr stark überarbeiten. Ich hatte einmal ein solches Problem und konnte IO besser vermeiden als optimieren.
Dan
1
Verwenden Sie ein Warteschlangensystem wie PBS oder Torque? Wenn dies der Fall ist, gibt es Befehle, um eine Datei in einem Verzeichnis "abzulegen", wenn ein Job gestartet wird. Ich weiß nicht, ob es die Dinge merklich beschleunigen würde, aber es könnte einen Versuch wert sein.
Dan
1
@ Dan: Ja, ich benutze PBS und kann damit meine Datei ablegen, wo immer ich will. Da mein Cluster jedoch keine knotenlokalen Datenträger enthält, gibt es nichts Besseres als ein freigegebenes NFS-Volume.
khinsen

Antworten:

6

Parallele E / A-Vorgänge können in diesem Fall hilfreich sein. Wenn Sie jedoch (von Natur aus ziemlich serielles) NFS zum Bereitstellen Ihrer Dateien verwenden, wird dies möglicherweise nicht den gewünschten Effekt erzielen - es wird einen seriellen Engpass geben Fileserver und Hunderte von Prozessen, die Anfragen an den einzelnen Server stellen, werden Ihnen nicht die hundertfache Beschleunigung eines einzelnen Prozesses bringen. Trotzdem könnte es bis zu einem gewissen Punkt helfen, zumal es sich so anhört, als würde der Engpass eher lesen als schreiben, und es wird eine große Verbesserung sein, wenn Ihr System auf ein vollständig paralleles Dateisystem aktualisiert wird.

MPI-IO ist sehr niedrig; Es lohnt sich, etwas darüber zu verstehen, um zu wissen, was mit parallelem HDF5, NetCDF4 oder ADIOS "unter der Haube" vor sich geht . Die Verwendung selbst eignet sich jedoch nur für Binärrohdaten , bei denen die Struktur zum Zeitpunkt der Kompilierung bekannt ist. HDF5 und NetCDF4 sind viel flexibler.

Beachten Sie, dass ich, wenn Ihre Daten relativ einfach sind - z. B. wenn es sich bei den Big-Data-Strukturen hauptsächlich um n-dimensionale Arrays oder Vektoren handelt - NetCDF4 (ebenfalls parallel und auf HDF5 basierend) anstelle von HDF5 empfehle. es ist bedeutend einfacher zu bedienen. HDF5 ist komplizierter und ermöglicht im Gegenzug für diese Komplexität sehr komplizierte Datenmodelle. Wenn Sie diese Funktion jedoch nicht benötigen, können Sie schneller mit NetCDF4 beginnen.

In unserem Zentrum gibt es eine Nachmittags- und eine Tagesklasse für parallele E / A, in der wir über die Grundkonzepte MPI-IO, HDF5 und NetCDF4 sprechen. Die Folien finden Sie hier .


quelle
5

Wir bekommen eine gute Skalierung auf den gesamten XT6 bei ORNL mit MPI / IO, um Vektoren auszugeben. Hier ist der Code . Die E / A-Subsysteme vieler Computer sind nicht für massive Parallelität ausgelegt. Ich denke, @Dan ist richtig, dass ich versuchen würde, die E / A durch das Schreiben von nur wenigen Schritten oder einer anderen Agglomerationsstrategie zu minimieren.

Was das flexible und skalierbare Schreiben von Ausgaben anbelangt , so habe ich Erfahrung mit XDMF , das durch große parallele Binärschreibvorgänge mit HDF5 (wie PETSc VecView ) in Verbindung mit einer kleinen Menge seriell geschriebenen XML-Codes zur Beschreibung des Layouts erzielt werden kann . Dies kann von Visualisierungspaketen wie Paraview oder MayaVi2 gelesen werden . Eine andere Möglichkeit, dies zu tun, ist die Verwendung des VTK-Formats mit angehängten Binärdaten. Dies setzt jedoch voraus, dass Sie alles wissen, was Sie im Voraus schreiben möchten.

Matt Knepley
quelle
XDMF sieht interessant aus, aber es geht eher darum, Daten zu organisieren, als effizient auf die von XDMF als "schwer" bezeichneten Daten zuzugreifen. Was verwenden Sie für diesen Aspekt?
Khinsen
Wir verwenden nur das XDMF, um auf HDF5 zu zeigen. Auf diese Weise können Sie alle binären HDF5-Dateien schreiben, aber von den meisten Visualisierungs-Engines lesen lassen.
Matt Knepley
1

Ich gehe davon aus, dass Ihr Skalierbarkeitsproblem mit der Ausgabe und nicht mit der Eingabe zusammenhängt. Die parallele Eingabe ist recht einfach - jede CPU öffnet die NetCDF-Eingabedatei und liest den Teil des Arrays, der zu ihrer Kachel gehört (es kann eine Begrenzung geben, wie viele Leser dieselbe NetCDF-Datei öffnen können, ich bin mir jedoch nicht sicher ). Die parallele Ausgabe ist problematischer.

Was ich gerade mache ist nicht ganz optimal, funktioniert aber erstmal. Ich sammle das Ganze auf einer CPU und mache die serielle Ausgabe. In der Zwischenzeit warten andere Spieler, bis der Schreiber fertig ist. Das hat bei mir gut funktioniert, weil ich es geschafft habe, die Berechnung über das Ausgangsverhältnis ziemlich hoch zu halten - daher wäre die Skalierbarkeit für weit über 200 CPUs gut. Dies ist jedoch nicht die Lösung, nach der Sie suchen.

Eine andere Lösung schlug Yann vor: Schreiben Sie seriell in N Dateien und lassen Sie die Kacheln von einer Drohnen-CPU zu einem Stück zusammenfügen - sofern RAM dies zulässt.

Abgesehen von den in den vorherigen Antworten vorgeschlagenen parallelen E / A-Bibliotheken sollten Sie sich auch mit Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf befassen, da Sie bereits mit NetCDF und MPI vertraut sind. Ich habe es in der Praxis nicht verwendet, aber ich habe vor, in diese Richtung zu gehen, wenn ich mit Sammel- und Serien-E / A gegen die Wand stoße.

milancurcic
quelle
Es ist die Eingabe, die mein Skalierbarkeitsproblem verursacht. Ich nehme an, dass alle eingehenden Anforderungen von vielen Knoten den NFS-Server überlasten, aber ich habe keine Ahnung, wie ich diese Hypothese überprüfen soll.
khinsen
@khinsen Um Ihre Hypothese zu testen, können Sie die Datei mit einer kleinen Anzahl von CPUs, z. B. zwischen 1 und 8, lesen und die Daten auf den Rest verteilen. Führen Sie die Profilerstellung durch und sehen Sie, wie viel Zeit Sie für E / A und Streuung aufwenden. Variieren Sie die Anzahl der CPU-Lesegeräte und ermitteln Sie die beste Leistung.
milancurcic
Guter Vorschlag! Dies wird einige Arbeit sein, da es bedeutet, den Code neu zu schreiben, aber es lohnt sich wahrscheinlich.
khinsen