监控特征偏差和偏移

本页面介绍如何创建、管理和解释部署到在线预测端点的模型的模型监控作业结果。Vertex AI 模型监控支持分类和数值输入特征的特征偏差和偏移检测。

如果模型部署在生产环境中并启用了模型监控,则传入的预测请求会记录在 Google Cloud 项目的 BigQuery 表中。然后系统会分析记录的请求中包含的输入特征值,以查找偏差或偏移。

如果您为模型提供原始训练数据集,则可以启用偏差检测;否则,您应启用偏移检测。如需了解详情,请参阅 Vertex AI 模型监控简介

前提条件

要使用模型监控,请完成以下操作:

  1. 在 Vertex AI 中准备好可用的模型,可以是表格 AutoML 或导入的表格自定义训练类型。

    • 如果您使用的是现有端点,请确保在该端点下部署的所有模型都是 AutoML 表格模型或导入的自定义训练类型。
  2. 如果要启用偏差检测,请将训练数据上传到 Cloud StorageBigQuery,并获取指向该数据的 URI 链接。 对于偏移检测,不需要训练数据。

  3. 可选:对于自定义训练模型,请将模型的分析实例架构上传到 Cloud Storage。Model Monitoring 要求架构开始监控过程并计算偏差检测的基准分布。如果您在作业创建期间未提供架构,则作业会保持待处理状态,直到 Model Monitoring 可以自动解析模型收到的前 1,000 个预测请求中的架构。

创建模型监控作业

如需设置偏差检测或偏移检测,请创建模型部署监控作业:

控制台

如需使用 Google Cloud 控制台创建模型部署监控作业,请创建端点:

  1. 在 Google Cloud 控制台中,转到 Vertex AI 端点页面。

    前往“端点”

  2. 点击创建端点

  3. 新建端点窗格中,为您的端点命名并设置区域。

  4. 点击继续

  5. 模型名称字段中,选择导入的自定义训练或表格 AutoML 模型。

  6. 版本字段中,选择模型的版本。

  7. 点击继续

  8. 模型监控窗格中,确保为此端点启用模型监控功能处于开启状态。您配置的任何监控设置都会应用于部署到端点的所有模型。

  9. 输入监控作业显示名称

  10. 输入监控时长

  11. 通知电子邮件地址部分,输入一个或多个以英文逗号分隔的电子邮件地址,以便在模型超出提醒阈值时接收提醒。

  12. (可选)在通知渠道部分,添加 Cloud Monitoring 渠道,以便在模型超出提醒阈值时接收提醒。您可以选择现有的 Cloud Monitoring 渠道,也可以通过点击管理通知渠道来创建一个新的 Cloud Monitoring 渠道。控制台支持 PagerDuty、Slack 和 Pub/Sub 通知渠道。

  13. 输入采样率

  14. 可选:输入预测输入架构分析输入架构

  15. 点击继续。此时系统会打开监控目标窗格,其中包含偏差或偏移检测选项:

    偏差检测

    1. 选择训练-应用偏差检测
    2. 训练数据源下,提供训练数据源。
    3. 目标列下,输入要训练模型以进行预测的训练数据中的列名称。此字段已从监控分析中排除。
    4. 可选:在提醒阈值下,指定触发提醒的阈值。如需了解如何设置阈值的格式,请将鼠标指针放在 帮助图标上。
    5. 点击创建

    偏移检测

    1. 选择预测偏移检测
    2. 可选:在提醒阈值下,指定触发提醒的阈值。如需了解如何设置阈值的格式,请将鼠标指针放在 帮助图标上。
    3. 点击创建

gcloud

如需使用 gcloud CLI 创建模型部署监控作业,请先将模型部署到端点。

监控作业配置适用于某个端点下所有已部署的模型。

运行 gcloud ai model-monitoring-jobs create 命令。

gcloud ai model-monitoring-jobs create \
  --project=PROJECT_ID \
  --region=REGION \
  --display-name=MONITORING_JOB_NAME \
  --emails=EMAIL_ADDRESS_1,EMAIL_ADDRESS_2 \
  --endpoint=ENDPOINT_ID \
  [--feature-thresholds=FEATURE_1=THRESHOLD_1, FEATURE_2=THRESHOLD_2] \
  [--prediction-sampling-rate=SAMPLING_RATE] \
  [--monitoring-frequency=MONITORING_FREQUENCY] \
  [--analysis-instance-schema=ANALYSIS_INSTANCE_SCHEMA] \
  --target-field=TARGET_FIELD \
  --bigquery-uri=BIGQUERY_URI

其中:

  • PROJECT_ID 是您的 Google Cloud 项目的 ID。 例如 my-project

  • REGION 是监控作业的位置。 例如 us-central1

  • MONITORING_JOB_NAME 是监控作业的名称。 例如 my-job

  • EMAIL_ADDRESS 是您要接收模型监控提醒的电子邮件地址。 例如 example@example.com

  • ENDPOINT_ID 是在其下部署模型的端点的 ID。例如 1234567890987654321

  • 可选:FEATURE_1=THRESHOLD_1 是您要监控的每个特征的提醒阈值。例如,如果您指定 Age=0.4,当 Age 特征的输入分布和基准分布之间的统计距离超过 0.4 时,模型监控会记录提醒。默认情况下,每个分类和数值特征都会受监控,并且阈值为 0.3。

  • 可选:SAMPLING_RATE 是您要记录的传入预测请求的比例。例如 0.5。如果未指定,则模型监控会记录所有预测请求。

  • 可选:MONITORING_FREQUENCY 是您希望监控作业在最近记录的输入上运行的频率。最小粒度为 1 小时。默认值为 24 小时。例如 2

  • 可选:ANALYSIS_INSTANCE_SCHEMA 是描述输入数据格式的架构文件的 Cloud Storage URI。例如 gs://test-bucket/schema.yaml

  • (只有偏差检测才需要)TARGET_FIELD 是模型正在预测的字段。此字段已从监控分析中排除。例如 housing-price

  • (只有偏差检测才需要)BIGQUERY_URI 是存储在 BigQuery 中的训练数据集的链接,格式如下:

    bq://\PROJECT.\DATASET.\TABLE
    

    例如 bq://\my-project.\housing-data.\san-francisco

    您可以将 bigquery-uri 标志替换为训练数据集的备用链接:

    • 对于存储在 Cloud Storage 存储桶中的 CSV 文件,请使用 --data-format=csv --gcs-uris=gs://BUCKET_NAME/OBJECT_NAME

    • 对于存储在 Cloud Storage 存储桶中的 TFRecord 文件,请使用 --data-format=tf-record --gcs-uris=gs://BUCKET_NAME/OBJECT_NAME

    • 对于表格 AutoML 代管式数据集,请使用 --dataset=DATASET_ID

Python SDK

如需了解完整的端到端 Model Monitoring API 工作流,请参阅示例笔记本

REST API

  1. 如果您尚未将模型部署到端点,请执行此操作。在执行模型部署说明中的获取端点 ID 步骤期间,记下 JSON 响应中的 deployedModels.id 值以备后用:

  2. 创建模型监控作业请求。以下说明介绍了如何为偏移检测创建基本的监控作业。如需自定义 JSON 请求,请参阅监控作业参考

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的 Google Cloud 项目的 ID。例如 my-project
    • LOCATION:监控作业的位置。例如 us-central1
    • MONITORING_JOB_NAME:监控作业的名称。例如 my-job
    • PROJECT_NUMBER:您的 Google Cloud 项目的编号。例如 1234567890
    • ENDPOINT_ID:部署了模型的端点的 ID。例如 1234567890
    • DEPLOYED_MODEL_ID:已部署模型的 ID。
    • FEATURE:VALUE:您要监控的每个特征的提醒阈值。例如,如果您指定 "Age": {"value": 0.4},当 Age 特征的输入分布和基准分布之间的统计距离超过 0.4 时,模型监控会记录提醒。默认情况下,每个分类和数值特征都会受监控,并且阈值为 0.3。
    • EMAIL_ADDRESS:您要接收模型监控提醒的电子邮件地址。例如 example@example.com
    • NOTIFICATION_CHANNELS:您要在其中接收模型监控提醒的 Cloud Monitoring 通知渠道列表。使用通知渠道的资源名称,您可以通过列出项目中的通知渠道进行检索。例如 "projects/my-project/notificationChannels/1355376463305411567", "projects/my-project/notificationChannels/1355376463305411568"
    • 可选:ANALYSIS_INSTANCE_SCHEMA 是描述输入数据格式的架构文件的 Cloud Storage URI。例如 gs://test-bucket/schema.yaml

    请求 JSON 正文:

    {
      "displayName":"MONITORING_JOB_NAME",
      "endpoint":"projects/PROJECT_NUMBER/locations/LOCATION/endpoints/ENDPOINT_ID",
      "modelDeploymentMonitoringObjectiveConfigs": {
         "deployedModelId": "DEPLOYED_MODEL_ID",
         "objectiveConfig":  {
            "predictionDriftDetectionConfig": {
                "driftThresholds": {
                  "FEATURE_1": {
                    "value": VALUE_1
                   },
                  "FEATURE_2": {
                    "value": VALUE_2
                   }
                }
             },
          },
      },
      "loggingSamplingStrategy": {
         "randomSampleConfig":  {
            "sampleRate":  0.5,
         },
      },
      "modelDeploymentMonitoringScheduleConfig": {
         "monitorInterval": {
            "seconds": 3600,
         },
      },
      "modelMonitoringAlertConfig": {
         "emailAlertConfig": {
            "userEmails": ["EMAIL_ADDRESS"],
         },
         "notificationChannels": [NOTIFICATION_CHANNELS]
      },
      "analysisInstanceSchemaUri": ANALYSIS_INSTANCE_SCHEMA
    }
    

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION/modelDeploymentMonitoringJobs/MONITORING_JOB_NUMBER",
      ...
      "state": "JOB_STATE_PENDING",
      "scheduleState": "OFFLINE",
      ...
      "bigqueryTables": [
        {
          "logSource": "SERVING",
          "logType": "PREDICT",
          "bigqueryTablePath": "bq://PROJECT_ID.model_deployment_monitoring_8451189418714202112.serving_predict"
        }
      ],
      ...
    }
    

创建监控作业后,模型监控功能会将传入的预测请求记录在系统生成的名为 PROJECT_ID.model_deployment_monitoring_ENDPOINT_ID.serving_predict 的 BigQuery 表中。如果启用了请求-响应日志记录,则模型监控功能会将传入请求记录到用于请求-响应日志记录的同一 BigQuery 表中。

(可选)为模型监控作业配置提醒

您可以通过提醒监控和调试模型监控作业。Model Monitoring 会自动通过电子邮件通知您作业更新,但您也可以通过 Cloud Logging 和 Cloud Monitoring 通知渠道设置提醒。

电子邮件

对于以下事件,Model Monitoring 会向您在创建 Model Monitoring 作业时指定的每个电子邮件地址发送电子邮件通知:

  • 每次设置偏差或偏移检测时。
  • 每次更新现有模型监控作业配置时。
  • 计划的监控流水线运行每次失败时。

Cloud Logging

如需为计划的监控流水线运行启用日志,请将 modelDeploymentMonitoringJobs 配置中的 enableMonitoringPipelineLogs 字段设置为 true。在设置监控作业时以及在每个监控间隔,调试日志都会写入 Cloud Logging。

调试日志会写入 Cloud Logging,日志名称为 model_monitoring。例如:

logName="projects/model-monitoring-demo/logs/aiplatform.googleapis.com%2Fmodel_monitoring" resource.labels.model_deployment_monitoring_job=6680511704087920640

以下是作业进度日志条目的示例:

{
"insertId": "e2032791-acb9-4d0f-ac73-89a38788ccf3@a1",
"jsonPayload": {
  "@type": "type.googleapis.com/google.cloud.aiplatform.logging.ModelMonitoringPipelineLogEntry",
  "statusCode": {
    "message": "Scheduled model monitoring pipeline finished successfully for job projects/677687165274/locations/us-central1/modelDeploymentMonitoringJobs/6680511704087920640"
  },
  "modelDeploymentMonitoringJob": "projects/677687165274/locations/us-central1/modelDeploymentMonitoringJobs/6680511704087920640"
},
"resource": {
  "type": "aiplatform.googleapis.com/ModelDeploymentMonitoringJob",
  "labels": {
    "model_deployment_monitoring_job": "6680511704087920640",
    "location": "us-central1",
    "resource_container": "projects/677687165274"
  }
},
"timestamp": "2022-02-04T15:33:54.778883Z",
"severity": "INFO",
"logName": "projects/model-monitoring-demo/logs/staging-aiplatform.sandbox.googleapis.com%2Fmodel_monitoring",
"receiveTimestamp": "2022-02-04T15:33:56.343298321Z"
}

通知渠道

每当计划的监控流水线运行失败时,Model Monitoring 都会向您在创建 Model Monitoring 作业时指定的 Cloud Monitoring 通知渠道发送通知。

为特征异常值配置提醒

如果超过为特征设置的阈值,模型监控会检测到异常值。Model Monitoring 会自动通过电子邮件通知您检测到的异常,但您也可以通过 Cloud Logging 和 Cloud Monitoring 通知渠道设置提醒。

电子邮件

在每个监控间隔中,如果至少一个特征的阈值超过规定的阈值,则 Model Monitoring 会向您在创建 Model Monitoring 作业时指定的每个电子邮件地址发送电子邮件提醒。该电子邮件包含以下内容:

  • 监控作业运行的时间。
  • 有偏差或偏移的特征的名称。
  • 提醒阈值以及记录的统计距离测量值。

Cloud Logging

如需启用 Cloud Logging 提醒,请将 ModelMonitoringAlertConfig 配置的 enableLogging 字段设置为 true

在每个监控间隔中,如果至少一个特征的分布超过该特征的阈值,则异常值日志会写入 Cloud Logging。您可以将日志转发到 Cloud Logging 支持的任何服务,例如 Pub/Sub。

异常值会写入 Cloud Logging,日志名称为 model_monitoring_anomaly。例如:

logName="projects/model-monitoring-demo/logs/aiplatform.googleapis.com%2Fmodel_monitoring_anomaly" resource.labels.model_deployment_monitoring_job=6680511704087920640

以下是异常值日志条目的示例:

{
"insertId": "b0e9c0e9-0979-4aff-a5d3-4c0912469f9a@a1",
"jsonPayload": {
  "anomalyObjective": "RAW_FEATURE_SKEW",
  "endTime": "2022-02-03T19:00:00Z",
  "featureAnomalies": [
    {
      "featureDisplayName": "age",
      "deviation": 0.9,
      "threshold": 0.7
    },
    {
      "featureDisplayName": "education",
      "deviation": 0.6,
      "threshold": 0.3
    }
  ],
  "totalAnomaliesCount": 2,
  "@type": "type.googleapis.com/google.cloud.aiplatform.logging.ModelMonitoringAnomaliesLogEntry",
  "startTime": "2022-02-03T18:00:00Z",
  "modelDeploymentMonitoringJob": "projects/677687165274/locations/us-central1/modelDeploymentMonitoringJobs/6680511704087920640",
  "deployedModelId": "1645828169292316672"
},
"resource": {
  "type": "aiplatform.googleapis.com/ModelDeploymentMonitoringJob",
  "labels": {
    "model_deployment_monitoring_job": "6680511704087920640",
    "location": "us-central1",
    "resource_container": "projects/677687165274"
  }
},
"timestamp": "2022-02-03T19:00:00Z",
"severity": "WARNING",
"logName": "projects/model-monitoring-demo/logs/staging-aiplatform.sandbox.googleapis.com%2Fmodel_monitoring_anomaly",
"receiveTimestamp": "2022-02-03T19:59:52.121398388Z"
}

通知渠道

在每个监控间隔中,如果至少一个特征的阈值超过规定的阈值,则 Model Monitoring 会向您在创建 Model Monitoring 作业时指定的 Cloud Monitoring 通知渠道发送提醒。提醒包括有关触发提醒的 Model Monitoring 作业的信息。

更新模型监控作业

您可以查看、更新、暂停和删除模型监控作业。您必须先暂停作业,然后才能将其删除。

控制台

Google Cloud 控制台不支持暂停和删除;请改用 gcloud CLI。

如需更新模型监控作业的参数,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 Vertex AI 端点页面。

    前往“端点”

  2. 点击要修改的端点的名称。

  3. 点击修改设置

  4. 修改端点窗格中,选择模型监控监控目标

  5. 更新您要更改的字段。

  6. 点击更新

如需查看模型的指标、提醒和监控属性,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到 Vertex AI 端点页面。

    前往“端点”

  2. 点击端点的名称。

  3. 在要查看的模型对应的监控列中,点击已启用

gcloud

运行以下命令:

gcloud ai model-monitoring-jobs COMMAND MONITORING_JOB_ID \
  --PARAMETER=VALUE --project=PROJECT_ID --region=LOCATION

其中:

  • COMMAND 是您要对监控作业执行的命令。例如,updatepauseresumedelete。如需了解详情,请参阅 gcloud CLI 参考文档

  • MONITORING_JOB_ID 是监控作业的 ID。例如 123456789。您可以通过 [检索端点信息][检索 ID] 或在 Google Cloud 控制台中查看模型的监控属性来找到该 ID。该 ID 包含在监控作业的资源名称中,格式为 projects/PROJECT_NUMBER/locations/LOCATION/modelDeploymentMonitoringJobs/MONITORING_JOB_ID

  • (可选)PARAMETER=VALUE 是要更新的参数。此标志仅在使用 update 命令时需要。例如 monitoring-frequency=2。如需查看您可以更新的参数列表,请参阅 gcloud CLI 参考

  • PROJECT_ID 是您的 Google Cloud 项目的 ID。 例如 my-project

  • LOCATION 是监控作业的位置。 例如 us-central1

REST API

暂停作业

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目的编号。例如 1234567890
  • LOCATION:监控作业的位置。例如 us-central1
  • MONITORING_JOB_ID:监控作业的 ID。例如 0987654321

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{}

删除作业

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_NUMBER:您的 Google Cloud 项目的编号。例如 my-project
  • LOCATION:监控作业的位置。例如 us-central1
  • MONITORING_JOB_ID:监控作业的 ID。例如 0987654321

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/MONITORING_JOB_ID",
  ...
  "done": true,
  ...
}

分析偏差和偏移数据

您可以使用 Google Cloud 控制台来直观呈现每个受监控的特征的分布情况,并了解哪些更改随时间变化会导致偏差或偏移。您可以以直方图的形式查看特征值分布。

控制台

  1. 如需查看 Google Cloud 控制台中的特征分布直方图,请前往端点页面。

    前往“端点”

  2. 端点页面上,点击要分析的端点。

  3. 在您选择的端点的详情页面上,将会显示在该端点上部署的所有模型的列表。点击要分析的模型的名称。

  4. 模型的详情页面列出了模型的输入特征以及相关信息,例如每个特征的提醒阈值以及该特征之前的提醒数量。

  5. 如需分析特征,请点击特征的名称。此时会显示一个页面,其中显示该特征的特征分布直方图。

    对于每个受监控的特征,您可以在 Google Cloud 控制台中查看最近 50 个监控作业的分布。对于偏差检测,训练数据分布显示在输入数据分布的旁边:

    显示进行偏差检测的示例输入数据分布和训练数据分布的直方图。

    通过以直方图的形式直观呈现数据分布,您可以快速关注数据中发生的变化。之后,您可以决定调整特征生成流水线或重新训练模型。

后续步骤