Use reservas com formação

Este documento explica como usar as reservas do Compute Engine para ter um elevado nível de garantia de que as suas tarefas de preparação personalizadas têm os recursos de máquinas virtuais (VMs) necessários para serem executadas.

As reservas são uma funcionalidade do Compute Engine. Ajudam a garantir que tem os recursos disponíveis para criar VMs com o mesmo hardware (memória e vCPUs) e recursos opcionais (CPUs, GPUs, TPUs e discos SSD locais) sempre que precisar deles.

Quando cria uma reserva, o Compute Engine verifica se a capacidade pedida está disponível na zona especificada. Se for o caso, o Compute Engine reserva os recursos, cria a reserva e acontece o seguinte:

  • Pode consumir imediatamente os recursos reservados, e estes permanecem disponíveis até eliminar a reserva.
  • Os recursos reservados são cobrados à mesma taxa a pedido que as VMs em execução, incluindo quaisquer descontos aplicáveis, até que a reserva seja eliminada. Uma VM que consuma uma reserva não incorre em custos separados. Só lhe é cobrado o custo dos recursos fora da reserva, como discos ou endereços IP. Para saber mais, consulte os preços das reservas.

Limitações e requisitos

Quando usar reservas do Compute Engine com a Vertex AI, considere as seguintes limitações e requisitos:

  • A Vertex AI só pode usar reservas para: CPUs, VMs de GPU, ou TPUs (pré-visualização).
  • O Vertex AI não pode consumir reservas de VMs que tenham discos SSD locais anexados manualmente.
  • A utilização de reservas do Compute Engine com o Vertex AI só é suportada para preparação e inferência personalizadas e para o Vertex AI Workbench (pré-visualização).
  • As propriedades da VM de uma reserva têm de corresponder exatamente à sua carga de trabalho do Vertex AI para consumir a reserva. Por exemplo, se uma reserva especificar um tipo de máquina a2-ultragpu-8g, a carga de trabalho do Vertex AI só pode consumir a reserva se também usar um tipo de máquina a2-ultragpu-8g. Veja os requisitos.
  • Para consumir uma reserva partilhada de VMs com GPUs ou TPUs, tem de a consumir através do projeto proprietário ou de um projeto consumidor com o qual a reserva é partilhada. Veja Como funcionam as reservas partilhadas.
  • Para suportar atualizações regulares das suas implementações da Vertex AI, recomendamos que aumente o número de VMs em, pelo menos, mais 1 VM para cada implementação simultânea.
  • O início flexível para o programador de cargas de trabalho dinâmicas e a execução de tarefas de preparação num recurso persistente são suportados, exceto quando usa reservas do Compute Engine com a preparação do Vertex AI.

Faturação

Quando usa reservas do Compute Engine, é-lhe faturado o seguinte:

  • Preços do Compute Engine para os recursos do Compute Engine, incluindo quaisquer descontos de fidelidade (DFs) aplicáveis. Consulte os preços do Compute Engine.
  • Taxas de gestão da preparação personalizada da Vertex AI, além da sua utilização da infraestrutura. Consulte os preços dos modelos personalizados.

Antes de começar

Permitir que uma reserva seja consumida

Antes de consumir uma reserva de CPUs, VMs de GPU ou TPUs, tem de definir a respetiva política de partilha para permitir que o Vertex AI consuma a reserva. Para tal, use um dos seguintes métodos:

Permitir o consumo durante a criação de uma reserva

Quando cria uma reserva de projeto único ou uma reserva partilhada de VMs de GPU, pode permitir que o Vertex AI consuma a reserva da seguinte forma:

  • Se estiver a usar a Google Cloud consola, na secção Serviços Google Cloud, selecione Partilhar reserva.
  • Se estiver a usar a Google Cloud CLI, inclua a flag --reservation-sharing-policy definida como ALLOW_ALL.
  • Se estiver a usar a API REST, no corpo do pedido, inclua o campo serviceShareType definido como ALLOW_ALL.

Permitir o consumo numa reserva existente

Só pode modificar uma reserva criada automaticamente de VMs com GPU ou TPUs para uma reserva futura após a hora de início da reserva.

Para permitir que o Vertex AI consuma uma reserva existente, use um dos seguintes métodos:

Verifique se uma reserva é consumida

Para verificar se a reserva está a ser consumida, consulte o artigo Verifique o consumo de reservas na documentação do Compute Engine.

Crie uma tarefa de preparação personalizada com uma reserva

Use a API REST para criar uma tarefa de preparação personalizada que consuma uma reserva do Compute Engine de VMs de GPU.

REST

Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:

  • LOCATION: a região onde o contentor ou o pacote Python vai ser executado.
  • PROJECT_ID: o projeto no qual a reserva foi criada. Para consumir uma reserva partilhada de outro projeto, tem de partilhar a reserva com esse projeto. Para mais informações, consulte Modifique os projetos de consumidor numa reserva partilhada.
  • JOB_NAME: obrigatório. Um nome a apresentar para o CustomJob.
  • MACHINE_TYPE: o tipo de máquina a usar para a tarefa. A predefinição é n1-standard-2. Para mais informações sobre os tipos de máquinas suportados, consulte o artigo Configure recursos de computação para preparação personalizada.
  • ACCELERATOR_TYPE: o tipo de acelerador a associar à máquina. Para mais informações sobre o tipo de GPU que cada tipo de máquina suporta, consulte GPUs para cargas de trabalho de computação.
  • ACCELERATOR_COUNT: o número de aceleradores a associar à máquina.
  • Defina a tarefa de formação personalizada:
    • RESERVATION_AFFINITY_TYPE: tem de ser ANY, SPECIFIC_RESERVATION ou NONE.

      • ANY significa que as VMs do seu customJob podem consumir automaticamente qualquer reserva com propriedades correspondentes.
      • SPECIFIC_RESERVATION significa que as VMs do seu customJob só podem consumir uma reserva que as VMs segmentam especificamente por nome.
      • NONE significa que as VMs do seu customJob não podem consumir nenhuma reserva. A especificação de NONE tem o mesmo efeito que omitir uma especificação de afinidade de reserva.
    • ZONE: a zona onde a reserva foi criada.
    • RESERVATION_NAME: o nome da sua reserva.
    • DISK_TYPE: opcional. O tipo de disco de arranque a usar para a tarefa, pd-standard (predefinição) ou pd-ssd. Saiba mais sobre os tipos de discos.
    • DISK_SIZE: opcional. O tamanho em GB do disco de arranque a usar para a tarefa. O valor predefinido é 100.
    • REPLICA_COUNT: o número de réplicas de trabalhadores a usar. Na maioria dos casos, defina este valor como 1 para o seu primeiro conjunto de trabalhadores.
    • Se a sua aplicação de preparação for executada num contentor personalizado, especifique o seguinte:
      • CUSTOM_CONTAINER_IMAGE_URI: o URI de uma imagem de contentor no Artifact Registry ou no Docker Hub que vai ser executada em cada réplica de worker.
      • CUSTOM_CONTAINER_COMMAND: opcional. O comando a invocar quando o contentor é iniciado. Este comando substitui o ponto de entrada predefinido do contentor.
      • CUSTOM_CONTAINER_ARGS: opcional. Os argumentos a transmitir quando iniciar o contentor.
    • Se a sua aplicação de preparação for um pacote Python executado num contentor pré-criado, especifique o seguinte:
      • EXECUTOR_IMAGE_URI: o URI da imagem do contentor que executa o código facultado. Consulte os contentores pré-criados disponíveis para formação.
      • PYTHON_PACKAGE_URIS: lista separada por vírgulas de URIs do Cloud Storage que especificam os ficheiros de pacotes Python que são o programa de preparação e os respetivos pacotes dependentes. O número máximo de URIs de pacotes é 100.
      • PYTHON_MODULE: o nome do módulo Python a executar após a instalação dos pacotes.
      • PYTHON_PACKAGE_ARGS: opcional. Argumentos da linha de comandos a transmitir ao módulo Python.
    • TIMEOUT: opcional. O tempo de execução máximo da tarefa.
  • Especifique os elementos LABEL_NAME e LABEL_VALUE para todas as etiquetas que quer aplicar a esta tarefa personalizada.

Método HTTP e URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

Corpo JSON do pedido:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "MACHINE_TYPE",
          "acceleratorType": "ACCELERATOR_TYPE",
          "acceleratorCount": ACCELERATOR_COUNT,
          "reservationAffinity": {
            "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
            "key": "compute.googleapis.com/reservation-name",
            "values": [
              "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
            ]
          },
        },
        "replicaCount": REPLICA_COUNT,
        "diskSpec": {
          "bootDiskType": DISK_TYPE,
          "bootDiskSizeGb": DISK_SIZE
        },

        // Union field task can be only one of the following:
        "containerSpec": {
          "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
          "command": [
            CUSTOM_CONTAINER_COMMAND
          ],
          "args": [
            CUSTOM_CONTAINER_ARGS
          ]
        },
        "pythonPackageSpec": {
          "executorImageUri": EXECUTOR_IMAGE_URI,
          "packageUris": [
            PYTHON_PACKAGE_URIS
          ],
          "pythonModule": PYTHON_MODULE,
          "args": [
            PYTHON_PACKAGE_ARGS
          ]
        }
        // End of list of possible types for union field task.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "timeout": TIMEOUT
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

Para enviar o seu pedido, escolha uma destas opções:

curl

Guarde o corpo do pedido num ficheiro com o nome request.json, e execute o seguinte comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"

PowerShell

Guarde o corpo do pedido num ficheiro com o nome request.json, e execute o seguinte comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

A resposta contém informações sobre as especificações, bem como o TRAININGPIPELINE_ID.

O que se segue?