背景

オンライン推論で最もありがちなボトルネックは「特徴量の取得」です。
モデル自体は Triton Inference Server 上で GPU が回してくれるので数ミリ秒ですが、特徴量を Aurora や S3 から直接取ろうとすると 100ms〜秒単位になることも珍しくありません。
この遅延が積み重なるとユーザー体験を大きく損ないます。

そこで Feast + Redis を使って「オンライン特徴量ストア」を構築すると、5ms 以内での特徴量取得が可能になります。


実務での落とし穴と回避策

1. Redis のメモリ設計

Redis はインメモリ型なので「どの特徴量をキャッシュするか」が死活問題です。

  • 全特徴量を載せるとすぐにメモリが枯渇する
  • 一方で不足すると Aurora へのフェイルオーバーが発生して遅延が跳ね上がる

👉 解決策としては

  • アクセス頻度の高い特徴量だけをオンラインに載せる
  • Aurora などのオフラインストアと TTL(有効期限)をうまく組み合わせる
    のが現実的です。

2. TTL 設定の難しさ

特徴量の鮮度はユースケース次第で大きく変わります。

  • レコメンド用の「直近の購入履歴」は数分単位で更新したい
  • 与信スコアのような「年収」「職業」などの静的特徴量は1日〜1週間に1回で十分

👉 Feast では TTL を特徴量ごとに細かく設定できるので、鮮度が必要なものだけ Redis に短期キャッシュ、それ以外は Aurora に任せるのが運用の肝です。

3. 書き込みレイテンシと一貫性

リアルタイムに流れてくるイベント(Kafka や Kinesis)を Flink / Spark で処理し、Redis に即座に書き込むフローを組むと、Redis には最新値があるが Aurora に反映されていない、という「一貫性のズレ」が発生します。

👉 これを避けるには

  • Flink から Redis と Aurora に二重書き込みを行う
  • もしくは Aurora に書き込み → Debezium で CDC(Change Data Capture)し、Redis に同期する
    といった設計が有効です。

4. Redis 運用の現実

AWS では ElastiCache for Redis を選ぶのが一般的ですが、スケーリング戦略を誤ると課金が跳ねます。

  • 単純なスケールアップは高コスト
  • スケールアウトはシャーディング設計が必要

👉 最初は 3〜5ノードのクラスタ構成から始め、キー分布を監視しながら調整すると安定します。


まとめ

  • Feast + Redis を使えばオンライン特徴量取得を 5ms 以内に抑えられる
  • ただし メモリ設計・TTL・一貫性・スケーリングが実運用での落とし穴
  • Aurora(永続ストア)と組み合わせ、ユースケースごとに特徴量を分離するのがベストプラクティス

💡この仕組みをしっかり設計しておくと、Django API から gRPC 経由で呼び出す際にも安定して「低遅延 × 高スループット」でモデル推論が実現できます。

投稿者 kojiro777

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です