モニタリング

Vertex AI Feature Store(従来版)では、featurestore と特徴に対するアラートをモニタリングし、設定できます。たとえば、運用チームが featurestore をモニタリングして、その CPU 使用率を追跡しているとします。データ サイエンティストなどの特徴のオーナーは、特徴値をモニタリングして経時的なブレを検出できます。

featurestore と特徴をモニタリングする方法については、以降のセクションで説明します。

Featurestore のモニタリング

Vertex AI Feature Store(従来版)は、featurestore に関する指標(CPU 負荷、ストレージ容量、リクエスト レイテンシなど)を Cloud Monitoring に報告します。Vertex AI はこれらの指標を収集して報告します。featurestore のモニタリングを構成または有効にする必要はありません。

しきい値と通知を構成するには、Cloud Monitoring を使用します。たとえば、平均 CPU 負荷が 70% を超えた場合にアラートを設定できます。この状況では、featurestore ノード数の増加が必要になる場合があります。

Google Cloud コンソールの [Vertex AI] セクションで featurestore 指標を表示して、傾向の推移を確認することもできます。一部のグラフでは、情報が集計しやすいよう、コンソールに集計値や計算値が表示されます。元データは Cloud Monitoring でいつでも表示できます。

詳細については、Vertex AI Cloud Monitoring ページの Vertex AI Feature Store(従来版)モニタリング指標をご覧ください。

特徴値モニタリング

特徴値モニタリングを使用すると、featurestore で特徴値の分布がどの程度変化するかを追跡できます。次の特徴値モニタリングがサポートされています。

  • スナップショット分析: Vertex AI Feature Store(従来版)は特徴値のスナップショットを定期的に作成します。時間の経過とともに取り込まれるデータが増加するにつれて、特徴値の分布が変化する場合があります。この変更は、特徴を使用するモデルを再トレーニングする必要がある可能性があることを示しています。しきい値を指定すると、分布の偏差がしきい値を超えるたびに、Cloud Logging コンソールに異常が記録されます。

    500 万個のエンティティ ID を超えるデータセットの場合、Vertex AI Feature Store(従来版)は、未更新日数として指定した時間枠内でランダムに選択された 500 万個のエンティティ ID に基づいてスナップショットを生成します。

  • 特徴分析のインポート: 各 ImportFeatureValues オペレーションで、Vertex AI Feature Store(従来版)に取り込まれた値の分布統計が生成されます。以前にインポートした特徴値の分布(有効にしている場合はスナップショットの分布)と分布統計を比較することで、異常を検出できます。

    インスタンス数が 500 万を超えるデータベースの場合、Vertex AI Feature Store(従来版)は、ランダムに選択されたデータに基づいて、次のようなスナップショットを生成します。

    • 取り込まれたデータセット内のインスタンス数が 500 万を超え、5,000 万を超えていない場合は、ランダムに選択された 500 万個のインスタンスに基づいてスナップショットが生成されます。
    • 取り込まれたデータセット内のインスタンス数が 5,000 万を超えると、ランダムに選択されたインスタンスの 10% に基づいてスナップショットが生成されます。

たとえば、最近販売された住宅の価格を収集し、その値を住宅価格の予測モデルにフィードする特徴について考えてみましょう。最近販売された住宅の価格は時間の経過とともに大幅に変動する可能性があります。また、インポートした値のバッチに、トレーニング データとは大きく異なるデータが含まれていることもあります。Vertex AI Feature Store(従来版)はこの変化について警告します。その後、最新の情報を使用してモデルを再トレーニングできます。

モニタリング構成を設定する

モニタリングを開始するには、エンティティ タイプにモニタリング構成を定義します。これにより、次のタイプのすべての特徴をモニタリングできます。

  • BOOL
  • STRING
  • DOUBLE
  • INT64

モニタリング構成は、エンティティ タイプを作成するときに設定できます。disableMonitoring プロパティを設定すると、特定の特徴のモニタリングを無効にすることもできます。エンティティ タイプのモニタリング構成で、次の項目を指定します。

  • モニタリングを有効にするかどうか。モニタリングはデフォルトで無効になっています。
  • 異常の検出に使用されるしきい値。デフォルトのしきい値は 0.3 です。
  • スナップショット ウィンドウとスナップショットの間隔(スナップショット分析用)。デフォルト値は 21 です。
  • 特徴分析のインポートを有効にするかどうか。デフォルトは無効になっています。

詳細については、API リファレンスの FeaturestoreMonitoringConfig タイプをご覧ください。

モニタリングが有効なエンティティ タイプを作成する

次の例では、特徴モニタリングが有効になっているエンティティ タイプを作成します。

ウェブ UI

UI でサポートされるのはスナップショット分析のみです。

  1. Google Cloud Console の [Vertex AI] セクションで、[特徴] ページに移動します。

    [特徴] ページに移動

  2. [リージョン] プルダウン リストからリージョンを選択します。
  3. [エンティティ タイプを作成] をクリックします。
  4. [特徴量モニタリング] セクションを [有効] に切り替えます。
  5. [モニタリングの時間間隔] フィールドに、スナップショットの間隔を日数で入力します。
    エンティティ タイプまたは特徴のモニタリング ジョブは、エンティティ タイプまたは特徴のモニタリングを有効にした時刻から最も近い正時に 1 回実行されます。たとえば、月曜日の午後 10 時 30 分にモニタリングを有効にして、モニタリング期間として 2 日を指定した場合、最初のモニタリング ジョブは水曜日の午後 11 時に実行されます。
  6. [モニタリングのルックバック ウィンドウ] に、各スナップショットのルックバック日数を入力します。
  7. [数値アラートのしきい値] フィールドに、数値特徴の異常検出に使用するしきい値を入力します。
  8. [カテゴリ アラートのしきい値] フィールドに、このエンティティ タイプのカテゴリ特徴の異常検出に使用するしきい値を入力します。
    特徴値の異常検出の詳細については、特徴値の異常を表示するをご覧ください。
  9. [作成] をクリックします。
  10. 特徴テーブルで、エンティティ タイプをクリックします。
  11. エンティティに新しい特徴を追加するには、[特徴を追加] をクリックします。
  12. 特定の特徴のモニタリングを無効にするには、[モニタリングを有効化] をオフにします。

REST

エンティティ タイプを作成するには、entityTypes.create メソッドを使用して POST リクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: featurestore が配置されているリージョン(us-central1 など)。
  • PROJECT_ID: 実際のプロジェクト ID
  • FEATURESTORE_ID: featurestore の ID。
  • ENTITY_TYPE_ID: エンティティ タイプの ID。
  • DURATION: スナップショット間の間隔(日数)。
  • STALENESS_DAYS: スナップショットの取得時にルックバックする日数。
  • NUMERICAL_THRESHOLD_VALUE: このエンティティ タイプの数値特徴の異常を検出するしきい値。統計偏差は Jenson-Shannon ダイバージェンスで計算されます。
  • CATEGORICAL_THRESHOLD_VALUE: このエンティティ タイプのカテゴリ特徴の異常を検出するしきい値。統計偏差は L-Infinity 距離で計算されます。
  • IMPORT_FEATURE_ANALYSIS_STATE: 特徴分析のインポートを有効にするかどうかを示す状態。
  • IMPORT_FEATURE_ANALYSIS_BASELINE: 有効な特徴分析のベースライン(有効な場合)。

HTTP メソッドと URL:

POST http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes?entityTypeId=ENTITY_TYPE_ID

リクエストの本文(JSON):

{
  "monitoringConfig": {
    "snapshotAnalysis": {
      "monitoringIntervalDays": "DURATION"
      "stalenessDays": "STALENESS_DAYS"
    }
  },
 "numericalThresholdConfig": {
    "value": "NUMERICAL_THRESHOLD_VALUE"
  },
  "categoricalThresholdConfig": {
    "value": "CATEGORICAL_THRESHOLD_VALUE"
  },
  "importFeatureAnalysis": {
    "state": "IMPORT_FEATURE_ANALYSIS_STATE",
    "anomalyDetectionBaseline": "IMPORT_FEATURE_ANALYSIS_BASELINE"
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes?entityTypeId=ENTITY_TYPE_ID"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes?entityTypeId=ENTITY_TYPE_ID" | Select-Object -Expand Content

出力は次のようになります。レスポンスの OPERATION_ID を使用して、オペレーションのステータスを取得できます。

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.ui.CreateEntityTypeOperationMetadata",
    "genericMetadata": {
      "createTime": "2022-04-29T20:29:05.206525Z",
      "updateTime": "2022-04-29T20:29:05.206525Z"
    }
  }
}

Java

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Java の設定手順を完了してください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.CreateEntityTypeOperationMetadata;
import com.google.cloud.aiplatform.v1.CreateEntityTypeRequest;
import com.google.cloud.aiplatform.v1.EntityType;
import com.google.cloud.aiplatform.v1.FeaturestoreMonitoringConfig;
import com.google.cloud.aiplatform.v1.FeaturestoreMonitoringConfig.SnapshotAnalysis;
import com.google.cloud.aiplatform.v1.FeaturestoreName;
import com.google.cloud.aiplatform.v1.FeaturestoreServiceClient;
import com.google.cloud.aiplatform.v1.FeaturestoreServiceSettings;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateEntityTypeMonitoringSample {

  public static void main(String[] args)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String featurestoreId = "YOUR_FEATURESTORE_ID";
    String entityTypeId = "YOUR_ENTITY_TYPE_ID";
    String description = "YOUR_ENTITY_TYPE_DESCRIPTION";
    int monitoringIntervalDays = 1;
    String location = "us-central1";
    String endpoint = "us-central1-aiplatform.googleapis.com:443";
    int timeout = 300;
    createEntityTypeMonitoringSample(
        project,
        featurestoreId,
        entityTypeId,
        description,
        monitoringIntervalDays,
        location,
        endpoint,
        timeout);
  }

  static void createEntityTypeMonitoringSample(
      String project,
      String featurestoreId,
      String entityTypeId,
      String description,
      int monitoringIntervalDays,
      String location,
      String endpoint,
      int timeout)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {

    FeaturestoreServiceSettings featurestoreServiceSettings =
        FeaturestoreServiceSettings.newBuilder().setEndpoint(endpoint).build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (FeaturestoreServiceClient featurestoreServiceClient =
        FeaturestoreServiceClient.create(featurestoreServiceSettings)) {

      FeaturestoreMonitoringConfig featurestoreMonitoringConfig =
          FeaturestoreMonitoringConfig.newBuilder()
              .setSnapshotAnalysis(
                  SnapshotAnalysis.newBuilder().setMonitoringIntervalDays(monitoringIntervalDays))
              .build();

      EntityType entityType =
          EntityType.newBuilder()
              .setDescription(description)
              .setMonitoringConfig(featurestoreMonitoringConfig)
              .build();

      CreateEntityTypeRequest createEntityTypeRequest =
          CreateEntityTypeRequest.newBuilder()
              .setParent(FeaturestoreName.of(project, location, featurestoreId).toString())
              .setEntityType(entityType)
              .setEntityTypeId(entityTypeId)
              .build();

      OperationFuture<EntityType, CreateEntityTypeOperationMetadata> entityTypeFuture =
          featurestoreServiceClient.createEntityTypeAsync(createEntityTypeRequest);
      System.out.format(
          "Operation name: %s%n", entityTypeFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      EntityType entityTypeResponse = entityTypeFuture.get(timeout, TimeUnit.SECONDS);
      System.out.println("Create Entity Type Monitoring Response");
      System.out.format("Name: %s%n", entityTypeResponse.getName());
    }
  }
}

Node.js

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Node.js の設定手順を完了してください。詳細については、Vertex AI Node.js API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const project = 'YOUR_PROJECT_ID';
// const featurestoreId = 'YOUR_FEATURESTORE_ID';
// const entityTypeId = 'YOUR_ENTITY_TYPE_ID';
// const description = 'YOUR_ENTITY_TYPE_DESCRIPTION';
// const duration = <MONITORING_INTERVAL_IN_SECONDS>;
// const location = 'YOUR_PROJECT_LOCATION';
// const apiEndpoint = 'YOUR_API_ENDPOINT';
// const timeout = <TIMEOUT_IN_MILLI_SECONDS>;

// Imports the Google Cloud Featurestore Service Client library
const {FeaturestoreServiceClient} =
  require('@google-cloud/aiplatform').v1beta1;

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: apiEndpoint,
};

// Instantiates a client
const featurestoreServiceClient = new FeaturestoreServiceClient(
  clientOptions
);

async function createEntityTypeMonitoring() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}/featurestores/${featurestoreId}`;

  const entityType = {
    description: description,
    monitoringConfig: {
      snapshotAnalysis: {
        monitoringInterval: {
          seconds: Number(duration),
        },
      },
    },
  };

  const request = {
    parent: parent,
    entityTypeId: entityTypeId,
    entityType: entityType,
  };

  // Create EntityType request
  const [operation] = await featurestoreServiceClient.createEntityType(
    request,
    {timeout: Number(timeout)}
  );
  const [response] = await operation.promise();

  console.log('Create entity type monitoring response');
  console.log(`Name : ${response.name}`);
  console.log('Raw response:');
  console.log(JSON.stringify(response, null, 2));
}
createEntityTypeMonitoring();

その他の言語

Vertex AI SDK for Python をインストールして使用する方法については、Vertex AI SDK for Python を使用するをご覧ください。詳細については、Vertex AI SDK for Python API のリファレンス ドキュメントをご覧ください。

新しい特徴のモニタリングを無効にする

次の例では、新しい特徴を作成してモニタリングを無効にします。

REST

特徴を作成するには、features.create メソッドを使用して POST リクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: featurestore が配置されているリージョン(us-central1 など)。
  • PROJECT_ID: 実際のプロジェクト ID
  • FEATURESTORE_ID: featurestore の ID。
  • ENTITY_TYPE_ID: エンティティ タイプの ID。
  • FEATURE_ID: 特徴の ID。
  • VALUE_TYPE: 特徴の値タイプ。
  • DISABLE_MONITORING: true に設定すると、モニタリングが明示的に無効になります。

HTTP メソッドと URL:

POST http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID?featureId=/FEATURE_ID

リクエストの本文(JSON):

{
  "disableMonitoring": "DISABLE_MONITORING",
  "valueType": "VALUE_TYPE"
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID?featureId=/FEATURE_ID"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID?featureId=/FEATURE_ID" | Select-Object -Expand Content

出力は次のようになります。レスポンスの OPERATION_ID を使用して、オペレーションのステータスを取得できます。

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.ui.CreateFeatureOperationMetadata",
    "genericMetadata": {
      "createTime": "2022-04-29T20:29:05.206525Z",
      "updateTime": "2022-04-29T20:29:05.206525Z"
    }
  }
}

モニタリング構成を更新する

モニタリング構成はエンティティ タイプの更新時に設定できます。disableMonitoring プロパティを設定すると、特定の特徴のモニタリングを無効にすることもできます。

エンティティ タイプと特徴のモニタリング構成を更新する

次の例では、既存のエンティティ タイプのモニタリング構成と、そのエンティティ タイプの特定の特徴を更新します。

ウェブ UI

UI でサポートされるのはスナップショット分析のみです。

  1. Google Cloud Console の [Vertex AI] セクションで、[特徴] ページに移動します。
  2. [リージョン] プルダウン リストからリージョンを選択します。
  3. 特徴テーブルの [エンティティ タイプ] 列で、更新するエンティティ タイプを見つけます。
  4. エンティティ タイプの名前をクリックして、エンティティの詳細ページを表示します。
  5. アクションバーで [情報を編集] をクリックします。
  6. [モニタリングの時間間隔] に、スナップショット間の日数を入力します。
    エンティティ タイプまたは特徴のモニタリング ジョブは、エンティティ タイプまたは特徴のモニタリングを有効にした時刻から最も近い正時に 1 回実行されます。たとえば、月曜日の午後 10 時 30 分にモニタリングを有効にして、モニタリング期間として 2 日を指定した場合、最初のモニタリング ジョブは水曜日の午後 11 時に実行されます。
  7. [更新] をクリックします。
  8. 同様に、特徴テーブルの [特徴] 列で、更新する特徴を探します。
  9. 特徴名をクリックして、詳細ページを表示します。
  10. アクションバーで [情報を編集] をクリックします。
  11. 特定の特徴のモニタリングを無効にするには、[モニタリングが有効] をオフにします。

REST

エンティティ タイプを更新するには、entityTypes.patch メソッドを使用して PATCH リクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: featurestore が配置されているリージョン(us-central1 など)。
  • PROJECT_ID: 実際のプロジェクト ID
  • FEATURESTORE_ID: featurestore の ID。
  • ENTITY_TYPE_ID: エンティティ タイプの ID。
  • DURATION_IN_DAYS: スナップショット間の間隔(日数)。
  • STALENESS_DAYS: スナップショットの取得時にルックバックする日数。
  • NUMERICAL_THRESHOLD_VALUE: このエンティティ タイプの数値特徴の異常を検出するしきい値。統計偏差は Jenson-Shannon ダイバージェンスで計算されます。
  • CATEGORICAL_THRESHOLD_VALUE: このエンティティ タイプのカテゴリ特徴の異常を検出するしきい値。統計偏差は L-Infinity 距離で計算されます。
  • IMPORT_FEATURE_ANALYSIS_STATE: 特徴分析のインポートを有効にするかどうかを示す状態。
  • IMPORT_FEATURE_ANALYSIS_BASELINE: ???? を示すベースライン

HTTP メソッドと URL:

PATCH http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID

リクエストの本文(JSON):

{
  "monitoringConfig": {
    "snapshotAnalysis": {
      "monitoringIntervalDays": "DURATION_IN_DAYS",
      "stalenessDays": "STALENESS_DAYS"
    }
  },
  "numericalThresholdConfig": {
    "value": "NUMERICAL_THRESHOLD_VALUE"
  },
  "categoricalThresholdConfig": {
    "value": "CATEGORICAL_THRESHOLD_VALUE"
  },
  "importFeatureAnalysis": {
    "state": "IMPORT_FEATURE_ANALYSIS_STATE",
    "anomalyDetectionBaseline": "IMPORT_FEATURE_ANALYSIS_BASELINE"
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID",
  "createTime": "2021-07-22T23:18:31.339972Z",
  "updateTime": "2021-07-29T22:24:40.221821Z",
  "etag": "AMEw9yPGDpwUwHx39gIDIg5mTQz65GMhnYHRzRslVPonm1g8xTnsTC5YUibmWo2MIuI=",
  "monitoringConfig": {
    "snapshotAnalysis": {
      "monitoringIntervalDays": "DURATION_IN_DAYS",
      "stalenessDays": "STALENESS_DAYS"
    }
  },
  "numericalThresholdConfig": {
    "value": "NUMERICAL_THRESHOLD_VALUE"
  },
  "categoricalThresholdConfig": {
    "value": "CATEGORICAL_THRESHOLD_VALUE"
  },
  "importFeatureAnalysis": {
    "state": "IMPORT_FEATURE_ANALYSIS_STATE",
    "anomalyDetectionBaseline": "IMPORT_FEATURE_ANALYSIS_BASELINE"
  }
}

Java

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Java の設定手順を完了してください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。


import com.google.cloud.aiplatform.v1.EntityType;
import com.google.cloud.aiplatform.v1.EntityTypeName;
import com.google.cloud.aiplatform.v1.FeaturestoreMonitoringConfig;
import com.google.cloud.aiplatform.v1.FeaturestoreMonitoringConfig.SnapshotAnalysis;
import com.google.cloud.aiplatform.v1.FeaturestoreServiceClient;
import com.google.cloud.aiplatform.v1.FeaturestoreServiceSettings;
import com.google.cloud.aiplatform.v1.UpdateEntityTypeRequest;
import java.io.IOException;

public class UpdateEntityTypeMonitoringSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String featurestoreId = "YOUR_FEATURESTORE_ID";
    String entityTypeId = "YOUR_ENTITY_TYPE_ID";
    int monitoringIntervalDays = 1;
    String location = "us-central1";
    String endpoint = "us-central1-aiplatform.googleapis.com:443";
    updateEntityTypeMonitoringSample(
        project, featurestoreId, entityTypeId, monitoringIntervalDays, location, endpoint);
  }

  static void updateEntityTypeMonitoringSample(
      String project,
      String featurestoreId,
      String entityTypeId,
      int monitoringIntervalDays,
      String location,
      String endpoint)
      throws IOException {

    FeaturestoreServiceSettings featurestoreServiceSettings =
        FeaturestoreServiceSettings.newBuilder().setEndpoint(endpoint).build();

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (FeaturestoreServiceClient featurestoreServiceClient =
        FeaturestoreServiceClient.create(featurestoreServiceSettings)) {
      FeaturestoreMonitoringConfig featurestoreMonitoringConfig =
          FeaturestoreMonitoringConfig.newBuilder()
              .setSnapshotAnalysis(
                  SnapshotAnalysis.newBuilder().setMonitoringIntervalDays(monitoringIntervalDays))
              .build();
      EntityType entityType =
          EntityType.newBuilder()
              .setName(
                  EntityTypeName.of(project, location, featurestoreId, entityTypeId).toString())
              .setMonitoringConfig(featurestoreMonitoringConfig)
              .build();

      UpdateEntityTypeRequest updateEntityTypeRequest =
          UpdateEntityTypeRequest.newBuilder().setEntityType(entityType).build();
      EntityType entityTypeResponse =
          featurestoreServiceClient.updateEntityType(updateEntityTypeRequest);
      System.out.println("Update Entity Type Monitoring Response");
      System.out.println(entityTypeResponse);
    }
  }
}

Node.js

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Node.js の設定手順を完了してください。詳細については、Vertex AI Node.js API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const project = 'YOUR_PROJECT_ID';
// const featurestoreId = 'YOUR_FEATURESTORE_ID';
// const entityTypeId = 'YOUR_ENTITY_TYPE_ID';
// const duration = <MONITORING_INTERVAL_IN_SECONDS>;
// const location = 'YOUR_PROJECT_LOCATION';
// const apiEndpoint = 'YOUR_API_ENDPOINT';
// const timeout = <TIMEOUT_IN_MILLI_SECONDS>;

// Imports the Google Cloud Featurestore Service Client library
const {FeaturestoreServiceClient} =
  require('@google-cloud/aiplatform').v1beta1;

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: apiEndpoint,
};

// Instantiates a client
const featurestoreServiceClient = new FeaturestoreServiceClient(
  clientOptions
);

async function updateEntityTypeMonitoring() {
  // Configure the name resource
  const name = `projects/${project}/locations/${location}/featurestores/${featurestoreId}/entityTypes/${entityTypeId}`;

  // Constructing the monitoring configuration
  const monitoringConfig = {
    snapshotAnalysis: {
      monitoringInterval: {
        seconds: Number(duration),
      },
    },
  };

  // Constructing the entityType
  const entityType = {
    name: name,
    monitoringConfig: monitoringConfig,
  };

  const request = {
    entityType: entityType,
  };

  // Update EntityType request
  const [response] = await featurestoreServiceClient.updateEntityType(
    request,
    {timeout: Number(timeout)}
  );

  console.log('Update entity type monitoring response');
  console.log(`Name : ${response.name}`);
  console.log('Raw response:');
  console.log(JSON.stringify(response, null, 2));
}
updateEntityTypeMonitoring();

特徴のモニタリングを無効にする

次の例では、既存の特徴のモニタリングをオフにします。

REST

特徴を更新するには、features.patch メソッドを使用して PATCH リクエストを送信します。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: featurestore が配置されているリージョン(us-central1 など)。
  • PROJECT_ID: 実際のプロジェクト ID
  • FEATURESTORE_ID: featurestore の ID。
  • ENTITY_TYPE_ID: エンティティ タイプの ID。
  • FEATURE_ID: 更新する特徴の ID。
  • DISABLE_MONITORING: true に設定すると、モニタリングが明示的に無効になります。

HTTP メソッドと URL:

PATCH http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID/features/FEATURE_ID

リクエストの本文(JSON):

{
  "disableMonitoring": "DISABLE_MONITORING"
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID/features/FEATURE_ID"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "http://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID/features/FEATURE_ID" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/featurestores/FEATURESTORE_ID/entityTypes/ENTITY_TYPE_ID/features/FEATURE_ID",
  "valueType": "FEATURE_VALUE_TYPE",
  "createTime": "2021-07-22T23:18:31.339972Z",
  "updateTime": "2021-07-29T22:24:40.221821Z",
  "etag": "AMEw9yPGDpwUwHx39gIDIg5mTQz65GMhnYHRzRslVPonm1g8xTnsTC5YUibmWo2MIuI=",
  "disableMonitoring": "DISABLE_MONITORING"
}

特徴値分布を表示する

Google Cloud コンソールを使用して、特徴値の経時的分布を表示します。

ウェブ UI

  1. Google Cloud Console の [Vertex AI] セクションで、[特徴] ページに移動します。

    [特徴] ページに移動

  2. [リージョン] プルダウン リストからリージョンを選択します。

  3. エンティティ タイプのすべての特徴の特徴値の分布を表示するには、[エンティティ タイプ] 列でエンティティ タイプをクリックします。

  4. 特徴の特徴値の分布指標を表示するには:

    1. [特徴] 列で、特徴をクリックします。

    2. [指標] をクリックして、特徴値分布の指標を表示します。

特徴値の異常を表示する

特徴値の分布がモニタリング パイプラインで指定されたしきい値を外れた場合、異常とみなされます。異常には、トレーニング サービング スキューとドリフトの 2 種類があります。偏差を計算するため、Vertex AI では、本番環境の最新の特徴値がベースラインと比較されます。

  • トレーニング サービング スキューを検出するため、Vertex AI は、本番環境の最新の特徴値とトレーニング データ内の特徴値の統計的分布を比較します。この場合、トレーニング データ内の特徴値の統計的分布はベースライン分布とみなされます。トレーニング サービング スキューの詳細

  • ドリフトを検出するため、Vertex AI は、本番環境の最新の特徴値と少なくとも 1 時間前に行われた最新のモニタリング実行からの特徴値の統計的分布を比較します。この場合、最新のモニタリング実行からの特徴値の統計的分布がベースライン分布とみなされます。ドリフトの詳細

いずれの場合も、ベースライン分布は、本番環境の最新の特徴値と比較されて距離スコアが計算されます。

  • カテゴリ特徴の場合、距離スコアはチェビシェフ距離を使用して計算されます。この場合、距離スコアが [カテゴリ アラートのしきい値] フィールドで指定されたしきい値を超えると、異常とみなされます。

  • 数値特徴の場合、距離スコアはジェンセン・シャノン ダイバージェンスを使用して計算されます。この場合、距離スコアが [数値アラートのしきい値] フィールドで指定されたしきい値を超えると、異常とみなされます。

いずれの場合も、距離スコアの計算に使用されるベースライン分布によっては、異常がトレーニング サービング スキューまたはドリフトになる可能性があります。異常なログは、featurestore_log という名前のログとして Cloud Logging に書き込まれます。ログは、Cloud Logging がサポートする任意のダウンストリーム サービス(Pub/Sub など)に同期できます。

アラートしきい値の設定の詳細については、モニタリングが有効なエンティティ タイプを作成するをご覧ください。

特定の featurestore に生成されたすべての異常を取得するクエリの例

logName="projects/model-monitoring-demo/logs/aiplatform.googleapis.com%2FFfeaturestore_log"
resource.labels.resource_container=<project_number>
resource.labels.featurestore_id=<featurestore_id>

異常ログエントリの例

{
  "insertId": "ktbx5jf7vdn7b",
  "jsonPayload": {
    "threshold": 0.001,
    "featureName": "projects/<project_number>/locations/us-central1/featurestores/<featurestore_id>/entityTypes/<entity_type_id>/features/<feature_id>",
    "deviation": 1,
    "@type": "type.googleapis.com/google.cloud.aiplatform.logging.FeatureAnomalyLogEntry",
    "objective": "Featurestore Monitoring Snapshot Drift Anomaly"
  },
  "resource": {
    "type": "aiplatform.googleapis.com/Featurestore",
    "labels": {
      "resource_container": "<project_number>",
      "location": "us-central1",
      "featurestore_id": "<featurestore_id>"
    }
  },
  "timestamp": "2022-02-06T00:54:06.455501Z",
  "severity": "WARNING",
  "logName": "projects/model-monitoring-demo/logs/aiplatform.googleapis.com%2Ffeaturestore_log",
  "receiveTimestamp": "2022-02-06T00:54:06.476107155Z"
}

ストリーミング取り込みのオフライン ストレージ書き込みエラーをモニタリングする

ストリーミングの取り込み中にオフライン ストレージへの書き込みエラーをモニタリングするには、Google Cloud コンソールを使用します。

オフライン ストレージへのストリーミング取り込みの指標を表示する

Metrics Explorer で、Vertex AI Feature Store(従来版)のストリーミング書き込み用のオフライン ストレージ書き込み指標をモニタリングできます。

ウェブ UI

  1. Google Cloud コンソールで、Metrics Explorer に移動します。

    Metrics Explorer に移動

  2. ツールバーで [エクスプローラ] タブを選択します。

  3. [構成] タブで、グラフに表示するデータを指定します。

    • リソースと指標: 指標として「Vertex AI Feature Store - Streaming storage write for streaming write」を選択します。

    • グループ条件: error_code を選択します。

    • 最小アライメント期間: グラフ内のデータをアライメントするための最小期間を指定します。

  4. これらのフィールドを更新すると、さまざまなエラーコードのオフライン ストレージ書き込みエラーがグラフに表示されます。

    作成したグラフは、カスタム ダッシュボードに追加できます。詳しくは、後で参照できるようにグラフを保存するをご覧ください。

Vertex AI Feature Store(従来版)のログを表示する

featurestore のログエントリ(オフライン ストア書き込みエラー中に生成されたログを含む)は、ログ エクスプローラで確認できます。

ウェブ UI

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. クエリビルダーで、次のクエリ パラメータを追加して、[クエリを実行] をクリックします。

    • リソース: Vertex AI Feature Store を選択します。
    • ログ名: [Vertex AI API] で aiplatform.googlapis.com/featurestore_log を選択します。