Obtén predicciones en línea para un modelo de previsión

Vertex AI proporciona dos opciones para proyectar valores futuros a través del modelo de previsión entrenado: predicciones en línea y predicciones por lotes.

Una predicción en línea es una solicitud síncrona. Usa predicciones en línea cuando realices solicitudes en respuesta a la entrada de la aplicación o en otras situaciones en las que necesites una inferencia oportuna.

Una solicitud de predicción por lotes es una solicitud asíncrona. Usa las predicciones por lotes cuando no necesites una respuesta inmediata y desees procesar datos acumulados mediante una sola solicitud.

En esta página, se muestra cómo proyectar valores futuros a través de predicciones en línea. Para obtener información para proyectar valores a través de predicciones por lotes, consulta Obtén predicciones por lotes para un modelo de previsión.

Debes implementar tu modelo en un extremo antes de poder usarlo para predicciones. Un extremo es un conjunto de recursos físicos.

Puedes solicitar una explicación en lugar de una predicción. Los valores de importancia de los atributos locales de la explicación te indican cuánto contribuyó cada atributo al resultado de la predicción. Para obtener una descripción general conceptual, consulta Atribuciones de atributos para la previsión.

Para obtener información de los precios de las predicciones en línea, consulta Precios de flujos de trabajo tabulares.

Antes de comenzar

Para poder realizar una solicitud de predicción en línea, primero debes entrenar un modelo.

Crea o selecciona un extremo

Usa la función aiplatform.Endpoint.create() para crear un extremo. Si ya tienes un extremo, usa la función aiplatform.Endpoint() para seleccionarlo.

En el siguiente código se proporciona un ejemplo:

# Import required modules
from google.cloud import aiplatform
from google.cloud.aiplatform import models

PROJECT_ID = "PROJECT_ID"
REGION = "REGION"

# Initialize the Vertex SDK for Python for your project.
aiplatform.init(project=PROJECT_ID, location=REGION)
endpoint = aiplatform.Endpoint.create(display_name='ENDPOINT_NAME')

Reemplaza lo siguiente:

  • PROJECT_ID: ID del proyecto
  • REGION: la región en la que usas Vertex AI.
  • ENDPOINT_NAME: Mostrar nombre del extremo.

Selecciona un modelo entrenado

Usa la función aiplatform.Model() para seleccionar un modelo entrenado:

# Create reference to the model trained ahead of time.
model_obj = models.Model("TRAINED_MODEL_PATH")

Reemplaza lo siguiente:

  • TRAINED_MODEL_PATH: Por ejemplo, projects/PROJECT_ID/locations/REGION/models/[TRAINED_MODEL_ID]

Implementa el modelo con el extremo

Usa la función deploy() para implementar el modelo en el extremo. En el siguiente código se proporciona un ejemplo:

deployed_model = endpoint.deploy(
    model_obj,
    machine_type='MACHINE_TYPE',
    traffic_percentage=100,
    min_replica_count='MIN_REPLICA_COUNT',
    max_replica_count='MAX_REPLICA_COUNT',
    sync=True,
    deployed_model_display_name='DEPLOYED_MODEL_NAME',
)

Reemplaza lo siguiente:

  • MACHINE_TYPE: por ejemplo, n1-standard-8. Más información sobre los tipos de máquinas.
  • MIN_REPLICA_COUNT: La cantidad mínima de nodos para esta implementación. El recuento de nodos se puede aumentar o disminuir según lo requiera la carga de predicción, hasta la cantidad máxima de nodos y nunca menos que esta cantidad. Este valor debe ser mayor o igual que 1%. Si no se establece la variable min_replica_count, el valor predeterminado es 1.
  • MAX_REPLICA_COUNT: La cantidad máxima de nodos para esta implementación. El recuento de nodos se puede aumentar o disminuir, según lo requiera la carga de predicción, hasta esta cantidad de nodos y nunca menos que la cantidad mínima de nodos. Si no estableces la variable max_replica_count, la cantidad máxima de nodos se establece en el valor de min_replica_count.
  • DEPLOYED_MODEL_NAME: Un nombre para DeployedModel También puedes usar el nombre visible de Model para DeployedModel.

La implementación del modelo puede tardar aproximadamente diez minutos.

Obtén predicciones en línea

Para obtener predicciones, usa la función predict() y proporciona una o más instancias de entrada. En el siguiente código, se muestra un ejemplo:

predictions = endpoint.predict(instances=[{...}, {...}])

Cada instancia de entrada es un diccionario de Python con el mismo esquema en el que se entrenó el modelo. Debe contener un par clave-valor disponible en la previsión que corresponda a la columna de tiempo y un par clave-valor no disponible en la previsión que contenga los valores históricos de la columna de predicción objetivo. Vertex AI espera que cada instancia de entrada pertenezca a una sola serie temporal. El orden de los pares clave-valor en la instancia no es importante.

La instancia de entrada está sujeta a las siguientes restricciones:

  • Todos los pares clave-valor disponibles en la previsión deben tener la misma cantidad de datos.
  • Todos los pares clave-valor no disponibles en la previsión deben tener la misma cantidad de datos.
  • Los pares clave-valor disponibles en la previsión deben tener al menos la misma cantidad de datos que los pares clave-valor no disponibles en la previsión.

Para obtener más información sobre los tipos de columnas que se usan en la previsión, consulta Tipo de atributo y disponibilidad en la previsión.

En el siguiente código, se muestra un conjunto de dos instancias de entrada. La columna Category contiene datos de atributos. La columna Timestamp contiene datos que están disponibles en la previsión. Tres puntos son datos de contexto y dos puntos son datos de horizonte. La columna Sales contiene datos que no están disponibles en la previsión. Los tres puntos son datos de contexto. Para obtener información sobre cómo se usan el contexto y el horizonte en las previsiones, consulta Horizonte de previsión, ventana de contexto y ventana de previsiones.

instances=[
  {
    # Attribute
    "Category": "Electronics",
    # Available at forecast: three days of context, two days of horizon
    "Timestamp": ['2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07'],
    # Unavailable at forecast: three days of context
    "Sales": [490.50, 325.25, 647.00],
  },
  {
    # Attribute
    "Category": "Food",
    # Available at forecast: three days of context, two days of horizon
    "Timestamp": ['2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07'],
    # Unavailable at forecast: three days of context
    "Sales": [190.50, 395.25, 47.00],
  }
])

Para cada instancia, Vertex AI responde con dos predicciones para Sales, que corresponden a las dos marcas de tiempo de horizonte ("2023-08-06" y "2023-08-07").

Para obtener un rendimiento óptimo, la cantidad de datos de contexto y la cantidad de datos de horizonte en cada instancia de entrada deben coincidir con las longitudes del contexto y del horizonte con las que se entrenó el modelo. Si hay una discrepancia, Vertex AI agrega padding o trunca la instancia para que coincida con el tamaño del modelo.

Si la cantidad de datos de contexto en tu instancia de entrada es menor o mayor que la cantidad de datos de contexto que se usan para el entrenamiento del modelo, asegúrate de que esta cantidad de datos sea coherente en todos los pares clave-valor disponibles en el pronóstico y en todos los pares clave-valor no disponibles en el pronóstico.

Por ejemplo, considera un modelo que se entrenó con cuatro días de datos de contexto y dos días de datos de horizonte. Puedes realizar una solicitud de predicción con solo tres días de datos de contexto. En este caso, los pares clave-valor no disponibles en la previsión contienen tres valores. Los pares clave-valor disponibles en la previsión deben contener cinco valores.

Resultado de la predicción en línea

Vertex AI proporciona el resultado de la predicción en línea en el campo value:

{
  'value': [...]
}

La longitud de la respuesta de la predicción depende del horizonte que se usa en el entrenamiento del modelo y del horizonte de la instancia de entrada. La longitud de la respuesta de la predicción es el más pequeño de estos dos valores.

Considera los siguientes ejemplos:

  • Entrenas un modelo con context = 15 y horizon = 50. Tu instancia de entrada tiene context = 15 y horizon = 20. La respuesta de la predicción tiene una longitud de 20.
  • Entrenas un modelo con context = 15 y horizon = 50. Tu instancia de entrada tiene context = 15 y horizon = 100. La respuesta de predicción tiene una longitud de 50.

Resultado de la predicción en línea para modelos de TFT

En el caso de los modelos entrenados con Temporal Fusion Transformer (TFT), Vertex AI proporciona la interpretabilidad de TFT tft_feature_importance, además de las predicciones en el campo value:

{
  "tft_feature_importance": {
    "attribute_weights": [...],
    "attribute_columns": [...],
    "context_columns": [...],
    "context_weights": [...],
    "horizon_weights": [...],
    "horizon_columns": [...]
  },
  "value": [...]
}
  • attribute_columns: Funciones de previsión que son invariables de tiempo.
  • attribute_weights: Son las ponderaciones asociadas con cada una de las attribute_columns.
  • context_columns: Atributos de previsión cuyos valores de ventana de contexto sirven como entradas para el codificador de memoria a corto plazo (LSTM) de TFT.
  • context_weights: Los pesos de importancia de las funciones asociadas con cada uno de los context_columns para la instancia prevista.
  • horizon_columns: Atributos de previsión cuyos valores de ventana de contexto sirven como entradas para el codificador de memoria a corto plazo (LSTM) de TFT.
  • horizon_weights: Los pesos de importancia de las funciones asociadas con cada uno de los horizon_columns para la instancia prevista.

Resultado de la predicción en línea para modelos optimizados para pérdidas cuantiles

Para los modelos optimizados para la pérdida cuantil, Vertex AI proporciona el siguiente resultado de la predicción en línea:

{
  "value": [...],
  "quantile_values": [...],
  "quantile_predictions": [...]
}
  • value: Si tu conjunto de cuantiles incluye la mediana, value es el valor de predicción en la mediana. De lo contrario, value es el valor de predicción en el cuantil más bajo del conjunto. Por ejemplo, si tu conjunto de cuantiles es [0.1, 0.5, 0.9], value es la predicción del cuantil 0.5. Si tu conjunto de cuantiles es [0.1, 0.9], value es la predicción del 0.1 cuantil.
  • quantile_values: Los valores de los cuantiles, que se establecen durante el entrenamiento del modelo.
  • quantile_predictions: Los valores de predicción asociados con los valores cuantiles.

Considera, por ejemplo, un modelo en el que la columna objetivo es el valor de las ventas. Los valores cuantiles se definen como [0.1, 0.5, 0.9]. Vertex AI muestra las siguientes predicciones de cuantiles: [4484, 5615, 6853]. Aquí, el conjunto de cuantiles incluye la mediana, por lo que value es la predicción para el cuantil 0.5 (5615). Las predicciones de cuantiles se pueden interpretar de la siguiente manera:

  • P(valor de ventas < 4484) = 10%
  • P(valor de ventas < 5615) = 50%
  • P(valor de ventas < 6853) = 90%

Resultado de la predicción en línea para modelos de inferencia probabilística

Si tu modelo usa inferencia probabilística, el campo value contiene el minimizador del objetivo de optimización. Por ejemplo, si tu objetivo de optimización es minimize-rmse, el campo value contiene el valor medio. Si es minimize-mae, el campo value contiene el valor de la mediana.

Si tu modelo usa inferencias probabilísticas con cuantiles, Vertex AI proporciona valores y predicciones cuantiles, además del minimizador del objetivo de optimización. Los valores cuantiles se establecen durante el entrenamiento de modelos. Las predicciones de cuantiles son los valores de predicción asociados con los valores cuantiles.

Obtén explicaciones en línea

Para obtener explicaciones, usa la función explain() y proporciona una o más instancias de entrada. En el siguiente código, se muestra un ejemplo:

explanations = endpoint.explain(instances=[{...}, {...}])

El formato de las instancias de entrada es el mismo para las predicciones y las explicaciones en línea. Para obtener más información, consulta Obtén predicciones en línea.

Para obtener una descripción general conceptual de las atribuciones de atributos, consulta Atribuciones de atributos para la previsión.

Resultado de la explicación en línea

En el siguiente código, se muestra cómo puedes generar los resultados de la explicación:

# Import required modules
import json
from google.protobuf import json_format

def explanation_to_dict(explanation):
  """Converts the explanation proto to a human-friendly json."""
  return json.loads(json_format.MessageToJson(explanation._pb))

for response in explanations.explanations:
  print(explanation_to_dict(response))

Los resultados de la explicación tienen el siguiente formato:

{
  "attributions": [
    {
      "baselineOutputValue": 1.4194682836532593,
      "instanceOutputValue": 2.152980089187622,
      "featureAttributions": {
        ...
        "store_id": [
          0.007947325706481934
        ],
        ...
        "dept_id": [
          5.960464477539062e-08
        ],
        "item_id": [
          0.1100526452064514
        ],
        "date": [
          0.8525647521018982
        ],
        ...
        "sales": [
          0.0
        ]
      },
      "outputIndex": [
        2
      ],
      "approximationError": 0.01433318599207033,
      "outputName": "value"
    },
    ...
  ]
}

La cantidad de elementos attributions depende del horizonte que se usa en el entrenamiento del modelo y del horizonte de la instancia de entrada. La cantidad de elementos es el más pequeño de estos dos valores.

El campo featureAttributions en un elemento attributions contiene un valor para cada una de las columnas del conjunto de datos de entrada. Vertex AI genera explicaciones para todos los tipos de atributos: atributo, disponible en el pronóstico y no disponible en el pronóstico. Para obtener más información sobre los campos de un elemento attributions, consulta Atribución.

Borrar el extremo

Usa las funciones undeploy_all() y delete() para borrar tu extremo. En el siguiente código, se muestra un ejemplo:

endpoint.undeploy_all()
endpoint.delete()

¿Qué sigue?