MLモデルをオンラインで推論する際、学習時と同じ特徴量を低遅延で取得する仕組みが必要です。 DatabricksのFeature Servingは、Unity Catalog上のFeature Storeテーブルを専用エンドポイント経由で配信し、 Training-Serving一貫性(学習時と推論時で同じ特徴量定義を使う)を実現します。 本稿ではFeature Servingの仕組み、Online Table設定、エンドポイント作成、一貫性の確保方法を解説します。
バッチ推論ではDeltaテーブルから直接特徴量を読み取れますが、オンライン推論(リアルタイムAPIリクエスト)では Deltaテーブルへのクエリはレイテンシが高すぎます(秒〜数十秒)。Feature Servingは以下の課題を解決します。
| 課題 | バッチ推論 | オンライン推論(Feature Serving) |
|---|---|---|
| レイテンシ要件 | 秒〜分(許容可能) | ミリ秒〜数十ミリ秒(低遅延必須) |
| 特徴量の取得元 | Deltaテーブルから直接SELECT | Online Table(KVストア)経由 |
| Training-Serving一貫性 | 同じテーブルを読むため自然に一致 | Feature Storeを共通定義にすることで保証 |
| スケーラビリティ | クラスターの計算能力に依存 | エンドポイントの自動スケーリング |
[Training]
│ Feature Engineering in UC
│ fe.create_training_set(
│ entity_df, feature_lookups=[...])
│ → 学習時に特徴量をルックアップ
v
[Feature Table (Delta, UC)]
│ ソーステーブル
│ ├─ customer_features (customer_id, avg_spend, ...)
│ └─ product_features (product_id, category, ...)
v
[Online Table]
│ Deltaからの差分同期 (Snapshot / Triggered / Continuous)
│ → 低遅延KVストアに変換
v
[Feature Serving Endpoint]
│ REST API (POST /serving-endpoints/{name}/invocations)
│ → customer_id をキーに特徴量ベクトルを返却
v
[Model Serving / Application]
│ 特徴量 + リアルタイム入力 → 推論結果Online TableはDeltaテーブルを低遅延のKVストアに同期する仕組みです。 ソースとなるDeltaテーブル(Feature Table)とプライマリキーを指定して作成します。
-- Online Tableの作成(SQL)
CREATE ONLINE TABLE ml.features.customer_features_online
SOURCE ml.features.customer_features
PRIMARY KEY (customer_id)
SYNC MODE TRIGGERED;| 同期モード | 動作 | レイテンシ | コスト |
|---|---|---|---|
| SNAPSHOT | 全データを定期的にスナップショット | 同期間隔に依存(分〜時間) | 低 |
| TRIGGERED | 手動トリガーでCDC差分同期 | トリガー実行時に更新 | 中 |
| CONTINUOUS | ストリーミングで常時差分同期 | 秒〜分のニアリアルタイム | 高(常時稼働) |
プライマリキーはFeature Tableのルックアップキーと一致させます。 複合キーも指定可能です(例: PRIMARY KEY (customer_id, product_id))。
Python SDK(databricks-feature-engineering)を使ってFeature Serving Endpointを作成します。
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities.feature_serving_endpoint import (
EndpointCoreConfig,
ServedEntity,
)
fe = FeatureEngineeringClient()
fe.create_feature_serving_endpoint(
name="customer-features-endpoint",
config=EndpointCoreConfig(
served_entities=ServedEntity(
feature_table_name="ml.features.customer_features",
scale_to_zero_enabled=True,
)
)
)scale_to_zero_enabledをTrueにすると、リクエストがない期間はエンドポイントがスケールダウンしてコストを抑えます。 ただしコールドスタート時にレイテンシが増加するため、SLAが厳しい場合はFalseにして常時稼働させます。
import requests
import json
endpoint_url = "https://<workspace-url>/serving-endpoints/customer-features-endpoint/invocations"
headers = {"Authorization": "Bearer <token>", "Content-Type": "application/json"}
payload = {
"dataframe_records": [
{"customer_id": "C001"},
{"customer_id": "C002"}
]
}
response = requests.post(endpoint_url, headers=headers, json=payload)
features = response.json()
# => {"dataframe_records": [
# {"customer_id": "C001", "avg_spend": 150.5, "total_orders": 42, ...},
# {"customer_id": "C002", "avg_spend": 89.2, "total_orders": 15, ...}
# ]}Training-Serving Skew(学習時と推論時で特徴量の定義や計算方法が異なる問題)は、MLシステムの信頼性を損なう最大の落とし穴です。 DatabricksのFeature Engineering in Unity Catalogは以下の仕組みでこの問題を構造的に解消します。
from databricks.feature_engineering import FeatureEngineeringClient, FeatureLookup
fe = FeatureEngineeringClient()
training_set = fe.create_training_set(
df=labels_df, # ラベルデータ (customer_id, label)
feature_lookups=[
FeatureLookup(
table_name="ml.features.customer_features",
lookup_key=["customer_id"],
),
FeatureLookup(
table_name="ml.features.product_features",
lookup_key=["product_id"],
),
],
label="label",
)
training_df = training_set.load_df()
# モデルのログ(特徴量リネージが自動記録される)
fe.log_model(
model=trained_model,
artifact_path="model",
flavor=mlflow.sklearn,
training_set=training_set,
registered_model_name="ml.models.recommendation_model",
)fe.log_modelでログされたモデルには特徴量テーブルの参照が埋め込まれます。 このモデルをModel Servingにデプロイすると、推論リクエスト時にFeature Serving経由で自動的に特徴量がルックアップされます(Feature Function)。
| 検討項目 | 推奨 | 理由 |
|---|---|---|
| プライマリキー設計 | エンティティの自然キー(customer_id等) | ルックアップの一意性を保証 |
| 特徴量テーブルの粒度 | エンティティ単位で1テーブル | テーブルが肥大化するとOnline Tableの同期コスト増大 |
| 特徴量の鮮度要件 | ユースケースに応じてOnline Table同期モードを選択 | リアルタイム推薦→Continuous、日次バッチ→Snapshot |
| 高カーディナリティの特徴量 | 前処理でバケット化・カテゴリ化 | Online Tableの行数・サイズを抑制 |
| エンドポイントのスケーリング | QPS要件に応じてscale_to_zeroの有無を決定 | 低QPS→scale_to_zero、高QPS→常時稼働 |
ML Associate / ML Professional
問題 1
MLエンジニアがオンライン推薦システムを構築している。学習時にはDeltaテーブルから顧客特徴量をルックアップしてモデルを学習した。推論時にも同じ特徴量を低遅延で取得し、学習時と推論時の特徴量定義を一致させたい。最も適切なアプローチはどれか。
正解: A
Feature Engineering in UCで特徴量テーブルを一元管理し、Online Tableで低遅延のKVストアに同期、Feature Serving Endpointで配信することで、Training-Serving一貫性と低遅延を両立できます。Deltaへの直接クエリは低遅延要件を満たしません。CSVエクスポートは特徴量の更新追従ができません。MLflowのモデルアーティファクトにはモデルのパラメータが含まれますが特徴量データそのものは含まれません。
Feature ServingとModel Servingの違いは何ですか?
Model ServingはMLモデル自体をエンドポイントとしてデプロイし、入力データを受け取って推論結果を返します。Feature Servingは特徴量テーブルから特定キーの特徴量ベクトルを低遅延で取得するエンドポイントです。典型的な構成では、クライアントがまずFeature Servingで特徴量を取得し、その特徴量をModel Servingに渡して推論する、という2段階のリクエストになります。Feature Functionを使えば、Model Serving内で自動的に特徴量をルックアップする一体化も可能です。
Online Tableの更新頻度はどのくらいですか?
Online Tableの同期モードは3種類あります。(1) Snapshot: 手動またはスケジュールでソースDeltaテーブル全体をスナップショット同期。(2) Triggered: 手動トリガーでCDC(変更データキャプチャ)を使った差分同期。(3) Continuous: ストリーミングで常時差分同期(最も低遅延だがコスト大)。ユースケースに応じて頻度とコストのバランスで選択します。
Feature Storeで管理していない特徴量もFeature Servingで配信できますか?
Feature Servingのエンドポイントは、Unity Catalog上のFeature Storeテーブル(Feature Engineering in Unity Catalog)から配信します。Feature Storeに登録されていないテーブルを直接Feature Servingで配信することはできません。ただし、任意のDeltaテーブルをFeature Store(UC上のFeatureテーブル)として登録することは簡単にでき、CREATE FEATURE TABLE文またはPython APIで登録できます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Databricks資格一覧|全7試験・難易度・勉強法
Databricks認定資格全7試験の一覧・難易度・出題範囲・合格ラインを徹底解説。2026年最新版の公式試験ガイドに準...
Databricks試験の難易度ランキング|全7資格を徹底比較
Databricks認定全7試験の難易度をランキング形式で徹底比較。合格率・学習時間・出題傾向から難易度を分析。...
Databricks資格の勉強方法|最短合格ルートと学習時間の目安
Databricks認定資格に最短で合格するための勉強方法を完全ガイド。公式リソース・問題集・学習スケジュールを徹底解説...
Databricks Data Engineer Associate完全解説|出題範囲・問題例・合格戦略
Databricks Certified Data Engineer Associate試験を徹底解説。5つの出題ドメイ...
Databricks Data Engineer Professional完全解説|上級試験の攻略法
Databricks Certified Data Engineer Professional試験を徹底解説。10の出題...