リアルタイム特徴量サービングにおけるオンラインテーブルの活用

[Use online tables for real\-time feature serving \| Databricks on AWS](https://docs.databricks.com/en/machine-learning/feature-store/online-tables.html) [2023/12/8時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note info
**プレビュー**
オンラインテーブルは機能制限のあるパブリックプレビューです。限定プレビューの間は、オンラインテーブルはSQLサーバレスDBUを消費します。オンラインテーブルの最終的な価格は今後明らかになります。プレビューに参加するには[こちら](https://forms.gle/9jLZkpXnJF9ZcxtQA)からサインアップしてください。

オンラインテーブルのプレビューは以下のリージョンで利用できます: us-east-1, us-west-2, eu-west-1, ap-southeast-2
:::

オンラインテーブルとは、オンラインアクセスに最適化された行指向フォーマットで格納されるDeltaテーブルの読み取り専用のコピーです。オンラインテーブルは、リクエストの負荷に応じてスループットの能力をオートスケールする完全にサーバレスなテーブルであり、いかなる規模のデータに対して低いレーテンシーと高いスループットを提供します。オンラインテーブルは、高速なデータ検索のために、Databricks Model Serving、Feature & Function Serving、retrieval-augmented generation (RAG)アプリケーションと動作するように設計されています。

オンラインテーブルの作成は1ステップのプロセスです。カタログエクスプローラでDeltaテーブルを選択し、**Create online table**を選択するだけです。

# 要件

- ワークスペースでUnity Catalogが有効化されていること。Unity Catalogメタストアの作成、ワークスペースでの有効化、カタログの作成方法については[ドキュメント](https://docs.databricks.com/en/data-governance/unity-catalog/get-started.html)をご覧ください。
- Databricks管理者は、アカウントコンソールでサーバレスの利用状況に同意する必要があります。

# オンラインテーブルの操作

このセクションではオンラインテーブルの作成、削除の方法、ステータスのチェック方法、オンラインテーブルのアップデートの起動方法を説明します。

## 作成

カタログエクスプローラからオンラインテーブルを作成します。必要な権限については、[ユーザーのアクセス権](#ユーザーのアクセス権)をご覧ください。

1. カタログエクスプローラで、オンラインテーブルに同期したいソーステーブルに移動します。![](https://docs.databricks.com/en/_images/kebab-menu.png)ケバブメニューから**Create online table**を選択します。
![](https://docs.databricks.com/en/_images/create-online-table.png)
1. オンラインテーブルを設定するためにダイアログのセレクターを使用します。
![](https://docs.databricks.com/en/_images/create-online-table-dlg.png)
    **Name:** Unity Catalogのオンラインテーブルの名称。
    **Primary Key:** オンラインテーブルの主キーとして使用するソーステーブルのカラム。
    **Timeseries Key:** (オプション)時系列のキーとして使用するソーステーブルのカラム。指定された場合、オンラインテーブルにはそれぞれの主キーごとに最新の時系列キーの値を持つ行のみが含まれます。
    **Sync mode:** 同期パイプラインがオンラインテーブルをどのようにアップデートするのかを指定します。**Snapshot**、**Triggered**、**Continuous**のいずれかを選択します。

    | ポリシー | 説明 |
    |:--|:--|
    |Snapshot   | ソーステーブルのスナップショットを取得し、オンラインテーブルにコピーするためにパイプラインは一度実行されます。新たにソーステーブルのスナップショットを取得し、新規コピーを作成することで、ソーステーブルに対する以降の変更はオンラインテーブルに反映されます。オンラインテーブルのコンテンツは原子的に更新されます。  |
    | Triggered  | オンラインテーブルでソーステーブルの初期コピーを作成するためにパイプラインが一度実行されます。スナップショットの同期モードとは異なり、オンラインテーブルがリフレッシュされた際、前回のパイプライン実行以来の変更のみが取得され、オンラインテーブルに適用されます。インクリメンタルなリフレッシュは手動、あるいはスケジュールに基づいて自動でトリガーすることができます。  |
    | Continuous  | パイプラインは継続的に稼働します。ソーステーブルに対する以降の変更はリアルタイムのストリーミングモードでオンラインテーブルに適用されます。手動のリフレッシュは不要です。  |    

    :::note
    **注意**
    **Triggered**、**Continuous**同期モードをサポートするには、ソーステーブルでは[Change data feed](https://docs.databricks.com/en/delta/delta-change-data-feed.html)が有効化されている必要があります。
   :::

1. 設定が完了したら、**Confirm**をクリックします。オンラインテーブルのページが表示されます。
1. ダイアログで指定したカタログ、スキーマに指定された名前で、新たなオンラインテーブルが作成されます。カタログエクスプローラでは、オンラインテーブルは![](https://docs.databricks.com/en/_images/online-table-icon.png)として表示されます。
    
## ステータスのチェックとアップデートのトリガー

オンラインテーブルのステータスをチェックするには、カタログでテーブル名をクリックします。オンラインテーブルのページが**Overview**タブにオープンされます。**Data Ingest**セクションには最新のアップデートのステータスが表示されます。アップデートをトリガーするには、**Sync now**をクリックします。また、**Data Ingest**セクションにはテーブルのアップデートを行うDelta Live Tablesパイプラインへのリンクが含まれています。
![](https://docs.databricks.com/en/_images/online-table-in-catalog.png)

## 削除

オンラインテーブルページで、![](https://docs.databricks.com/en/_images/kebab-menu.png)ケバブメニューから**Delete**を選択します。

# 特徴量サービングエンドポイントを用いたオンラインテーブルのサービング

Databricks外でホスティングされているモデルやアプリケーションに対して、オンラインテーブルから特徴量をサービングするための特徴量サービングエンドポイントを作成することができます。エンドポイントによって、REST APIを用いた低レーテンシーの特徴量利用が可能となります。

1. `feature spec`の作成。
    `feature spec`を作成する際、使用するソーステーブルの名前を指定します。すると、`feature spec`はソーステーブル名を用いてUnity Catalogに新規feature spec関数を作成します。これによって、オンラインとオフラインシナリオの両方で`feature spec`を活用することができます。オンラインの検索では、`feature spec`を用いるサービングエンドポイントは低レーテンシーの特徴量検索を実行するために、オンラインバージョンのテーブルを自動で活用します。

    カタログエクスプローラの**Funtion**タブで`feature spec`を参照することができます。

    ```py:Python
    fe = FeatureEngineeringClient()
    fe.create_feature_spec(
      name="catalog.default.user_preferences_spec",
      features=[
        FeatureLookup(
          table_name="user_preferences",
          lookup_key="user_id"
        )
      ]
    )
    ```

1. 特徴量サービングエンドポイントの作成。
    このステップでは、Deltaテーブル`user_preferences`からのデータを同期するオンラインテーブル`user_preferences_online_table`を作成しているものとします。特徴量サービングエンドポイントを作成するには`feature spec`を使用します。このエンドポイントによって、関連づけられたオンラインテーブルを用いてREST API経由でデータを利用できるようになります。

    :::note
    **注意**
    このオペレーションを行うユーザーはオフラインテーブルとオンラインテーブル両方のオーナーである必要があります。
   :::

    ```py:Python
    fe.create_feature_serving_endpoint(
    name = "user-preferences",
    config=EndpointCoreConfig(
      served_entities=ServedEntity(
        feature_spec_name="catalog.default.user_preferences_spec",
        workload_size="Small",
        scale_to_zero_enabled=True)
      )
    )
    ```

1. 特徴量サービングエンドピントからのデータの取得。
    APIエンドポイントにアクセスするには、最初にOAuth認証を用いたリクエスtの認証を行い、HTTP GETリクエストを行います。

    ```py:Python
    url = "https://{workspace_url}/serving-endpoints/user-preferences/invocations"
    databricks_token = xxxxxxx

    headers = {'Authorization': f'Bearer {databricks_token}', 'Content-Type': 'application/json'}

    data = {
      "dataframe_records": [{"user_id": user_id}]
    }
    data_json = json.dumps(data, allow_nan=True)

    response = requests.request(method='POST', headers=headers, url=url, data=data_json)
    if response.status_code != 200:
      raise Exception(f'Request failed with status {response.status_code}, {response.text}')

    print(response.json()['outputs'][0]['hotel_preference'])
    ```

# RAGアプリケーションによるオンラインテーブルの活用

RAGアプリケーションはオンラインテーブルの一般的なユースケースとなります。RAGアプリケーションが必要とする構造化データのオンラインテーブルを作成し、特徴量サービングエンドポイントにホスティングします。RAGアプリケーションはオンラインテーブルから適切なデータを検索するために、特徴量サービングエンドポイントを使用します。

典型的なステップは以下のようになります:

1. 特徴量サービングエンドポイントの作成。
1. 適切なデータを検索するためにエンドポイントを使用するLangChainToolの作成。
1. 適切なデータを取得するためのLangChainエージェントで上記ツールを使用。
1. LangChainアプリケーションをホストするためのモデルサービングエンドポイントを作成。

ステップバイステップの手順については以下のサンプルノートブックをご覧ください。

# サンプルノートブック: オンラインテーブル

以下のノートブックでは、retrieval augmented generation (RAG)アプリケーションでのDatabricksオンラインテーブルや特徴量サービングエンドポイントの使い方を説明しています。

## RAGアプリケーションを用いたオンラインテーブルのデモノートブック

https://docs.databricks.com/_extras/notebooks/source/machine-learning/structured-data-for-rag.html

# Databricksモデルサービングによるオンラインテーブルの活用

Databricks Model Servingの特徴量検索でオンラインテーブルを活用することができます。オンラインテーブルに特徴量テーブルを同期すると、当該特徴量テーブルの特徴量を用いてトレーニングされたモデルは、推論の際に自動でオンラインテーブルから特徴量の値を検索します。追加の設定は不要です。

1. モデルのトレーニングで`FeatureLookup`を使う。
    モデルのトレーニングでは、以下の例のようにモデルのトレーニングセットでオフラインの特徴量テーブルの特徴量を使います:

    ```py:Python
    training_set = fe.create_training_set(
      df=id_rt_feature_labels,
      label='quality',
      feature_lookups=[
          FeatureLookup(
              table_name="user_preferences",
              lookup_key="user_id"
          )
      ],
      exclude_columns=['user_id'],
    )
    ```

1. Databricks Model Servingでモデルをサービングする。モデルは自動でオンラインテーブルから特徴量を検索します。詳細は[Automatic feature lookup with MLflow models on Databricks](https://docs.databricks.com/en/machine-learning/feature-store/automatic-feature-lookup.html)をご覧ください。

# ユーザーのアクセス権

オンラインテーブルを作成するには以下の権限が必要です:

- ソーステーブルに対する`SELECT`権限。
- 目的のカタログに対する`USE_CATALOG`権限。
- 目的のスキーマに対する`USE_SCHEMA`と`CREATE_TABLE`権限。

オンラインテーブルに対するデータ同期パイプラインを管理するには、オンラインテーブルのオーナーであるか、オンラインテーブルに対する`REFLESH`権限が必要です。カタログに対する`USE_CATALOG`と`USE_SCHEMA`権限を持たないユーザーはカタログエクスプローラでオンラインテーブルを参照することはできません。

Unity Catalogメタストアは[Privilege Model Version 1\.0](https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/upgrade-privilege-model.html)である必要があります。

# エンドポイントの権限モデル

データをクエリーし、関数を実行するために必要な限定的な権限を持つ特徴量サービングやモデルサービングのエンドポイント向けには自動でユニークなサービスプリンシパルが作成されます。このサービスプリンシパルによって、リソースを作成したユーザーとは独立したデータと関数のリソースにエンドポイントがアクセスでき、作成者がワークスペースを去った後でもエンドポイントが動作し続けることを保証します。

このシステムサービスプリンシパルのライフタイムは、エンドポイントのライフタイムと同一です。監査ログには、Unity Catalogのカタログのオーナーがこのシステムサービスプリンシパルに必要な権限を付与したことを示すシステム生成レコードが表示されることがあります。

プロダクション環境の管理の一般的な情報については、[Recommendations for production serving endpoints](https://docs.databricks.com/en/security/auth-authz/access-control/serving-endpoint-acl.html#recommendations-for-production-serving-endpoints)をご覧ください。

# 制限

- ソーステーブルごとに1つのオンラインテーブルのみがサポートされます。
- ARRAY、MAP、STRUCTのデータタイプのカラムをオンラインテーブルの主キーとして使用することはできません。
- オンラインテーブルの主キーとしてあるカラムが使用されている場合、ソーステーブルのそのカラムでnull値を含むすべての行は無視されます。
- ソーステーブルとして、外部テーブル、システムテーブル、内部テーブルはサポートされません。
- Deltaのチェンジデータフィードが有効化されていないソーステーブルでは、**Snapshot**同期モードしかサポートされません。
- ソーステーブルとオンラインテーブルのカタログ、スキーマ、テーブル名には英数字とアンダースコアのみが許可されており、数字でスタートしてはいけません。
- Stringタイプのカラムは64KB長に制限されます。
- 行の最大サイズは2MBです。
- ゲーテッドパブリックプレビューにおけるオンラインテーブルの最大サイズは200GBの非圧縮ユーザーデータとなります。
- ゲーテッドパブリックプレビューにおけるUnity Catalogメタストアにおけるすべてのオンラインテーブルの合計サイズは1TBとなります。

# トラブルシューティング

## カタログエクスプローラで「Create online table」が表示されない

通常この原因は、同期しようとしているテーブルがサポートされていないタイプによるものです。(カタログエクスプローラの**Details**タブに表示される)テーブルのセキュリティ保護種別が以下のいずれかであることを確認してください:

- TABLE_EXTERNAL
- TABLE_DELTA
- TABLE_DELTA_EXTERNAL
- TABLE_DELTASHARING
- TABLE_DELTASHARING_MUTABLE
- TABLE_STREAMING_LIVE_TABLE
- TABLE_STANDARD
- TABLE_FEATURE_STORE
- TABLE_FEATURE_STORE_EXTERNAL
- TABLE_VIEW
- TABLE_VIEW_DELTASHARING
- TABLE_MATERIALIZED_VIEW

## オンラインテーブル作成時に「Triggered」や「Continuous」同期モードを選択できない

ソーステーブルでDeltaチェンジデータフィードが有効化されていない場合、あるいはビューやマテリアライズドビューの場合に発生します。**Incremental**同期モードを使うには、ソーステーブルでチェンジデータフィードを有効化するか、ビューではないテーブルを使います。

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)