Configurar a comunicação de tarefas usando uma biblioteca MPI

Neste documento, explicamos como configurar um job no Batch com tarefas fortemente acopladas que se comunicam entre si em diferentes VMs usando uma biblioteca de interface de transmissão de mensagens (MPI, na sigla em inglês).

Para jobs em lote, o acoplamento descreve as tarefas de interdependência. Isso influencia como você configura o número de tarefas que podem ser executadas em paralelo (em vez de sequencialmente) usando o campo parallelism de um job. As tarefas podem ser descritas usando os seguintes tipos de acoplamento:

  • Tarefas com acoplamento flexível:tarefas que podem ser executadas de maneira independente.
  • Tarefas com acoplamento rígido:tarefas que dependem umas das outras para serem executadas.

Outra opção é criar um job que use uma biblioteca de MPI para permitir que tarefas fortemente acopladas se comuniquem entre si em diferentes instâncias de VM. Um caso de uso comum para MPI são cargas de trabalho de computação de alto desempenho (HPC) com acoplamento rígido.

Antes de começar

Criar e executar um job que usa MPI para tarefas com acoplamento rígido

Nesta seção, fornecemos exemplos de como criar um job que pode usar MPI. O job de exemplo tem três executáveis:

  • O primeiro executável é um script que prepara o job para a MPI desativando o multithreading simultâneo e instalando a MPI da Intel.
  • O segundo executável é uma barreira executável vazia (formatada como { "barrier": {} }), que garante que todas as tarefas terminem de configurar a MPI antes de continuar para os executáveis futuros.
  • O terceiro executável (e qualquer executável subsequente) está disponível para a carga de trabalho do job.

É possível criar um job que use MPI para tarefas fortemente associadas usando a CLI gcloud ou a API Batch.

gcloud

Para criar um job de script que use MPI para tarefas com acoplamento rígido usando a CLI gcloud, faça o seguinte:

  1. Crie um arquivo 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:

    • SCRIPT: um script executável para uma carga de trabalho que usa MPI.
    • TASK_COUNT: o número de tarefas do job. O valor precisa ser um número inteiro entre 1 e o limite de tarefas por grupo de tarefas. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como 2 ou superior.
    • TASK_COUNT_PER_NODE: o número de tarefas que um job pode executar simultaneamente em uma instância de VM. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como 1, o que equivale a executar uma instância de VM por tarefa.
    • REQUIRE_HOSTS_FILE: quando definido como true, o job cria um arquivo listando as instâncias de VM em execução em um grupo de tarefas. O caminho do arquivo é armazenado na variável de ambiente BATCH_HOSTS_FILE. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo precisa ser definido como verdadeiro.
    • PERMISSIVE_SSH: quando definido como true, o Batch configura o SSH para permitir a comunicação sem senha entre as instâncias de VM em execução em um grupo de tarefas. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo precisa ser definido como "true".
  2. Para criar o job, use o comando gcloud batch jobs submit.

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

    Substitua:

    • JOB_NAME: o nome do job.
    • LOCATION: o local do job.
    • JSON_CONFIGURATION_FILE: o caminho de um arquivo JSON com os detalhes de configuração do job.

Como alternativa, é possível aumentar o desempenho das bibliotecas de MPI fornecidas pelo Batch fazendo o seguinte:

Por exemplo, para criar um job de script a partir de um modelo de instância que usa MPI e faz com que uma tarefa produza o nome do host das três tarefas no grupo de tarefas:

  1. Crie um arquivo JSON no diretório atual chamado example-job-uses-mpi.json com 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 este comando:

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

API

Para criar um job de script que use um MPI para tarefas fortemente associadas usando a 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:

  • PROJECT_ID: o ID do projeto (link em inglês).
  • LOCATION: o local do job.
  • JOB_NAME: o nome do job.
  • SCRIPT: o script executável para uma carga de trabalho que usa MPI.
  • TASK_COUNT: o número de tarefas do job. O valor precisa ser um número inteiro entre 1 e o limite de tarefas por grupo de tarefas. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como 2 ou superior.
  • TASK_COUNT_PER_NODE: o número de tarefas que um job pode executar simultaneamente em uma instância de VM. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como 1, o que equivale a executar uma instância de VM por tarefa.
  • REQUIRE_HOSTS_FILE: quando definido como true, o job cria um arquivo listando as instâncias de VM em execução em um grupo de tarefas. O caminho do arquivo é armazenado na variável de ambiente BATCH_HOSTS_FILE. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo precisa ser definido como "true".
  • PERMISSIVE_SSH: quando definido como true, o Batch configura o SSH para permitir a comunicação sem senha entre as instâncias de VM em execução em um grupo de tarefas. Para usar as bibliotecas de MPI fornecidas pelo Batch, esse campo precisa ser definido como verdadeiro.

Como alternativa, é possível aumentar o desempenho das bibliotecas de MPI fornecidas pelo Batch fazendo o seguinte:

Por exemplo, para criar um job de script baseado em um modelo de instância que usa MPI e faz com que uma tarefa produza o nome do host das três tarefas no grupo de tarefas, use a seguinte solicitação:

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

em que PROJECT_ID é o ID do projeto.

A seguir