Usar reservas com previsão

Este documento explica como usar as reservas do Compute Engine para ter um alto nível de garantia de que os jobs de previsão têm os recursos necessários para serem executados.

Para garantir que os jobs de previsão tenham os recursos de instâncias de máquina virtual (VM) disponíveis quando precisarem, use as reservas do Compute Engine. As reservas oferecem um alto nível de garantia para conseguir capacidade para uma ou mais VMs com a configuração de hardware especificada. Uma reserva de VM gera custos da VM desde a criação até a exclusão. No entanto, enquanto você consome essa VM, o custo total é equivalente a uma VM sem reserva. Saiba mais em Reservas de recursos zonais do Compute Engine.

Limitações e requisitos

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

  • A Vertex AI só pode consumir reservas de VMs que tenham GPUs anexadas.
  • O uso de reservas do Compute Engine com a Vertex AI é permitido apenas para treinamento e previsão personalizados.
  • As propriedades de VM de uma reserva precisam corresponder exatamente ao seu workload 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 da Vertex AI só poderá consumir a reserva se também usar um tipo de máquina a2-ultragpu-8g. Consulte os requisitos.
  • Para consumir uma reserva compartilhada de VMs de GPU, use o projeto proprietário ou um projeto consumidor com que a reserva é compartilhada. Consulte Como funcionam as reservas compartilhadas.
  • Para oferecer suporte a atualizações regulares das implantações da Vertex AI, recomendamos aumentar a contagem de VMs em pelo menos uma VM adicional para cada implantação simultânea.
  • Os seguintes serviços e recursos não são compatíveis com o uso de reservas do Compute Engine com a previsão da Vertex AI:

    • Compliance com o Programa Federal de Gerenciamento de Risco e Autorização (FedRAMP)

Faturamento

Ao usar reservas do Compute Engine, você recebe cobranças pelos seguintes itens:

  • Preços do Compute Engine para os recursos do Compute Engine, incluindo todos os descontos por uso contínuo (CUDs) aplicáveis. Consulte Preços do Compute Engine.
  • Taxas de gerenciamento de previsão da Vertex AI, além do uso da sua infraestrutura. Consulte Preços da previsão.

Antes de começar

Permitir que uma reserva seja consumida

Antes de consumir uma reserva de VMs de GPU, é necessário definir a política de compartilhamento para permitir que a Vertex AI consuma a reserva. Para fazer isso, use um dos seguintes métodos:

Permitir o consumo ao criar uma reserva

Ao criar uma reserva de projeto único ou reserva compartilhada de VMs de GPU, é possível permitir que a Vertex AI consuma a reserva da seguinte maneira:

  • Se você estiver usando o console do Google Cloud, selecione Compartilhar reserva na seção Serviços do Google Cloud.
  • Se você estiver usando a Google Cloud CLI, inclua a sinalização --reservation-sharing-policy definida como ALLOW_ALL.
  • Se você estiver usando a API REST, inclua o campo serviceShareType definido como ALLOW_ALL no corpo da solicitação.

Permitir consumo em uma reserva

Para permitir que a Vertex AI consuma uma reserva de VMs de GPU, consulte Modificar a política de compartilhamento de uma reserva.

Receber previsões usando uma reserva

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

REST

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION_ID: a região em que você está usando a Vertex AI.
  • PROJECT_ID: o projeto em que a reserva foi criada. Para consumir uma reserva compartilhada de outro projeto, você precisa compartilhar a reserva com esse projeto. Para mais informações, consulte Modificar os projetos do consumidor em uma reserva compartilhada.
  • ENDPOINT_ID: o ID do endpoint.
  • MODEL_ID: o ID do modelo a ser implantado.
  • DEPLOYED_MODEL_NAME: um nome para DeployedModel. Também é possível usar o nome de exibição do Model para o DeployedModel.
  • MACHINE_TYPE: o tipo de máquina a ser usado para cada nó nesta implantação. A configuração padrão é n1-standard-2. Para mais informações sobre os tipos de máquina compatíveis, consulte Configurar recursos de computação para previsão.
  • ACCELERATOR_TYPE: o tipo de acelerador a ser anexado à máquina. Para mais informações sobre o tipo de GPU compatível com cada tipo de máquina, consulte GPUs para cargas de trabalho de computação.
  • ACCELERATOR_COUNT: o número de aceleradores a serem anexados à máquina.
  • RESERVATION_AFFINITY_TYPE: precisa ser ANY, SPECIFIC_RESERVATION ou NONE.
    • ANY significa que as VMs do customJob podem consumir automaticamente qualquer reserva com propriedades correspondentes.
    • SPECIFIC_RESERVATION significa que as VMs do customJob podem consumir apenas uma reserva que as VMs segmentam especificamente por nome.
    • NONE significa que as VMs do customJob não podem consumir nenhuma reserva. Especificar NONE tem o mesmo efeito que omitir uma especificação de afinidade de reserva.
  • RESERVATION_NAME: o nome da sua reserva.
  • MIN_REPLICA_COUNT: o número mínimo de nós para esta implantação. A contagem de nós pode ser aumentada ou reduzida conforme necessário pela carga de previsão, até o número máximo de nós e nunca menos que esse número. O valor precisa ser maior ou igual a 1.
  • MAX_REPLICA_COUNT: o número máximo de nós para esta implantação. A contagem de nós pode ser aumentada ou reduzida conforme necessário pela carga de previsão, até esse número de nós e nunca menos que o número mínimo de nós.
  • TRAFFIC_SPLIT_THIS_MODEL: a porcentagem do tráfego de previsão para esse endpoint que será roteada para o modelo que está sendo implantado com esta operação. O padrão é 100. A soma de todas as porcentagens de tráfego precisam totalizar 100. Saiba mais sobre as divisões de tráfego.
  • DEPLOYED_MODEL_ID_N: opcional. Se outros modelos forem implantados nesse endpoint, será necessário atualizar as porcentagens de divisão de tráfego para que todas as porcentagens somem 100.
  • TRAFFIC_SPLIT_MODEL_N: o valor da porcentagem da divisão de tráfego para a chave de ID do modelo implantado.
  • PROJECT_NUMBER: o número do projeto gerado automaticamente.

Método HTTP e URL:

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

Corpo JSON da solicitação:

{
  "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 a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "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 da Vertex AI para Python, consulte Instalar o SDK da Vertex AI para Python. Saiba mais na documentação de referência da API do SDK da Vertex AI para Python.

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

  • DEPLOYED_NAME: um nome para o modelo implantado.
  • TRAFFIC_SPLIT: o valor da porcentagem da divisão de tráfego para a chave de ID do modelo implantado.
  • MACHINE_TYPE: a máquina usada para cada nó desta implantação. A configuração padrão é n1-standard-2. Saiba mais sobre os tipos de máquinas.
  • ACCELERATOR_TYPE: o tipo de acelerador a ser anexado à máquina. Para mais informações sobre o tipo de GPU compatível com cada tipo de máquina, consulte GPUs para cargas de trabalho de computação.
  • ACCELERATOR_COUNT: o número de aceleradores a serem anexados à máquina.
  • PROJECT_ID: o projeto em que a reserva foi criada. Para consumir uma reserva compartilhada de outro projeto, você precisa compartilhar a reserva com esse projeto. Para mais informações, consulte Modificar os projetos do consumidor em uma reserva compartilhada.
  • ZONE: a zona em que está localizada a VM.
  • RESERVATION_NAME: o nome da sua reserva.
  • MIN_REPLICA_COUNT: o número mínimo de nós para esta implantação. A contagem de nós pode ser aumentada ou reduzida conforme necessário pela carga de previsão, até o número máximo de nós e nunca menos que esse número. O valor precisa ser maior ou igual a 1.
  • MAX_REPLICA_COUNT: o número máximo de nós para esta implantação. A contagem de nós pode ser aumentada ou reduzida conforme necessário pela carga de previsão, até esse número de nós e nunca menos que o número mínimo de nós.

Dependendo do tipo de reserva que você 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 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
    )

A seguir