Implementar un modelo en un extremo

Debes implementar un modelo en un extremo antes de poder usarlo para entregar predicciones en línea. La implementación de un modelo asocia recursos físicos para entregar predicciones en línea con baja latencia.

En esta página, se describen los pasos que debes seguir para implementar un modelo en un extremo con la predicción en línea.

Antes de comenzar

Para implementar modelos de predicción en línea, comunícate con el administrador de IAM del proyecto y solicita el rol de administrador de Vertex AI Prediction (vertex-ai-prediction-admin) en el espacio de nombres de tu proyecto.

Para obtener más información sobre este rol, consulta Prepara los permisos de IAM.

Antes de implementar tu modelo en un extremo, exporta los artefactos del modelo para realizar predicciones y asegúrate de cumplir con todos los requisitos previos de esa página.

Crea un grupo de recursos

Un recurso personalizado de ResourcePool te permite tener un control detallado sobre el comportamiento de tu modelo. Puedes definir parámetros de configuración como los siguientes:

  • Configuraciones de ajuste de escala automático.
  • El tipo de máquina, que define los requisitos de CPU y memoria
  • Opciones de acelerador, como recursos de GPU.

El tipo de máquina es esencial para la solicitud de especificación del grupo de nodos que envías para crear el clúster de predicción.

Para el grupo de recursos del modelo implementado, el recuento y el tipo de acelerador determinan el uso de GPU. El tipo de máquina solo dicta los recursos de CPU y memoria solicitados. Por este motivo, cuando se incluyen aceleradores de GPU en la especificación de ResourcePool, el campo machineType controla los requisitos de CPU y memoria para el modelo, mientras que el campo acceleratorType controla la GPU. Además, el campo acceleratorCount controla la cantidad de porciones de GPU.

Sigue estos pasos para crear un recurso personalizado ResourcePool:

  1. Crea un archivo YAML que defina el recurso personalizado ResourcePool. En los siguientes ejemplos, se incluyen archivos YAML para grupos de recursos con aceleradores de GPU (modelos basados en GPU) y sin aceleradores de GPU (modelos basados en CPU):

    Modelos basados en 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 basados en 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
    

    Reemplaza lo siguiente:

    • RESOURCE_POOL_NAME: Es el nombre que deseas asignar al archivo de definición ResourcePool.
    • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto asociado con el clúster de predicción.

    Modifica los valores en los campos dedicatedResources según tus necesidades de recursos y lo que esté disponible en tu clúster de predicción.

  2. Aplica el archivo de definición ResourcePool al clúster de predicción:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f RESOURCE_POOL_NAME.yaml
    

    Reemplaza lo siguiente:

    • PREDICTION_CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig en el clúster de predicción.
    • RESOURCE_POOL_NAME: Es el nombre del archivo de definición de ResourcePool.

Cuando creas el recurso personalizado ResourcePool, la API de Kubernetes y el servicio de webhook validan el archivo YAML y, luego, informan si la operación se realizó de forma correcta o si falló. El operador de predicción aprovisiona y reserva tus recursos del grupo de recursos cuando implementas tus modelos en un extremo.

Implementa tu modelo en un extremo

Si tienes un grupo de recursos, puedes implementar más de un modelo en un extremo y puedes implementar un modelo en más de un extremo. Implementa un modelo predictivo orientado a contenedores compatibles. Según si el extremo ya existe o no, elige uno de los siguientes dos métodos:

Implementa un modelo en un extremo nuevo

Sigue estos pasos para implementar un modelo predictivo en un extremo nuevo:

  1. Crea un archivo YAML que defina un recurso personalizado DeployedModel:

    TensorFlow

    En el siguiente archivo YAML, se muestra una configuración de ejemplo para un modelo de 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
    

    Reemplaza lo siguiente:

    • DEPLOYED_MODEL_NAME: Es el nombre que deseas asignar al archivo de definición DeployedModel.
    • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto asociado con el clúster de predicción.
    • PREDICTION_ENDPOINT: Es el nombre que deseas asignarle al extremo nuevo, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: Es la ruta de acceso a tu modelo en el bucket de almacenamiento.
    • RESOURCE_POOL_NAME: Es el nombre que le diste al archivo de definición de ResourcePool cuando creaste un grupo de recursos para alojar el modelo.

    Modifica los valores en los campos restantes según tu modelo predictivo.

    PyTorch

    En el siguiente archivo YAML, se muestra una configuración de ejemplo para un modelo de 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
    

    Reemplaza lo siguiente:

    • DEPLOYED_MODEL_NAME: Es el nombre que deseas asignar al archivo de definición DeployedModel.
    • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto asociado con el clúster de predicción.
    • PREDICTION_ENDPOINT: Es el nombre que deseas asignarle al extremo nuevo, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: Es la ruta de acceso a tu modelo en el bucket de almacenamiento.
    • RESOURCE_POOL_NAME: Es el nombre que le diste al archivo de definición de ResourcePool cuando creaste un grupo de recursos para alojar el modelo.

    Modifica los valores en los campos restantes según tu modelo predictivo.

  2. Aplica el archivo de definición DeployedModel al clúster de predicción:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Reemplaza lo siguiente:

    • PREDICTION_CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig en el clúster de predicción.
    • DEPLOYED_MODEL_NAME: Es el nombre del archivo de definición de DeployedModel.

    Cuando creas el recurso personalizado DeployedModel, la API de Kubernetes y el servicio de webhook validan el archivo YAML y, luego, informan si la operación se realizó de forma correcta o si falló. El operador de predicción concilia el recurso personalizado DeployedModel y lo entrega en el clúster de predicción.

  3. Crea un archivo YAML que defina un recurso personalizado Endpoint.

    En el siguiente archivo YAML, se muestra una configuración de ejemplo:

    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
    

    Reemplaza lo siguiente:

    • ENDPOINT_NAME: Es el nombre que deseas asignar al archivo de definición de Endpoint.
    • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto asociado con el clúster de predicción.
    • PREDICTION_ENDPOINT: Es el nombre del extremo nuevo. Definiste este nombre en el archivo de definición DeployedModel.
    • DEPLOYED_MODEL_NAME: Es el nombre que le diste al archivo de definición de DeployedModel.

    Puedes tener uno o más destinos serviceRef. Si tienes un segundo objeto serviceRef, agrégalo al archivo YAML en el campo destinations y reemplaza DEPLOYED_MODEL_NAME_2 por el nombre que le diste al segundo archivo de definición DeployedModel que creaste. Sigue agregando o quitando objetos serviceRef según sea necesario, según la cantidad de modelos que implementes.

    Establece los campos trafficPercentage según cómo quieras dividir el tráfico entre los modelos de este extremo. Modifica los valores de los campos restantes según la configuración de tu extremo.

  4. Aplica el archivo de definición Endpoint al clúster de predicción:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Reemplaza ENDPOINT_NAME por el nombre del archivo de definición de Endpoint.

Para obtener la ruta de URL del endpoint del modelo predictivo, ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • PREDICTION_CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig en el clúster de predicción.
  • PREDICTION_ENDPOINT: Es el nombre del extremo nuevo.
  • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto de predicción.

Implementa un modelo en un extremo existente

Solo puedes implementar un modelo en un extremo existente si antes implementaste otro modelo en ese extremo cuando era nuevo. El sistema requiere este paso previo para crear el extremo.

Sigue estos pasos para implementar un modelo predictivo en un extremo existente:

  1. Crea un archivo YAML que defina un recurso personalizado DeployedModel.

    En el siguiente archivo YAML, se muestra una configuración de ejemplo:

    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
    

    Reemplaza lo siguiente:

    • DEPLOYED_MODEL_NAME: Es el nombre que deseas asignar al archivo de definición DeployedModel.
    • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto asociado con el clúster de predicción.
    • PREDICTION_ENDPOINT: Es el nombre del extremo existente, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: Es la ruta de acceso a tu modelo en el bucket de almacenamiento.
    • RESOURCE_POOL_NAME: Es el nombre que le diste al archivo de definición ResourcePool cuando creaste un grupo de recursos para alojar el modelo.

    Modifica los valores en los campos restantes según tu modelo de predicción.

  2. Aplica el archivo de definición DeployedModel al clúster de predicción:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f DEPLOYED_MODEL_NAME.yaml
    

    Reemplaza lo siguiente:

    • PREDICTION_CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig en el clúster de predicción.
    • DEPLOYED_MODEL_NAME: Es el nombre del archivo de definición de DeployedModel.

    Cuando creas el recurso personalizado DeployedModel, la API de Kubernetes y el servicio de webhook validan el archivo YAML y, luego, informan si la operación se realizó de forma correcta o si falló. El operador de predicción concilia el recurso personalizado DeployedModel y lo entrega en el clúster de predicción.

  3. Muestra los detalles del recurso personalizado Endpoint existente:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yaml
    

    Reemplaza ENDPOINT_NAME por el nombre del archivo de definición de Endpoint.

  4. Actualiza el archivo YAML de la definición de recursos personalizados Endpoint agregando un objeto serviceRef nuevo en el campo destinations. En el objeto nuevo, incluye el nombre de servicio adecuado según el recurso personalizado DeployedModel que creaste recientemente.

    En el siguiente archivo YAML, se muestra una configuración de ejemplo:

    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
    

    Reemplaza lo siguiente:

    • ENDPOINT_NAME: Es el nombre del archivo de definición de Endpoint existente.
    • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto asociado con el clúster de predicción.
    • PREDICTION_ENDPOINT: Es el nombre del extremo existente. Hiciste referencia a este nombre en el archivo de definición de DeployedModel.
    • DEPLOYED_MODEL_NAME: Es el nombre de un archivo de definición de DeployedModel creado con anterioridad.
    • DEPLOYED_MODEL_NAME_2: Es el nombre que le diste al archivo de definición de DeployedModel recién creado.

    Puedes tener uno o más destinos serviceRef. Si tienes un tercer objeto serviceRef, agrégalo al archivo YAML en el campo destinations y reemplaza DEPLOYED_MODEL_NAME_3 por el nombre que le diste al tercer archivo de definición de DeployedModel que creaste. Sigue agregando o quitando objetos serviceRef según sea necesario, según la cantidad de modelos que implementes.

    Establece los campos trafficPercentage según cómo quieras dividir el tráfico entre los modelos de este extremo. Modifica los valores de los campos restantes según la configuración de tu extremo.

  5. Aplica el archivo de definición Endpoint al clúster de predicción:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

    Reemplaza ENDPOINT_NAME por el nombre del archivo de definición de Endpoint.

Para obtener la ruta de URL del endpoint del modelo predictivo, ejecuta el siguiente comando:

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

Reemplaza lo siguiente:

  • PREDICTION_CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig en el clúster de predicción.
  • PREDICTION_ENDPOINT: El nombre del extremo.
  • PROJECT_NAMESPACE: Es el nombre del espacio de nombres del proyecto de predicción.