在开始监控模型之前,您必须先向 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 会使用这些设置作为默认设置。
控制台
在 Google Cloud 控制台中,转到 Monitoring 页面。
点击配置监控。
选择要监控的模型及其版本。
如果适用,请定义预测输出的输入特征的架构和(如有)标准答案。
可选:如需监控与训练数据集的偏移,请指定数据集的位置。
可选:如需指定用于导出监控结果的现有 Cloud Storage 存储桶,请展开高级选项,然后选择一个存储桶。
如需配置监控目标,请点击继续或点击设置以创建模型监控。
此配置在运行作业时用作默认配置。
选择要监控的目标。对于每个目标,您可以设置要监控的指标以及提醒阈值。
在 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 )