LESSON 30分

ストーリー

田中VPoE
特徴量ストアの2層構造を理解した。最後の仕上げは「Feature Serving」—推論サービスに特徴量を提供する仕組みだ
あなた
APIで特徴量を取得するだけではないんですか?
田中VPoE
シンプルなケースはそうだが、実運用では「特徴量の結合」「リクエスト時特徴量の計算」「キャッシュ」「フォールバック」など考慮すべきことが多い。ここを適切に設計しないと推論レイテンシが跳ね上がる

Feature Servingのアーキテクチャ

クライアント → API Gateway → 推論サービス

                    ┌───────────┼───────────┐
                    │           │           │
              オンライン    リクエスト時    キャッシュ
              ストア      特徴量計算      レイヤー

サービングパターン

パターン説明レイテンシ
Embedded推論サービス内で特徴量取得低(10-50ms)
Sidecarサイドカーコンテナで特徴量取得中(20-100ms)
External外部Feature Serviceに問い合わせ高(50-200ms)

推論サービスの実装例

from feast import FeatureStore
from fastapi import FastAPI
import numpy as np

app = FastAPI()
store = FeatureStore(repo_path="./feature_repo")
model = load_model("churn_predictor_v2")

@app.post("/predict")
async def predict(customer_id: str):
    # 1. オンラインストアから特徴量取得
    features = store.get_online_features(
        features=[
            "customer_features:total_purchases",
            "customer_features:avg_order_value",
            "customer_features:days_since_last_order",
        ],
        entity_rows=[{"customer_id": customer_id}],
    ).to_dict()

    # 2. 特徴量ベクトルを構築
    feature_vector = np.array([[
        features["total_purchases"][0],
        features["avg_order_value"][0],
        features["days_since_last_order"][0],
    ]])

    # 3. 推論実行
    prediction = model.predict_proba(feature_vector)[0][1]

    return {
        "customer_id": customer_id,
        "churn_probability": float(prediction),
        "risk_level": "HIGH" if prediction > 0.7 else "MEDIUM" if prediction > 0.3 else "LOW"
    }

キャッシュ戦略

戦略TTL用途
L1キャッシュ秒〜分インメモリ(アプリ内)
L2キャッシュ分〜時間Redis/Memcached
なし-常に最新値が必要な場合

フォールバック設計

特徴量取得に失敗した場合の対策:

戦略説明
デフォルト値事前定義した中央値・最頻値を使用
キャッシュ値前回取得した値を再利用
簡易モデル特徴量が少なくても動く軽量モデルに切り替え
グレースフルデグラデーション推薦なし、など機能を制限
async def get_features_with_fallback(customer_id: str):
    try:
        features = store.get_online_features(...)
        return features
    except TimeoutError:
        # キャッシュから取得
        cached = redis_client.get(f"features:{customer_id}")
        if cached:
            return json.loads(cached)
        # デフォルト値を返す
        return DEFAULT_FEATURES

モニタリング

メトリクス閾値例アクション
取得レイテンシP99 < 50msスケールアウト
キャッシュヒット率> 80%TTL調整
Null値率< 1%パイプライン調査
特徴量ドリフト分布変動 > 2σアラート発報

まとめ

  • Feature ServingはEmbedded/Sidecar/Externalの3パターン
  • キャッシュ戦略でレイテンシとコストを最適化する
  • フォールバック設計で障害時の可用性を確保する
  • モニタリングで品質とパフォーマンスを継続的に監視する

チェックリスト

  • Feature Servingの3パターンを説明できる
  • 推論サービスの実装イメージが掴めた
  • キャッシュとフォールバックの設計方針を理解した
  • 特徴量サービングのモニタリング項目を把握した

次のステップへ

特徴量ストアの全体像を理解したら、演習でFeastを使った特徴量ストアの構築に挑戦しましょう。

推定読了時間: 30分