Implantar um modelo em um endpoint

É preciso implantar um modelo em um endpoint antes de usá-lo para exibir previsões on-line. A implantação de um modelo associa recursos físicos para exibir previsões on-line com baixa latência.

Nesta página, descrevemos as etapas para implantar um modelo em um endpoint usando a previsão on-line.

Antes de começar

Para implantar modelos de previsão on-line, entre em contato com o administrador do projeto do IAM para solicitar o papel de administrador do Vertex AI Prediction (vertex-ai-prediction-admin) no namespace do projeto.

Para mais informações sobre esse papel, consulte Preparar permissões do IAM.

Antes de implantar o modelo em um endpoint, exporte os artefatos do modelo para previsão e verifique se você atende a todos os pré-requisitos dessa página.

Criar um pool de recursos

Um recurso personalizado ResourcePool permite que você tenha controle detalhado sobre o comportamento do modelo. É possível definir configurações como as seguintes:

  • Configurações de escalonamento automático.
  • O tipo de máquina, que define os requisitos de CPU e memória.
  • Opções de acelerador, como recursos de GPU.

O tipo de máquina é essencial para a solicitação de especificação do pool de nós que você envia para criar o cluster de previsão.

Para o pool de recursos do modelo implantado, a contagem e o tipo de acelerador determinam o uso da GPU. O tipo de máquina dita apenas os recursos de CPU e memória solicitados. Por isso, ao incluir aceleradores de GPU na especificação ResourcePool, o campo machineType controla os requisitos de CPU e memória do modelo, enquanto o campo acceleratorType controla a GPU. Além disso, o campo acceleratorCount controla o número de frações de GPU.

Siga estas etapas para criar um recurso personalizado ResourcePool:

  1. Crie um arquivo YAML que defina o recurso personalizado ResourcePool. Os exemplos a seguir contêm arquivos YAML para pools de recursos com aceleradores de GPU (modelos baseados em GPU) e sem aceleradores de GPU (modelos baseados em CPU):

    Modelos baseados em GPU

      apiVersion: prediction.aiplatform.gdc.goog/v1
      kind: ResourcePool
      metadata:
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
      spec:
        resourcePoolID: RESOURCE_POOL_NAME
        enableContainerLogging: false
        dedicatedResources:
          machineSpec:
            # The system adds computing overhead to the nodes for mandatory components.
            # Choose a machineType value that allocates fewer CPU and memory resources
            # than those used by the nodes in the prediction cluster.
            machineType: a2-highgpu-1g-gdc
            acceleratorType: nvidia-a100-80gb
            # The accelerator count is a slice of the requested virtualized GPUs.
            # The value corresponds to one-seventh of 80 GB of GPUs for each count.
            acceleratorCount: 2
          autoscaling:
            minReplica: 2
            maxReplica: 10
    

    Modelos baseados em CPU

      apiVersion: prediction.aiplatform.gdc.goog/v1
      kind: ResourcePool
      metadata:
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
      spec:
        resourcePoolID: RESOURCE_POOL_NAME
        enableContainerLogging: false
        dedicatedResources:
          machineSpec:
            # The system adds computing overhead to the nodes for mandatory components.
            # Choose a machineType value that allocates fewer CPU and memory resources
            # than those used by the nodes in the prediction cluster.
            machineType: n2-highcpu-8-gdc
          autoscaling:
            minReplica: 2
            maxReplica: 10
    

    Substitua:

    • RESOURCE_POOL_NAME: o nome que você quer dar ao arquivo de definição ResourcePool.
    • PROJECT_NAMESPACE: o nome do namespace do projeto associado ao cluster de previsão.

    Modifique os valores nos campos dedicatedResources de acordo com as necessidades de recursos e o que está disponível no cluster de previsão.

  2. Aplique o arquivo de definição ResourcePool ao cluster de previsão:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f RESOURCE_POOL_NAME.yaml
    

    Substitua:

    • PREDICTION_CLUSTER_KUBECONFIG: o caminho para o arquivo kubeconfig no cluster de previsão.
    • RESOURCE_POOL_NAME: o nome do arquivo de definição de ResourcePool.

Quando você cria o recurso personalizado ResourcePool, a API Kubernetes e o serviço de webhook validam o arquivo YAML e informam se houve sucesso ou falha. O operador de previsão provisiona e reserva os recursos do pool quando você implanta os modelos em um endpoint.

Implantar o modelo em um endpoint

Se você tiver um pool de recursos, poderá implantar mais de um modelo em um endpoint, além de poder implantar um modelo em mais de um endpoint. Implantar um modelo preditivo direcionado a contêineres compatíveis. Dependendo se o endpoint já existe ou não, escolha um dos dois métodos a seguir:

Implantar um modelo em um novo endpoint

Siga estas etapas para implantar um modelo preditivo em um novo endpoint:

  1. Crie um arquivo YAML que defina um recurso personalizado DeployedModel:

    TensorFlow

    O arquivo YAML a seguir mostra um exemplo de configuração para um modelo do TensorFlow:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      # The endpoint path structure is endpoints/<endpoint-id>
      endpointPath: endpoints/PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket-fqn/tensorflow
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: img-detection-model
        modelDisplayName: my_img_detection_model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/img-detection-model/1
        # The model version ID must match the name of the first folder in
        # the artifactLocation bucket, inside the 'tensorflow' folder.
        # For example, if the bucket path is
        # s3://my-prediction-bucket-fqn/tensorflow/1/,
        # then the value for the model version ID is "1".
        modelVersionID: "1"
        modelContainerSpec:
          args:
          - --model_config_file=/models/models.config
          - --rest_api_port=8080
          - --port=8500
          - --file_system_poll_wait_seconds=30
          - --model_config_file_poll_wait_seconds=30
          command:
          - /bin/tensorflow_model_server
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/tf2-cpu.2-18:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-18:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-18:latest
          ports:
          - 8080
          grpcPorts:
          - 8500
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

    Substitua:

    • DEPLOYED_MODEL_NAME: o nome que você quer dar ao arquivo de definição DeployedModel.
    • PROJECT_NAMESPACE: o nome do namespace do projeto associado ao cluster de previsão.
    • PREDICTION_ENDPOINT: o nome que você quer dar ao novo endpoint, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: o caminho para o modelo no bucket de armazenamento.
    • RESOURCE_POOL_NAME: o nome que você deu ao arquivo de definição ResourcePool quando criou um pool de recursos para hospedar o modelo.

    Modifique os valores nos campos restantes de acordo com seu modelo preditivo.

    PyTorch

    O arquivo YAML a seguir mostra um exemplo de configuração para um modelo do PyTorch:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      endpointPath: PREDICTION_ENDPOINT
      endpointInfo:
        id: PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 prefix that
        # includes the model artifacts for the model version.
        # For example, s3://my-prediction-bucket-fqn/pytorch-model/1
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: "pytorch"
        modelDisplayName: my-pytorch-model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/pytorch/1
        modelVersionID: "1"
        modelContainerSpec:
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/pytorch-cpu.2-1:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/pytorch-gpu.2-1:latest
          imageURI: gcr.io/aiml/prediction/containers/pytorch-cpu.2-1:latest
          ports:
          - 8080
          grpcPorts:
          - 7070
      sharesResourcePool: false
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

    Substitua:

    • DEPLOYED_MODEL_NAME: o nome que você quer dar ao arquivo de definição DeployedModel.
    • PROJECT_NAMESPACE: o nome do namespace do projeto associado ao cluster de previsão.
    • PREDICTION_ENDPOINT: o nome que você quer dar ao novo endpoint, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: o caminho para o modelo no bucket de armazenamento.
    • RESOURCE_POOL_NAME: o nome que você deu ao arquivo de definição ResourcePool quando criou um pool de recursos para hospedar o modelo.

    Modifique os valores nos campos restantes de acordo com seu modelo preditivo.

  2. Aplique o arquivo de definição DeployedModel ao cluster de previsão:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Substitua:

    • PREDICTION_CLUSTER_KUBECONFIG: o caminho para o arquivo kubeconfig no cluster de previsão.
    • DEPLOYED_MODEL_NAME: o nome do arquivo de definição de DeployedModel.

    Quando você cria o recurso personalizado DeployedModel, a API Kubernetes e o serviço de webhook validam o arquivo YAML e informam se houve sucesso ou falha. O operador de previsão reconcilia o recurso personalizado DeployedModel e o disponibiliza no cluster de previsão.

  3. Crie um arquivo YAML que defina um recurso personalizado Endpoint.

    O arquivo YAML a seguir mostra um exemplo de configuração:

    apiVersion: aiplatform.gdc.goog/v1
    kind: Endpoint
    metadata:
      name: ENDPOINT_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      createDns: true
      id: PREDICTION_ENDPOINT
      destinations:
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_2
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
    

    Substitua:

    • ENDPOINT_NAME: o nome que você quer dar ao arquivo de definição do Endpoint.
    • PROJECT_NAMESPACE: o nome do namespace do projeto associado ao cluster de previsão.
    • PREDICTION_ENDPOINT: o nome do novo endpoint. Você definiu esse nome no arquivo de definição DeployedModel.
    • DEPLOYED_MODEL_NAME: o nome que você deu ao arquivo de definição de DeployedModel.

    É possível ter um ou mais destinos serviceRef. Se você tiver um segundo objeto serviceRef, adicione-o ao arquivo YAML no campo destinations e substitua DEPLOYED_MODEL_NAME_2 pelo nome que você deu ao segundo arquivo de definição DeployedModel que criou. Continue adicionando ou removendo objetos serviceRef conforme necessário, dependendo da quantidade de modelos que você está implantando.

    Defina os campos trafficPercentage com base em como você quer dividir o tráfego entre os modelos neste endpoint. Modifique os valores nos campos restantes de acordo com as configurações do endpoint.

  4. Aplique o arquivo de definição Endpoint ao cluster de previsão:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Substitua ENDPOINT_NAME pelo nome do arquivo de definição Endpoint.

Para acessar o caminho do URL do endpoint do modelo preditivo, execute o seguinte comando:

kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'

Substitua:

  • PREDICTION_CLUSTER_KUBECONFIG: o caminho para o arquivo kubeconfig no cluster de previsão.
  • PREDICTION_ENDPOINT: o nome do novo endpoint.
  • PROJECT_NAMESPACE: o nome do namespace do projeto de previsão.

Implantar um modelo em um endpoint atual

Só é possível implantar um modelo em um endpoint atual se você já tiver implantado outro modelo nesse endpoint quando ele era novo. O sistema exige essa etapa anterior para criar o endpoint.

Siga estas etapas para implantar um modelo preditivo em um endpoint existente:

  1. Crie um arquivo YAML que defina um recurso personalizado DeployedModel.

    O arquivo YAML a seguir mostra um exemplo de configuração:

    apiVersion: prediction.aiplatform.gdc.goog/v1
    kind: DeployedModel
    metadata:
      name: DEPLOYED_MODEL_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      # The endpoint path structure is endpoints/<endpoint-id>
      endpointPath: endpoints/PREDICTION_ENDPOINT
      modelSpec:
        # The artifactLocation field must be the s3 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket-fqn/tensorflow
        artifactLocation: s3://PATH_TO_MODEL
        # The value in the id field must be unique to each model.
        id: img-detection-model-v2
        modelDisplayName: my_img_detection_model
        # The model resource name structure is models/<model-id>/<model-version-id>
        modelResourceName: models/img-detection-model/2
        # The model version ID must match the name of the first folder in
        # the artifactLocation bucket,
        # inside the 'tensorflow' folder.
        # For example, if the bucket path is
        # s3://my-prediction-bucket-fqn/tensorflow/2/,
        # then the value for the model version ID is "2".
        modelVersionID: "2"
        modelContainerSpec:
          args:
          - --model_config_file=/models/models.config
          - --rest_api_port=8080
          - --port=8500
          - --file_system_poll_wait_seconds=30
          - --model_config_file_poll_wait_seconds=30
          command:
          - /bin/tensorflow_model_server
          # The image URI field must contain one of the following values:
          # For CPU-based models: gcr.io/aiml/prediction/containers/tf2-cpu.2-6:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-6:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-6:latest
          ports:
          - 8080
          grpcPorts:
          - 8500
      resourcePoolRef:
        kind: ResourcePool
        name: RESOURCE_POOL_NAME
        namespace: PROJECT_NAMESPACE
    

    Substitua:

    • DEPLOYED_MODEL_NAME: o nome que você quer dar ao arquivo de definição DeployedModel.
    • PROJECT_NAMESPACE: o nome do namespace do projeto associado ao cluster de previsão.
    • PREDICTION_ENDPOINT: o nome do endpoint atual, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: o caminho para o modelo no bucket de armazenamento.
    • RESOURCE_POOL_NAME: o nome que você deu ao arquivo de definição ResourcePool quando criou um pool de recursos para hospedar o modelo.

    Modifique os valores nos campos restantes de acordo com seu modelo de previsão.

  2. Aplique o arquivo de definição DeployedModel ao cluster de previsão:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Substitua:

    • PREDICTION_CLUSTER_KUBECONFIG: o caminho para o arquivo kubeconfig no cluster de previsão.
    • DEPLOYED_MODEL_NAME: o nome do arquivo de definição de DeployedModel.

    Quando você cria o recurso personalizado DeployedModel, a API Kubernetes e o serviço de webhook validam o arquivo YAML e informam se houve sucesso ou falha. O operador de previsão reconcilia o recurso personalizado DeployedModel e o disponibiliza no cluster de previsão.

  3. Mostre os detalhes do recurso personalizado Endpoint:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yaml
    

    Substitua ENDPOINT_NAME pelo nome do arquivo de definição Endpoint.

  4. Atualize o arquivo YAML da definição de recurso personalizado Endpoint adicionando um novo objeto serviceRef no campo destinations. No novo objeto, inclua o nome de serviço apropriado com base no recurso personalizado DeployedModel recém-criado.

    O arquivo YAML a seguir mostra um exemplo de configuração:

    apiVersion: aiplatform.gdc.goog/v1
    kind: Endpoint
    metadata:
      name: ENDPOINT_NAME
      namespace: PROJECT_NAMESPACE
    spec:
      createDns: true
      id: PREDICTION_ENDPOINT
      destinations:
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 40
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_2
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 50
          grpcPort: 8501
          httpPort: 8081
        - serviceRef:
            kind: DeployedModel
            name: DEPLOYED_MODEL_NAME_3
            namespace: PROJECT_NAMESPACE
          trafficPercentage: 10
          grpcPort: 8501
          httpPort: 8081
    

    Substitua:

    • ENDPOINT_NAME: o nome do arquivo de definição Endpoint atual.
    • PROJECT_NAMESPACE: o nome do namespace do projeto associado ao cluster de previsão.
    • PREDICTION_ENDPOINT: o nome do endpoint atual. Você referenciou esse nome no arquivo de definição DeployedModel.
    • DEPLOYED_MODEL_NAME: o nome de um arquivo de definição DeployedModel criado anteriormente.
    • DEPLOYED_MODEL_NAME_2: o nome que você deu ao arquivo de definição DeployedModel recém-criado.

    É possível ter um ou mais destinos serviceRef. Se você tiver um terceiro objeto serviceRef, adicione-o ao arquivo YAML no campo destinations e substitua DEPLOYED_MODEL_NAME_3 pelo nome que você deu ao terceiro arquivo de definição DeployedModel que criou. Continue adicionando ou removendo objetos serviceRef conforme necessário, dependendo da quantidade de modelos que você está implantando.

    Defina os campos trafficPercentage com base em como você quer dividir o tráfego entre os modelos desse endpoint. Modifique os valores nos campos restantes de acordo com as configurações do endpoint.

  5. Aplique o arquivo de definição Endpoint ao cluster de previsão:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Substitua ENDPOINT_NAME pelo nome do arquivo de definição Endpoint.

Para acessar o caminho do URL do endpoint do modelo preditivo, execute o seguinte comando:

kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG get endpoint PREDICTION_ENDPOINT -n PROJECT_NAMESPACE -o jsonpath='{.status.endpointFQDN}'

Substitua:

  • PREDICTION_CLUSTER_KUBECONFIG: o caminho para o arquivo kubeconfig no cluster de previsão.
  • PREDICTION_ENDPOINT: o nome do endpoint.
  • PROJECT_NAMESPACE: o nome do namespace do projeto de previsão.