Obtén inferencias 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: inferencias en línea y por lotes.

Una inferencia en línea es una solicitud síncrona. Usa inferencias 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 inferencia por lotes es una solicitud asíncrona. Usa las inferencias 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 inferencias en línea. Para obtener información para proyectar valores a través de inferencias por lotes, consulta Obtén inferencias por lotes para un modelo de previsión.

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

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

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

Antes de comenzar

Antes de que puedas realizar una solicitud de inferencia 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 inferencia, 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 inferencia, 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 inferencias en línea

Para obtener inferencias, 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 inferencia 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 inferencias 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 inferencia 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.

Salida de la inferencia en línea

Vertex AI proporciona un resultado de inferencia en línea en el campo value:

{
  'value': [...]
}

La longitud de la respuesta de inferencia 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 inferencia es el menor 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 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.

Resultado de las inferencias en línea para modelos de TFT

En el caso de los modelos entrenados con Transformador de fusión temporal (TFT), Vertex AI proporciona tft_feature_importance de interpretabilidad de TFT, además de 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 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 inferencia en línea para modelos optimizados para pérdidas cuantiles

En el caso de los modelos optimizados para la pérdida cuantil, Vertex AI proporciona el siguiente resultado de inferencia en línea:

{
  "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 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 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 establecen durante el entrenamiento del modelo.
  • quantile_predictions: Los valores de inferencia asociados con quantile_values.

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 inferencias de cuantiles: [4484, 5615, 6853]. Aquí, el conjunto de cuantiles incluye la mediana, por lo que value es la inferencia para el cuantil 0.5 (5615). Las inferencias de cuantiles se pueden interpretar de la siguiente manera:

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

Resultado de la inferencia 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 conclusiones cuantiles, además del minimizador del objetivo de optimización. Los valores cuantiles se establecen durante el entrenamiento de modelos. Las inferencias de cuantiles son los valores de inferencia 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 inferencias y las explicaciones en línea. Para obtener más información, consulta Cómo obtener inferencias 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?