Aufgabenkommunikation mit einer MPI-Bibliothek konfigurieren

In diesem Dokument wird erläutert, wie Sie mithilfe einer MPI-Bibliothek (Message Passing Interface) einen Batchjob mit eng gekoppelten Aufgaben konfigurieren, die über verschiedene VMs miteinander kommunizieren.

Bei Batchjobs werden die Interdependenzaufgaben unter Kopplung beschrieben. Dies wirkt sich darauf aus, wie Sie die Anzahl der Aufgaben, die parallel (anstatt sequenziell) ausgeführt werden können, mithilfe des parallelism-Felds eines Jobs konfigurieren. Aufgaben können mithilfe der folgenden Kopplungstypen beschrieben werden:

  • Lose gekoppelte Aufgaben:Aufgaben, die unabhängig voneinander ausgeführt werden können.
  • Eng gekoppelte Aufgaben: Aufgaben, die voneinander abhängig sind, damit sie ausgeführt werden können.

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

Hinweise

Job mit MPI für eng gekoppelte Aufgaben erstellen und ausführen

Dieser Abschnitt enthält Beispiele zum Erstellen eines Jobs, der MPI verwenden kann. Beachten Sie, dass der Beispieljob drei Runnables hat:

  • Das erste ausführbare Skript ist ein Skript, das den Job für MPI vorbereitet, indem das gleichzeitige Multithreading deaktiviert und Intel MPI installiert wird.
  • Das zweite Runnable ist ein leeres Barrier Runnable im Format { "barrier": {} }, das dafür sorgt, dass alle Tasks MPI eingerichtet haben, bevor mit zukünftigen Runnables fortgefahren wird.
  • Das dritte Runnable (und alle nachfolgenden Runnables) ist für die Arbeitslast des Jobs verfügbar.

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

gcloud

So erstellen Sie über die gcloud CLI einen Skriptjob, der MPI für eng gekoppelte 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 Skript, das für eine Arbeitslast ausgeführt werden kann, die MPI verwendet
    • TASK_COUNT: die Anzahl der Tasks für den Job Der Wert muss eine ganze Zahl zwischen 1 und dem Limit für Aufgaben pro Aufgabengruppe sein. Dieses Feld ist erforderlich und muss auf 2 oder höher gesetzt werden, um die von Batch bereitgestellten MPI-Bibliotheken zu verwenden.
    • TASK_COUNT_PER_NODE: die Anzahl der Tasks, 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. Dies entspricht der Ausführung einer VM-Instanz pro Task.
    • REQUIRE_HOSTS_FILE: Wenn dieser Wert auf true gesetzt ist, erstellt der Job eine Datei mit einer Liste der 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 Wert auf true gesetzt ist, konfiguriert Batch SSH, um die passwortlose Kommunikation zwischen den VM-Instanzen, die in einer Aufgabengruppe ausgeführt werden, zu ermöglichen. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, muss dieses Feld auf „true“ gesetzt sein.
  2. Verwenden Sie zum Erstellen des Jobs den Befehl gcloud batch jobs submit.

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

    Ersetzen Sie Folgendes:

    • JOB_NAME: der Name des Jobs.
    • LOCATION: der Standort des Jobs.
    • JSON_CONFIGURATION_FILE: der Pfad für eine JSON-Datei mit den Konfigurationsdetails des Jobs.

Optional können Sie die Leistung der von Batch bereitgestellten MPI-Bibliotheken erhöhen. Gehen Sie dazu so vor:

So erstellen Sie beispielsweise einen Skriptjob aus einer Instanzvorlage, die MPI verwendet und dafür sorgt, dass 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 Skriptjob erstellen möchten, der eine MPI für eng gekoppelte Aufgaben verwendet, verwenden Sie die Methode jobs.create und geben 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: der Standort des Jobs.
  • JOB_NAME: der Name des Jobs.
  • SCRIPT: Skript, das für eine Arbeitslast ausgeführt werden kann, die MPI verwendet
  • TASK_COUNT: die Anzahl der Tasks für den Job Der Wert muss eine ganze Zahl zwischen 1 und dem Limit für Aufgaben pro Aufgabengruppe sein. Dieses Feld ist erforderlich und muss auf 2 oder höher gesetzt werden, um die von Batch bereitgestellten MPI-Bibliotheken zu verwenden.
  • TASK_COUNT_PER_NODE: die Anzahl der Tasks, die ein Job gleichzeitig auf einer VM-Instanz ausführen kann. Dieses Feld ist erforderlich und muss auf 1 gesetzt werden, um die von Batch bereitgestellten MPI-Bibliotheken zu verwenden. Dies entspricht der Ausführung einer VM-Instanz pro Task.
  • REQUIRE_HOSTS_FILE: Wenn dieser Wert auf true gesetzt ist, erstellt der Job eine Datei mit einer Liste der 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 Wert auf true gesetzt ist, konfiguriert Batch SSH so, dass eine passwortlose Kommunikation zwischen den VM-Instanzen möglich ist, die in einer Aufgabengruppe ausgeführt werden. Wenn Sie die von Batch bereitgestellten MPI-Bibliotheken verwenden möchten, muss dieses Feld auf „true“ gesetzt sein.

Optional können Sie die Leistung der von Batch bereitgestellten MPI-Bibliotheken erhöhen. Gehen Sie dazu so vor:

Um beispielsweise einen Skriptjob aus einer Instanzvorlage zu erstellen, die MPI verwendet und dafür sorgt, dass 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