Melhorar a capacidade de obtenção usando a flexibilidade de instâncias

Este documento descreve como criar e executar um job do Batch que usa a flexibilidade da instância. A flexibilidade da instância permite que um job seja executado em vários tipos de máquina especificados e, opcionalmente, classificados.

Ao permitir mais tipos de máquina para um job, você pode usar a flexibilidade da instância para melhorar a capacidade de obtenção, que é a probabilidade de os recursos estarem disponíveis para executar o job. Para mais informações sobre como escolher os recursos de capacidade de obtenção a serem usados na carga de trabalho, consulte Melhorar a capacidade de obtenção de recursos. Por exemplo, o uso da flexibilidade da instância pode ajudar você a fazer o seguinte:

  • Reduzir a probabilidade de erros de disponibilidade de recursos e atrasos de programação relacionados.
  • Selecionar recursos com maior capacidade de obtenção para ajudar os jobs a serem concluídos mais cedo. Por exemplo:
    • Aumentar a probabilidade de conseguir mais instâncias para jobs que oferecem suporte ao processamento paralelo.
    • Conseguir VMs spot com menor probabilidade de serem interrompidas forçosamente.

Antes de começar

  1. 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.
  2. 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:

    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 com papéis personalizados ou outros papéis predefinidos.

Restrições

Quando um job usa a flexibilidade da instância, todas as restrições a seguir são aplicadas:

  • A melhoria da capacidade de obtenção aumenta com o número de tipos de máquina que você permite que um job use.

  • O job não pode especificar o modelo de provisionamento FLEX_START ou RESERVATION_BOUND.

  • O job não pode consumir uma reserva especificamente direcionada. O reservation campo precisa estar indefinido ou definido como NO_RESERVATION.

    Uma reserva especificamente direcionada inclui todas as reservas para o modelo de provisionamento RESERVATION_BOUND e algumas reservas para o modelo de provisionamento STANDARD. Esses recursos são inerentemente incompatíveis porque a criação de instâncias só pode ser bem-sucedida para o tipo de máquina da reserva.

  • Cada job pode ter até 50 seleções de instância.

  • Cada seleção de instância em um job precisa ter um nome exclusivo, uma classificação exclusiva e um ou mais tipos de máquina exclusivos.

  • Os tipos de máquina não podem se repetir. Inclua cada tipo de máquina em apenas uma seleção de instância por job.

  • Cada job pode ter até 200 tipos de máquina exclusivos nas seleções de instância.

  • Embora a especificação de vários tipos de máquina na mesma seleção de instância seja opcional, ela é necessária se você quiser recursos com maior capacidade de obtenção.

    • O Batch tenta selecionar um ou mais tipos de máquina com a maior capacidade de obtenção somente quando a seleção de instância para uma classificação tem vários tipos de máquina. Por exemplo, essa seleção é importante se você quiser que o job tenha VMs spot com menor probabilidade de serem interrompidas forçosamente ou mais instâncias para um job que possa executar tarefas em paralelo.
    • Caso contrário, quando a seleção de instância para uma classificação tiver apenas um tipo de máquina, a flexibilidade da instância só ajudará a evitar erros de disponibilidade de recursos.
  • O job não pode incluir o machineType campo, e o tipo de máquina de qualquer modelo de instância especificado pelo job será ignorado.

  • É necessário verificar se todas as propriedades especificadas para o job são compatíveis com todos tipo de máquina permitidos. Caso contrário, o job poderá falhar após o envio porque não é possível criar instâncias. Por exemplo, recomendamos que você verifique se pelo menos as seguintes propriedades de um job são compatíveis com todos os tipos de máquina:

    • localização (se especificado, campo allowedLocations[]; caso contrário, location)
    • recursos de computação por tarefa (campo computeResource)
    • discos e imagens (campos volumes[], disk[] e bootDisk)
    • rede (campo network)
    • todas as outras propriedades da instância (subcampos instances[]):

      • plataforma mínima de CPU (campo minCpuPlatform)
      • modelo de provisionamento (campo provisioningModel)
      • GPUs (campo accelerators[])
  • Não é possível substituir discos e plataformas mínimas de CPU para jobs do Batch. Todos os tipos de máquina usam os valores especificados (nos subcampos policy ou em um modelo de instância) ou, se não especificados, usam os valores padrão para um tipo de máquina na seleção de instância de maior prioridade. Consequentemente, recomendamos que você faça o seguinte:

    • Verifique se o tipo de disco de inicialização é compatível com todos os tipos de máquina permitidos. Em resumo, os tipos de máquina da quarta geração e mais recentes não oferecem suporte a discos permanentes, os tipos de máquina da segunda geração e anteriores não oferecem suporte ao hiperdisco, e os tipos de máquina da terceira geração e anteriores usam discos de inicialização permanentes por padrão.

    • Não especifique uma plataforma mínima de CPU ou discos opcionais, a menos que você tenha verificado se eles são compatíveis com todos tipo de máquina permitidos.

Criar um job que possa usar vários tipos de máquina

Para criar um job que possa usar vários tipos de máquina, selecione um dos métodos a seguir.

gcloud

Para configurar vários tipos de máquina ao usar a Google Cloud CLI para criar um job, siga estas etapas:

  1. Inclua o instanceFlexibilityPolicy campo e os subcampos no allocationPolicy campo no arquivo JSON que especifica os detalhes de configuração do job. O campo instanceFlexibilityPolicy oferece suporte a uma ou mais seleções de instância, cada uma com um nome exclusivo, uma classificação exclusiva e uma lista de um ou mais tipos de máquina.

    "allocationPolicy":{
      "instanceFlexibilityPolicy":{
        "instanceSelections":{
          "INSTANCE_SELECTION_NAME":{
            "rank": RANK,
            "machineTypes": [MACHINE_TYPES]
          }
        }
      }
    }
    

    Substitua:

    • INSTANCE_SELECTION_NAME: um nome para a seleção da instância. Se o job tiver várias seleções de instância, verifique se cada nome nesse job é exclusivo.

    • RANK: opcional: um número inteiro de zero ou maior que representa a prioridade dessa seleção de instância, em que o valor mais baixo é a maior prioridade. Se não for especificado, o valor padrão será 0 (maior prioridade). Se o job tiver várias seleções de instância, verifique se cada classificação nesse job é exclusiva.

    • MACHINE_TYPES: uma lista separada por vírgulas de um ou mais tipos de máquina, que são escritos como strings, para essa seleção de instância. É possível incluir cada tipo de máquina em apenas uma seleção de instância por job. Por exemplo, uma lista de três tipos de máquina pode ser escrita da seguinte maneira:

      "MACHINE_TYPE_1", "MACHINE_TYPE_2", "MACHINE_TYPE_3"
      

      Substitua MACHINE_TYPE_1, MACHINE_TYPE_2, MACHINE_TYPE_3 por um tipo de máquina. Por exemplo, e2-micro, e2-small e n1-standard-2.

    Para mais informações, consulte também o job de exemplo.

  2. Enquanto esse recurso estiver na versão prévia, será necessário usar o gcloud alpha batch jobs submit comando para criar e enviar o job.

    gcloud alpha 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 para um arquivo JSON com os detalhes de configuração do job.

REST

Para usar a API Batch para criar um job que usa vários tipos de máquina, use o método jobs.create da v1alpha enquanto esse recurso estiver na versão prévia.

Para especificar vários tipos de máquina para um job, inclua o instanceFlexibilityPolicy campo e subcampos no campo allocationPolicy no corpo principal do arquivo JSON. O campo instanceFlexibilityPolicy oferece suporte a uma ou mais seleções de instância, cada uma com um nome exclusivo, uma classificação exclusiva e uma lista de um ou mais tipos de máquina.

"allocationPolicy":{
  "instanceFlexibilityPolicy":{
    "instanceSelections":{
      "INSTANCE_SELECTION_NAME":{
        "rank": RANK,
        "machineTypes": [MACHINE_TYPES]
      }
    }
  }
}

Substitua:

  • INSTANCE_SELECTION_NAME: um nome para a seleção da instância. Se o job tiver várias seleções de instância, verifique se cada nome nesse job é exclusivo.

  • RANK: opcional: um número inteiro de zero ou maior que representa a prioridade dessa seleção de instância, em que o valor mais baixo é a maior prioridade. Se não for especificado, o valor padrão será 0 (maior prioridade). Se o job tiver várias seleções de instância, verifique se cada classificação nesse job é exclusiva.

  • MACHINE_TYPES: uma lista separada por vírgulas de um ou mais tipos de máquina, que são escritos como strings, para essa seleção de instância. É possível incluir cada tipo de máquina em apenas uma seleção de instância por job. Por exemplo, uma lista de três tipos de máquina pode ser escrita da seguinte maneira:

    "MACHINE_TYPE_1", "MACHINE_TYPE_2", "MACHINE_TYPE_3"
    

    Substitua MACHINE_TYPE_1, MACHINE_TYPE_2, MACHINE_TYPE_3 por um tipo de máquina. Por exemplo, e2-micro, e2-small e n1-standard-2.

Para mais informações, consulte também o job de exemplo.

Exemplo de arquivo de configuração JSON do job

Por exemplo, ao usar a CLI gcloud ou a API Batch, é possível usar o seguinte arquivo de configuração JSON para criar um job de script básico que tenha duas seleções de instância:

  • A seleção de instância chamada first-choice tem a maior prioridade ("rank": 0) e três tipos de máquina (e2-micro, e2-small, e n1-standard-2).
  • A seleção de instância chamada second-choice tem a segunda prioridade ("rank": 1) e um tipo de máquina (e2-medium).
{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello World! This is task $BATCH_TASK_INDEX."
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy":{
    "instanceFlexibilityPolicy":{
      "instanceSelections":{
        "first-choice":{
          "rank": 0,
          "machineTypes": ["e2-micro", "e2-small", "n1-standard-2"]
        },
        "second-choice":{
          "rank": 1,
          "machineTypes": ["e2-medium"]
        }
      }
    }
  }
}

A seguir