Desplegar un modelo en un endpoint

Debes desplegar un modelo en un punto final para poder usarlo y ofrecer predicciones online. Al desplegar un modelo, se asocian recursos físicos para ofrecer predicciones online con baja latencia.

En esta página se describen los pasos que debe seguir para desplegar un modelo en un endpoint mediante la predicción online.

Antes de empezar

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

Crear un grupo de recursos

Un recurso personalizado ResourcePool te permite tener un control pormenorizado sobre el comportamiento de tu modelo. Puedes definir ajustes como los siguientes:

  • Configuraciones de autoescalado.
  • 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.

En el caso del grupo de recursos del modelo implementado, el número y el tipo de aceleradores determinan el uso de la GPU. El tipo de máquina solo determina los recursos de CPU y memoria solicitados. Por este motivo, al incluir aceleradores de GPU en la especificación 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 el número de porciones de GPU.

Sigue estos pasos para crear un ResourcePoolrecurso personalizado:

  1. Crea un archivo YAML que defina el recurso personalizado ResourcePool. Los siguientes ejemplos contienen archivos YAML de 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
    

    Haz los cambios siguientes:

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

    Modifica los valores de 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
    

    Haz los cambios siguientes:

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

Cuando creas el recurso personalizado ResourcePool, la API de Kubernetes y el servicio de webhook validan el archivo YAML e informan de si se ha completado correctamente o no. El operador de predicción aprovisiona y reserva tus recursos del grupo de recursos cuando despliegas tus modelos en un endpoint.

Desplegar un modelo en un endpoint

Si tienes un grupo de recursos, puedes desplegar más de un modelo en un endpoint y desplegar un modelo en más de un endpoint. Despliega un modelo de predicción dirigido a contenedores admitidos. En función de si el endpoint ya existe o no, elige uno de los dos métodos siguientes:

Desplegar un modelo en un endpoint nuevo

Sigue estos pasos para desplegar un modelo de predicción en un nuevo endpoint:

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

    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/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
    

    Haz los cambios siguientes:

    • DEPLOYED_MODEL_NAME: el nombre que quieras dar al archivo de definición DeployedModel.
    • PROJECT_NAMESPACE: el nombre del espacio de nombres del proyecto asociado al clúster de predicción.
    • PREDICTION_ENDPOINT: el nombre que quieras dar al nuevo endpoint, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: la ruta a tu modelo en el contenedor de almacenamiento.
    • RESOURCE_POOL_NAME: el nombre que le asignaste al archivo de definición ResourcePool cuando creaste un grupo de recursos para alojar el modelo.

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

    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 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
    

    Haz los cambios siguientes:

    • DEPLOYED_MODEL_NAME: el nombre que quieras dar al archivo de definición DeployedModel.
    • PROJECT_NAMESPACE: el nombre del espacio de nombres del proyecto asociado al clúster de predicción.
    • PREDICTION_ENDPOINT: el nombre que quieras dar al nuevo endpoint, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: la ruta a tu modelo en el contenedor de almacenamiento.
    • RESOURCE_POOL_NAME: el nombre que le asignaste al archivo de definición ResourcePool cuando creaste un grupo de recursos para alojar el modelo.

    Modifica los valores de 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
    

    Haz los cambios siguientes:

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

    Cuando creas el recurso personalizado DeployedModel, la API de Kubernetes y el servicio de webhook validan el archivo YAML e informan si se ha completado correctamente o no. El operador de predicción reconcilia el recurso personalizado DeployedModel y lo sirve 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
    

    Haz los cambios siguientes:

    • ENDPOINT_NAME: el nombre que quieras dar al archivo de definición de Endpoint.
    • PROJECT_NAMESPACE: el nombre del espacio de nombres del proyecto asociado al clúster de predicción.
    • PREDICTION_ENDPOINT: el nombre del nuevo endpoint. Has definido este nombre en el archivo de definición DeployedModel.
    • DEPLOYED_MODEL_NAME: el nombre que le has dado al archivo de definición DeployedModel.

    Puedes tener uno o varios serviceRef destinos. Si tienes un segundo objeto serviceRef, añádelo al archivo YAML en el campo destinations y sustituye DEPLOYED_MODEL_NAME_2 por el nombre que le hayas dado al segundo archivo de definición DeployedModel que hayas creado. Añade o elimina serviceRef objetos según los necesites, en función del número de modelos que vayas a desplegar.

    Define los campos trafficPercentage en función de cómo quieras dividir el tráfico entre los modelos de este endpoint. Modifica los valores de los campos restantes según las configuraciones de tus endpoints.

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

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

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

Para obtener la ruta de la URL del punto final 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}'

Haz los cambios siguientes:

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

Desplegar un modelo en un endpoint

Solo puedes desplegar un modelo en un punto final si ya habías desplegado otro modelo en ese punto final cuando era nuevo. El sistema requiere este paso anterior para crear el endpoint.

Sigue estos pasos para desplegar un modelo de predicción en un endpoint que ya tengas:

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

    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/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
    

    Haz los cambios siguientes:

    • DEPLOYED_MODEL_NAME: el nombre que quieras dar al archivo de definición DeployedModel.
    • PROJECT_NAMESPACE: el nombre del espacio de nombres del proyecto asociado al clúster de predicción.
    • PREDICTION_ENDPOINT: el nombre del endpoint, como my-img-prediction-endpoint.
    • PATH_TO_MODEL: la ruta a tu modelo en el contenedor de almacenamiento.
    • RESOURCE_POOL_NAME: el nombre que le has dado al archivo de definición cuando has creado un grupo de recursos para alojar el modelo.ResourcePool

    Modifica los valores de 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
    

    Haz los cambios siguientes:

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

    Cuando creas el recurso personalizado DeployedModel, la API de Kubernetes y el servicio de webhook validan el archivo YAML e informan si se ha completado correctamente o no. El operador de predicción reconcilia el recurso personalizado DeployedModel y lo sirve en el clúster de predicción.

  3. Mostrar los detalles del recurso personalizado Endpoint:

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG describe -f ENDPOINT_NAME.yaml
    

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

  4. Actualiza el archivo YAML de la definición de recurso personalizado Endpoint añadiendo un nuevo objeto serviceRef al campo destinations. En el nuevo objeto, incluye el nombre del servicio adecuado en función del recurso personalizado DeployedModel que hayas creado.

    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
    

    Haz los cambios siguientes:

    • ENDPOINT_NAME: el nombre del archivo de definición Endpoint.
    • PROJECT_NAMESPACE: el nombre del espacio de nombres del proyecto asociado al clúster de predicción.
    • PREDICTION_ENDPOINT: el nombre del endpoint. Has hecho referencia a este nombre en el archivo de definición DeployedModel.
    • DEPLOYED_MODEL_NAME: el nombre de un archivo de definición DeployedModel creado anteriormente.
    • DEPLOYED_MODEL_NAME_2: el nombre que le has dado al archivo de definición DeployedModel recién creado.

    Puedes tener uno o varios serviceRef destinos. Si tienes un tercer objeto serviceRef, añádelo al archivo YAML en el campo destinations y sustituye DEPLOYED_MODEL_NAME_3 por el nombre que le hayas dado al tercer archivo de definición DeployedModel que hayas creado. Añade o elimina serviceRef objetos según los necesites, en función del número de modelos que vayas a desplegar.

    Define los campos trafficPercentage en función de cómo quieras dividir el tráfico entre los modelos de este endpoint. Modifica los valores de los campos restantes según las configuraciones de tus endpoints.

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

    kubectl --kubeconfig PREDICTION_CLUSTER_KUBECONFIG apply -f ENDPOINT_NAME.yaml
    

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

Para obtener la ruta de la URL del punto final 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}'

Haz los cambios siguientes:

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