Aufgabenkommunikation mit einer MPI-Bibliothek konfigurieren

In diesem Dokument wird beschrieben, wie Sie einen Batchjob mit eng gekoppelten Aufgaben konfigurieren, die über eine Message Passing Interface (MPI)-Bibliothek über verschiedene VMs hinweg miteinander kommunizieren.

Bei Batchjobs beschreibt die Kopplung die Abhängigkeiten zwischen Aufgaben. Dies wirkt sich darauf aus, wie Sie die Anzahl der Aufgaben konfigurieren, die parallel (anstelle von sequenziell) ausgeführt werden können, indem Sie das Feld parallelism eines Jobs verwenden. Aufgaben können mit den folgenden Kopplungstypen beschrieben werden:

  • Lose gekoppelte Aufgaben: Aufgaben, die unabhängig voneinander ausgeführt werden können.
  • Eng miteinander verbundene Aufgaben: Aufgaben, die für die Ausführung voneinander abhängig sind.

Optional können Sie einen Job erstellen, der eine MPI-Bibliothek verwendet, damit eng verbundene Aufgaben über verschiedene VM-Instanzen hinweg miteinander kommunizieren können. Ein häufiger Anwendungsfall für MPI sind eng gekoppelte HPC-Arbeitslasten (High Performance Computing, Hochleistungs-Computing).

Hinweise

  1. Wenn Sie Batch noch nicht verwendet haben, lesen Sie den Hilfeartikel Batch-Dateien erstellen und ausführen und aktivieren Sie Batch, indem Sie die Voraussetzungen für Projekte und Nutzer erfüllen.
  2. Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen eines Jobs benötigen:

    Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

    Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

  3. Wenn Sie das Netzwerk für diesen Job angeben, muss es eine Firewallregel haben, die Verbindungen zwischen den VMs des Jobs zulässt. Weitere Informationen zum Konfigurieren von VPC-Firewallregeln für gängige Anwendungsfälle

Job erstellen und ausführen, der MPI für eng gekoppelte Aufgaben verwendet

In diesem Abschnitt finden Sie Beispiele für das Erstellen eines Jobs, der MPI verwenden kann. Der Beispieljob hat drei ausführbare Dateien:

  • Das erste ausführbare Element ist ein Script, das den Job für MPI vorbereitet, indem das gleichzeitige Multithreading deaktiviert und Intel MPI installiert wird.
  • Das zweite ausführbare Element ist eine leere Barriere (formatiert als { "barrier": {} }), die dafür sorgt, dass alle Aufgaben die Einrichtung von MPI abschließen, bevor mit zukünftigen ausführbaren Elementen fortgefahren wird.
  • Das dritte ausführbare Element (und alle nachfolgenden ausführbaren Elemente) ist für die Arbeitslast des Jobs verfügbar.

Sie können mit der gcloud CLI oder der Batch API einen Job erstellen, der MPI für eng verbundene Aufgaben verwendet.

gcloud

So erstellen Sie mit der gcloud CLI einen Script-Job, der MPI für eng verbundene Aufgaben verwendet:

  1. Erstellen Sie eine JSON-Konfigurationsdatei mit folgendem Inhalt:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                SCRIPT
                            }
                        }
                    ]
                },
                "taskCount": TASK_COUNT,
                "taskCountPerNode": TASK_COUNT_PER_NODE,
                "requireHostsFile": REQUIRE_HOSTS_FILE,
                "permissiveSsh": PERMISSIVE_SSH
            }
        ]
    }
    

    Ersetzen Sie Folgendes:

    • SCRIPT: Ein Script, das für eine Arbeitslast ausgeführt werden kann, die MPI verwendet.
    • TASK_COUNT: Die Anzahl der Aufgaben für den Job. Der Wert muss eine ganze Zahl zwischen 1 und dem Limit für Aufgaben pro Aufgabengruppe sein. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, ist dieses Feld erforderlich und muss auf 2 oder höher festgelegt sein.
    • TASK_COUNT_PER_NODE: Die Anzahl der Aufgaben, die ein Job gleichzeitig auf einer VM-Instanz ausführen kann. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, ist dieses Feld erforderlich und muss auf 1 gesetzt werden. Das entspricht der Ausführung einer VM-Instanz pro Aufgabe.
    • REQUIRE_HOSTS_FILE: Wenn diese Option auf true festgelegt ist, erstellt der Job eine Datei mit den VM-Instanzen, die in einer Aufgabengruppe ausgeführt werden. Der Dateipfad wird in der Umgebungsvariablen BATCH_HOSTS_FILE gespeichert. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, muss dieses Feld auf „true“ gesetzt sein.
    • PERMISSIVE_SSH: Wenn dieser Parameter auf true festgelegt ist, konfiguriert Batch SSH so, dass die Kommunikation zwischen den VM-Instanzen, die in einer Aufgabengruppe ausgeführt werden, passwortlos erfolgt. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, muss dieses Feld auf „wahr“ gesetzt sein.
  2. Verwenden Sie den Befehl gcloud batch jobs submit, um den Job zu erstellen.

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Ersetzen Sie Folgendes:

    • JOB_NAME: Der Name des Jobs.
    • LOCATION: den Standort der Stelle.
    • JSON_CONFIGURATION_FILE: der Pfad zu einer JSON-Datei mit den Konfigurationsdetails des Jobs.

Optional können Sie die Leistung der von Batch bereitgestellten MPI-Bibliotheken so steigern:

So erstellen Sie beispielsweise einen Scriptjob aus einer Instanzvorlage, die MPI verwendet und bei dem eine Aufgabe den Hostnamen der drei Aufgaben in der Aufgabengruppe ausgibt:

  1. Erstellen Sie im aktuellen Verzeichnis eine JSON-Datei mit dem Namen example-job-uses-mpi.json und folgendem Inhalt:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                "text":
                                    "if [ $BATCH_TASK_INDEX = 0 ]; then
                                    mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                    fi"
                            }
                        },
                        { "barrier": {} }
                    ]
                },
                "taskCount": 3,
                "taskCountPerNode": 1,
                "requireHostsFile": true,
                "permissiveSsh": true
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "instanceTemplate": "example-template-job-uses-mpi"
                }
            ]
        },
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    
  2. Führen Sie dazu diesen Befehl aus:

    gcloud batch jobs submit example-template-job-uses-mpi \
      --location us-central1 \
      --config example-job-uses-mpi.json
    

API

Wenn Sie mit der Batch API einen Script-Job erstellen möchten, der ein MPI für eng verbundene Aufgaben verwendet, verwenden Sie die Methode jobs.create und geben Sie die Felder permissiveSsh, requireHostsFile, taskCount und taskCountPerNode an.

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_ID

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            SCRIPT
                        }
                    }
                ]
            },
            "taskCount": TASK_COUNT,
            "taskCountPerNode": TASK_COUNT_PER_NODE,
            "requireHostsFile": REQUIRE_HOSTS_FILE,
            "permissiveSsh": PERMISSIVE_SSH
        }
    ]
}

Ersetzen Sie Folgendes:

  • PROJECT_ID: die Projekt-ID Ihres Projekts.
  • LOCATION: den Standort der Stelle.
  • JOB_NAME: Der Name des Jobs.
  • SCRIPT: Das Script, das für eine Arbeitslast ausgeführt werden kann, die MPI verwendet.
  • TASK_COUNT: Die Anzahl der Aufgaben für den Job. Der Wert muss eine ganze Zahl zwischen 1 und dem Limit für Aufgaben pro Aufgabengruppe sein. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, ist dieses Feld erforderlich und muss auf 2 oder höher festgelegt sein.
  • TASK_COUNT_PER_NODE: Die Anzahl der Aufgaben, die ein Job gleichzeitig auf einer VM-Instanz ausführen kann. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, ist dieses Feld erforderlich und muss auf 1 gesetzt werden. Das entspricht der Ausführung einer VM-Instanz pro Aufgabe.
  • REQUIRE_HOSTS_FILE: Wenn diese Option auf true festgelegt ist, erstellt der Job eine Datei mit den VM-Instanzen, die in einer Aufgabengruppe ausgeführt werden. Der Dateipfad wird in der Umgebungsvariable BATCH_HOSTS_FILE gespeichert. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, muss dieses Feld auf „wahr“ gesetzt sein.
  • PERMISSIVE_SSH: Wenn diese Option auf true festgelegt ist, konfiguriert Batch SSH so, dass die passwortlose Kommunikation zwischen den VM-Instanzen in einer Aufgabengruppe zulässig ist. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, muss dieses Feld auf „wahr“ gesetzt sein.

Optional können Sie die Leistung der von Batch bereitgestellten MPI-Bibliotheken so steigern:

Wenn Sie beispielsweise einen Script-Job aus einer Instanzvorlage erstellen möchten, die MPI verwendet und bei dem eine Aufgabe den Hostnamen der drei Aufgaben in der Aufgabengruppe ausgibt, verwenden Sie die folgende Anfrage:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-template-job-uses-mpi

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            "text":
                                "if [ $BATCH_TASK_INDEX = 0 ]; then
                                mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                fi"
                        }
                    },
                    { "barrier": {} }
                ]
            },
            "taskCount": 3,
            "taskCountPerNode": 1,
            "requireHostsFile": true,
            "permissiveSsh": true
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "instanceTemplate": "example-template-job-uses-mpi"
            }
        ]
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

Dabei ist PROJECT_ID die Projekt-ID Ihres Projekts.

Nächste Schritte