Usar reservas com inferência on-line

Neste documento, explicamos como usar as reservas do Compute Engine para garantir que seus jobs de inferência on-line tenham os recursos de máquina virtual (VM) necessários para execução.

As reservas são um recurso do Compute Engine. Elas garantem que você tenha 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.

Ao criar uma reserva, o Compute Engine verifica se a capacidade solicitada está disponível na zona especificada. Em caso afirmativo, o Compute Engine reserva os recursos, cria a reserva e o seguinte acontece:

  • Você pode consumir imediatamente os recursos reservados, e eles permanecem disponíveis até que você exclua a reserva.
  • Você recebe cobranças pelos recursos reservados na mesma taxa sob demanda que as VMs em execução, incluindo todos os descontos aplicáveis, até que a reserva seja excluída. Uma VM que consome uma reserva não gera cobranças separadas. Você só recebe cobranças pelos recursos fora da reserva, como discos ou endereços IP. Para saber mais, consulte os preços das reservas.

Limitações e requisitos

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

  • A Agent Platform só pode usar reservas para CPUs, VMs de GPU, ou TPUs (visualização).
  • A Agent Platform não pode consumir reservas de VMs que tenham discos SSD locais anexados manualmente.
  • O uso de reservas do Compute Engine com a Agent Platform só é compatível com o treinamento sem servidor, a inferência e o Workbench da Gemini Enterprise Agent Platform (visualização).
  • As propriedades de VM de uma reserva precisam corresponder exatamente à carga de trabalho da Agent Platform para consumir a reserva. Por exemplo, se uma reserva especificar um a2-ultragpu-8g tipo de máquina, a carga de trabalho da Agent Platform só poderá consumir a reserva se também usar um a2-ultragpu-8g tipo de máquina. Consulte os requisitos.
  • Para consumir uma reserva compartilhada de VMs de GPU ou TPUs, você precisa consumi-la usando o projeto proprietário ou um projeto de consumidor com que a reserva é compartilhada. Consulte Como as reservas compartilhadas funcionam.
  • Para oferecer suporte a atualizações regulares das implantações da Agent Platform, recomendamos aumentar a contagem de VMs em mais do que o número total de réplicas da seguinte maneira, de acordo com o tipo de reserva usado pelo DeployedModel:
    • SPECIFIC_RESERVATION: precisa especificar pelo menos uma VM adicional. Nós recomendamos 10% (mas pelo menos 1). Os modelos implantados que usam SPECIFIC_RESERVATION têm a garantia de consumir apenas VMs da reserva. A Agent Platform não pode realizar atualizações se não houver uma VM adicional.
    • ANY:
      • Não é necessário ter VMs adicionais, porque os modelos implantados que usam a ANY reserva usam VMs sob demanda se a capacidade da reserva não for suficiente. No entanto, sem VMs adicionais, a reserva pode não ser totalmente utilizada após um upgrade. Por exemplo, suponha que você tenha uma reserva com 40 VMs e implante um modelo com 40 réplicas usando essa reserva. Quando você implanta pela primeira vez, todas as 40 VMs na reserva são usadas pelo DeployedModel. Após um upgrade, apenas 36 VMs são da reserva e 4 VMs são sob demanda.
      • Se você quiser manter o uso dentro da reserva, recomendamos ter 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 reservas ANY for menor que 50, recomendamos 10% (mas pelo menos 1) a mais. Se for maior que 50, recomendamos 25% a mais. Por exemplo:
        • Se você planeja implantar modelos usando 40 VMs A3, pode ter uma reserva A3 com 44 VMs ou duas reservas 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 todas sejam compartilhadas com a Agent Platform e o número total de VMs nessas reservas seja de pelo menos 44.
        • Se você planeja implantar modelos usando 100 VMs A3, o número total de VMs em todas as reservas A3 compartilhadas com a Agent Platform precisa ser de pelo menos 125.
        • Se você planeja implantar dois modelos usando 10 VMs, o número total de VMs em todas as reservas A3 compartilhadas com a Agent Platform precisa ser de pelo menos 12. O número de VMs é menor que 50, mas o número de VMs adicionais é 2 (1 por DeployedModel).
  • Para consumir uma reserva SPECIFIC_RESERVATION, conceda o papel do IAM de Leitor do Compute à conta de serviço da Agent Platform no projeto que possui as reservas (service-${PROJECT_NUMBER}@gcp-sa-aiplatform.iam.gserviceaccount.com, em que PROJECT_NUMBER é o número do projeto que consome a reserva).

Faturamento

Ao usar as 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 inferência on-line da Agent Platform, além do uso da infraestrutura. Consulte Preços da previsão.

Antes de começar

Permitir que uma reserva seja consumida

Antes de consumir uma reserva de CPUs, VMs de GPU ou TPUs, defina a política de compartilhamento para permitir que a Agent Platform 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 compartilhada de VMs de GPU, é possível permitir que a Agent Platform consuma a reserva da seguinte maneira:

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

Permitir o consumo de uma reserva atual

Só é possível modificar uma reserva criada automaticamente de VMs de GPU ou TPUs para uma reserva adiantada após o horário de início da reserva.

Para permitir que a Agent Platform consuma uma reserva atual, use um dos seguintes métodos:

Permitir o consumo de várias reservas específicas

É possível permitir o consumo de várias reservas específicas especificando duas ou mais reservas, em ordem de prioridade, na lista de nomes de reservas no campo values da especificação de afinidade de reserva. Liste-as em ordem de prioridade.

Cada reserva precisa ser compartilhada com o Vertex, e a zona da reserva precisa estar na região do endpoint. Caso contrário, é possível misturar reservas em projetos de origem e várias zonas.

Verificar se uma reserva é consumida

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

Receber inferências on-line usando uma reserva

Para criar uma implantação de modelo que consuma uma reserva de VMs de GPU do Compute Engine, use a API REST ou o SDK da Agent Platform 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 Agent Platform.
  • 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 as well.
  • 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 que cada tipo de máquina oferece suporte, 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 reservas que as VMs segmentam especificamente pelo 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.
  • ZONE: a zona em que a reserva foi criada.
  • RESERVATION_NAME_N: os nomes das reservas, em ordem de prioridade. Cada um precisa ser o nome completo do recurso da reserva ou do bloco de 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 inferência, 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 inferência, 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/v1/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_1",
            "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME_2"
          ]
        }
      },
      "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 Agent Platform para Python, consulte Instalar o SDK da Agent Platform para Python. Para mais informações, consulte a documentação de referência da API SDK da Agent Platform para Python.

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

  • 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 tipos de máquinas.
  • ACCELERATOR_TYPE: o tipo de acelerador a ser anexado à máquina. Para mais informações sobre o tipo de GPU que cada tipo de máquina oferece suporte, 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_N: os nomes das reservas, em ordem de prioridade. Cada um precisa ser o nome completo do recurso da reserva ou do bloco de 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 inferência, 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 inferência, 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, siga um destes procedimentos:

  • Para consumir uma ou mais reservas específicas:
    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_1",
            "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME_2"
            ],
        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
    )

A seguir