设置模型监控

在开始监控模型之前,您必须先向 Vertex AI Model Registry 注册模型,然后通过创建模型监控器来配置监控详细信息。本页面介绍了如何注册模型,并说明了您可以在监控配置中定义的所有规范。

Model Monitoring v2 仅支持表格模型。这些模型可以在 Vertex AI 或其他服务基础设施上提供。

注册模型

您可以监控部署在任何服务基础设施(例如 Vertex AI 端点、GKE 或 BigQuery)上的模型。如需注册您在 Vertex AI 中提供的模型,请参阅导入模型

对于您在 Vertex AI 之外提供的模型,您可以注册参考模型,该模型是在其他资源上提供的模型的占位模型。注册参考模型时,您需要注册该模型的名称,如以下示例所示:

Python SDK

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

对于参考模型,Model Monitoring 可以支持来自 Cloud Storage 或 BigQuery 的数据集。您无法监控参考模型的特征归因。

数据源

您可以监控存储在以下来源的数据中的指标。不支持嵌套的功能。如需分析嵌套数据,请先将其展平。例如,如果您的数据位于 BigQuery 中,您可以使用 SQL 转换嵌套特征。

BigQuery
您可以提供 BigQuery 表 URI 或 SQL 查询。如需指定时间窗口或设置持续监控,表必须包含时间戳列,在数据集中指定该列作为 timestamp_field
Cloud Storage
数据必须以 CSV 或 JSONL 格式存储。
对于 CSV 文件,请在文件中添加列名称的标题作为第一行。
Vertex AI 批量预测作业
提供完全限定的批量预测作业资源名称,以监控批量预测作业。您可以在创建批量预测作业后立即运行监控作业;无需等待批量作业完成。Model Monitoring v2 会在批量预测作业完成后立即运行监控作业。
Vertex AI 端点日志记录

您必须先在端点上启用请求-响应日志记录,然后才能开始监控该端点。专用端点不受支持,因为它们不支持请求-响应日志记录。

Model Monitoring v2 要求 Vertex AI 端点请求和响应的 JSON 格式遵循 predict 方法所使用的格式。instances 对象会以数组的形式插入到日志记录表的 request_payload 列中:[INSTANCE_1, INSTANCE_2]。同样,predictions 对象会以数组的形式插入到日志记录表的 response_payload 列中:[PREDICTION_1, PREDICTION_2]

系统支持其他方法(例如原始预测),但您的数据必须遵循 predict 方法的 API 参考文档中所述的请求和响应 JSON 格式。

Vertex AI 托管式数据集

在 Vertex AI 中管理的数据集。如需了解详情,请参阅表格式数据集格式

持续监控

持续监控(也称为预定运行)可让您按设置的时间表运行监控作业。使用时间规范持续监控模型仅支持 BigQuery 和 Vertex AI 端点日志记录作为数据源。

如需将 BigQuery 用作使用时间规范持续监控的来源,表必须包含时间戳列。对于由 Vertex AI 端点日志记录功能生成的 BigQuery 表,这些表中已包含 logging_time 时间戳列。

作为通用 BigQuery 优化技术,我们建议您按时间戳对表进行分区,以通过减少查询读取的字节数来提高查询性能并控制费用。

支持的数据类型

支持数值特征和分类特征。您可以添加包含数组的列,例如布尔值、类别、字符串或整数值的数组。Model Monitoring v2 会将数组展平,使数组中的每个元素都是不同的值。

数值特征映射到以下数据类型:

  • 浮点数
  • 整数

类别特征映射到以下数据类型:

  • 布尔值
  • 字符串
  • 分类

模型架构

Model Monitoring v2 使用模型架构来解析您的数据。创建模型监控器时,必须使用此架构。对于 AutoML Tables,您无需指定模型架构;Vertex AI Model Monitoring 会自动提取模型架构。

以下示例展示了预期架构的一般结构:

Python SDK

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

如果某个列包含值数组,请将 repeated 设置为 true

对于 AutoML Tables,当 Model Monitoring v2 提取模型架构时,它会将训练数据集中的特征用作输入特征(不包括目标列)。预测输出设置为 predicted_{target_column} 列。此外,预测输出值的 Model Monitoring v2 提取方法取决于模型类型。对于 AutoML Tables 分类模型,Vertex AI Model Monitoring 会监控 argmax 标签分布。对于 AutoML Tables 回归模型,Vertex AI Model Monitoring 会监控值分布。

基准数据集和目标数据集

基准数据集表示您用于衡量一段时间内指标的参照点。目标数据集包含您用于与基准数据集进行比较的较新数据。Model Monitoring v2 会计算这两个数据集之间的指标,以帮助您跟踪模型的质量。基准数据集和目标数据集可以来自任何受支持的数据源。

作为目标和基准的示例,您可以将服务数据集(目标)与模型的训练数据集(基准)进行比较,也可以将服务数据集(目标)与之前时间段的服务数据集(基准)进行比较。

目标数据集

当您选择目标数据集时,Model Monitoring v2 可以处理整个数据集,您也可以设置窗口,用于指定 Model Monitoring v2 要检查的数据量。例如,如果您指定 24 小时窗口,则 Model Monitoring v2 仅将最新 24 小时的数据与基准数据集进行比较。

对于数据偏移分析,如果处理的数据量不足,偏移可能会不稳定。较长的时间窗口有助于避免因样本数较少而触发的提醒。

基准数据集

您可以将基准数据集设置为任何受支持的数据源,例如包含模型训练数据的 Vertex AI 托管式数据集。与目标数据集类似,您可以选择让 Model Monitoring v2 处理整个数据集或特定窗口。

时间规范

您可以通过以下两种方法设置监控时间规范:

  • 时间范围,包括开始时间和结束时间对。
  • 时间窗口和偏移量,用于指定要包含的数据量以及比较数据集之间的时间段。

例如,如果您想将近期数据与之前收集的数据进行比较,可以设置偏移量。偏移量指定目标数据集和基准数据集之间的时间段。例如,假设您为目标数据集设置了 1 天的窗口,而为基准数据集设置了 1 周的偏移量,同时设置了 1 天的窗口。

在本例中,目标数据集包含监控作业开始时间前 24 小时的数据。基准数据集包含来自同一 24 小时周期(但正好是前一周)的数据。

创建模型监控器

创建模型监控器,以将监控详细信息与已在 Vertex AI Model Registry 中注册的模型版本相关联。生成的资源称为模型监控器。您只能为每个模型版本创建一个模型监控器。

创建模型监控时,请指定模型名称、版本和架构。对于某些模型(例如 AutoML 模型),系统会为您提供架构。

您可以视需要在模型监控器中设定监控目标、训练数据集、监控输出位置和通知设置。运行监控作业时,Model Monitoring v2 会使用这些设置作为默认设置。

控制台

  1. 在 Google Cloud 控制台中,转到 Monitoring 页面。

    转到“监控”

  2. 点击配置监控

  3. 选择要监控的模型及其版本。

  4. 如果适用,请定义预测输出的输入特征的架构和(如有)标准答案。

  5. 可选:如需监控与训练数据集的偏移,请指定数据集的位置。

  6. 可选:如需指定用于导出监控结果的现有 Cloud Storage 存储桶,请展开高级选项,然后选择一个存储桶。

  7. 如需配置监控目标,请点击继续或点击设置以创建模型监控。

    此配置在运行作业时用作默认配置。

  8. 选择要监控的目标。对于每个目标,您可以设置要监控的指标以及提醒阈值。

  9. 在 Cloud Monitoring 中指定电子邮件地址和(可选)通知渠道,以便监控提醒和通知。

Python SDK

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_condition=0.0003,
  feature_alert_conditions={"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_config=DEFAULT_FEATURE_ATTRIBUTION_SPEC,
  output_spec=DEFAULT_OUTPUT_SPEC,
  notification_spec=DEFAULT_NOTIFICATION_SPEC
)