Configura la comunicazione delle attività utilizzando una libreria MPI

Questo documento spiega come configurare un job batch con attività a stretto accoppiamento che comunicano tra loro su diverse VM utilizzando una libreria MPI (Message Passing Interface).

Per i job batch, l'accoppiamento descrive le attività di interdipendenza; questo influenza il modo in cui configuri il numero di attività che possono essere eseguite in parallelo (anziché in sequenza) utilizzando il campo parallelism di un job. Le attività possono essere descritte utilizzando i seguenti tipi di accoppiamento:

  • Attività a basso accoppiamento:attività che possono essere eseguite in modo indipendente.
  • Attività a stretto accoppiamento:attività che dipendono l'una dall'altra per l'esecuzione.

Facoltativamente, puoi creare un job che utilizza una libreria MPI per consentire alle attività ad accoppiamento stretto comunicare tra istanze VM diverse. Un caso d'uso comune per MPI è costituito dai carichi di lavoro di computing ad alte prestazioni (HPC) strettamente collegati.

Prima di iniziare

Crea ed esegui un job che utilizzi MPI per attività ad accoppiamento stretto

Questa sezione fornisce esempi su come creare un job che può utilizzare MPI. In particolare, il job di esempio ha tre elementi eseguibili:

  • Il primo eseguibile è uno script che prepara il job per MPI disabilitando il multithreading simultaneo e installando Intel MPI.
  • Il secondo elemento eseguibile è una barriera eseguibile vuota (formattata come { "barrier": {} }), che garantisce che tutte le attività terminino la configurazione dell'MPI prima di continuare con gli elementi eseguibili futuri.
  • Il terzo elemento eseguibile (e tutti gli eventuali elementi eseguibili successivi) è disponibile per il carico di lavoro del job.

Puoi creare un job che utilizza MPI per attività ad accoppiamento stretto utilizzando l'interfaccia a riga di comando gcloud o l'API Batch.

gcloud

Per creare un job di script che utilizza MPI per attività ad accoppiamento stretto utilizzando l'interfaccia a riga di comando gcloud, segui questi passaggi:

  1. Crea un file di configurazione JSON con i seguenti contenuti:

    {
        "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
            }
        ]
    }
    

    Sostituisci quanto segue:

    • SCRIPT: uno script eseguibile per un carico di lavoro che utilizza MPI.
    • TASK_COUNT: il numero di attività per il job. Il valore deve essere un numero intero compreso tra 1 e il limite di attività per gruppo di attività. Per utilizzare le librerie MPI fornite da Batch, questo campo è obbligatorio e deve essere impostato su 2 o su un valore superiore.
    • TASK_COUNT_PER_NODE: il numero di attività che un job può eseguire contemporaneamente su un'istanza VM. Per utilizzare le librerie MPI fornite da Batch, questo campo è obbligatorio e deve essere impostato su 1, che equivale a eseguire un'istanza VM per attività.
    • REQUIRE_HOSTS_FILE: se impostato su true, il job crea un file che elenca le istanze VM in esecuzione in un gruppo di attività. Il percorso del file viene archiviato nella variabile di ambiente BATCH_HOSTS_FILE. Per utilizzare le librerie MPI fornite da Batch, questo campo deve essere impostato su true.
    • PERMISSIVE_SSH: se impostato su true, Batch configura l'SSH per consentire la comunicazione senza password tra le istanze VM in esecuzione in un gruppo di attività. Per utilizzare le librerie MPI fornite da Batch, questo campo deve essere impostato su true.
  2. Per creare il job, utilizza il comando gcloud batch jobs submit.

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

    Sostituisci quanto segue:

    • JOB_NAME: il nome del job.
    • LOCATION: la località del lavoro.
    • JSON_CONFIGURATION_FILE: il percorso di un file JSON con i dettagli di configurazione del job.

Facoltativamente, puoi aumentare le prestazioni delle librerie MPI fornite da Batch seguendo questi passaggi:

Ad esempio, per creare un job di script da un modello di istanza che utilizza MPI e restituisce 1 attività come nome host delle 3 attività nel gruppo di attività:

  1. Crea nella directory corrente example-job-uses-mpi.json un file JSON con il seguente contenuto:

    {
        "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. Esegui questo comando:

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

API

Per creare un job di script che utilizzi un MPI per le attività ad accoppiamento stretto tramite l'API Batch, usa il metodo jobs.create e specifica i campi permissiveSsh, requireHostsFile, taskCount e taskCountPerNode.

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
        }
    ]
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID progetto del progetto.
  • LOCATION: la località del lavoro.
  • JOB_NAME: il nome del job.
  • SCRIPT: lo script eseguibile per un carico di lavoro che utilizza MPI.
  • TASK_COUNT: il numero di attività per il job. Il valore deve essere un numero intero compreso tra 1 e il limite di attività per gruppo di attività. Per utilizzare le librerie MPI fornite da Batch, questo campo è obbligatorio e deve essere impostato su 2 o su un valore superiore.
  • TASK_COUNT_PER_NODE: il numero di attività che un job può eseguire contemporaneamente su un'istanza VM. Per utilizzare le librerie MPI fornite da Batch, questo campo è obbligatorio e deve essere impostato su 1, che equivale a eseguire un'istanza VM per attività.
  • REQUIRE_HOSTS_FILE: se impostato su true, il job crea un file che elenca le istanze VM in esecuzione in un gruppo di attività. Il percorso file è archiviato nella variabile di ambiente BATCH_HOSTS_FILE. Per utilizzare le librerie MPI fornite da Batch, questo campo deve essere impostato su true.
  • PERMISSIVE_SSH: se impostato su true, Batch configura l'SSH per consentire la comunicazione senza password tra le istanze VM in esecuzione in un gruppo di attività. Per utilizzare le librerie MPI fornite da Batch, questo campo deve essere impostato su true.

Facoltativamente, puoi aumentare le prestazioni delle librerie MPI fornite da Batch seguendo questi passaggi:

Ad esempio, per creare un job di script da un modello di istanza che utilizza MPI e restituisce 1 attività come output del nome host delle tre attività nel gruppo di attività, utilizza la seguente richiesta:

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"
    }
}

dove PROJECT_ID è l'ID progetto del tuo progetto.

Passaggi successivi