Use reservas com inferência

Este documento explica como usar as reservas do Compute Engine para ter um elevado nível de garantia de que as suas tarefas de previsão têm os recursos de máquina virtual (VM) 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 do Vertex AI, recomendamos que aumente o número de VMs mais do que o número total de réplicas da seguinte forma, de acordo com o tipo de reserva usado pelo seu DeployedModel:
    • SPECIFIC_RESERVATION: tem de especificar, pelo menos, 1 VM adicional. Recomendamos 10% (mas, pelo menos, 1). Os modelos implementados que usam SPECIFIC_RESERVATION têm a garantia de que só consomem VMs da reserva. O Vertex AI não pode fazer atualizações se não existir uma VM adicional.
    • ANY:
      • Não é necessário ter VMs adicionais, porque os modelos implementados que usam a reserva usam VMs a pedido se a capacidade de reserva não for suficiente.ANY No entanto, sem VMs adicionais, a sua reserva pode não ser totalmente utilizada após uma atualização. Por exemplo, suponha que tem uma reserva com 40 VMs e implementa um modelo com 40 réplicas usando essa reserva. Quando implementa pela primeira vez, todas as 40 VMs na reserva são usadas pelo DeployedModel. Após uma atualização, apenas 36 VMs são da reserva e 4 VMs são a pedido.
      • Se quiser manter a utilização dentro da reserva, recomendamos que tenha, pelo menos, 1 VM adicional para cada DeployedModel ou DeploymentResourcePool que use a reserva. Se o número total de VMs do mesmo tipo nas suas reservas ANY for inferior a 50, recomendamos que aumente 10% (mas, pelo menos, 1). Se for superior a 50, recomendamos um aumento de 25%. Por exemplo:
        • Se planear implementar modelos com 40 VMs A3, pode ter 1 reserva de A3 com 44 VMs ou 2 reservas de A3: a reserva X com 30 VMs e a reserva Y com 14 VMs (44 no total). O mesmo se aplica a outros números de reservas, desde que sejam todas partilhadas com a Vertex AI e o número total de VMs nessas reservas seja, pelo menos, 44.
        • Se planeia implementar modelos com 100 VMs A3, o número total de VMs em todas as reservas A3 partilhadas com a Vertex AI deve ser, pelo menos, 125.
        • Se planear implementar 2 modelos com 10 VMs, o número total de VMs em todas as reservas A3 partilhadas com a Vertex AI deve ser, pelo menos, 12. O número de VMs é inferior a 50, mas o número de VMs adicionais é 2 (1 por DeployedModel).

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 de previsões do Vertex AI, além da utilização da sua infraestrutura. Consulte os preços de previsão.

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.

Obtenha inferências através de uma reserva

Para criar uma implementação de modelo que consuma uma reserva do Compute Engine de VMs de GPU, use a API REST ou o SDK Vertex AI para Python.

REST

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

  • LOCATION_ID: a região onde está a usar o Vertex AI.
  • 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.
  • ENDPOINT_ID: o ID do ponto final.
  • MODEL_ID: o ID do modelo a implementar.
  • DEPLOYED_MODEL_NAME: um nome para o DeployedModel. Também pode usar o nome a apresentar do Model para o DeployedModel.
  • MACHINE_TYPE: o tipo de máquina a usar para cada nó nesta implementação. 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 previsão.
  • 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.
  • 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.
  • MIN_REPLICA_COUNT: o número mínimo de nós para esta implementação. O número de nós pode ser aumentado ou diminuído conforme necessário pela carga de inferência, até ao número máximo de nós e nunca inferior a este número de nós. Este valor tem de ser igual ou superior a 1.
  • MAX_REPLICA_COUNT: o número máximo de nós para esta implementação. O número de nós pode ser aumentado ou diminuído conforme necessário pela carga de inferência, até este número de nós e nunca inferior ao número mínimo de nós.
  • TRAFFIC_SPLIT_THIS_MODEL: a percentagem do tráfego de previsão para este ponto final a ser encaminhado para o modelo implementado com esta operação. A predefinição é 100. Todas as percentagens de tráfego têm de totalizar 100. Saiba mais acerca das divisões de tráfego.
  • DEPLOYED_MODEL_ID_N: opcional. Se outros modelos forem implementados neste ponto final, tem de atualizar as respetivas percentagens de divisão de tráfego para que todas as percentagens totalizem 100.
  • TRAFFIC_SPLIT_MODEL_N: o valor da percentagem da divisão de tráfego para a chave do ID do modelo implementado.
  • PROJECT_NUMBER: o número do projeto gerado automaticamente para o seu projeto.

Método HTTP e URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

Corpo JSON do pedido:

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/LOCATION_ID/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "dedicatedResources": {
      "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"
          ]
        }
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT
    },
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

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

Deve receber uma resposta JSON semelhante à seguinte:

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

Python

Para saber como instalar ou atualizar o SDK Vertex AI para Python, consulte o artigo Instale o SDK Vertex AI para Python. Para mais informações, consulte a documentação de referência da API do SDK Vertex AI para Python.

Antes de executar qualquer um dos seguintes scripts, faça as seguintes substituições:

  • DEPLOYED_NAME: um nome para o modelo implementado.
  • TRAFFIC_SPLIT: o valor da percentagem da divisão de tráfego para a chave do ID do modelo implementado.
  • MACHINE_TYPE: a máquina usada para cada nó desta implementação. A predefinição é n1-standard-2. Saiba mais acerca dos tipos de máquinas.
  • 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 anexar à máquina.
  • 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 o artigo Modifique os projetos de consumidor numa reserva partilhada.
  • ZONE: a zona onde a reserva está localizada.
  • RESERVATION_NAME: o nome da sua reserva.
  • MIN_REPLICA_COUNT: o número mínimo de nós para esta implementação. O número de nós pode ser aumentado ou diminuído conforme necessário pela carga de inferência, até ao número máximo de nós e nunca inferior a este número de nós. Este valor tem de ser igual ou superior a 1.
  • MAX_REPLICA_COUNT: o número máximo de nós para esta implementação. O número de nós pode ser aumentado ou diminuído conforme necessário pela carga de inferência, até este número de nós e nunca inferior ao número mínimo de nós.

Consoante o tipo de reserva que quer consumir, faça uma das seguintes ações:

  • Para consumir uma reserva específica:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="SPECIFIC_RESERVATION",
        reservation_affinity_key="compute.googleapis.com/reservation-name",
        reservation_affinity_values=["projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"],
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )
  • Para consumir uma reserva consumida automaticamente:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="ANY_RESERVATION",
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )

O que se segue?