設定模型監控

開始監控模型前,您必須先向 Vertex AI Model Registry 註冊模型,然後建立模型監控器,設定監控詳細資料。本頁面說明如何註冊模型,並解釋您可以在監控設定中定義的所有規格。

模型監控 v2 僅支援表格型模型。這些模型可在 Vertex AI 或其他服務基礎架構上提供服務。

註冊模型

您可以監控部署在任何服務基礎架構上的模型,例如 Vertex AI 端點、GKE 或 BigQuery。如要註冊在 Vertex AI 中提供的模型,請參閱「匯入模型」。

如要透過 Vertex AI 以外的服務提供模型,可以註冊參照模型,這是透過其他資源提供模型的預留位置。註冊參考模型時,請註冊模型的名稱,如下列範例所示:

Python SDK

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

對於參考模型,模型監控功能可支援來自 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 方法使用的格式。物件會以陣列形式插入 request_payload 資料欄的記錄資料表:[INSTANCE_1, INSTANCE_2]instances同樣地,predictions 物件會以陣列形式插入記錄資料表的 response_payload 欄中:[PREDICTION_1, PREDICTION_2]

系統支援其他方法 (例如原始預測),但資料必須遵循 predict 方法的 API 參考資料中所述的要求和回應 JSON 格式。

Vertex AI 代管資料集

在 Vertex AI 中管理的資料集。詳情請參閱表格資料集格式

持續監控

持續監控 (也稱為排程執行) 可讓您按照設定的排程執行監控作業。使用時間規格持續監控模型時,只支援 BigQuery 和 Vertex AI 端點記錄做為資料來源。

如要使用 BigQuery 做為來源,並透過時間規格進行持續監控,資料表必須有時間戳記欄。如果是 Vertex AI 端點記錄檔生成的 BigQuery 資料表,資料表已包含 logging_time 時間戳記資料欄。

一般而言,我們建議您按時間戳記分割資料表,以提升查詢效能,並減少查詢讀取的位元組數,進而控管費用。

支援的資料類型

支援數值和類別特徵。您可以加入含有陣列的資料欄,例如布林值、類別、字串或整數值的陣列。模型監控 v2 會將陣列整併,讓陣列中的每個元素都是不同的值。

數值特徵會對應至下列資料類型:

  • 浮點值
  • 整數

類別特徵會對應至下列資料類型:

  • 布林值
  • 字串
  • 類別

模型結構定義

模型監控第 2 版會使用模型結構定義剖析資料。建立模型監控時,必須使用這個結構定義。如果是 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,當模型監控服務第 2 版擷取模型結構定義時,會使用訓練資料集中的特徵做為輸入特徵,目標資料欄除外。預測輸出內容會設為 predicted_{target_column} 資料欄。此外,預測輸出值的 Model Monitoring v2 擷取方法取決於模型類型。如果是 AutoML Tables 分類模型,Vertex AI Model Monitoring 會監控 argmax 標籤分布情形。如果是 AutoML Tables 迴歸模型,Vertex AI Model Monitoring 會監控值分布情形。

基準和目標資料集

基準資料集代表您用來隨時間評估指標的參考點。目標資料集包含較新的資料,可用於與基準資料集比較。模型監控 v2 會計算這兩個資料集之間的指標,協助您追蹤模型品質。基準和目標資料集可來自任何支援的資料來源。

舉例來說,您可以比較供應資料集 (目標) 與模型的訓練資料集 (基準),也可以比較供應資料集 (目標) 與較早時間範圍的供應資料集 (基準)。

目標資料集

選取目標資料集後,模型監控 v2 可以處理整個資料集,也可以設定時間範圍,指定模型監控 v2 要檢查的資料量。舉例來說,如果您指定 24 小時的時間範圍,模型監控 v2 只會比較最新的 24 小時資料與基準資料集。

如果處理的資料量不足,資料偏移分析結果可能會不穩定。如果樣本數偏低而觸發快訊,較大的時間範圍有助於避免這類情況。

基準資料集

您可以將基準資料集設為任何支援的資料來源,例如包含模型訓練資料的 Vertex AI 代管資料集。與目標資料集類似,您可以選擇讓模型監控第 2 版處理整個資料集或特定時間範圍。

時間規格

您可以透過兩種方式設定監控時間規格:

  • 時間範圍,包括開始時間和結束時間配對。
  • 時間範圍和偏移量,用於指定要納入的資料量,以及比較資料集之間的時間範圍。

舉例來說,如要比較近期資料與先前收集的資料,可以設定「偏移」。偏移量會指定目標和基準資料集之間的時間間隔。舉例來說,假設您將目標資料集設為 1 天回溯期,基準則設為 1 週的偏移量,回溯期同樣為 1 天。

在本例中,目標資料集包含監控工作開始時間前 24 小時的資料。基準資料集包含前一週同一 24 小時期間的資料。

建立模型監控器

建立模型監控器,將監控詳細資料與已在 Vertex AI Model Registry 中註冊的模型版本建立關聯。產生的資源稱為「模型監控器」。每個模型版本只能建立一個模型監控器。

建立模型監控器時,請指定模型名稱、版本和結構定義。對於部分模型 (例如 AutoML 模型),系統會提供結構定義。

您可以在模型監控器中選擇性設定監控目標、訓練資料集、監控輸出位置和通知設定。執行監控作業時,Model Monitoring v2 會將這些設定做為預設值。

控制台

  1. 前往 Google Cloud 控制台的「Monitoring」頁面。

    前往「Monitoring」頁面

  2. 按一下「設定監控」

  3. 選取要監控的模型和版本。

  4. 如適用,請定義預測輸入特徵、預測輸出內容和真值的結構定義 (如有)。

  5. 選用:如要監控訓練資料集的偏移情形,請指定資料集位置。

  6. 選用:如要指定現有的 Cloud Storage bucket 來匯出監控結果,請展開「Advanced options」(進階選項),然後選取 bucket。

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