Configurer la communication des tâches à l'aide d'une bibliothèque MPI

Ce document explique comment configurer un job par lot avec des tâches étroitement couplées qui communiquent entre elles sur différentes VM à l'aide d'une bibliothèque d'interface de transmission de messages (MPI, Message Passing Interface).

Pour les tâches par lot, le couplage décrit les tâches d'interdépendance. Cela a une incidence sur la configuration du nombre de tâches pouvant s'exécuter en parallèle (plutôt que de manière séquentielle) à l'aide du champ parallelism d'une tâche. Les tâches peuvent être décrites à l'aide des types de couplage suivants:

  • Tâches faiblement couplées:tâches qui peuvent s'exécuter indépendamment.
  • Tâches étroitement couplées:tâches qui dépendent les unes des autres pour s'exécuter.

Vous pouvez éventuellement créer une tâche qui utilise une bibliothèque MPI pour permettre aux tâches à couplage fort de communiquer entre elles sur différentes instances de VM. Un cas d'utilisation courant de MPI est l'utilisation de charges de travail de calcul hautes performances (HPC, High-Performance Computing) à couplage fort.

Avant de commencer

Créer et exécuter un job qui utilise l'indicateur MPI pour les tâches à couplage fort

Cette section fournit des exemples de création d'une tâche pouvant utiliser MPI. L'exemple de job comporte notamment trois exécutables:

  • Le premier exécutable est un script qui prépare la tâche pour MPI en désactivant le multithreading simultané et en installant Intel MPI.
  • Le deuxième exécutable est un exécutable de barrière vide (au format { "barrier": {} }), qui garantit que toutes les tâches terminent la configuration de l'élément MPI avant de passer aux futurs exécutables.
  • Le troisième exécutable (et tous les exécutables suivants) est disponible pour la charge de travail du job.

Vous pouvez créer un job qui utilise MPI pour les tâches à couplage fort à l'aide de gcloud CLI ou de l'API Batch.

gcloud

Pour créer une tâche de script utilisant MPI pour les tâches à couplage fort à l'aide de gcloud CLI, procédez comme suit:

  1. Créez un fichier de configuration JSON avec le contenu suivant:

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

    Remplacez les éléments suivants :

    • SCRIPT: script exécutable pour une charge de travail qui utilise MPI.
    • TASK_COUNT: nombre de tâches du job. La valeur doit être un nombre entier compris entre 1 et la limite de tâches par groupe de tâches. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ est obligatoire et doit être défini sur 2 ou une valeur supérieure.
    • TASK_COUNT_PER_NODE: nombre de tâches qu'une tâche peut exécuter simultanément sur une instance de VM. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ est obligatoire et doit être défini sur 1, ce qui équivaut à exécuter une instance de VM par tâche.
    • REQUIRE_HOSTS_FILE: lorsque la valeur est true, la tâche crée un fichier répertoriant les instances de VM en cours d'exécution dans un groupe de tâches. Le chemin d'accès au fichier est stocké dans la variable d'environnement BATCH_HOSTS_FILE. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ doit être défini sur "true".
    • PERMISSIVE_SSH: lorsque la valeur est true, Batch configure SSH pour permettre une communication sans mot de passe entre les instances de VM exécutées dans un groupe de tâches. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ doit être défini sur "true".
  2. Pour créer la tâche, utilisez la commande gcloud batch jobs submit.

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

    Remplacez les éléments suivants :

    • JOB_NAME: nom de la tâche.
    • LOCATION: lieu de la tâche.
    • JSON_CONFIGURATION_FILE: chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

Vous pouvez éventuellement augmenter les performances des bibliothèques MPI fournies par Batch en procédant comme suit:

Par exemple, pour créer une tâche de script à partir d'un modèle d'instance qui utilise MPI et génère une tâche qui génère le nom d'hôte des trois tâches dans le groupe de tâches:

  1. Dans le répertoire actuel, créez un fichier JSON nommé example-job-uses-mpi.json avec le contenu suivant:

    {
        "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. Exécutez la commande ci-dessous.

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

API

Pour créer une tâche de script qui utilise un MPI pour les tâches à couplage fort à l'aide de l'API Batch, utilisez la méthode jobs.create et spécifiez les champs permissiveSsh, requireHostsFile, taskCount et 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
        }
    ]
}

Remplacez les éléments suivants :

  • PROJECT_ID: ID de votre projet.
  • LOCATION: lieu de la tâche.
  • JOB_NAME: nom de la tâche.
  • SCRIPT: script exécutable pour une charge de travail utilisant MPI.
  • TASK_COUNT: nombre de tâches du job. La valeur doit être un nombre entier compris entre 1 et la limite de tâches par groupe de tâches. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ est obligatoire et doit être défini sur 2 ou une valeur supérieure.
  • TASK_COUNT_PER_NODE: nombre de tâches qu'une tâche peut exécuter simultanément sur une instance de VM. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ est obligatoire et doit être défini sur 1, ce qui équivaut à exécuter une instance de VM par tâche.
  • REQUIRE_HOSTS_FILE: lorsque la valeur est true, la tâche crée un fichier répertoriant les instances de VM exécutées dans un groupe de tâches. Le chemin d'accès au fichier est stocké dans la variable d'environnement BATCH_HOSTS_FILE. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ doit être défini sur "true".
  • PERMISSIVE_SSH: lorsque la valeur est true, Batch configure SSH pour autoriser la communication sans mot de passe entre les instances de VM exécutées dans un groupe de tâches. Pour utiliser les bibliothèques MPI fournies par Batch, ce champ doit être défini sur "true".

Vous pouvez éventuellement augmenter les performances des bibliothèques MPI fournies par Batch en procédant comme suit:

Par exemple, pour créer une tâche de script à partir d'un modèle d'instance qui utilise MPI et génère pour une tâche le nom d'hôte des trois tâches du groupe, utilisez la requête suivante:

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

PROJECT_ID est l'ID de votre projet.

Étapes suivantes