設定模型監控

開始監控模型前,您必須先向 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 會將陣列整併,讓陣列中的每個元素都是不同的值。

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

  • 浮點值
  • 整數

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

  • 布林值
  • 字串
  • 類別

模型結構定義

模型監控 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,當模型監控服務第 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
)