Implementar un modelo en un extremo

Debes implementar un modelo en un extremo antes de que se pueda usar 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

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

Crea un grupo de recursos

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

  • Son las configuraciones del ajuste de escala automático.
  • El tipo de máquina, que define los requisitos de CPU y memoria
  • Opciones de aceleradores, 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 la GPU. El tipo de máquina solo indica 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 del modelo, mientras que el campo acceleratorType controla la GPU. Además, el campo acceleratorCount controla la cantidad de segmentos 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 la 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 de 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 las necesidades de tus 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 registran el éxito o el error. 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 de predicción que se dirija 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 de predicción 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 muestra 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/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/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-14:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/tf2-gpu.2-14:latest
          imageURI: gcr.io/aiml/prediction/containers/tf2-gpu.2-14: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 de 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 quieres 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 de predicción.

    PyTorch

    En el siguiente archivo YAML, se muestra una configuración de muestra 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 path to the folder that
        # contains the various model versions.
        # For example, s3://my-prediction-bucket/pytorch
        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-4:latest
          # For GPU-based models: gcr.io/aiml/prediction/containers/pytorch-gpu.2-4:latest
          imageURI: gcr.io/aiml/prediction/containers/pytorch-cpu.2-4: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 de 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 quieres 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 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 registran el éxito o el error. El operador de predicción reconcilia el recurso personalizado DeployedModel y lo publica 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 muestra:

    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 asignaste 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 asignaste al segundo archivo de definición DeployedModel que creaste. Sigue agregando o quitando objetos serviceRef según los necesites, en función de 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 en 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 extremo del modelo de predicción, 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 implementaste otro modelo en ese extremo cuando era nuevo. El sistema requiere este paso anterior para crear el extremo.

Sigue estos pasos para implementar un modelo de predicción 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 muestra:

    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/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/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 de 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 de 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 registran el éxito o el error. El operador de predicción reconcilia el recurso personalizado DeployedModel y lo publica 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 del recurso personalizado Endpoint agregando un nuevo objeto serviceRef en el campo destinations. En el objeto nuevo, incluye el nombre del servicio adecuado según el recurso personalizado DeployedModel que creaste recientemente.

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

    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 DeployedModel.
    • DEPLOYED_MODEL_NAME: Es el nombre de un archivo de definición DeployedModel creado anteriormente.
    • DEPLOYED_MODEL_NAME_2: Es el nombre que le asignaste al archivo de definición 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 DeployedModel que creaste. Sigue agregando o quitando objetos serviceRef según los necesites, en función de la cantidad de modelos que implementes.

    Establece los campos trafficPercentage según cómo desees dividir el tráfico entre los modelos de este extremo. Modifica los valores en 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 extremo del modelo de predicción, 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.