Configurar la monitorización de modelos

Antes de poder monitorizar un modelo, debe registrarlo en Vertex AI Model Registry y, a continuación, configurar los detalles de la monitorización creando un monitor de modelos. En esta página se describe cómo registrar un modelo y se explican todas las especificaciones que puede definir en una configuración de monitorización.

Model Monitoring v2 solo admite modelos tabulares. Estos modelos se pueden servir en Vertex AI o en otra infraestructura de servicio.

Registrar modelo

Puedes monitorizar los modelos que se hayan desplegado en cualquier infraestructura de servicio, como los puntos finales de Vertex AI, GKE o BigQuery. Para registrar un modelo que sirvas en Vertex AI, consulta Importar modelos.

En el caso de los modelos que sirves fuera de Vertex AI, puedes registrar un modelo de referencia, que es un marcador de posición para los modelos que se sirven en otros recursos. Cuando registras un modelo de referencia, registras el nombre del modelo, como se muestra en el siguiente ejemplo:

SDK de Python

model = aiplatform.Model.upload(
 display_name="MODEL_NAME"
)

En el caso de los modelos de referencia, Model Monitoring puede admitir conjuntos de datos de Cloud Storage o BigQuery. No puedes monitorizar las atribuciones de características de los modelos de referencia.

Fuentes de datos

Puede monitorizar métricas en los datos almacenados en las siguientes fuentes. No se admiten funciones anidadas. Para analizar datos anidados, primero debes aplanarlos. Si tus datos están en BigQuery, por ejemplo, puedes usar SQL para transformar las características anidadas.

BigQuery
Puede proporcionar un URI de tabla de BigQuery o una consulta de SQL. Para especificar un periodo o configurar una monitorización continua, la tabla debe incluir una columna de marca de tiempo, que se especifica en el conjunto de datos como timestamp_field.
Cloud Storage
Los datos deben almacenarse en formato CSV o JSONL. En el caso de los archivos CSV, incluya un encabezado con los nombres de las columnas en la primera fila del archivo.
Tareas de predicción en lote de Vertex AI
Proporciona el nombre de recurso completo de la tarea de predicción por lotes para monitorizarla. Puedes ejecutar una tarea de monitorización en cuanto crees la tarea de predicción por lotes. No tienes que esperar a que se complete la tarea por lotes. Monitorización de modelos v2 ejecuta la tarea de monitorización poco después de que se haya completado la tarea de predicción por lotes.
Registro de endpoints de Vertex AI

Debes habilitar el registro de solicitudes y respuestas en el endpoint para poder empezar a monitorizarlo. No se admiten los endpoints privados porque no admiten el registro de solicitudes y respuestas.

Model Monitoring v2 espera que el formato JSON de las solicitudes y respuestas de los endpoints de Vertex AI siga el formato utilizado por el método predict. Los objetos instances se insertan en la tabla de registro en la columna request_payload como una matriz: [INSTANCE_1, INSTANCE_2]. Del mismo modo, los objetos predictions se insertan en la tabla de registro en la columna response_payload como una matriz: [PREDICTION_1, PREDICTION_2].

Se admiten otros métodos (como la predicción sin formato), pero los datos deben seguir el formato JSON de solicitud y respuesta que se describe en la referencia de la API del método predict.

Conjunto de datos gestionado de Vertex AI

Conjuntos de datos gestionados en Vertex AI. Para obtener más información, consulta el formato de conjunto de datos tabular.

Monitorización continua

La monitorización continua (también conocida como ejecuciones programadas) le permite ejecutar trabajos de monitorización según una programación que usted defina. La monitorización continua de modelos con especificaciones de tiempo solo admite BigQuery y el registro de endpoints de Vertex AI como fuentes de datos.

Para usar BigQuery como fuente de monitorización continua con especificaciones de tiempo, tu tabla debe tener una columna de marca de tiempo. En el caso de las tablas de BigQuery generadas por el registro de endpoints de Vertex AI, las tablas ya incluyen una columna de marca de tiempo logging_time.

Como técnica general de optimización de BigQuery, te recomendamos que particiones tu tabla por marca de tiempo para mejorar el rendimiento de las consultas y controlar los costes reduciendo el número de bytes leídos por una consulta.

Tipos de datos admitidos

Se admiten tanto las características numéricas como las categóricas. Puedes incluir columnas con arrays, como un array de valores booleanos, categóricos, de cadena o enteros. Monitorización de modelos v2 aplana la matriz para que cada elemento de la matriz sea un valor distinto.

Las funciones numéricas se asignan a los siguientes tipos de datos:

  • Flotante
  • Entero

Las funciones categóricas se asignan a los siguientes tipos de datos:

  • Booleano
  • Cadena
  • Categórica

Esquema del modelo

Model Monitoring v2 usa el esquema del modelo para analizar sus datos. Este esquema es obligatorio cuando creas un monitor de modelo. En AutoML Tables, no es necesario especificar el esquema del modelo, ya que Vertex AI Model Monitoring lo obtiene automáticamente.

En el siguiente ejemplo se muestra la estructura general del esquema esperado:

SDK de Python

ml_monitoring.spec.ModelMonitoringSchema(
  feature_fields=[
      ml_monitoring.spec.FieldSchema(
          name="FEATURE_NAME",
          data_type="DATA_TYPE",
          repeated=BOOLEAN
      )
  ],
    prediction_fields = [
      model_monitor.spec.FieldSchema(
          name="PREDICTION_NAME",
          data_type="DATA_TYPE",
          repeated=BOOLEAN
      )
  ],
  ground_truth_fields = [
      model_monitor.spec.FieldSchema(
          feature="GROUND_TRUTH_NAME",
          data_type="DATA_TYPE",
          repeated=BOOLEAN
      )
  ]
)

Si una columna incluye una matriz de valores, asigna el valor true a repeated.

En AutoML Tables, cuando Model Monitoring v2 obtiene el esquema del modelo, usa las funciones que están en el conjunto de datos de entrenamiento como funciones de entrada, sin incluir la columna de destino. El resultado de la predicción se asigna a la columna predicted_{target_column}. Además, el método de extracción de Model Monitoring v2 para el valor de salida de la predicción depende del tipo de modelo. En el caso de los modelos de clasificación de AutoML Tables, Vertex AI Model Monitoring monitoriza la distribución de etiquetas argmax. En el caso de los modelos de regresión de AutoML Tables, Vertex AI Model Monitoring monitoriza la distribución de valores.

Conjuntos de datos de referencia y objetivo

El conjunto de datos de referencia representa un punto de referencia que se usa para medir las métricas a lo largo del tiempo. El conjunto de datos de destino incluye datos más recientes que se usan para compararlos con el conjunto de datos de referencia. Monitorización de modelos v2 calcula las métricas entre los dos conjuntos de datos para ayudarte a hacer un seguimiento de la calidad de tus modelos. Los conjuntos de datos de referencia y de destino pueden proceder de cualquier fuente de datos compatible.

Por ejemplo, puedes comparar tu conjunto de datos de servicio (objetivo) con el conjunto de datos de entrenamiento de tu modelo (valor de referencia) o con un conjunto de datos de servicio de un periodo anterior (valor de referencia).

Conjunto de datos de destino

Cuando seleccionas el conjunto de datos de destino, Monitorización de modelos v2 puede procesar todo el conjunto de datos o puedes definir una ventana, que especifica la cantidad de datos que debe examinar Monitorización de modelos v2. Por ejemplo, si especifica un periodo de 24 horas, Model Monitoring v2 solo compara los datos de las últimas 24 horas con el conjunto de datos de referencia.

En el análisis de la deriva de datos, la deriva puede ser volátil si se procesa un volumen de datos inadecuado. Una ventana temporal más amplia puede ayudar a evitar alertas que se hayan activado debido a un número de muestras bajo.

Conjunto de datos de referencia

Puedes definir como conjunto de datos de referencia cualquier fuente de datos admitida, como un conjunto de datos gestionado de Vertex AI que contenga los datos de entrenamiento de tu modelo. Al igual que con los conjuntos de datos de destino, puede elegir si quiere que Model Monitoring v2 procese todo el conjunto de datos o una ventana concreta.

Especificación de tiempo

Puedes definir especificaciones de tiempo de monitorización de dos formas:

  • Intervalo de tiempo, que incluye un par de horas de inicio y de finalización.
  • Ventana temporal y desfase, que especifican la cantidad de datos que se deben incluir y el periodo entre los conjuntos de datos de comparación.

Por ejemplo, si quiere comparar datos recientes con datos recogidos anteriormente, puede definir un desfase. El desfase especifica el periodo entre los conjuntos de datos de destino y de referencia. Por ejemplo, supongamos que define su conjunto de datos objetivo con una ventana de un día y su valor de referencia con un desfase de una semana y una ventana de un día.

En este caso, el conjunto de datos de destino incluye datos de las 24 horas anteriores a la hora de inicio de la tarea de monitorización. El conjunto de datos de referencia incluye datos del mismo periodo de 24 horas, pero exactamente una semana antes.

Crear un monitor de modelo

Crea un monitor de modelo para asociar los detalles de la monitorización con una versión de un modelo que se haya registrado en Vertex AI Model Registry. El recurso resultante se denomina monitor de modelo. Solo puede crear un monitor de modelo por versión de modelo.

Cuando crees un monitor de modelo, especifica el nombre del modelo, su versión y su esquema. En algunos modelos, como los de AutoML, el esquema se proporciona automáticamente.

En el monitor de modelos, puede definir objetivos de monitorización, un conjunto de datos de entrenamiento, una ubicación de salida de la monitorización y ajustes de notificaciones. Cuando ejecutas un trabajo de monitorización, Model Monitoring v2 usa estos ajustes como valores predeterminados.

Consola

  1. En la Google Cloud consola, ve a la página Monitorización.

    Ir a Monitoring

  2. Haz clic en Configurar monitorización.

  3. Selecciona un modelo y su versión para monitorizarlos.

  4. Si procede, define el esquema de las funciones de entrada, las salidas de predicción y, si está disponible, la verdad fundamental.

  5. Opcional: Para monitorizar la deriva de tu conjunto de datos de entrenamiento, especifica la ubicación de tu conjunto de datos.

  6. Opcional: Para especificar un segmento de Cloud Storage que ya tengas para exportar los resultados de la monitorización, despliega Opciones avanzadas y, a continuación, selecciona un segmento.

  7. Para configurar los objetivos de monitorización, haga clic en Continuar o en Configurar para crear el monitor de modelos.

    Esta configuración se usa como valor predeterminado al ejecutar un trabajo.

  8. Selecciona los objetivos que quieras monitorizar. En cada objetivo, puedes definir la métrica que quieres monitorizar y un umbral para las alertas.

  9. Especifica las direcciones de correo electrónico y, opcionalmente, los canales de notificación en Cloud Monitoring para las alertas y notificaciones de monitorización.

SDK de Python

from vertexai.resources.preview import ml_monitoring
from google.cloud.aiplatform_v1beta1.types import ExplanationSpec, ExplanationParameters, ExplanationMetadata

# Define Monitoring Schema. For AutoML models, this is optional if the schema information is available.
MONITORING_SCHEMA=ml_monitoring.spec.ModelMonitoringSchema(
  feature_fields=[
      ml_monitoring.spec.FieldSchema(
          name="sepal_length_cm",
          data_type="float"
      ),
      ml_monitoring.spec.FieldSchema(
          name="sepal_width_cm",
          data_type="float"
      ),
      ml_monitoring.spec.FieldSchema(
          name="petal_length_cm",
          data_type="float"
      ),
      ml_monitoring.spec.FieldSchema(
          name="petal_width_cm",
          data_type="float"
      )
  ],
  prediction_fields = [
      ml_monitoring.spec.FieldSchema(
          name="predicted_species",
          data_type="categorical"
      )
  ]
)

TRAINING_DATASET = ml_monitoring.spec.MonitoringInput(
  gcs_uri=GCS_INPUT_URI,
  data_format=DATA_FORMAT,
)

DEFAULT_FEATURE_DRIFT_SPEC=ml_monitoring.spec.DataDriftSpec(
  categorical_metric_type="l_infinity",
  numeric_metric_type="jensen_shannon_divergence",
  default_categorical_alert_threshold=0.1,
  default_numeric_alert_threshold=0.1,
)

DEFAULT_PREDICTION_OUTPUT_DRIFT_SPEC=ml_monitoring.spec.DataDriftSpec(
  categorical_metric_type="l_infinity",
  numeric_metric_type="jensen_shannon_divergence",
  default_categorical_alert_threshold=0.1,
  default_numeric_alert_threshold=0.1,
)

DEFAULT_FEATURE_ATTRIBUTION_SPEC=ml_monitoring.spec.FeatureAttributionSpec(
  default_alert_threshold=0.0003,
  feature_alert_thresholds={"sepal_length_cm":0.0001},
)

EXPLANATION_SPEC=ExplanationSpec(
  parameters=ExplanationParameters(
      {"sampled_shapley_attribution": {"path_count": 2}}
  ),
  metadata=ExplanationMetadata(
      inputs={
          "sepal_length_cm": ExplanationMetadata.InputMetadata({
              "input_tensor_name": "sepal_length_cm",
              "encoding": "IDENTITY",
              "modality": "numeric",
          }),
          ...
      },
      ...
  )
)

DEFAULT_OUTPUT_SPEC = ml_monitoring.spec.output.OutputSpec(
  gcs_base_dir=GCS_OUTPUT_BASE_DIR
)

DEFAULT_NOTIFICATION_SPEC = ml_monitoring.spec.NotificationSpec(
  user_emails=['email@example.com']
)

my_model_monitor = ml_monitoring.ModelMonitor.create(
  display_name=MONITORING_JOB_DISPLAY_NAME,
  model_name=MODEL_RESOURCE_NAME,
  model_version_id=MODEL_VERSION_ID,
  model_monitoring_schema=MONITORING_SCHEMA,
  # The following fields are optional for creating the model monitor.
  training_dataset=TRAINING_DATASET,
  tabular_objective_spec=ml_monitoring.spec.TabularObjective(
      feature_drift_spec=DEFAULT_FEATURE_DRIFT_SPEC,
      prediction_output_drift_spec=DEFAULT_PREDICTION_OUTPUT_DRIFT_SPEC,
      feature_attribution_spec=DEFAULT_FEATURE_ATTRIBUTION_SPEC,
  ),
  explanation_spec=DEFAULT_FEATURE_ATTRIBUTION_SPEC,
  output_spec=DEFAULT_OUTPUT_SPEC,
  notification_spec=DEFAULT_NOTIFICATION_SPEC
)