Configura la comunicazione delle attività utilizzando una libreria MPI

Questo documento spiega come configurare un job batch con ad attività strettamente accoppiate che comunicano tra loro su diverse VM tramite un'interfaccia MPI (Message Passing Interface) libreria.

Per i job batch, 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 Campo parallelism. Le attività possono essere descritte utilizzando i seguenti tipi di accoppiamento:

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

Se vuoi, puoi creare un job che utilizzi una libreria MPI per consentire alle attività fortemente accoppiate di comunicare tra loro in diverse istanze VM. Un caso d'uso comune per MPI è costituito da carichi di lavoro di computing ad alte prestazioni (HPC) strettamente collegati.

Prima di iniziare

  1. Se non hai mai utilizzato Batch, rivedi Inizia a utilizzare Batch e abilita Batch, completando prerequisiti per progetti e utenti.
  2. Per ottenere le autorizzazioni necessarie per creare un job, chiedi all'amministratore di concederti seguenti ruoli IAM:

    Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

  3. Se specifichi la rete per questo job, assicurati che la rete abbia una regola firewall che consenta le connessioni tra le VM del job. Scopri come configurare le regole firewall VPC per i casi d'uso comuni.

Creare ed eseguire un job che utilizza MPI per attività strettamente accoppiate

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

  • Il primo file eseguibile è uno script che prepara il job per MPI disattivando il multithreading simultaneo e installando Intel MPI.
  • Il secondo eseguibile è barriera eseguibile (con formattazione { "barrier": {} }), che garantisce il completamento di tutte le attività e configurare la MPI prima di continuare con gli eseguibili futuri.
  • Il terzo eseguibile (e gli eventuali eseguibili successivi) è disponibile per il carico di lavoro del job.

Puoi creare un job che utilizza MPI per attività strettamente accoppiate utilizzando la proprietà gcloud CLI o API Batch.

gcloud

Per creare un job di script che utilizza MPI per attività strettamente accoppiate utilizzando gcloud CLI, 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 versioni successive.
    • TASK_COUNT_PER_NODE: il numero di attività che un job può essere eseguito contemporaneamente su un'istanza VM. Per utilizzare le librerie MPI fornito 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 valore crea un file che elenca le istanze VM in esecuzione in un gruppo di attività. La il percorso del file è archiviato nella variabile di ambiente BATCH_HOSTS_FILE. Per usare le librerie MPI fornite da Batch, questo campo deve essere impostato su true.
    • PERMISSIVE_SSH: se impostato su true, Batch configura SSH per consentire la comunicazione senza password tra le istanze VM in esecuzione in un gruppo di attività. Per utilizzare Librerie MPI fornite da Batch, questo campo deve essere impostato su true.
  2. Per creare il job, utilizza 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.

Se vuoi, puoi aumentare le prestazioni delle librerie MPI fornite da Batch nel seguente modo:

Ad esempio, per creare un job di script da un modello di istanza che utilizza MPI e fa in modo che un'attività stampi il nome host delle tre attività nel gruppo di attività:

  1. Crea un file JSON nella directory corrente denominata example-job-uses-mpi.json con i seguenti contenuti:

    {
        "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 utilizza una MPI per attività strettamente accoppiate, utilizzando l'API Batch, utilizza Metodo jobs.create e specificare i permissiveSsh, requireHostsFile, taskCount e taskCountPerNode campi.

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: il ID progetto del tuo 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 l'MPI tramite le librerie fornite da Batch, questo campo è obbligatorio 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 fornito da Batch, questo campo è obbligatorio e deve essere impostato a 1, il 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 è memorizzato 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 SSH per consentire la comunicazione senza password tra le istanze VM in esecuzione in un gruppo di attività. Per utilizzare le librerie MPI fornito da Batch, questo campo deve essere impostato su true.

Facoltativamente, puoi aumentare le prestazioni delle librerie MPI fornite in batch:

Ad esempio, per creare un job di script da un modello di istanza che usa MPI e imposta un'attività come output del nome host delle tre attività nel gruppo, usa 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 è il ID progetto del tuo progetto.

Passaggi successivi