開始監控模型前,您必須先向 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 會將這些設定做為預設值。
控制台
前往 Google Cloud 控制台的「Monitoring」頁面。
按一下「設定監控」。
選取要監控的模型和版本。
如適用,請定義預測輸入特徵、預測輸出內容和真值的結構定義 (如有)。
選用:如要監控訓練資料集的偏移情形,請指定資料集位置。
選用:如要指定現有的 Cloud Storage bucket 來匯出監控結果,請展開「Advanced options」(進階選項),然後選取 bucket。
如要設定監控目標,請按一下「繼續」或「設定」,建立模型監控器。
執行工作時,系統會將這項設定做為預設值。
選取要監控的目標。您可以為每個目標設定要監控的指標,以及快訊的閾值。
在 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 )