Auswählen der richtigen MPI-Bibliothek

Abgeschlossen

HB120_v2-, HB60- und HC44-SKUs unterstützen InfiniBand-Netzwerkverbindungen. Da PCI Express über die E/A-Virtualisierung mit Einzelstamm (Single-Root Input/Output Virtualization, SR-IOV) virtualisiert wird, sind alle gängigen MPI-Bibliotheken (HPC-X, OpenMPI, Intel MPI, MVAPICH und MPICH) auf diesen HPC-VMs verfügbar.

Die aktuelle Obergrenze für einen HPC-Cluster, der über InfiniBand kommunizieren kann, liegt bei 300 VMs. In der folgenden Tabelle ist die jeweilige maximale Anzahl paralleler Prozesse aufgelistet, die in eng gekoppelten MPI-Anwendungen unterstützt werden, die über InfiniBand kommunizieren.

SKU Maximale Anzahl paralleler Prozesse
HB120_v2 36.000 Prozesse
HC44 13.200 Prozesse
HB60 18.000 Prozesse

Hinweis

Diese Grenzwerte können sich ändern. Wenn Sie über einen eng gekoppelten MPI-Auftrag verfügen, der eine höhere Anzahl erfordert, senden Sie eine Supportanfrage. Möglicherweise können die Grenzwerte für Ihr Szenario erhöht werden.

Wenn eine HPC-Anwendung eine bestimmte MPI-Bibliothek empfiehlt, probieren Sie diese Version zuerst aus. Wenn Sie die MPI-Bibliothek frei wählen können und die beste Leistung erzielen möchten, probieren Sie es mit HPC-X. Insgesamt weist die MPI-Bibliothek HPC-X die beste Leistung auf, da sie das UCX-Framework für die InfiniBand-Schnittstelle verwendet und alle InfiniBand-Hardware- und Softwarefunktionen von Mellanox nutzt.

In der folgenden Abbildung werden die gängigen MPI-Bibliotheksarchitekturen gegenübergestellt.

Diagram of popular MPI architectures.

HPC-X und OpenMPI sind ABI-kompatibel, sodass Sie eine HPC-Anwendung, die mit OpenMPI erstellt wurde, dynamisch mit HPC-X ausführen können. Intel MPI, MVAPICH und MPICH sind ebenfalls ABI-kompatibel.

Die Gast-VM kann nicht auf das Warteschlangenpaar 0 zugreifen, um Sicherheitsrisiken über Low-Level-Hardwarezugriff zu verhindern. Dies sollte keine Auswirkung auf HPC-Anwendungen von Endbenutzern haben, kann jedoch verhindern, dass einige Low-Level-Tools ordnungsgemäß funktionieren.

mpirun-Argumente für HPC-X und OpenMPI

Der folgende Befehl enthält einige empfohlene mpirun-Argumente für HPC-X und OpenMPI:

mpirun -n $NPROCS --hostfile $HOSTFILE --map-by ppr:$NUMBER_PROCESSES_PER_NUMA:numa:pe=$NUMBER_THREADS_PER_PROCESS -report-bindings $MPI_EXECUTABLE

Dieser Befehl umfasst folgende Parameter:

Parameter BESCHREIBUNG
$NPROCS Hier wird die Anzahl der MPI-Prozesse angegeben. Beispiel: -n 16.
$HOSTFILE Hier wird eine Datei angegeben, die den Hostnamen oder die IP-Adresse enthält, um anzugeben, wo die MPI-Prozesse ausgeführt werden. Beispiel: --hostfile hosts.
$NUMBER_PROCESSES_PER_NUMA Hier wird die Anzahl der MPI-Prozesse angegeben, die in den einzelnen NUMA-Domänen ausgeführt werden. Für vier MPI-Prozesse pro NUMA-Domäne verwenden Sie z. B. --map-by ppr:4:numa:pe=1.
$NUMBER_THREADS_PER_PROCESS Hier wird die Anzahl der Threads pro MPI-Prozess angegeben. Für einen MPI-Prozess und vier Threads pro NUMA-Domäne verwenden Sie z. B. --map-by ppr:1:numa:pe=4.
-report-bindings Hiermit wird die Zuordnung der MPI-Prozesse zu den Kernen ausgegeben. Dies ist nützlich, um zu überprüfen, ob Sie die MPI-Prozesse richtig angeheftet haben.
$MPI_EXECUTABLE Hier wird die erstellte ausführbare MPI-Datei angegeben, die die MPI-Bibliotheken einbindet. Bei MPI-Compilerwrappern erfolgt dies automatisch. Zum Beispiel: mpicc oder mpif90.

Wenn Sie vermuten, dass übermäßig viel gemeinsame Kommunikation über Ihre eng gekoppelte MPI-Anwendung erfolgt, können Sie versuchen, Hierarchical Collectives (HCOLL) zu aktivieren. Verwenden Sie die folgenden Parameter, um diese Features zu aktivieren.

-mca coll_hcoll_enable 1 -x HCOLL_MAIN_IB=<MLX device>:<Port>

mpirun-Argumente für Intel MPI

Mit dem Intel MPI 2019-Release wurde vom OFA-Framework (Open Fabrics Alliance) auf das OFI-Framework (Open Fabrics Interfaces) umgestellt, und libfabric wird derzeit unterstützt. Es gibt zwei Anbieter für InfiniBand-Unterstützung: mlx und verbs. Der Anbieter mlx ist der bevorzugte Anbieter für HB- und HC-VMs.

Im Folgenden sind einige Vorschläge für mpirun-Argumente für Intel MPI 2019, Update 5 und höher aufgeführt:

export FI_PROVIDER=mlx
export I_MPI_DEBUG=5
export I_MPI_PIN_DOMAIN=numa

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

Diese Argumente umfassen folgende Parameter:

Parameter BESCHREIBUNG
FI_PROVIDER Hier wird angegeben, welcher libfabric-Anbieter verwendet werden soll. Dies wirkt sich auf die API, das Protokoll und das Netzwerk aus, die verwendet werden. verbs ist eine weitere Option, doch bietet mlx im Allgemeinen eine bessere Leistung.
I_MPI_DEBUG Hier wird der Umfang der zusätzlichen Debugausgabe angegeben, die Details dazu bereitstellen kann, wo Prozesse angeheftet sind und welches Protokoll und Netzwerk verwendet werden.
I_MPI_PIN_DOMAIN Hier geben Sie an, wie Sie die Prozesse anheften möchten. Sie können sie beispielsweise an Kerne, Sockets oder NUMA-Domänen anheften. In diesem Beispiel wurde diese Umgebungsvariable auf numa festgelegt. Dies bedeutet, dass Prozesse an NUMA-Knotendomänen angeheftet werden.

Es gibt noch einige weitere Optionen, die Sie ausprobieren können, insbesondere dann, wenn gemeinsame Vorgänge viel Zeit beanspruchen. Intel MPI 2019, Update 5 und höher, unterstützt den Anbieter mlx und verwendet das UCX-Framework für die Kommunikation mit InfiniBand. Darüber hinaus wird HCOLL unterstützt.

export FI_PROVIDER=mlx
export I_MPI_COLL_EXTERNAL=1

mpirun-Argumente für MVAPICH

In der folgenden Liste sind einige empfohlene mpirun-Argumente aufgeführt:

export MV2_CPU_BINDING_POLICY=scatter
export MV2_CPU_BINDING_LEVEL=numanode
export MV2_SHOW_CPU_BINDING=1
export MV2_SHOW_HCA_BINDING=1

mpirun -n $NPROCS -f $HOSTFILE $MPI_EXECUTABLE

Diese Argumente umfassen folgende Parameter:

Parameter BESCHREIBUNG
MV2_CPU_BINDING_POLICY Hier wird angegeben, welche Bindungsrichtlinie verwendet werden soll. Dies wirkt sich darauf aus, wie Prozesse an Kern-IDs angeheftet werden. In diesem Fall wurde scatter angegeben, sodass die Prozesse gleichmäßig auf die NUMA-Domänen verteilt werden.
MV2_CPU_BINDING_LEVEL Hier wird angegeben, wo Prozesse angeheftet werden sollen. In diesem Fall wurde numanode festgelegt. Dies bedeutet, dass Prozesse an NUMA-Domäneneinheiten angeheftet werden.
MV2_SHOW_CPU_BINDING Hier wird angegeben, ob Debuginformationen dazu abgerufen werden sollen, wo die Prozesse angeheftet sind.
MV2_SHOW_HCA_BINDING Hier wird angegeben, ob Debuginformationen dazu abgerufen werden sollen, welchen Hostkanaladapter die einzelnen Prozesse verwenden.