モデル モニタリングを設定する

モデルのモニタリングを開始する前に、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] としてロギング テーブルに挿入されます。

他のメソッド(raw predict など)もサポートされていますが、データは 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
      )
  ]
)

列に値の配列が含まれている場合は、repeatedtrue に設定します。

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 は、2 つのデータセット間の指標を計算して、モデルの品質を追跡するのに役立ちます。ベースライン データセットとターゲット データセットは、サポートされている任意のデータソースから取得できます。

ターゲットとベースラインの例として、サービング データセット(ターゲット)とモデルのトレーニング データセット(ベースライン)を比較できます。また、サービング データセット(ターゲット)と以前の期間のサービング データセット(ベースライン)を比較することもできます。

ターゲット データセット

ターゲット データセットを選択すると、Model Monitoring v2 はデータセット全体を処理できます。または、ウィンドウを設定することもできます。これは、Model Monitoring v2 が検査するデータの量を指定します。たとえば、24 時間のウィンドウを指定すると、Model Monitoring v2 は最新の 24 時間のデータのみをベースライン データセットと比較します。

データドリフトの分析では、不十分な量のデータが処理されると、ドリフトが不安定になる可能性があります。時間枠を長くすると、サンプル数が少ないためにトリガーされたアラートを回避できます。

ベースライン データセット

ベースライン データセットは、サポートされている任意のデータソース(モデルのトレーニング データを含む Vertex AI マネージド データセットなど)に設定できます。ターゲット データセットと同様に、Model Monitoring v2 でデータセット全体または特定のウィンドウを処理するように選択できます。

時間指定

モニタリング時間の指定は、次の 2 つの方法で設定できます。

  • 期間(開始時間と終了時間のペアを含む)。
  • 時間ウィンドウとオフセット。含めるデータの量と、比較データセット間の期間を指定します。

たとえば、最近のデータと以前に収集されたデータを比較する場合は、オフセットを設定できます。オフセットは、ターゲット データセットとベースライン データセットの間の期間を指定します。たとえば、ターゲット データセットは 1 日のウィンドウで設定し、ベースラインは 1 日のウィンドウを 1 週間のオフセットで設定するとします。

この場合、ターゲット データセットには、モニタリング ジョブの開始時刻の 24 時間前のデータが含まれます。ベースライン データセットには、同じ 24 時間のデータが含まれますが、ちょうど 1 週間前のデータとなります。

モデルモニターを作成する

モデルモニターを作成して、モニタリング情報を Vertex AI Model Registry に登録されているモデル バージョンに関連付けます。生成されたリソースは、モデルモニターと呼ばれます。モデル バージョンごとに作成できるモデルモニターは 1 つだけです。

モデルモニターを作成するときは、モデル名、バージョン、スキーマを指定します。AutoML モデルなど、一部のモデルではスキーマが提供されます。

必要に応じて、モデル モニタリングでモニタリングの目的、トレーニング データセット、モニタリング出力場所、通知設定を設定できます。モニタリング ジョブを実行すると、Model Monitoring v2 はこれらの設定をデフォルトとして使用します。

コンソール

  1. Google Cloud コンソールで [Monitoring] ページに移動します。

    [Monitoring] に移動

  2. [モニタリングを構成する] をクリックします。

  3. モニタリングする [モデル] と [バージョン] を選択します。

  4. 該当する場合は、入力特徴のスキーマ、予測出力、(可能であれば)正解(グラウンド トゥルース)を定義します。

  5. 省略可: トレーニング用データセットのドリフトをモニタリングするには、データセットの場所を指定します。

  6. 省略可: モニタリング結果のエクスポートに既存の Cloud Storage バケットを指定するには、[詳細オプション] を開いてバケットを選択します。

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