Garantir a disponibilidade de recursos usando reservas de VM

Este documento explica como criar jobs que são executados em recursos reservados e como bloquear o consumo de reservas por jobs.

As reservas são um recurso do Compute Engine. Uma reserva oferece um nível muito alto de garantia na obtenção da capacidade para uma ou mais VMs com os configuração de hardware especificada. A reserva de uma VM gera os custos essa VM desde a criação até a exclusão da reserva. Mas, embora estiver consumindo aquela VM, o custo total será equivalente ao de uma VM sem reserva.

Em geral, as reservas são úteis quando a disponibilidade de capacidade é extremamente importante ou para evitar erros na obtenção de recursos. Especificamente para o Batch, considere usar reservas dedicadas para minimizar o tempo de agendamento de jobs ou tentar usar reservas enquanto não estão sendo usadas. Se você tiver reservas subutilizadas, como as necessárias para descontos por uso contratado, é possível configurar jobs para tentar consumi-las enquanto elas não estão sendo usadas para ajudar a otimizar seus custos incorridos. Como alternativa, se você quiser priorizar a disponibilidade de recursos para outras cargas de trabalho no projeto, bloquear explicitamente o consumo de reservas por um job.

Para saber mais sobre reservas, consulte a documentação do Compute Engine para reservas.

Antes de começar

  1. Se você nunca usou o Batch antes, revise Introdução ao Batch e ativar o Batch. pré-requisitos para projetos e usuários.
  2. Verifique se você tem as permissões para criar uma reserva ou ver uma reserva existente que você quer que as VMs de um job consumam conforme necessário.
  3. Para ter 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 por meio de papéis personalizados ou de outros papéis predefinidos.

Restrições

Além das restrições gerais para reservas, os lotes também têm as seguintes restrições:

Requisitos

Esta seção resume os requisitos para que as VMs de um job consumam uma reserva. Para mais informações sobre todos os requisitos, consulte a requisitos gerais para reservas na documentação do Compute Engine procedimento para planejar sua configuração mais adiante neste documento.

  • Para que as VMs de um job possam consumir uma reserva, todas as seguintes condições precisam ser atendidas:

    • O job e a reserva precisam especificar as propriedades da VM que correspondem exatamente.

    • Você deve cumprir todas as restrições neste documento e todos os outros requisitos gerais para reservas.

  • Para que cada uma das VMs de um job consuma uma reserva, a reserva precisa ter capacidade não utilizada disponível durante o tempo de execução da VM.

    A capacidade não utilizada de uma reserva é a diferença entre o Contagem de VMs e o número de VMs consumindo-as no momento. As VMs tentam consumir reservas sempre que você tem capacidade de reserva não utilizada. Assim, uma VM pode começar a consumir reserva quando a VM é criada ou posteriormente no ambiente de execução. Uma VM param de consumir uma reserva até que a VM pare de ser executada ou até que a reserva seja excluída.

    Dependendo da capacidade total de reserva não utilizada, nenhuma, algumas ou todas as VMs de um job podem consumir reservas, e a quantidade de VMs reservadas pode variar durante a execução do job.

Criar e executar um job que possa consumir VMs reservadas

  1. Planeje sua configuração. Para garantir que o job e a reserva sejam compatíveis, conclua as etapas a seguir.

    Se você quiser consumir uma reserva que já existe, crie uma job com uma configuração correspondente. Caso contrário, se você planeja criar uma nova reserva, selecione as opções de configuração que preferir.

    1. Determinar as propriedades da reserva. Devido às restrições, o tipo de compartilhamento precisa ser de projeto único, que é o padrão para fazer uma reserva. Determine os valores que você quer usar para as seguintes propriedades de reserva:

      • Tipo de consumo*
      • Contagem de VMs

      *O valor tipo de consumo (segmentado especificamente ou consumido automaticamente) determina quais VMs podem consumir a reserva.

      O Contagem de VMs representa a capacidade total de uma reserva. Ao decidir esse valor, considere o número de VMs do job.

    2. Determine as propriedades da VM para o job e a reserva. Devido às restrições, nem o job nem a reserva podem especificar uma política de posicionamento compacto, que é a opção padrão para reservas e jobs. Determine os valores que você quer usar para o seguinte Propriedades da VM, que precisam corresponder exatamente. para a reserva e o job:

      • Projeto
      • Zona*
      • Tipo de máquina
      • Plataforma mínima de CPU (se houver*)
      • Tipo e contagem de GPU (se houver*)
      • Tipo e contagem de SSD local (se houver)
      • Afinidade de reserva#

      *As VMs do job precisam estar localizadas na mesma zona que o VMs reservadas. Inclua essa zona no campo allowedLocations[] do job ou, se o campo allowedLocations[] for omitido, defina a localização do job como a região que contém essa zona.

      O job precisa definir todas essas propriedades usando os subcampos policy ou um modelo de instância de VM. Um job não pode especificar uma combinação de subcampos policy e um modelo.

      Um campo opcional não pode ser definido para um recurso e omitido do outro. Defina ou omita o campo opcional para os reserva e o job. Se o job especificar um modelo de instância de VM, isso também se aplica aos campos do modelo especificado.

      #O tipo de consumo da reserva determina a afinidade de reserva necessária para as VMs do job, que precisa ser especificada no job da seguinte maneira:

      • Se o job estiver usando um modelo de instância de VM, o modelo precisará Configure a afinidade das reservas, conforme explicado na documentação de reservas.
      • Se o job não estiver usando um modelo e a reserva for direcionada especificamente, especifique o nome da reserva no campo reservation do job.
      • Caso contrário, se o job não estiver usando um modelo e a reserva for consumida automaticamente, omita o campo reservation do job.
  2. Prepare a reserva. Caso ainda não tenha feito isso, criar a reserva que você quer que as VMs do job consumam. Verifique se a reserva tem o propriedades que planejou.

  3. Crie e execute o job. É possível criar e executar um job que consuma VMs da reserva preparada usando o CLI gcloud ou API Batch:

    gcloud

    1. Crie um arquivo JSON que especifique os detalhes de configuração do job e defina os subcampos do recurso de instância de VM (instances[]) para corresponder exatamente às propriedades da VM de uma reserva.

      Por exemplo, para criar um job de script básico que consome VMs de uma reserva, crie um arquivo JSON com o seguinte conteúdo:

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      Substitua VM_RESOURCES pelos recursos de VM que correspondem à reserva que você quer que o job consuma, especificando os subcampos instances[] que você planejou nas etapas anteriores.

      Por exemplo, comece com o seguinte valor para VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      Para usar esse valor, faça as seguintes mudanças:

      1. Você quer usar um modelo de instância?

        • Sim:substitua policy com o campo instanceTemplate e especificar um Modelo de instância de VM que corresponde à reserva. Por exemplo: consulte o exemplo de código usando um modelo de instância de VM. Se a reserva usar GPUs ou SSDs locais, também será necessário configurar o campo installGpuDrivers e volumes[] do job, respectivamente. Caso contrário, pule as mudanças.

        • Não:substitua MACHINE_TYPE por o mesmo tipo de máquina da reserva.

      2. A reserva inclui uma plataforma mínima de CPU?

        • Sim: substitua MIN_CPU_PLATFORM pela mesma plataforma mínima de CPU.

        • Não: remova o campo minCpuPlatform.

      3. A reserva inclui GPUs?

        • Sim: substitua INSTALL_GPU_DRIVERS, GPU_TYPE e GPU_COUNT para corresponder à reserva. Por exemplo, consulte o exemplo de código usando GPUs.

        • Não:remova o campo installGpuDrivers e o accelerators[].

      4. A reserva inclui SSDs locais?

        • Sim: substitua LOCAL_SSD_SIZE e LOCAL_SSD_NAME para corresponder à reserva e monte os SSDs locais adicionando o campo volumes[] ao job. Por exemplo, consulte o exemplo de código para usar SSDs locais.

        • Não: remova o campo disks[].

      5. A reserva usa o tipo de consumo segmentado especificamente?

        • Sim: substitua SPECIFIC_RESERVATION_NAME pelo nome da reserva.

        • Não:remova o campo reservation.

      Por exemplo, suponha que você esteja usando uma reserva para n2-standard-32 VMs que não especifique nenhuma plataforma mínima de CPU, GPUs ou SSDs locais. Além disso, você Você não quer especificar um modelo de instância de VM. Nesse caso, substitua VM_RESOURCES. pelo seguinte valor:

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. Para criar e executar 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 trabalho. A menos que o job especifique o campo allowedLocations[], ele precisa ser a região que contém a zona da reserva.

      • JSON_CONFIGURATION_FILE: o caminho para um arquivo JSON com os detalhes de configuração do job.

    API

    Faça uma solicitação POST para o método jobs.create que define os subcampos de recurso de instância de VM (instances[]) para corresponder exatamente às propriedades de VM de uma reserva.

    Por exemplo, para criar um job de script básico que consome VMs de uma reserva, faça a seguinte solicitação:

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Substitua:

    • PROJECT_ID: o ID do projeto do seu projeto.

    • LOCATION: o local do trabalho. A menos que o job especifique allowedLocations[], precisa ser a região que contém a zona da reserva.

    • JOB_NAME: o nome do job.

    • VM_RESOURCES: os recursos da VM que correspondem à reserva que você quer que o job consuma, especificando os subcampos instances[] que você planejou nas etapas anteriores.

      Por exemplo, comece com o seguinte valor para VM_RESOURCES:

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }

      Para usar esse valor, faça as seguintes mudanças:

      1. Você quer usar um modelo de instância?

        • Sim: substitua o campo policy pelo campo instanceTemplate e especifique um modelo de instância de VM existente que corresponda à reserva. Por exemplo, confira o exemplo de código para usar um modelo de instância de VM. Se a reserva usar GPUs ou SSDs locais, também será necessário configurar o campo installGpuDrivers e volumes[] do job, respectivamente. Caso contrário, pule as mudanças.

        • Não:substitua MACHINE_TYPE por o mesmo tipo de máquina da reserva.

      2. A reserva inclui uma plataforma mínima de CPU?

        • Sim: substitua MIN_CPU_PLATFORM pela mesma plataforma mínima de CPU.

        • Não: remova o campo minCpuPlatform.

      3. A reserva inclui GPUs?

        • Sim: substitua INSTALL_GPU_DRIVERS, GPU_TYPE e GPU_COUNT para corresponder à reserva. Por exemplo, consulte o exemplo de código usando GPUs.

        • Não: remova o campo installGpuDrivers e o campo accelerators[].

      4. A reserva inclui SSDs locais?

        • Sim:substitua LOCAL_SSD_SIZE e LOCAL_SSD_NAME para corresponder à reserva; e montar os SSDs locais adicionando Campo volumes[] para o trabalho. Por exemplo, consulte o exemplo de código para usar SSDs locais.

        • Não: remova o campo disks[].

      5. A reserva usa o tipo de consumo segmentado especificamente?

        • Sim: substitua SPECIFIC_RESERVATION_NAME pelo nome da reserva.

        • Não:remova o campo reservation.

      Por exemplo, suponha que você esteja usando uma reserva consumida automaticamente para VMs n2-standard-32 que não especifique nenhuma plataforma de CPU mínima, GPUs ou SSDs locais. Além disso, você Você não quer especificar um modelo de instância de VM. Nesse caso, substitua VM_RESOURCES. pelo seguinte valor:

      "policy": {
        "machineType": "n2-standard-32"
      }

Criar e executar um job que não pode consumir VMs reservadas

Para impedir que um job consuma reservas, defina o campo reservation como NO_RESERVATION. Para mais informações sobre como evitar o consumo de reservas, consulte Crie VMs sem consumir reservas na documentação do Compute Engine.

É possível criar e executar um job que não pode consumir nenhuma VM reservada usando o CLI gcloud ou API Batch.

gcloud

  1. criar um arquivo JSON que especifique os detalhes e conjuntos de configuração do job o campo reservation como NO_RESERVATION.

    Por exemplo, para criar um job de script básico que não pode consumir reservas, crie um arquivo JSON com o seguinte conteúdo:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. Para criar e executar 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 trabalho.

    • JSON_CONFIGURATION_FILE: o caminho para um arquivo JSON com os detalhes de configuração do job.

API

Faça uma solicitação POST ao Método jobs.create que define o campo reservation como NO_RESERVATION.

Por exemplo, para criar um job de script básico que não possa consumir reservas, faça a seguinte solicitação:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Substitua:

  • PROJECT_ID: o ID do projeto do seu projeto.

  • LOCATION: o local do job.

  • JOB_NAME: o nome do job.

A seguir