👉

Vertex AI Feature Store による BigQuery 上の特徴量の管理とオンライン サービングでの利用

2023/12/27に公開

はじめに

こんにちは、この度 Google Cloud Partner Top Engineer 2024 を受賞いたしました、クラウドエース データML ディビジョン所属の松本です。

クラウドエース データML ディビジョン について

クラウドエースのITエンジニアリングを担う システム開発部 の中で、特にデータ基盤構築・分析基盤構築からデータ分析までを含む一貫したデータ課題の解決を専門とするのが データML ディビジョン です。
弊社では、新たに仲間に加わってくださる方を募集しています。もしにご興味があれば エントリー をお待ちしております!

今回は、機械学習の特徴量管理サービスとして Google Cloud が提供する Vertex AI Feature Store の機能について、Google Cloud Next ‘23 で発表された新機能も含めてご紹介いたします。

この記事はこんな人にオススメ

  • Vertex AI Feature Store の新機能である BigQuery を利用した特徴量管理について知りたい
  • Vertex AI Feature Store の新機能についての実装方法を知りたい
  • 機械学習の特徴量を扱う上で発生しやすい以下の課題を解消したい
    • 共有と再利用が難しい
    • トレーニング時とサービング時で特徴量に意図しないスキュー(ズレ)が生じる
    • 本番環境で求められる低レイテンシの特徴量サービングの実装が難しい

Vertex AI Feature Store とは

Vertex AI Feature Store は、機械学習における特徴量を整理、保存、提供し、一元管理するためのリポジトリです。一般的に Feature Store に求められる以下の要件を満たすことができます。

  • 組織全体で特徴量を共有
  • トレーニング / サービング スキューの回避
  • 特徴量データの分布の経時的な変化(予測ドリフト)を検出
トレーニング / サービング スキュー とは

本番環境の予測で使用する特徴量データの分布が、モデルのトレーニングに使用された特徴量データの分布と異なる場合に発生する歪みのこと。

Vertex AI Feature Store の新機能

Google Cloud Next ‘23 では、BigQuery をオフライン ストアとして活用する次世代の Vertex AI Feature Store が新機能の1つとして発表されました。

従来(レガシー)の Vertex AI Feature Store では、Cloud Storage バケットや BigQuery ソースなどから、Vertex AI Feature Store のオフライン ストアへのインポートが必要でしたが、最新機能では BigQuery をオフライン ストアとして利用することで、データを移動することなく、特徴量管理ができるようになりました。

この最新機能によって以下の点が改善され、より優れた特徴量管理が可能となりました。

1. BigQuery の利点を活用できる

  • BigQuery をオフライン ストアとして利用することでコストを削減となる
  • BigQuery SQL の機能性と柔軟性を最大限に活用して、特徴量を取得および変更できる
  • BigQuery での使い慣れたデータアクセスとガバナンスの設定を行うことができる

2. 低レイテンシのサービングが可能

  • 複雑なオンライン アーキテクチャのオーケストレーションは不要となる
  • リクエストの 99% が 2 ミリ秒以内に完了する(Google の社内ベンチマークより)

3. 予測 AI と生成 AI の両方に対応

Vertex AI Feature Store の機能詳細

ここからは Vertex AI Feature Store の新機能についてご紹介いたします。

データ モデル

BigQuery でのデータ準備

新しい Vertex AI Feature Store を利用するためには、まず BigQuery のテーブルまたはビューに特徴量データを保存する必要があります。

BigQuery テーブルでは、Vertex AI Feature Store に必要な特徴量に関わる以下の列を含んでいる必要があります。

  • 各特徴量のレコードを識別するための一意の ID 列(下図の entity_id 列)
  • 各特徴量の列(下図の f1, f2 列)
  • タイムスタンプ列(下図の feature_timestamp 列)
    2
    図. Example of a BigQuery data source.
    出典:Vertex AI Feature Store data model and resources

Vertex AI Feature Store のレジストリ登録

特徴量データを Vertex AI Feature Store のレジストリに登録するには、次の Vertex AI Feature Store リソースを作成する必要があります。

  • 特徴量グループ(FeatureGroup)
    BigQuery ソース テーブルまたはビューに関連付けられる特徴量のグループです。
    特徴量グループの作成方法については こちら を参照ください。
  • 特徴量(Feature)
    特徴量グループに紐づく特徴値を含む特定の列です。レジストリ登録時に、複数ある特徴量から一部を選択することができます。(下図の場合 f1~f4 の内 f1, f2 のみを登録)
    特徴量の作成方法については こちら を参照ください。
    尚、feature_timestamp 列を含めると、Vertex AI Feature Store は、特徴量データから最新の特徴値のみを提供します。また、その際の履歴値は除外されます。
    3
    図. Example of a FeatureGroup containing two Feature columns sourced from a BigQuery data source.
    出典:Vertex AI Feature Store data model and resources

オンライン サービング

オンライン サービング時に特徴量を利用するには、オンライン サービング クラスターを定義して、特徴量レジストリのリソースと関連付ける必要があります。

オンライン サービスを設定するには、以下の Vertex AI Feature Store リソースを作成する必要があります。

  • オンライン ストア(FeatureOnlineStore)
    オンライン サービング クラスターにおけるインスタンスを表し、オンライン サービング時のノード数などのオンライン サービング構成情報が含まれます。
    オンライン ストアの作成方法については こちら を参照ください。

  • 特徴量ビュー(FeatureView)
    オンライン ストア インスタンス内の特徴量の論理的なコレクションを表します。特徴量ビューを作成するときは、次のいずれかの方法でデータ ソースを指定できます。
    特徴量ビューを作成する方法については こちら を参照ください。

    • 特徴量レジストリ・特徴量グループ・特徴量を関連付ける方法
    • BigQuery ソーステーブルまたはビューを直接関連付ける方法

以下の例では、ある1つの BigQuery テーブルに関連付けられた2つの特徴量グループがあり、そこから取得された特徴量列 f2f4 で構成される特徴量ビューを表示しています。
4
図. Example of a FeatureView containing features from two separate feature groups.
出典:Vertex AI Feature Store data model and resources

また Vertex AI Feature Store はリアルタイムのオンライン予測のために、次のタイプのオンライン サービングを提供します。設定方法については オンライン サービス タイプ を参照ください。

  • Cloud Bigtable のオンライン サービング
    Cloud Bigtable のオンライン サービングは、レイテンシの影響を受けないシナリオで大量のデータ(テラバイト単位のデータ)を提供する場合の利用に適しています。
    ただし、突然のトラフィックの急増に迅速に適応するように最適化されていませんが(レガシーと同様)、ホットスポットを軽減するためにキャッシュが強化されています。
  • 最適化されたオンライン サービング(2023年12月時点ではプレビュー段階)
    Cloud Bigtable オンライン サービスよりも低いレイテンシでオンライン サービングする必要があり、頻繁に更新されるテラバイト規模のデータの処理を必要としない場合に適しています。
    利用時は、パブリック エンドポイントまたは専用の Private Service Connect エンドポイントを構成する必要があります。

オフライン サービング(バッチ サービングまたはモデル トレーニングでの利用)

オフライン サービングの場合、別途 BigQuery から Vertex AI Feature Store のオフライン ストアに特徴量データをコピーまたはインポートする必要がないため、BigQuery に保存されている特徴量データをそのまま利用できます。
また BigQuery のデータ管理機能とエクスポート機能を使用して次のことを行うことができます。

モニタリング

特徴量モニタリング

レガシー版の Vertex AI Feature Store では 特徴量値の分布などを確認できる 特徴量モニタリング が存在していましたが、新機能においては BigQuery のデータを直接参照する形になり、Vertex AI Feature Store としての特徴量モニタリングの機能は存在しません。

オンライン ストア インスタインス のモニタリング

オンライン ストアを作成すると内部的に Bigtable のインスタンスが作成され、そこから特徴量を取得してオンライン サービングを行います。(プロジェクト内のリソースとして見える形で Bitable のインスタンスは作成されない。)
その際の Bigtable のリソース状況を確認できる機能は Vertex AI Feature Store として提供しています。

埋め込み管理とベクトル検索

Vertex AI Feature Store では、エンベンディングを BigQuery double 配列として保存することが可能です。これによりベクトル類似性検索を実行して、指定したエンティティまたはエンベディング値に最も近いエンティティを取得することが可能です。

BigQuery データソースの準備やエンティティのベクトル検索の実行方法などについては、以下を参照ください。

料金

Vertex AI Feature Store の料金は以下ドキュメントをご参照ください。(新機能の料金については、2023年12月時点で英語版のみ記載されています。)
https://cloud.google.com/vertex-ai/pricing#featurestore

2023年12月時点では以下の料金となっています。
尚、オンライン サービングを行う際は Bigtable online serving node Serving with Cloud Bigtable の料金がボトルネックになりますが、オンライン ストア 1ノードのみの利用であっても 3,000 ~ 3,500円/day 程度の課金が想定されます。
17

レガシー版との比較

新機能とレガシー版との違いについては以下の通りです。

データモデル

項目 新機能 レガシー
オンライン
ストア
リソース階層:
FeatureOnlineStore -> FeatureView
リソース階層:
Featurestore -> EntityType -> Feature
※詳細は こちら
オフライン
ストア
データは BigQuery に存在するため、
オフライン ストア リソース は存在しない。
リソース階層:
Featurestore -> EntityType -> Feature
※詳細は こちら
特徴量
レジストリ
リソース階層:
FeatureGroup -> Feature
特徴量レジストリは存在しない。

特徴量管理

項目 新機能 レガシー
オンライン
ストア
オンライン ストア インスタンスを作成し、特徴ビューを定義する必要がある。 Feature Store のプロビジョニング時に、オンライン ストアが作成される。
オフライン
ストア
BigQuery データソースを利用するため、オフライン ストアを個別に用意する必要はない。 Feature Store のプロビジョニング時に、オフライン ストアが作成される。
特徴量のインポート オフライン サービング
データが BigQuery にあるため、オフライン ストアにデータをインポートする必要はない。
オンライン サービング
BigQuery テーブルを登録することも、特徴データをオンライン ストアにコピーすることもできる。
オフライン / オンライン サービング
サービングのため BigQuery テーブルやビューなどの外部ソースからバッチインポートまたはストリーミング インポートを使用する必要がある。

特徴量のサービング

項目 新機能 レガシー
オンライン
ストア
以下のどちらかのサービングを利用する。
・Cloud Bigtable オンライン サービング
・最適化されたオンライン サービング
1 種類のオンライン サービスのみ提供される。
オフライン
ストア
オフライン ストアを操作するには、BigQuery API を使用する必要がある。 Vertex AI Feature Store のオフラインストアを操作するために Vertex AI API を使用する。

インターフェースと API

項目 新機能 レガシー
コンソール機能 コンソールの機能は制限されており、オンライン ストアのリストと特徴量のリネージに関する情報を表示できるが、リソースを作成することはできない。 コンソールを使用して、リソース作成モニタリングを含むほとんどの機能管理タスクが可能である。
リソース作成 API FeatureOnlineStore、FeatureView、FeatureGroup、Feature リソースを作成するための API が利用可能。 Featurestore、EntityType、Feature の各リソースを作成するための API が利用可能。
一括インポート API オンライン サービング
データの同期中に、BigQuery からオンライン ストアにデータを定期的にコピーする。
オフライン サービング
オフライン ストアへのバッチ インポートには API は必要ない。
オンライン サービング
Vertex AI API を使用してオンライン ストアへのバッチ インポートを行う。
オフライン サービング
オフライン ストアへの一括インポートには Vertex AI API を使用する。
ストリーミング インポート API オンライン サービング
ストリーミング インポートはサポートされていない。
オフライン サービング
オフライン ストアへのストリーミング インポートに API は必要ない。
オンライン サービング
Vertex AI API を使用してオンライン ストアへのストリーミング インポートを行う。
オフライン サービング
オフライン ストアへのストリーミング インポートには Vertex AI API を使用する。
バッチ提供 API BigQuery API を使用して、特徴量ビューで定義された BigQuery データソースから直接データをバッチで提供する。 Vertex AI API を使用して特徴量データをバッチ処理する。
オンライン サービング API FetchFeatureValues (FetchFeatureValuesRequest) API を使用する。 オンライン提供には ReadFeatureValues (ReadFeatureValuesRequest) API を使用する。

レガシー版からの移行

レガシー版の Vertex AI Feature Store は、そのまま次世代版ですぐに利用できません。これはリソース階層の定義が異なるためです。レガシー版からの移行が必要な場合は、Vertex AI Feature Store への移行 を参照ください。

実装方法

今回は GitHub に公開されている チュートリアル を参考に Google Cloud の一般公開データセットであるeコマースのデータセットを利用して、BigQuery ビューに紐づけた Feature Store を作成し、オンライン サービングにおける特徴量の取得方法を試します。

事前準備

まず、事前準備として以下を実施します。

Vertex AI API の有効化

以下に記載されている手順に従い、Vertex AI API を有効にしてください。
https://cloud.google.com/vertex-ai/docs/featurestore/setup?hl=ja#configure_project

権限設定

IAM にて、Vertex AI Workbench または Colab Enterprise で使用するユーザーアカウントに対して Vertex AI Feature Store 管理者(Vertex AI Feature Store Admin)の事前定義ロールを付与します。
16

Vertex AI Notebooks の準備

今回は Google Cloud が提供する Notebook 環境として Colab Enterprise または Vertex AI Workbench を利用して実装しています。
以下いずれかの方法で環境を作成し、以降の手順を実施してください。
(Notebook の選択に迷った場合は こちら をご参照ください。)

ライブラリのインストール

Vertex AI と BigQuery のクライアントライブラリと Pandas データフレームとデータベースの間でのデータ型変換補助ライブラリをインストールします。

! pip3 install --upgrade --quiet google-cloud-aiplatform\
                                 google-cloud-bigquery\
                                 db-dtypes

プロジェクトIDとリージョンを指定

以下コマンドの[your-project-id](と必要に応じてus-central1のリージョン)を Vertex AI Feature Store を利用するプロジェクトIDとリージョンに変更してセル実行します。

PROJECT_ID = "[your-project-id]"
! gcloud config set project {PROJECT_ID}
REGION = "us-central1"

ライブラリのインポート

以下のライブラリをインポートします。

from google.cloud import aiplatform, bigquery
from google.cloud.aiplatform_v1 import (FeatureOnlineStoreAdminServiceClient,
                                        FeatureOnlineStoreServiceClient,
                                        FeatureRegistryServiceClient)
from google.cloud.aiplatform_v1.types import feature as feature_pb2
from google.cloud.aiplatform_v1.types import feature_group as feature_group_pb2
from google.cloud.aiplatform_v1.types import \
    feature_online_store as feature_online_store_pb2
from google.cloud.aiplatform_v1.types import \
    feature_online_store_admin_service as \
    feature_online_store_admin_service_pb2
from google.cloud.aiplatform_v1.types import \
    feature_online_store_service as feature_online_store_service_pb2
from google.cloud.aiplatform_v1.types import \
    feature_registry_service as feature_registry_service_pb2
from google.cloud.aiplatform_v1.types import feature_view as feature_view_pb2
from google.cloud.aiplatform_v1.types import \
    featurestore_service as featurestore_service_pb2
from google.cloud.aiplatform_v1.types import io as io_pb2

Vertex AI SDK の初期化

Vertex AI SDK for Python を初期化します。

aiplatform.init(project=PROJECT_ID, location=REGION)
API_ENDPOINT = f"{REGION}-aiplatform.googleapis.com"

BigQuery でのデータ準備

オンライン予測を提供するために、以下の Google Cloud の一般公開データセットからeコマースのデータセットを利用します。以下の変換クエリを作成します。

  • bigquery-public-data.thelook_ecommerce.order_items
  • bigquery-public-data.thelook_ecommerce.products
feature_extract_query = """
WITH
 product_order_agg AS (
   SELECT cast(product_id as string) as entity_id,
     countif(status in ("Shipped", "Complete")) as good_order_count,
     countif(status in ("Returned", "Cancelled")) as bad_order_count
   FROM `bigquery-public-data.thelook_ecommerce.order_items`
   WHERE
     timestamp_trunc(created_at, day) >= timestamp_trunc(timestamp_sub(CURRENT_TIMESTAMP(), interval 30 day), day) and
     timestamp_trunc(created_at, day) < timestamp_trunc(CURRENT_TIMESTAMP(), day)
   group by 1
   order by entity_id),
 product_basic AS (
   SELECT cast(id as string) AS entity_id,
     lower(name) as name,
     lower(category) as category,
     lower(brand) as brand,
     cost,
     retail_price
   FROM   bigquery-public-data.thelook_ecommerce.products)
SELECT *, current_timestamp() as feature_timestamp
FROM product_basic
LEFT OUTER JOIN product_order_agg
USING (entity_id)
"""

クエリを実行して取得したデータを確認します。

bq_client = bigquery.Client(project=PROJECT_ID)
product_data = bq_client.query(feature_extract_query).result().to_dataframe()

print(product_data.shape)
product_data.head()

5
BigQuery のデータセットを作成します。

BQ_DATASET_ID = "featurestore_demo"
dataset = bigquery.Dataset(f"{PROJECT_ID}.{BQ_DATASET_ID}")
dataset.location = "US"
dataset = bq_client.create_dataset(
    dataset, exists_ok=True, timeout=30
)

BigQuery のビューを作成します。

BQ_VIEW_ID = "product_features"
BQ_VIEW_ID_FQN = f"{PROJECT_ID}.{BQ_DATASET_ID}.{BQ_VIEW_ID}"
view = bigquery.Table(BQ_VIEW_ID_FQN)
view.view_query = feature_extract_query
view = bq_client.create_table(view, exists_ok=True)

BigQuery コンソールにて作成したデータセットとビューが存在することを確認します。
6

オンライン ストア インスタンスの作成

サービス クライアントを初期化します。

admin_client = FeatureOnlineStoreAdminServiceClient(
    client_options={"api_endpoint": API_ENDPOINT}
)
registry_client = FeatureRegistryServiceClient(
    client_options={"api_endpoint": API_ENDPOINT}
)

オンライン ストア インスタンスを作成します。
尚、自動スケーリング設定として min_node_count, max_node_count, cpu_utilization_target を指定できます。

FEATURE_ONLINE_STORE_ID = "the_look_demo_unique"

online_store_config = feature_online_store_pb2.FeatureOnlineStore(
    bigtable=feature_online_store_pb2.FeatureOnlineStore.Bigtable(
        auto_scaling=feature_online_store_pb2.FeatureOnlineStore.Bigtable.AutoScaling(
            min_node_count=1, max_node_count=3, cpu_utilization_target=50
        )
    )
)

create_store_lro = admin_client.create_feature_online_store(
    feature_online_store_admin_service_pb2.CreateFeatureOnlineStoreRequest(
        parent=f"projects/{PROJECT_ID}/locations/{REGION}",
        feature_online_store_id=FEATURE_ONLINE_STORE_ID,
        feature_online_store=online_store_config,
    )
)
# オンライン ストア インスタンスの作成が完了するまで待つ
print(create_store_lro.result())

Vertex AI Feature Store のコンソールからオンライン ストア インスタンスが作成されていることを確認します。
Google Cloud コンソールのナビゲーションメニューから [Vertex AI] > [Feature Store] を選択し、画面右上の [Vertex AI Feature Store (Legacy)] を [Vertex AI Feature Store] に切り替えます。
7

[ONLINE STORE] に切り替え Online store の一覧にて、作成したオンライン ストア インスタンス the_look_demo_unique が存在することを確認します。
8

特徴量ビューの作成

利用する BigQuery ビューと特徴量ビューのエンティティID となるentity_idカラムを指定して、特徴量ビューを作成します。

FEATURE_VIEW_ID = "product"
CRON_SCHEDULE = "TZ=America/Los_Angeles 56 * * * *"

# 利用する BigQuery ビューと特徴量ビューのエンティティID となる`entity_id`カラムを指定
big_query_source = feature_view_pb2.FeatureView.BigQuerySource(
    uri=f"bq://{BQ_VIEW_ID_FQN}", entity_id_columns=["entity_id"]
)

sync_config = feature_view_pb2.FeatureView.SyncConfig(cron=CRON_SCHEDULE)

create_view_lro = admin_client.create_feature_view(
    feature_online_store_admin_service_pb2.CreateFeatureViewRequest(
        parent=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}",
        feature_view_id=FEATURE_VIEW_ID,
        feature_view=feature_view_pb2.FeatureView(
            big_query_source=big_query_source,
            sync_config=sync_config,
        ),
    )
)

# 特徴量ビューの作成が完了するまで待つ
print(create_view_lro.result())

Vertex AI Feature Store のコンソールからオンライン ストア インスタンス the_look_demo_unique を押下します。
9

Feature Views より作成した特徴量ビュー product が存在することを確認します。
10

特徴量グループの作成

BigQuery ビューに関連付ける特徴量グループ名と特徴量となるカラムを指定します。

FEATURE_GROUP_ID = "product_features_unique"
FEATURE_IDS = [
    "good_order_count",
    "bad_order_count",
    "category",
    "name",
    "brand",
    "cost",
    "retail_price",
]

特徴量グループを作成します。

feature_group_config = feature_group_pb2.FeatureGroup(
    big_query=feature_group_pb2.FeatureGroup.BigQuery(
        big_query_source=io_pb2.BigQuerySource(input_uri=f"bq://{BQ_VIEW_ID_FQN}")
    )
)

create_group_lro = registry_client.create_feature_group(
    feature_registry_service_pb2.CreateFeatureGroupRequest(
        parent=f"projects/{PROJECT_ID}/locations/{REGION}",
        feature_group_id=FEATURE_GROUP_ID,
        feature_group=feature_group_config,
    )
)

# 特徴量グループの作成が完了するまで待つ
print(create_group_lro.result())

Vertex AI Feature Store コンソールにて [FEATURE GROUPS] に表示を切り替え、Feature groups にて作成した特徴量グループ product_features_unique が存在することを確認します。
11

特徴量の登録

作成した特徴量グループに紐づけて特徴量を登録します。

create_feature_lros = []
for id in FEATURE_IDS:
    create_feature_lros.append(
        registry_client.create_feature(
            featurestore_service_pb2.CreateFeatureRequest(
                parent=f"projects/{PROJECT_ID}/locations/{REGION}/featureGroups/{FEATURE_GROUP_ID}",
                feature_id=id,
                feature=feature_pb2.Feature(),
            )
        )
    )

for lro in create_feature_lros:
    # 特徴量の登録が完了するまで待つ
    print(lro.result())

Vertex AI Feature Store コンソールにて、特徴量グループ product_features_unique に登録した特徴量が存在することを確認します。
12

作成した特徴量グループと特徴量に紐付く特徴量ビュー インスタンスを作成します。また、BigQuery ビューとの同期の時間と頻度を毎時56分(PST)に設定します。

FEATURE_VIEW_ID = "registry_product"
CRON_SCHEDULE = "TZ=America/Los_Angeles 56 * * * *"

feature_registry_source = feature_view_pb2.FeatureView.FeatureRegistrySource(
    feature_groups=[
        feature_view_pb2.FeatureView.FeatureRegistrySource.FeatureGroup(
            feature_group_id=FEATURE_GROUP_ID, feature_ids=FEATURE_IDS
        )
    ]
)

sync_config = feature_view_pb2.FeatureView.SyncConfig(cron=CRON_SCHEDULE)

create_view_lro = admin_client.create_feature_view(
    feature_online_store_admin_service_pb2.CreateFeatureViewRequest(
        parent=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}",
        feature_view_id=FEATURE_VIEW_ID,
        feature_view=feature_view_pb2.FeatureView(
            feature_registry_source=feature_registry_source,
            sync_config=sync_config,
        ),
    )
)

# Wait for LRO to complete and show result
print(create_view_lro.result())

Vertex AI Feature Store コンソールにて、オンライン ストア インスタンス the_look_demo_unique にある特徴量ビューとして、作成した特徴量ビューが存在していることを確認します。
13

手動での特徴量ビュー更新

前述の手順で特徴量ビュー作成時に指定した日時で特徴量ビューが更新されるようスケジュールしていますが、ここでは手動での更新を行います。

sync_response = admin_client.sync_feature_view(
    feature_view=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}/featureViews/{FEATURE_VIEW_ID}"
)

以下コードを実行することで、特徴量ビューを最新化します。
get_feature_view_sync を使用して、30秒ごとに特徴量ビューのステータスを確認します。

import time

while True:
    feature_view_sync = admin_client.get_feature_view_sync(
        name=sync_response.feature_view_sync
    )
    if feature_view_sync.run_time.end_time.seconds > 0:
        status = "Succeed" if feature_view_sync.final_status.code == 0 else "Failed"
        print(f"Sync {status} for {feature_view_sync.name}.")
        break
    else:
        print("Sync ongoing, waiting for 30 seconds.")
    time.sleep(30)

list_feature_view_syncs を使用して、すべての同期を表示します。

admin_client.list_feature_view_syncs(
    parent=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}/featureViews/{FEATURE_VIEW_ID}"
)

Vertex AI Feature Store コンソールにて、特徴量ビューの詳細画面にて、同期ジョブのステータスを確認します。
同期中の場合は、ステータスが Running になります。

14

同期が完了すると、ステータスが Success になります。
(同期に約8分30秒程度かかります。)
15

オンライン サービングの実行

オンライン サービングのためにデータをフェッチするには、特徴量ビューのリソースとエンティティIDを指定して fetch_feature_values によりリクエストを送信します。
FetchFeatureValuesRequest.Format を使用して応答形式を指定できます。 形式を指定しない場合、形式はデフォルトで KEY_VALUE に設定されます。 PROTO_STRUCT もサポートされている形式です。)

# クライアント インスタンスを生成
data_client = FeatureOnlineStoreServiceClient(
    client_options={"api_endpoint": API_ENDPOINT}
)
# 特徴量をフェッチする
data_client.fetch_feature_values(
    request=feature_online_store_service_pb2.FetchFeatureValuesRequest(
        feature_view=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}/featureViews/{FEATURE_VIEW_ID}",
        data_key=feature_online_store_service_pb2.FeatureViewDataKey(key="28098"),
    )
)

取得結果は以下の通りとなります。

key_values {
  features {
    name: "feature_timestamp"
    value {
      int64_value: 1703492812886244
    }
  }
  features {
    name: "good_order_count"
    value {
      int64_value: 0
    }
  }
  features {
    name: "category"
    value {
      string_value: "swim"
    }
  }
  features {
    name: "retail_price"
    value {
      double_value: 64.94999694824219
    }
  }
  features {
    name: "cost"
    value {
      double_value: 36.56684834767282
    }
  }
  features {
    name: "bad_order_count"
    value {
      int64_value: 1
    }
  }
  features {
    name: "name"
    value {
      string_value: "rip curl men\'s hotskin short sleeve jacket"
    }
  }
  features {
    name: "brand"
    value {
      string_value: "rip curl"
    }
  }
}

クリーンアップ

作成したリソースを削除する場合は、以下を実行します。

# 特徴量を削除
for id in FEATURE_IDS:
    registry_client.delete_feature(
        name=f"projects/{PROJECT_ID}/locations/{REGION}/featureGroups/{FEATURE_GROUP_ID}/features/{id}"
    )

# 特徴量グループを削除
registry_client.delete_feature_group(
    name=f"projects/{PROJECT_ID}/locations/{REGION}/featureGroups/{FEATURE_GROUP_ID}"
)

# 特徴量ビューを削除
admin_client.delete_feature_view(
    name=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}/featureViews/{FEATURE_VIEW_ID}"
)

# オンライン ストアを削除
admin_client.delete_feature_online_store(
    name=f"projects/{PROJECT_ID}/locations/{REGION}/featureOnlineStores/{FEATURE_ONLINE_STORE_ID}",
    force=True,
)

# BigQuery データセットを削除
bq_client.delete_dataset(BQ_DATASET_ID, delete_contents=True, not_found_ok=True)

まとめ

今回は Vertex AI Feature Store の新機能についてご紹介しました。
この機能を利用することで BigQuery からデータを移動することなく特徴量管理ができ、かつ低レイテンシのオンライン サービングが可能となりました。
ただし BigQuery から特徴量ビュー インスタンスへの同期処理のパフォーマンスに関しては検証の余地があると感じましたので、また別の機会に調査して記事化できたらと考えています。

Discussion