Neste documento, explicamos como configurar um job em lote do Batch com tarefas de acoplamento rígido 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 do Batch,
o acoplamento
descreve as tarefas de interdependência. Isso influencia a forma 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 de acoplamento flexível:tarefas que podem ser executadas de forma independente.
- Tarefas de acoplamento rígido:tarefas que dependem umas das outras para serem executadas.
Opcionalmente, você pode criar um job que usa uma biblioteca MPI para permitir que tarefas de acoplamento rígido 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, na sigla em inglês) de acoplamento rígido.
Antes de começar
- Se você nunca usou o Batch, consulte Introdução ao Batch e ative o serviço concluindo os pré-requisitos para projetos e usuários.
-
Para receber as permissões necessárias para criar um job, peça ao administrador para conceder a você os seguintes papéis do IAM:
- Editor de jobs do Batch (
roles/batch.jobsEditor) no projeto - Usuário da conta de serviço (
roles/iam.serviceAccountUser) na conta de serviço do job, que, por padrão, é a conta de serviço padrão do Compute Engine
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias usando personalizados papéis ou outros predefinidos papéis.
- Editor de jobs do Batch (
- Se você especificar a rede para esse job, verifique se ela tem uma regra de firewall que permite conexões entre as VMs do job. Saiba como configurar regras de firewall da VPC para casos de uso comuns.
Criar e executar um job que usa MPI para tarefas de acoplamento rígido
Esta seção fornece 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 MPI by desativando a multithreading simultânea e instalando o Intel MPI.
- O segundo executável é um executável de barreira vazio
(formatado como
{ "barrier": {} }), que garante que todas as tarefas terminem de configurar o MPI antes de continuar para os próximos executáveis. - O terceiro executável (e todos os executáveis subsequentes) está disponível para a carga de trabalho do job.
É possível criar um job que usa MPI para tarefas de acoplamento rígido usando a CLI gcloud ou a API Batch.
gcloud
Para criar um job de script que usa MPI para tarefas de acoplamento rígido usando a CLI gcloud, faça o seguinte:
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 executável de script 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 entre1e o limite de tarefas por grupo de tarefas. Para usar as bibliotecas MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como2ou maior.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 MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como1, o que equivale a executar uma instância de VM por tarefa.REQUIRE_HOSTS_FILE: quando definido comotrue, 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 ambienteBATCH_HOSTS_FILE. Para usar as bibliotecas MPI fornecidas pelo Batch, esse campo precisa ser definido como verdadeiro.PERMISSIVE_SSH: quando definido comotrue, 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 MPI fornecidas pelo Batch, esse campo precisa ser definido como verdadeiro.
Para criar o job, use o
gcloud batch jobs submitcomando.gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILESubstitua:
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.
Opcionalmente, você pode aumentar a performance das bibliotecas MPI fornecidas pelo Batch fazendo o seguinte:
- Crie e execute um job usando um modelo de instância de VM e especifique um modelo de instância de VM pronto para HPC nos recursos do job.
- Especifique Cloud Logging como o destino das informações de registro do job nos recursos dele.
Por exemplo, para criar um job de script de um modelo de instância que usa MPI e faz com que uma tarefa gere o nome do host das três tarefas no grupo de tarefas:
Crie um arquivo JSON no diretório atual chamado
example-job-uses-mpi.jsoncom 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" } }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 usa um MPI para tarefas de acoplamento rígido usando
a API Batch, use o
jobs.create método
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.LOCATION: o local do job.JOB_NAME: o nome do job.SCRIPT: o executável de script 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 entre1e o limite de tarefas por grupo de tarefas. Para usar as bibliotecas MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como2ou maior.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 MPI fornecidas pelo Batch, esse campo é obrigatório e precisa ser definido como1, o que equivale a executar uma instância de VM por tarefa.REQUIRE_HOSTS_FILE: quando definido comotrue, 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 ambienteBATCH_HOSTS_FILE. Para usar as bibliotecas MPI fornecidas pelo Batch, esse campo precisa ser definido como verdadeiro.PERMISSIVE_SSH: quando definido comotrue, 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 MPI fornecidas pelo Batch, esse campo precisa ser definido como verdadeiro.
Opcionalmente, você pode aumentar a performance das bibliotecas MPI fornecidas pelo Batch fazendo o seguinte:
- Crie e execute um job usando um modelo de instância de VM e especifique um modelo de instância de VM pronto para HPC nos recursos do job.
- Especifique Cloud Logging como o destino das informações de registro do job nos recursos dele.
Por exemplo, para criar um job de script de um modelo de instância que usa MPI e faz com que uma tarefa gere 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
do seu projeto.
A seguir
- Para um exemplo mais detalhado de um job que usa MPI para tarefas de acoplamento rígido, consulte Executar o modelo de pesquisa e previsão do tempo com o Batch.
- Saiba como reduzir a latência de jobs com tarefas de acoplamento rígido.
- Se você tiver problemas para criar ou executar um job, consulte Solução de problemas.
- Ver jobs e tarefas.
- Saiba mais sobre as opções de criação de jobs.