Databricks Feature & Function Servingとは？

[What is Databricks Feature & Function Serving? \| Databricks on AWS](https://docs.databricks.com/en/machine-learning/feature-store/feature-function-serving.html) [2023/12/8時点]の翻訳です。

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

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

Databricks Feature & Function Servingによって、Databricks外にデプロイされたモデルやアプリケーションでDatabricksプラットフォームのデータを利用できるようになります。Feature & Function Servingエンドポイントは、リアルタイムのトラフィックに合わせて自動でスケールし、高可用性かつ低レーテンシーの特徴量サービングを提供します。このページでは、Feature & Function Servingのセットアップ方法を説明します。

Databricksの特徴量を用いて構築されたモデルをサービングするためにDatabricksモデルサービングを使う際、モデルは推論リクエストに対して自動で特徴量を検索、変換します。Databricks Feature & Function Servingを用いることで、retrieval augmented generation (RAG)アプリケーションのための構造化データや、Unity Catalogにあるデータをベースとした特徴量を必要とするDatabricks外のモデルや、その他のアプリケーションでサービングされるモデルが必要とする特徴量をサービングすることができます。
![](https://docs.databricks.com/en/_images/when-to-use-feature-serving.png)

# なぜ、Feature & Function Servingを使うのか？

Databricks Feature & Function Servingは、事前にマテリアライズされた特徴量やオンデマンドの特徴量をサービングする単一のインタフェースを提供します。また、以下のようなメリットを提供します:

- シンプルさ。Databricksがインフラストラクチャの面倒を見ます。単一のAPIコールによって、プロダクションレベルのサービングエンドポイントが作成されます。
- 高可用性と高いスケーラビリティ。Feature & Function Servingエンドポイントは、サービングのリクエストのボリュームに応じて自動でスケールアップ、スケールダウンします。
- セキュリティ。エンドポイントはセキュアなネットワーク領域にデプロイされ、エンドポイントが削除されるか、ゼロにスケールする際には停止される専用計算資源を使用します。

# 要件

- Databricks Runtime 14.2 ML以降
- Feature & Function Servingでは、`databricks-feature-store`バージョン0.16.2以降が必要です。Databricks Runtime 14.2 MLにはバージョン0.16.1が含まれています。必要なバージョンを手動でインストールするには、`%pip install databricks-feature-store>=0.16.2`を実行します。Databricksノートブックを使っている場合には、新規セルで`dbutils.library.restartPython()`を実行してPythonカーネルを再起動する必要があります。

# サンプルノートブック

以下のノートブックでは、Feature & Function Servingエンドポイントの作成方法を説明しています。

## Feature & Function Servingサンプルノートブック

https://docs.databricks.com/_extras/notebooks/source/machine-learning/feature-function-serving-aws.html

# `FeatureSpec`の作成

`FeatureSpec`は特徴量と関数に対するユーザー定義セットとなります。`FeatureSpec`で特徴量と関数を結合することができます。`FeatureSpec`はUnity Catalogで管理され、カタログエクスプローラに表示されます。

`FeatureSpec`で指定されるテーブルは、オンラインストアに公開される必要があります。特徴量のオンラインストアへの公開方法に関しては、[Publish features to an online store](https://docs.databricks.com/en/machine-learning/feature-store/publish-features.html)をご覧ください。

```py:Python
from databricks.feature_engineering import (
  FeatureFunction,
  FeatureLookup,
  FeatureEngineeringClient,
)

fe = FeatureEngineeringClient()

features = [
  # Lookup column `average_yearly_spend` and `country` from a table in UC by the input `user_id`.
  FeatureLookup(
    table_name="main.default.customer_profile",
    lookup_key="user_id",
    features=["average_yearly_spend", "country"]
  ),
  # Calculate a new feature called `spending_gap` - the difference between `ytd_spend` and `average_yearly_spend`.
  FeatureFunction(
    udf_name="main.default.difference",
    output_name="spending_gap",
    # Bind the function parameter with input from other features or from request.
    # The function calculates a - b.
    input_bindings={"a": "ytd_spend", "b": "average_yearly_spend"},
  ),
]

# Create a `FeatureSpec` with the features defined above.
# The `FeatureSpec` can be accessed in Unity Catalog as a function.
fe.create_feature_spec(
  name="main.default.customer_features",
  features=features,
)
```

# エンドポイントの作成

`FeatureSpec`でエンドポイントを定義します。詳細については、[Create and manage model serving endpoints](https://docs.databricks.com/en/machine-learning/model-serving/create-manage-serving-endpoints.html)と[the API documentation](https://api-docs.databricks.com/python/feature-store/latest/feature_store.endpoint_core_config.html)をご覧ください。

```py:Python
from databricks.feature_engineering.entities.feature_serving_endpoint import (
  ServedEntity,
  EndpointCoreConfig,
)

fe.create_feature_serving_endpoint(
  name="customer-features",
    config=EndpointCoreConfig(
    served_entities=ServedEntity(
      feature_spec_name="main.default.customer_features",
             workload_size="Small",
             scale_to_zero_enabled=True,
             instance_profile_arn=None,
    )
  )
)
```

エンドポイントを確認するには、Databricks UIの左のサイドバーで**Serving**をクリックします。状態が**Ready**になったら、エンドポイントにクエリーを行うことができます。Databricksモデルサービングの詳細については、[Databricks Model Serving](https://docs.databricks.com/en/machine-learning/model-serving/index.html)をご覧ください。

# エンドポイントの取得

エンドポイントのメタデータと状態を取得するには、API `get_feature_serving_endpoint`を使います。

```py:Python
endpoint = fe.get_feature_serving_endpoint(name="customer-features")
# print(endpoint)
```

# エンドポイントへのクエリー

サービングエンドポイントを試す最も簡単な方法はサービングUIを使うというものです:

1. Databricksワークスペースの左のナビゲーションバーで**Serving**をクリックします。
1. クエリーを行いたいエンドポイントをクリックします。
1. 画面右上の**Query endpoint**をクリックします。
![](https://docs.databricks.com/en/_images/query-endpoint-button.png)
1. **Request**ボックスにJSONフォーマットでリクエストボディを入力します。
1. **Send request**をクリックします。

    ```json:JSON
    // Example of a request body.
    {
      "dataframe_records": [
        {"user_id": 1, "ytd_spend": 598},
        {"user_id": 2, "ytd_spend": 280}
      ]
    }
    ```
    **Query endpoint**ダイアログには、curl、Python、SQLでのサンプルコードが含まれています。サンプルコードを参照、コピーするにはタブをクリックします。
![](https://docs.databricks.com/en/_images/query-endpoint-dialog.png)
    コードをコピーするには、テキストボックスの右上のコピーアイコンをクリックします。
![](https://docs.databricks.com/en/_images/query-endpoint-dialog-with-code.png)

# エンドポイントの削除

:::note alert
**警告！**
この操作は取り消せません。
:::

```py:Python
fe.delete_feature_serving_endpoint(name="customer-features")
```

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

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


### Databricks無料トライアル

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