Das WRF-Wettervorhersage-Modell mit Fluid Numerics ausführen' Slurm-GCP

1. Einführung

USA (kontinental)

Letzte Aktualisierung:05.05.2021

Überblick

In diesem Codelab stellen Sie einen automatisch skalierenden HPC-Cluster (High Performance Computing) in Google Cloud mit dem Slurm-Job-Scheduler bereit. Sie verwenden eine Beispielbereitstellung mit Terraform, mit der dieser Cluster mit WRF® bereitgestellt wird, das über Spack installiert wurde. Anschließend verwenden Sie diese Infrastruktur, um den CONUS-Benchmark mit 2,5 km oder den CONUS-Benchmark mit 12 km auszuführen.

Lerninhalte

  • Konfigurieren von IAM-Richtlinien (Identity and Access Management) für den Betrieb eines HPC-Clusters auf der Google Cloud Platform
  • Cloudnativer HPC-Cluster mit dem Slurm-Jobplaner bereitstellen
  • WRF® parallel in Google Cloud mit einem Slurm-Batchjob ausführen

Das brauchen Sie

2. Konfiguration

Google Cloud APIs aktivieren

Zum Erstellen und Verwenden von Google Cloud-Ressourcen müssen APIs aktiviert sein.

gcloud services enable compute.googleapis.com 

IAM-Richtlinien festlegen

Im HPC gibt es klare Unterschiede zwischen Systemadministratoren und Systemnutzern. Systemadministratoren haben in der Regel „Root-Zugriff“, mit dem sie Rechenressourcen verwalten und betreiben können. Systemnutzer sind in der Regel Forscher, Wissenschaftler und Anwendungsentwickler, die die Ressourcen nur zum Ausführen von Jobs benötigen.

In Google Cloud stellt die OS Login API POSIX-Nutzerinformationen aus Google Workspace-, Cloud Identity- und Gmail-Konten bereit. Außerdem wird OS Login in das Identity and Access Management (IAM)-System von GCP eingebunden, um zu ermitteln, ob Nutzer Berechtigungen auf Linux-Systemen eskalieren dürfen.

In dieser Anleitung gehen wir davon aus, dass Sie die Rollen des Systemadministrators und des Compute Engine-Administrators ausfüllen. Wir konfigurieren IAM-Richtlinien, um Ihnen die Berechtigungen zu gewähren, die Sie für die folgenden Aufgaben benötigen.

  • Google Compute Engine-VM-Instanzen erstellen/löschen
  • SSH-Verbindung zu GCE-VM-Instanzen herstellen

57883cb8acc09653.png

So weisen Sie sich selbst die erforderlichen IAM-Rollen zu, um dieses Tutorial durchzuarbeiten:

  1. Rufen Sie im Menü „Produkte und Dienste“ die Option „IAM & Verwaltung“ > „IAM“ auf.
  2. Klicken Sie oben auf der Seite auf „+ Hinzufügen“.
  3. Geben Sie unter „Neue Mitglieder“ Ihr Google Workspace-Konto, Cloud Identity-Konto oder Gmail-Konto ein.
  4. Fügen Sie die folgenden Rollen hinzu: „Compute Admin“, „Compute OS Login“ und „Service Account User“.
  5. Klicken Sie auf „Speichern“.

Ihr Login hat jetzt die Berechtigungen, die zum Starten der Erstellung des HPC-Clusters erforderlich sind.

Öffnen Sie Cloud Shell und führen Sie den folgenden Befehl aus, um zu prüfen, ob Sie die richtigen Rollen zugewiesen haben. Ersetzen Sie YOUR_PROJECT und EMAIL_ADDRESS durch Ihr Projekt und Ihre E-Mail-Adresse.

$ gcloud projects get-iam-policy YOUR_PROJECT --flatten="bindings[].members" --format='table(bindings.role)' --filter="bindings.members=user:EMAIL_ADDRESS"

Dieser Befehl erzeugt die folgende Ausgabe:

ROLE
roles/compute.osLogin
roles/iam.serviceAccountUser
roles/compute.admin

3. Niedriges Kontingent: Automatisch skalierenden HPC-Cluster mit Terraform bereitstellen

In diesem Abschnitt stellen Sie einen automatisch skalierenden HPC-Cluster mit dem Slurm-Jobplaner bereit. Diese Option ist mit der Option „Hohes Kontingent“ identisch, mit der Ausnahme, dass der verwendete Maschinentyp und die Anzahl der verwendeten vCPUs kleiner sind.

  1. Öffnen Sie Cloud Shell in der GCP.
  2. FluidNumerics/slurm-gcp-Repository klonen
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Wechseln Sie in das WRF-Verzeichnis:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Terraform-Plan erstellen und prüfen Legen Sie die Umgebungsvariablen WRF_NAME, WRF_PROJECT und WRF_ZONE fest, um den Namen Ihres Clusters, Ihr GCP-Projekt und die Zone anzugeben, in der Sie die Bereitstellung vornehmen möchten.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. Wenn Sie Terraform zum ersten Mal ausführen, müssen Sie den Befehl init ausführen:
terraform init
  1. Erstellen Sie den Plan mit dem Befehl „make“, der terraform ausführt.
make plan
  1. Stellen Sie den Cluster bereit. Die Installation und Einrichtung kann bis zu 2 Stunden dauern. Während der Bereitstellung werden WRF und alle zugehörigen Abhängigkeiten installiert.
make apply
  1. Stellen Sie eine SSH-Verbindung zum Anmeldeknoten her, der im vorherigen Schritt erstellt wurde. Diesen Knoten sehen Sie im vorherigen Schritt (wahrscheinlich wrf-small-login0). Klicken Sie dazu im Konsolenmenüelement Compute Engine -> VM-Instanz neben der Liste der VM-Instanzen auf die Schaltfläche „SSH“.

Option:Mit diesem Paar von gcloud-Befehlen wird der Name des Anmeldeknotens ermittelt und eine SSH-Verbindung zu ihm hergestellt:

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${WRF_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)

gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${WRF_ZONE}

  1. Nachdem Sie eine Verbindung zum Anmeldeknoten hergestellt haben, prüfen Sie, ob das WRF-Modul verfügbar ist, um die Einrichtung des Clusters zu bestätigen.
$ module load gcc && module load openmpi && module avail
-------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/openmpi/4.0.5-eagetxh/gcc/9.2.0 --------------------------------------
   hdf5/1.10.7    netcdf-c/4.7.4    netcdf-fortran/4.5.3    parallel-netcdf/1.12.1    wrf/4.2

------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/gcc/9.2.0 -------------------------------------------------
   hwloc/2.2.0      libiconv/1.16          libpng/1.6.37     nasm/2.15.05            openmpi/4.0.5 (L,D)    time/1.9              zlib/1.2.11
   jasper/2.0.16    libjpeg-turbo/2.0.4    libtirpc/1.2.6    ncurses/5.9.20130511    perl/5.16.3            util-macros/1.19.1
   krb5/1.15.1      libpciaccess/0.16      libxml2/2.9.10    numactl/2.0.14          tcsh/6.22.02           xz/5.2.2

--------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/Core ----------------------------------------------------
   gcc/9.2.0 (L)

---------------------------------------------------------------------- /apps/modulefiles ----------------------------------------------------------------------
   openmpi/v4.1.x
  1. Prüfen Sie, ob /apps/share/conus-12km die unten aufgeführten Inhalte enthält.
$  ls -1 /apps/share/conus-12km/
FILE:2018-06-17_00
FILE:2018-06-17_03
FILE:2018-06-17_06
FILE:2018-06-17_09
FILE:2018-06-17_12
geo_em.d01.nc
geogrid.log
met_em.d01.2018-06-17_00:00:00.nc
met_em.d01.2018-06-17_03:00:00.nc
met_em.d01.2018-06-17_06:00:00.nc
met_em.d01.2018-06-17_09:00:00.nc
met_em.d01.2018-06-17_12:00:00.nc
metgrid.log
namelist.input
namelist.wps
ungrib.log
wrfbdy_d01
wrfinput_d01

4. CONUS 12 km-Benchmark ausführen

Um den CONUS-Benchmark mit 12 km auszuführen, senden Sie einen Slurm-Batchjob. Die Eingabe-Decks für diesen Benchmark sind im VM-Image „wrf-gcp“ unter „/apps/share/benchmarks/conus-12km“ enthalten.

Für diesen Abschnitt müssen Sie eine SSH-Verbindung zum Anmeldeknoten des Clusters herstellen.

  1. Kopieren Sie die Beispielbatchdatei wrf-conus.sh aus /apps/share.
cp /apps/share/wrf-conus12.sh ~/
  1. Öffnen Sie wrf-conus.sh in einem Texteditor, um zu prüfen, ob --partition und --ntasks richtig festgelegt sind. Die Anzahl der Aufgaben sollte auf die Anzahl der MPI-Ränge festgelegt werden, die Sie zum Starten des Jobs verwenden möchten. Für diese Demonstration entspricht die Anzahl der Aufgaben der Anzahl der für den Job verwendeten vCPUs und sollte Ihr verfügbares Kontingent nicht überschreiten.
#!/bin/bash
#SBATCH --partition=wrf
#SBATCH --ntasks=24
#SBATCH --ntasks-per-node=8
#SBATCH --mem-per-cpu=2g
#SBATCH --cpus-per-task=1
#SBATCH --account=default
#
# /////////////////////////////////////////////// #

WORK_PATH=${HOME}/wrf-benchmark/
SRUN_FLAGS="-n $SLURM_NTASKS --cpu-bind=threads"

. /apps/share/spack.sh
module load gcc/9.2.0
module load openmpi
module load hdf5 netcdf-c netcdf-fortran wrf

mkdir -p ${WORK_PATH}
cd ${WORK_PATH}
ln -s ${INSTALL_ROOT}/share/conus-12km/* .
ln -s $(spack location -i wrf)/run/* .

srun $MPI_FLAGS ./wrf.exe
  1. Senden Sie den Batchjob mit sbatch.
sbatch wrf-conus12.sh
  1. Warten Sie, bis der Job abgeschlossen ist. Dieser Benchmark ist für eine 6-Stunden-Prognose konfiguriert, die mit 24 Rängen etwa 3 Stunden dauert. Sie können den Status Ihres Jobs mit squeue überwachen.
  2. Wenn der Job abgeschlossen ist, prüfen Sie den Inhalt von rsl.out.0000, um zu bestätigen, dass die Anweisung „wrf: SUCCESS COMPLETE WRF“ angezeigt wird. Das numerische Suffix ist unterschiedlich, wenn Sie den Job mehrmals ausgeführt haben, z.B. weil Sie eine Konfigurationseinstellung falsch eingegeben haben und den Job noch einmal ausführen mussten.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

5. Hohes Kontingent: Automatisch skalierenden HPC-Cluster mit Terraform bereitstellen

In diesem Abschnitt stellen Sie einen automatisch skalierenden HPC-Cluster mit dem Slurm-Job-Scheduler in GCP bereit.

  1. Öffnen Sie Cloud Shell in der GCP.
  2. FluidNumerics/slurm-gcp-Repository klonen
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. Wechseln Sie in das WRF-Verzeichnis:
cd  ~/slurm-gcp/tf/examples/wrf
  1. Terraform-Plan erstellen und prüfen Legen Sie die Umgebungsvariablen WRF_NAME, WRF_PROJECT, WRF_ZONE, WRF_MAX_NODE und WRF_MACHINE_TYPE fest, um den Namen Ihres Clusters, Ihr GCP-Projekt, die Zone, in der Sie die Bereitstellung vornehmen möchten, die maximale Anzahl von Knoten und den Maschinentyp anzugeben. Für den CONUS-Benchmark mit 2,5 km empfehlen wir die Verwendung von c2-standard-60-Instanzen mit mindestens 8 Knoten, um Jobs mit 480 MPI-Rängen auszuführen.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME=wrf-large
export WRF_MAX_NODE=5
export WRF_MACHINE_TYPE="c2-standard-60"
  1. Wenn Sie das oben nicht getan haben, müssen Sie terraform init ausführen, um Terraform zu starten:
terraform init
  1. Erstellen Sie den Plan mit dem Befehl „make“.
make plan
  1. Stellen Sie den Cluster bereit. Die Installation und Einrichtung kann bis zu 2 Stunden dauern. Während der Bereitstellung werden WRF und alle zugehörigen Abhängigkeiten installiert.
make apply
  1. Stellen Sie eine SSH-Verbindung zum Anmeldeknoten her, der im vorherigen Schritt erstellt wurde. Diesen Knoten sehen Sie im vorherigen Schritt (wahrscheinlich wrf-large-login0). Klicken Sie dazu im Konsolenmenüelement Compute Engine -> VM-Instanz neben der Liste der VM-Instanzen auf die Schaltfläche „SSH“.

Option:Mit diesem Paar von gcloud-Befehlen wird der Name des Anmeldeknotens ermittelt und eine SSH-Verbindung zu ihm hergestellt:

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${WRF_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)

gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${WRF_ZONE}

Der zweite Befehl sollte dazu führen, dass Sie mit dem Slurm-Anmeldeknoten verbunden sind.

  1. Nachdem Sie eine Verbindung zum Anmeldeknoten hergestellt haben, prüfen Sie, ob das WRF-Modul verfügbar ist, um die Einrichtung des Clusters zu bestätigen.
$ module load gcc && module load openmpi && module avail
-------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/openmpi/4.0.5-eagetxh/gcc/9.2.0 --------------------------------------
   hdf5/1.10.7    netcdf-c/4.7.4    netcdf-fortran/4.5.3    parallel-netcdf/1.12.1    wrf/4.2

------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/gcc/9.2.0 -------------------------------------------------
   hwloc/2.2.0      libiconv/1.16          libpng/1.6.37     nasm/2.15.05            openmpi/4.0.5 (L,D)    time/1.9              zlib/1.2.11
   jasper/2.0.16    libjpeg-turbo/2.0.4    libtirpc/1.2.6    ncurses/5.9.20130511    perl/5.16.3            util-macros/1.19.1
   krb5/1.15.1      libpciaccess/0.16      libxml2/2.9.10    numactl/2.0.14          tcsh/6.22.02           xz/5.2.2

--------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/Core ----------------------------------------------------
   gcc/9.2.0 (L)

---------------------------------------------------------------------- /apps/modulefiles ----------------------------------------------------------------------
   openmpi/v4.1.x
  1. Prüfen Sie, ob /apps/share/conus-2.5km die unten aufgeführten Inhalte enthält.
$ ls -1 /apps/share/conus-2.5km
FILE:2018-06-17_00
FILE:2018-06-17_03
FILE:2018-06-17_06
FILE:2018-06-17_09
FILE:2018-06-17_12
geo_em.d01.nc
geogrid.log
gfs.0p25.2018061700.f000.grib2
gfs.0p25.2018061700.f003.grib2
gfs.0p25.2018061700.f006.grib2
gfs.0p25.2018061700.f009.grib2
gfs.0p25.2018061700.f012.grib2
met_em.d01.2018-06-17_00:00:00.nc
met_em.d01.2018-06-17_03:00:00.nc
met_em.d01.2018-06-17_06:00:00.nc
met_em.d01.2018-06-17_09:00:00.nc
met_em.d01.2018-06-17_12:00:00.nc
metgrid.log
namelist.input
namelist.wps
ungrib.log
wrfbdy_d01
wrfinput_d01

6. CONUS-Benchmark mit 2,5 km ausführen

Um den CONUS-Benchmark mit 2,5 km auszuführen, senden Sie einen Slurm-Batchjob. Die Eingabe-Decks für diesen Benchmark sind im VM-Image „wrf-gcp“ unter „/apps/share/benchmarks/conus-2.5km“ enthalten.

Für diesen Abschnitt müssen Sie eine SSH-Verbindung zum Anmeldeknoten des Clusters herstellen.

  1. Kopieren Sie die Beispielbatchdatei wrf-conus.sh aus /apps/share.
cp /apps/share/wrf-conus2p5.sh ~/
  1. Öffnen Sie wrf-conus.sh in einem Texteditor, um zu prüfen, ob --partition und --ntasks richtig festgelegt sind. Die Partition sollte auf „c2-60“ festgelegt sein. Die Anzahl der Aufgaben sollte auf die Anzahl der MPI-Ränge festgelegt werden, die Sie zum Starten des Jobs verwenden möchten. Für diese Demonstration entspricht die Anzahl der Aufgaben der Anzahl der für den Job verwendeten vCPUs und sollte Ihr verfügbares Kontingent nicht überschreiten.
#!/bin/bash
#SBATCH --partition=c2-60
#SBATCH --ntasks=480
#SBATCH --ntasks-per-node=60
#SBATCH --mem-per-cpu=2g
#SBATCH --cpus-per-task=1
#SBATCH --account=default
#
# /////////////////////////////////////////////// #

WORK_PATH=${HOME}/wrf-benchmark/
SRUN_FLAGS="-n $SLURM_NTASKS --cpu-bind=threads"

. /apps/share/spack.sh
module load gcc/9.2.0
module load openmpi
module load hdf5 netcdf-c netcdf-fortran wrf

mkdir -p ${WORK_PATH}
cd ${WORK_PATH}
ln -s ${INSTALL_ROOT}/share/conus-2.5km/* .
ln -s $(spack location -i wrf)/run/* .

srun $MPI_FLAGS ./wrf.exe
  1. Senden Sie den Batchjob mit sbatch.
sbatch wrf-conus2p5.sh
  1. Warten Sie, bis der Job abgeschlossen ist. Dieser Benchmark ist für eine 6-Stunden-Vorhersage konfiguriert, die mit 480 Rängen etwa eine Stunde dauert. Sie können den Status Ihres Jobs mit squeue überwachen.
  2. Wenn der Job abgeschlossen ist, prüfen Sie den Inhalt von rsl.out.0000, um zu bestätigen, dass die Anweisung „wrf: SUCCESS COMPLETE WRF“ angezeigt wird. Das numerische Suffix ist unterschiedlich, wenn Sie den Job mehrmals ausgeführt haben, z.B. weil Sie eine Konfigurationseinstellung falsch eingegeben haben und den Job noch einmal ausführen mussten.
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

7. Glückwunsch

In diesem Codelab haben Sie einen automatisch skalierten, cloudnativen HPC-Cluster erstellt und eine parallele WRF®-Simulation auf der Google Cloud Platform ausgeführt.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud Platform-Konto die in diesem Codelab verwendeten Ressourcen berechnet werden:

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, indem Sie das für das Codelab erstellte Projekt löschen.

Achtung: Das Löschen von Projekten hat folgende Auswirkungen:

  • Alle Inhalte des Projekts werden gelöscht. Wenn Sie für dieses Codelab ein bereits bestehendes Projekt verwendet haben, werden auch alle anderen im Rahmen des Projekts erstellten Daten gelöscht.
  • Benutzerdefinierte Projekt-IDs gehen verloren. Beim Erstellen dieses Projekts haben Sie möglicherweise eine benutzerdefinierte Projekt-ID erstellt, die Sie weiterhin verwenden möchten. Damit die URLs, die die Projekt-ID verwenden, z. B. eine appspot.com-URL, erhalten bleiben, sollten Sie ausgewählte Ressourcen innerhalb des Projekts löschen, statt das gesamte Projekt.

Wenn Sie mehrere Codelabs und Kurzanleitungen durcharbeiten möchten, können Sie die Überschreitung von Projektkontingenten verhindern, indem Sie Projekte wiederverwenden.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten. Zur Seite „Ressourcen verwalten“
  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen dc096e8341a05fec.png.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Einzelne Ressourcen löschen

  1. Öffnen Sie Cloud Shell und rufen Sie das WRF-Beispielverzeichnis auf.
cd  ~/slurm-gcp/tf/examples/wrf
  1. Führen Sie „make destroy“ aus, um alle Ressourcen zu löschen.
make destroy