Configure a comunicação de tarefas através de uma biblioteca MPI

Este documento explica como configurar uma tarefa em lote com tarefas estreitamente associadas que comunicam entre si em diferentes VMs através de uma biblioteca Message Passing Interface (MPI).

Para tarefas em lote, a associação descreve as tarefas de interdependência. Isto influencia a forma como configura o número de tarefas que podem ser executadas em paralelo (em vez de sequencialmente) através do campo parallelism de uma tarefa. As tarefas podem ser descritas através dos seguintes tipos de associação:

  • Tarefas pouco acopladas: tarefas que podem ser executadas de forma independente.
  • Tarefas fortemente interligadas: tarefas que dependem umas das outras para serem executadas.

Opcionalmente, pode criar uma tarefa que use uma biblioteca MPI para permitir que as tarefas fortemente acopladas comuniquem entre si em diferentes instâncias de VMs. Um exemplo de utilização comum do MPI são as cargas de trabalho de computação de alto desempenho (HPC) fortemente acopladas.

Antes de começar

  1. Se nunca usou o Batch, reveja o artigo Comece a usar o Batch e ative o Batch concluindo os pré-requisitos para projetos e utilizadores.
  2. Para receber as autorizações de que precisa para criar uma tarefa, peça ao seu administrador para lhe conceder as seguintes funções de IAM:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

  3. Se especificar a rede para esta tarefa, certifique-se de que a rede tem uma regra de firewall que permite ligações entre as VMs da tarefa. Saiba como configurar regras de firewall de VPC para exemplos de utilização comuns.

Crie e execute uma tarefa que use MPI para tarefas fortemente acopladas

Esta secção fornece exemplos de como criar uma tarefa que pode usar a MPI. Em particular, a tarefa de exemplo tem 3 executáveis:

  • O primeiro executável é um script que prepara a tarefa para a MPI através da desativação da multithreading simultânea e da instalação da Intel MPI.
  • O segundo executável é um executável de barreira vazio (formatado como { "barrier": {} }), que garante que todas as tarefas terminam de configurar a MPI antes de continuar para executáveis futuros.
  • O terceiro executável (e todos os executáveis subsequentes) está disponível para a carga de trabalho da tarefa.

Pode criar uma tarefa que use a MPI para tarefas fortemente acopladas através da CLI gcloud ou da API Batch.

gcloud

Para criar uma tarefa de script que use MPI para tarefas fortemente acopladas através da CLI gcloud, faça o seguinte:

  1. Crie um ficheiro de configuração JSON com o seguinte conteúdo:

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

    Substitua o seguinte:

    • SCRIPT: um script executável para uma carga de trabalho que usa MPI.
    • TASK_COUNT: o número de tarefas para o trabalho. O valor tem de ser um número inteiro entre 1 e o limite de tarefas por grupo de tarefas. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo é obrigatório e tem de ser definido como 2 ou superior.
    • TASK_COUNT_PER_NODE: o número de tarefas que um trabalho pode executar em simultâneo numa instância de VM. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo é obrigatório e tem de ser definido como 1, o que equivale a executar uma instância de VM por tarefa.
    • REQUIRE_HOSTS_FILE: quando definida como true, a tarefa cria uma lista de ficheiros com as instâncias de VM em execução num grupo de tarefas. O caminho do ficheiro está armazenado na variável de ambiente BATCH_HOSTS_FILE. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo tem de ser definido como verdadeiro.
    • PERMISSIVE_SSH: quando definido como true, o Batch configura o SSH para permitir a comunicação sem palavra-passe entre as instâncias de VM em execução num grupo de tarefas. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo tem de ser definido como verdadeiro.
  2. Para criar a tarefa, use o comando gcloud batch jobs submit.

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

    Substitua o seguinte:

    • JOB_NAME: o nome da tarefa.
    • LOCATION: a localização do trabalho.
    • JSON_CONFIGURATION_FILE: o caminho para um ficheiro JSON com os detalhes de configuração da tarefa.

Opcionalmente, pode aumentar o desempenho das bibliotecas da MPI fornecidas pelo Batch fazendo o seguinte:

Por exemplo, para criar uma tarefa de script a partir de um modelo de instância que usa MPI e faz com que 1 tarefa produza o nome do anfitrião das 3 tarefas no grupo de tarefas:

  1. Crie um ficheiro JSON no diretório atual com o nome example-job-uses-mpi.json e o seguinte conteúdo:

    {
        "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. Execute o seguinte comando:

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

API

Para criar uma tarefa de script que use uma MPI para tarefas fortemente acopladas através da API Batch, use o método jobs.create e especifique os campos 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
        }
    ]
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto do seu projeto.
  • LOCATION: a localização do trabalho.
  • JOB_NAME: o nome da tarefa.
  • SCRIPT: o script executável para uma carga de trabalho que usa MPI.
  • TASK_COUNT: o número de tarefas para o trabalho. O valor tem de ser um número inteiro entre 1 e o limite de tarefas por grupo de tarefas. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo é obrigatório e tem de ser definido como 2 ou superior.
  • TASK_COUNT_PER_NODE: o número de tarefas que um trabalho pode executar em simultâneo numa instância de VM. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo é obrigatório e tem de ser definido como 1, o que equivale a executar uma instância de VM por tarefa.
  • REQUIRE_HOSTS_FILE: quando definido como true, a tarefa cria uma lista de ficheiros com as instâncias de VM em execução num grupo de tarefas. O caminho do ficheiro está armazenado na variável de ambiente BATCH_HOSTS_FILE. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo tem de ser definido como verdadeiro.
  • PERMISSIVE_SSH: quando definido como true, o Batch configura o SSH para permitir a comunicação sem palavra-passe entre as instâncias de VM em execução num grupo de tarefas. Para usar as bibliotecas MPI fornecidas pelo Batch, este campo tem de estar definido como verdadeiro.

Opcionalmente, pode aumentar o desempenho das bibliotecas da MPI fornecidas pelo Batch fazendo o seguinte:

Por exemplo, para criar uma tarefa de script a partir de um modelo de instância que usa MPI e faz com que 1 tarefa produza o nome do anfitrião das 3 tarefas no grupo de tarefas, use o seguinte pedido:

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

onde PROJECT_ID é o ID do projeto do seu projeto.

O que se segue?