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

Ce document explique comment configurer un job Batch avec des tâches à couplage fort qui communiquent entre elles sur différentes VM à l'aide d'une bibliothèque Message Passing Interface (MPI).

Pour les jobs par lot, le couplage décrit les tâches interdépendantes. Il influence la façon dont vous configurez le nombre de tâches pouvant s'exécuter en parallèle (au lieu de séquentiellement) à l'aide du champ parallelism d'un job. Les tâches peuvent être décrites à l'aide des types de couplage suivants :

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

Vous pouvez également créer un job qui utilise une bibliothèque MPI pour permettre aux tâches étroitement couplées de communiquer entre elles sur différentes instances de VM. MPI est souvent utilisé pour les charges de travail de calcul hautes performances (HPC) à couplage fort.

Avant de commencer

  1. Si vous n'avez jamais utilisé Batch, consultez Premiers pas avec Batch et activez Batch en remplissant les conditions préalables pour les projets et les utilisateurs.
  2. Pour obtenir les autorisations nécessaires pour créer un job, demandez à votre administrateur de vous accorder les rôles IAM suivants :

    Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

  3. Si vous spécifiez le réseau pour ce job, assurez-vous qu'il comporte une règle de pare-feu autorisant les connexions entre les VM du job. Découvrez comment configurer des règles de pare-feu VPC pour les cas d'utilisation courants.

Créer et exécuter un job qui utilise MPI pour les tâches étroitement liées

Cette section fournit des exemples de création d'un job pouvant utiliser MPI. L'exemple de job comporte trois exécutables :

  • Le premier exécutable est un script qui prépare le job 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 (formaté en tant que { "barrier": {} }), qui garantit que toutes les tâches terminent la configuration de MPI avant de passer aux exécutables suivants.
  • 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 étroitement couplées à l'aide de gcloud CLI ou de l'API Batch.

gcloud

Pour créer un job de script qui utilise MPI pour les tâches étroitement couplées à l'aide de gcloud CLI, procédez comme suit :

  1. Créez un fichier de configuration JSON contenant les éléments suivants :

    {
        "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 pour le 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 version ultérieure.
    • TASK_COUNT_PER_NODE : nombre de tâches qu'un job 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 définie sur true, le job crée un fichier listant 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 définie sur 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".
  2. Pour créer le job, 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 du job.
    • LOCATION : emplacement du job.
    • JSON_CONFIGURATION_FILE : chemin d'accès à un fichier JSON contenant les détails de configuration du job.

Vous pouvez également améliorer les performances des bibliothèques MPI fournies par Batch en procédant comme suit :

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

  1. Créez un fichier JSON dans le répertoire actuel 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 suivante :

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

API

Pour créer un job de script qui utilise MPI pour les tâches étroitement couplées à 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 projet de votre projet.
  • LOCATION : emplacement du job.
  • JOB_NAME : nom du job.
  • SCRIPT : script exécutable pour une charge de travail qui utilise MPI.
  • TASK_COUNT : nombre de tâches pour le 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 version ultérieure.
  • TASK_COUNT_PER_NODE : nombre de tâches qu'un job 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 définie sur true, le job crée un fichier listant 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 définie sur 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 également améliorer les performances des bibliothèques MPI fournies par Batch en procédant comme suit :

Par exemple, pour créer un job de script à partir d'un modèle d'instance qui utilise MPI et qui fait en sorte qu'une tâche génère le nom d'hôte des trois tâches du groupe de tâches, 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 correspond à l'ID de projet de votre projet.

Étapes suivantes