Obtener inferencias online de un modelo de previsión

Vertex AI ofrece dos opciones para proyectar valores futuros con el modelo de previsión entrenado: inferencias online e inferencias por lotes.

Una inferencia online es una solicitud síncrona. Usa inferencias online cuando hagas solicitudes en respuesta a la entrada de una aplicación o en otras situaciones en las que necesites una inferencia oportuna.

Una solicitud de inferencia por lotes es una solicitud asíncrona. Usa las inferencias por lotes cuando no necesites una respuesta inmediata y quieras procesar los datos acumulados con una sola solicitud.

En esta página se explica cómo proyectar valores futuros mediante inferencias online. Para saber cómo proyectar valores mediante inferencias por lotes, consulta el artículo Obtener inferencias por lotes de un modelo de previsión.

Debes desplegar tu modelo en un endpoint para poder usarlo en inferencias. Un endpoint es un conjunto de recursos físicos.

Puedes solicitar una explicación en lugar de una inferencia. Los valores de importancia de las funciones locales de la explicación te indican cuánto ha contribuido cada función al resultado de la inferencia. Para obtener una descripción general conceptual, consulta Atribuciones de funciones para la previsión.

Para obtener información sobre los precios de las inferencias online, consulta Precios de los flujos de trabajo tabulares.

Antes de empezar

Antes de poder hacer una solicitud de inferencia online, primero debes entrenar un modelo.

Crear o seleccionar un endpoint

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

El siguiente código muestra 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')

Haz los cambios siguientes:

  • PROJECT_ID: tu ID de proyecto.
  • REGION: la región en la que usas Vertex AI.
  • ENDPOINT_NAME: nombre visible del endpoint.

Seleccionar 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")

Haz los cambios siguientes:

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

Desplegar el modelo en el endpoint

Usa la función deploy() para desplegar el modelo en el endpoint. El siguiente código muestra 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',
)

Haz los cambios siguientes:

  • MACHINE_TYPE: por ejemplo, n1-standard-8. Más información sobre los tipos de máquinas
  • MIN_REPLICA_COUNT: número mínimo de nodos de esta implementación. Puedes aumentar o disminuir el número de nodos según lo requiera la carga de inferencia, hasta el número máximo de nodos y sin que nunca sea inferior a este número de nodos. Este valor debe ser superior o igual a 1. Si no define la variable min_replica_count, el valor predeterminado será 1.
  • MAX_REPLICA_COUNT: número máximo de nodos de este despliegue. Puedes aumentar o reducir el número de nodos según la carga de inferencia, hasta este número de nodos y nunca por debajo del número mínimo de nodos. Si no defines la variable max_replica_count, el número máximo de nodos se definirá con el valor de min_replica_count.
  • DEPLOYED_MODEL_NAME: nombre del DeployedModel. También puedes usar el nombre visible de Model para DeployedModel.

El despliegue del modelo puede tardar unos diez minutos.

Obtener inferencias online

Para obtener inferencias, usa la función predict() y proporciona una o varias 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 con el que se entrenó el modelo. Debe contener un par clave-valor available at forecast que corresponda a la columna de tiempo y un par clave-valor unavailable at forecast que contenga los valores históricos de la columna de inferencia de destino. Vertex AI espera que cada instancia de entrada pertenezca a una sola serie temporal. El orden de los pares clave-valor de la instancia no es importante.

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

  • Todos los pares clave-valor de available at forecast deben tener el mismo número de puntos de datos.
  • Todos los pares clave-valor unavailable at forecast deben tener el mismo número de puntos de datos.
  • Los pares clave-valor disponibles en la previsión deben tener al menos tantos puntos de datos como 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 las previsiones, consulte Tipos de funciones y disponibilidad en las previsiones.

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 saber cómo se usan el contexto y el horizonte en las previsiones, consulta Horizonte de previsión, ventana de contexto y ventana de previsión.

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],
  }
])

En cada instancia, Vertex AI responde con dos inferencias para Sales, que se corresponden con las dos marcas de tiempo del horizonte ("2023-08-06" y "2023-08-07").

Para obtener un rendimiento óptimo, el número de puntos de datos de context y el número de puntos de datos de horizon de cada instancia de entrada deben coincidir con las longitudes de contexto y horizonte con las que se entrenó el modelo. Si hay alguna discrepancia, Vertex AI rellena o trunca la instancia para que coincida con el tamaño del modelo.

Si el número de puntos de datos de contexto de tu instancia de entrada es inferior o superior al número de puntos de datos de contexto que se han usado para entrenar el modelo, asegúrate de que este número de puntos sea coherente en todos los pares clave-valor disponibles en la previsión y en todos los pares clave-valor no disponibles en la previsión.

Por ejemplo, supongamos que se ha entrenado un modelo con datos de contexto de cuatro días y datos de horizonte de dos días. Puedes hacer una solicitud de inferencia con solo tres días de datos de contexto. En este caso, los pares clave-valor unavailable at forecast contienen tres valores. Los pares clave-valor de available at forecast deben contener cinco valores.

Resultado de la inferencia online

Vertex AI proporciona la salida de inferencia online en el campo value:

{
  'value': [...]
}

La duración de la respuesta de inferencia depende del horizonte utilizado en el entrenamiento del modelo y del horizonte de la instancia de entrada. La longitud de la respuesta de inferencia es el menor de estos dos valores.

Ten en cuenta 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 inferencia 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 inferencia tiene una longitud de 50.

Resultados de las inferencias online de los modelos TFT

En el caso de los modelos entrenados con Temporal Fusion Transformer (TFT), Vertex AI proporciona interpretabilidad de TFT tft_feature_importance, además de las inferencias 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 invariantes en el tiempo.
  • attribute_weights: los pesos asociados a cada uno de los attribute_columns.
  • context_columns: funciones de previsión cuyos valores de ventana de contexto sirven como entradas para el codificador de memoria a corto y largo plazo (LSTM) de TFT.
  • context_weights: los pesos de importancia de las funciones asociados a cada uno de los context_columns de la instancia predicha.
  • horizon_columns: funciones de previsión cuyos valores de horizonte de previsión sirven como entradas para el decodificador de memoria a corto y largo plazo (LSTM) de TFT.
  • horizon_weights: los pesos de importancia de las funciones asociados a cada uno de los horizon_columns de la instancia predicha.

Resultados de inferencia online de modelos optimizados para la pérdida de cuantiles

En el caso de los modelos optimizados para la pérdida de cuantiles, Vertex AI proporciona el siguiente resultado de inferencia online:

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

Por ejemplo, supongamos que tiene un modelo en el que la columna de destino es el valor de las ventas. Los valores de los cuantiles se definen como [0.1, 0.5, 0.9]. Vertex AI devuelve las siguientes inferencias de cuantiles: [4484, 5615, 6853]. En este caso, el conjunto de cuantiles incluye la mediana, por lo que value es la inferencia del cuantil 0.5 (5615). Las inferencias de los cuantiles se pueden interpretar de la siguiente manera:

  • P(sales value < 4484) = 10%
  • P(sales value < 5615) = 50%
  • P(sales value < 6853) = 90%

Resultados de la inferencia online de modelos con inferencia probabilística

Si tu modelo usa la inferencia probabilística, el campo value contiene el minimizador del objetivo de optimización. Por ejemplo, si su 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 inferencia probabilística con cuantiles, Vertex AI proporciona valores e inferencias de cuantiles, además del minimizador del objetivo de optimización. Los valores de los cuantiles se definen durante el entrenamiento del modelo. Las inferencias de cuantiles son los valores de inferencia asociados a los valores de cuantiles.

Obtener explicaciones online

Para obtener explicaciones, usa la función explain() y proporciona una o varias 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 inferencias y las explicaciones online. Para obtener más información, consulta Obtener inferencias online.

Para obtener una descripción general conceptual de las atribuciones de funciones, consulta Atribuciones de funciones para las previsiones.

Resultado de la explicación online

En el siguiente código se muestra cómo puedes obtener 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"
    },
    ...
  ]
}

El número de elementos attributions depende del horizonte utilizado en el entrenamiento del modelo y del horizonte de la instancia de entrada. El número de elementos es el menor de estos dos valores.

El campo featureAttributions de un elemento attributions contiene un valor por cada una de las columnas del conjunto de datos de entrada. Vertex AI genera explicaciones para todos los tipos de características: atributo, disponible en la previsión y no disponible en la previsión. Para obtener más información sobre los campos de un elemento attributions, consulte Atribución.

Eliminar el endpoint

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

endpoint.undeploy_all()
endpoint.delete()

Siguientes pasos