MPI

Allgemeines

Das Message Passing Interface ist eine Schnittstelle zum Austausch von Daten zwischen mehreren Prozessen, die parallel, aber unabhängig voneinander unterschiedliche Daten bearbeiten. Sinnvoll ist die Verwendung von MPI v.a. dann, wenn wenig Kommunikation zwischen den einzelnen Prozessen notwendig ist; mögliche Szenarien sind:
  • Simulation mit mehreren (künstlichen) Datensätzen: die unterschiedlichen Datensätze können parallel auf unterschiedlichen Nodes (Prozessorkernen auf Brutus) bearbeitet werden.
  • (Zeitintensive) Berechnung mit einem Datensatz für verschiedene Parameter: die Berechnung kann für unterschiedliche Parameter auf unterschiedlichen Nodes durchgeführt werden.

Ein einfaches Beispiel eines R-Skripts, das Rmpi verwendet, findet man am SfS unter /u/sfs/R/BrutusEx/mpi_ex.R Kopiert man dieses auf Brutus (wie hier beschrieben), kann man es wie folgt ausführen:
  1. R- und OpenMPI-Module laden:
    module load open_mpi r
  2. Vorbereitete Datei .Rprofile des Packages Rmpi ins selbe Verzeichnis kopieren, in dem sich das Skript befindet:
    cp /cluster/apps/r/2.11.1_goto2/lib64/R/library/Rmpi/Rprofile .Rprofile
    Diese Datei enthält einige Hilfsfunktionen, die für das korrekte Funktionieren von MPI notwendig sind. Das genaue Verzeichnis der Datei (bzw. des Packages Rmpi) hängt von der R-Version ab, für die man sie verwenden will! Daher muss man diesen Pfad vorher wie folgt ermitteln:
    1. R auf Login-Node starten
    2. Informationen über installierte Packages sammeln: pack <- installed.packages() (dauert eine Weile, wenn viele Packages installiert sind)
    3. Pfad von Rmpi ausgeben: pack["Rmpi", "LibPath"]
  3. Skript ans Batch-System von Brutus senden; da das Skript MPI verwendet, muss es von mpirun gestartet werden, und die gewünschte Anzahl Nodes (hier: 5) muss gewählt werden:
    bsub -n 5 mpirun R CMD BATCH --no-save mpi_ex.R
  4. Job-Status mit bjobs überprüfen; Ausgabe des Skripts wird schliesslich in mpi_ex.Rout gespeichert (genau wie bei einfachen R-Skripten ohne Parallelisierung).

Funktionsweise von Rmpi

Das R-Package Rmpi erlaubt Berechnungen im Master-Slave-Modus: werden auf Brutus n Nodes angefordert, arbeitet ein Node als Master, der Aufgaben (Datensätze, Parameter, etc.) die andern n - 1 Nodes, die Slaves, verteilt sowie deren Resultate sammelt und speichert.

Es ist wichtig zu wissen, dass das R-Skript, das auf Brutus mit MPI gestartet wird, ausschliesslich vom Master-Node ausgeführt wird. Die Slaves laden also per se keine Packages, parsen keine Funktionen aus dem R-Skript, etc. Alle R-Objekte (also auch Funktionen!), welche die Slaves benötigen, müssen daher
  • entweder vom Master an die Slaves geschickt werden, z.B. mit der Funktion mpi.bcast() aus dem Package Rmpi,
  • oder aber mit source() bzw. library() in die Datei .Rprofile eingebunden werden, welche im selben Verzeichnis wie das Master-R-Skript liegen muss.

Ein komplexeres Beispiel für eine Parallelisierung mit MPI findet sich in der Datei /u/sfs/R/BrutusEx/taskPull.R Dort wird auch demonstiert, wie eine Funktion (linregR()) an alle Slaves geschickt werden kann. (Es wäre im Beispiel natürlich sinnvoller, stattdessen lm.fit zu verwenden, aber diese Funktion müsste dann nicht mehr an die Slaves verteilt werden wink )

Page URL: https://wiki.math.ethz.ch/bin/view/SfSInfo/RechnenBrutusErsteSchritteMPI
2024-05-02
© 2024 Eidgenössische Technische Hochschule Zürich