フィーチャー テーブルの配信

特徴テーブルは2つの方法で提供できます。

  • モデルサービング: 特徴テーブルで訓練されたモデルをデプロイします。 同じエンドポイントは特徴検索とモデル推論の両方に使用されます。 エンドポイントはモデルが記録された系譜を用いて 、特徴値を自動的に検索または計算します。 これを使用して、モデル予測を提供します。
  • 特徴量サービング: モデルを使わずに特徴テーブルを直接参照する FeatureSpec をデプロイします。 エンドポイントは要求された特徴出力を返します。 これは、アプリケーションでモデル予測ではなく特徴値が必要な場合に使用します。 最終的にモデル推論に特徴量を使う場合、Databricksはモデルサービングを直接使うことを推奨しています。

どちらのアプローチも、事前計算された機能とオンデマンド機能の両方をサポートしています。

要件

  • Databricks Runtime 14.2 ML 以降
  • Python API を使用するには、Feature Serving databricks-feature-engineering バージョン 0.1.2 以降が必要です。これは Databricks Runtime 14.2 ML に組み込まれています。 それ以前のバージョンの Databricks Runtime ML の場合は、%pip install databricks-feature-engineering>=0.1.2 を使用して必要なバージョンを手動でインストールしてください。 Databricks ノートブックを使用している場合は、新しいセル (dbutils.library.restartPython()) でこのコマンドを実行して、Python カーネルを再起動する必要があります。
  • Databricks SDK を使用するために、Feature Serving には、databricks-sdk バージョン 0.18.0 以降が必要です。 必要なバージョンを手動でインストールするには、%pip install databricks-sdk>=0.18.0 を使用します。 Databricks ノートブックを使用している場合は、新しいセル (dbutils.library.restartPython()) でこのコマンドを実行して、Python カーネルを再起動する必要があります。

Databricks Feature Serving では、エンドポイントの作成、更新、クエリ、および削除のための UI と複数のプログラム オプションが提供されます。 この記事には、次の各オプションの手順が含まれています。

  • Databricks ユーザーインターフェース
  • REST API
  • Python API
  • Databricks SDK

REST API または MLflow Deployments SDK を使用するには、Databricks API トークンが必要です。

重要

運用シナリオのセキュリティのベスト プラクティスとして、Databricks では、運用環境での認証 にマシン間 OAuth トークン を使用することをお勧めします。

テストと開発のために、Databricks では、ワークスペース ユーザーではなく 、サービス プリンシパル に属する個人用アクセス トークンを使用することをお勧めします。 サービス プリンシパルのトークンを作成するには、サービス プリンシパル のトークンの管理に関するページを参照してください。

Feature Serving の認証

認証の詳細については、「Azure Databricks リソースへのアクセスを認証するを参照してください。

認証要求の処理に使用する FeatureSpec

FeatureSpec は、機能と関数のユーザー定義セットです。 FeatureSpec 内で、機能と関数を組み合わせることができます。 FeatureSpecs は Unity カタログで保存および管理され、Catalog Explorer に表示されます。

FeatureSpecで指定されたテーブルは、オンライン 機能ストアまたはサード パーティのオンライン ストアに発行する必要があります。 Databricks Online Feature Store を参照してください。

databricks-feature-engineering を作成するには、FeatureSpec パッケージを使用する必要があります。

まず、関数を定義します。

from unitycatalog.ai.core.databricks import DatabricksFunctionClient

client = DatabricksFunctionClient()

CATALOG = "main"
SCHEMA = "default"

def difference(num_1: float, num_2: float) -> float:
  """
  A function that accepts two floating point numbers, subtracts the second one
  from the first, and returns the result as a float.

  Args:
      num_1 (float): The first number.
      num_2 (float): The second number.

  Returns:
      float: The resulting difference of the two input numbers.
  """
  return num_1 - num_2

client.create_python_function(
  func=difference,
  catalog=CATALOG,
  schema=SCHEMA,
  replace=True
)

その後、 FeatureSpecで関数を使用できます。

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",
    feature_names=["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 num_1 - num_2.
    input_bindings={"num_1": "ytd_spend", "num_2": "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,
)

既定値を指定する

フィーチャの既定値を指定するには、default_valuesで FeatureLookup パラメーターを使用します。 次の例を参照してください。

feature_lookups = [
    FeatureLookup(
        table_name="ml.recommender_system.customer_features",
        feature_names=[
            "membership_tier",
            "age",
            "page_views_count_30days",
        ],
        lookup_key="customer_id",
        default_values={
          "age": 18,
          "membership_tier": "bronze"
        },
    ),
]

rename_outputs パラメーターを使用してフィーチャ列の名前を変更する場合は、default_values名前を変更した機能名を使用する必要があります。

FeatureLookup(
  table_name = 'main.default.table',
  feature_names = ['materialized_feature_value'],
  lookup_key = 'id',
  rename_outputs={"materialized_feature_value": "feature_value"},
  default_values={
    "feature_value": 0
  }
)

Python依存関係の追加

ユーザー定義関数(UDF)がPythonパッケージをインポートする場合は、FeatureSpecを作成する際にそれらを宣言してください。 extra_pip_requirementsパラメータはバージョン0.17.0databricks-feature-engineeringそれ以上が必要です。 Feature ServingはMLflowおよび databricks-feature-lookup パッケージを自動的にインストールします。

例えば、機能仕様のUDFがNumPyをインポートした場合、仕様に次の要件を追加します。

fe.create_feature_spec(
    name="main.default.customer_features_with_dependencies",
    features=features,
    extra_pip_requirements=["numpy==1.26.4"],
)

エンドポイントを作成する際は仕様名としてmain.default.customer_features_with_dependenciesを使いましょう。

extra_pip_requirementsの各エントリは、numpy==1.26.4のようなPyPI要件文字列、またはUnity Catalogボリューム内の.whlファイルへのパスでなければなりません。 例えば、アップロードしたホイールに /Volumes/main/libraries/wheels/custom_features-1.0.0-py3-none-any.whl を使うと良いでしょう。 エンドポイントの作成者は、ボリュームに対するUSE CATALOGと、その親カタログおよびスキーマに対するUSE SCHEMAとREAD VOLUMEの権限を持っている必要があります。

プライベートリポジトリからのパッケージについては、 ワークスペースのデフォルトパッケージリポジトリを設定してください。 --index-urlなどのpipコマンドオプションをextra_pip_requirementsに入れないでください。

Unity Catalog UDF の ENVIRONMENT 句内の依存関係は、オフラインでの SQL 実行に適用されます。 フィーチャーサービングは自動的にコピーしません。 アップストリーム機能内のUDFを含め、UDFで必要となるすべてのパッケージを、feature spec の requirements に宣言してください。

エンドポイント展開が失敗した場合は、ビルドログでパッケージインストールエラー、バージョンの競合、ホイールアクセスの失敗がないか確認してください。 モデルの品質とエンドポイントの正常性の監視を参照してください。

CustomUDFと FeatureViewSource の例として、Serve CustomUDF の特徴とその依存関係を参照してください。 モデルサービス依存関係については 、カスタムUDF依存関係を参照してください。

エンドポイントの作成

FeatureSpec はエンドポイントを定義します。 詳細については、エンドポイントを提供するカスタム モデルの作成、Python API ドキュメント、またはDatabricks SDK のドキュメントを参照してください。

注

待機時間の影響を受けやすいワークロードや、1 秒あたりのクエリ数が多いワークロードについては、「モデル サービス」では、カスタム モデル サービス エンドポイントでのルートの最適化が提供されます。「サービス エンドポイントでのルートの最適化」を参照してください。

Databricks SDK - Python

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import EndpointCoreConfigInput, ServedEntityInput

workspace = WorkspaceClient()

# Create endpoint
workspace.serving_endpoints.create(
  name="my-serving-endpoint",
  config = EndpointCoreConfigInput(
    served_entities=[
    ServedEntityInput(
        entity_name="main.default.customer_features",
        scale_to_zero_enabled=True,
        workload_size="Small"
      )
    ]
  )
)

Python API

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,
    )
  )
)

REST API

curl -X POST -u token:$DATABRICKS_API_TOKEN ${WORKSPACE_URL}/api/2.0/serving-endpoints \
    -H 'Content-Type: application/json' \
    -d '"name": "customer-features",
   "config": {
       "served_entities": [
           {
               "entity_name": "main.default.customer_features",
               "workload_size": "Small",
               "scale_to_zero_enabled": true
           }
       ]
   }'

エンドポイントを表示するには、Databricks UI の左側のサイドバーにある [ サービス ] をクリックします。 状態が Ready になると、エンドポイントはクエリに応答する準備が整います。 モデル サービスの詳細については、「 モデル サービス」を参照してください。

拡張データフレームを推論テーブルに保存する

2025 年 2 月以降に作成されたエンドポイントの場合は、検索された機能値と関数の戻り値を含む拡張 DataFrame をログに記録するようにモデル サービス エンドポイントを構成できます。 DataFrame は、提供されたモデルの推論テーブルに保存されます。

この構成を設定する手順については、「特徴量検索 DataFrame を推論テーブルにログする」をご覧ください。

推論テーブルに関する情報については、「 Serving Endpoints (legacy)のログリクエストおよびレスポンス」を参照してください。

エンドポイントを取得する

Databricks SDK または Python API を使用して、エンドポイントのメタデータと状態を取得できます。

Databricks SDK - Python

from databricks.sdk import WorkspaceClient
workspace = WorkspaceClient()

endpoint = workspace.serving_endpoints.get(name="customer-features")
# print(endpoint)

Python API

endpoint = fe.get_feature_serving_endpoint(name="customer-features")
# print(endpoint)

エンドポイントのスキーマを取得する

Databricks SDK または REST API を使用して、エンドポイントのスキーマを取得できます。 エンドポイント スキーマの詳細については、「エンドポイント スキーマ を提供するモデルを取得する」を参照してください。

Databricks SDK - Python

from databricks.sdk import WorkspaceClient
workspace = WorkspaceClient()

# Create endpoint
endpoint = workspace.serving_endpoints.get_open_api(name="customer-features")

REST API

ACCESS_TOKEN=<token>
ENDPOINT_NAME=<endpoint name>

curl "https://example.databricks.com/api/2.0/serving-endpoints/$ENDPOINT_NAME/openapi" -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json"

エンドポイントのクエリを実行する

エンドポイントのクエリを実行するには、REST API、MLflow デプロイ SDK、または提供 UI を使用できます。

次のコードは、MLflow Deployments SDK を使うときに資格情報を設定し、クライアントを作成する方法を示しています。

  # Set up credentials
  export DATABRICKS_HOST=...
  export DATABRICKS_TOKEN=...
  # Set up the client
  import mlflow.deployments

  client = mlflow.deployments.get_deploy_client("databricks")

注

セキュリティのベスト プラクティスとして、自動化されたツール、システム、スクリプト、アプリを使用して認証する場合、Databricks では、ワークスペース ユーザーではなく サービス プリンシパル に属する個人用アクセス トークンを使用することをお勧めします。 サービス プリンシパルのトークンを作成するには、サービス プリンシパル のトークンの管理に関するページを参照してください。

API を使用してエンドポイントのクエリを実行する

このセクションには、REST API または MLflow デプロイ SDK を使用したエンドポイントへのクエリの実行の例が含まれます。

MLflow デプロイ SDK

重要

次の例では、predict()MLflow Deployments SDK からの API を使用します。 この API は 試験段階 であり、API 定義が変更される可能性があります。

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")
response = client.predict(
    endpoint="test-feature-endpoint",
    inputs={
        "dataframe_records": [
            {"user_id": 1, "ytd_spend": 598},
            {"user_id": 2, "ytd_spend": 280},
        ]
    },
)

REST API

curl -X POST -u token:$DATABRICKS_API_TOKEN $ENDPOINT_INVOCATION_URL \
  -H 'Content-Type: application/json' \
  -d '{"dataframe_records": [
          {"user_id": 1, "ytd_spend": 598},
          {"user_id": 2, "ytd_spend": 280}
      ]}'

UI を使用してエンドポイントのクエリを実行する

提供 UI から提供エンドポイントに直接クエリを実行できます。 UI には、エンドポイントのクエリの実行に使用できる、生成されたコード例が含まれます。

  1. Azure Databricksワークスペースの左側のサイドバーで、Serving をクリックします。

  2. クエリを実行するエンドポイントをクリックします。

  3. 画面の右上にある [ クエリ エンドポイント] をクリックします。

    [クエリ エンドポイント] ボタン

  4. [ 要求 ] ボックスに、JSON 形式で要求本文を入力します。

  5. [ 要求の送信] をクリックします。

// Example of a request body.
{
  "dataframe_records": [
    { "user_id": 1, "ytd_spend": 598 },
    { "user_id": 2, "ytd_spend": 280 }
  ]
}

Query エンドポイント ダイアログには、curl、Python、SQL で生成されたコード例が含まれています。 タブをクリックして、コード例を表示およびコピーします。

クエリ エンドポイント ダイアログ

コードをコピーするには、テキスト ボックスの右上にあるコピー アイコンをクリックします。

[クエリ エンドポイント] ダイアログの [コピー] ボタン

エンドポイントを更新する

重要

Feature Serving エンドポイントの構成 ( FeatureSpec やワークロード サイズの変更など) を変更するには、このセクションで説明する更新 API を常に使用します。 エンドポイントを削除して再作成して変更を適用しないでください。 ライブ エンドポイントを削除すると、直ちにダウンタイムが発生し、クエリを実行するすべてのアプリケーションが中断されます。

REST API、Databricks SDK、または 提供 UI を使用してエンドポイントを更新できます。

API を使用してエンドポイントを更新する

Databricks SDK - Python

from databricks.sdk import WorkspaceClient
workspace = WorkspaceClient()

workspace.serving_endpoints.update_config(
  name="my-serving-endpoint",
  served_entities=[
    ServedEntityInput(
      entity_name="main.default.customer_features",
      scale_to_zero_enabled=True,
      workload_size="Small"
    )
  ]
)

REST API

curl -X PUT -u token:$DATABRICKS_API_TOKEN ${WORKSPACE_URL}/api/2.0/serving-endpoints/<endpoint_name>/config \
  -H 'Content-Type: application/json' \
  -d '"served_entities": [
        {
            "name": "customer-features",
            "entity_name": "main.default.customer_features_new",
            "workload_size": "Small",
            "scale_to_zero_enabled": True
        }
    ]'

UI を使用してエンドポイントを更新する

提供 UI を使用するには、次の手順に従ってください。

  1. Azure Databricksワークスペースの左側のサイドバーで、Serving をクリックします。
  2. テーブルで、更新するエンドポイントの名前をクリックします。 エンドポイント画面が表示されます。
  3. 画面の右上にある [ エンドポイントの編集] をクリックします。
  4. [ サービス エンドポイントの編集] ダイアログで、必要に応じてエンドポイント設定を編集します。
  5. [ 更新 ] をクリックして変更を保存します。

エンドポイントを更新する

エンドポイントの削除

警告

このアクションは回復できません。 Feature Serving エンドポイントを削除すると、クエリを実行するすべてのアプリケーションで直ちにダウンタイムが発生します。 エンドポイントの構成を変更する場合は、エンドポイントを削除して再作成するのではなく、 エンドポイントを更新 するを使用します。

エンドポイントは、REST API、Databricks SDK、Python API、またはサービス UI を使用して削除できます。

API を使用してエンドポイントを削除する

Databricks SDK - Python

from databricks.sdk import WorkspaceClient
workspace = WorkspaceClient()

workspace.serving_endpoints.delete(name="customer-features")

Python API

fe.delete_feature_serving_endpoint(name="customer-features")

REST API

curl -X DELETE -u token:$DATABRICKS_API_TOKEN ${WORKSPACE_URL}/api/2.0/serving-endpoints/<endpoint_name>

UI を使用してエンドポイントを削除する

提供 UI を使用してエンドポイントを削除するには、次の手順に従ってください。

  1. Azure Databricksワークスペースの左側のサイドバーで、Serving をクリックします。
  2. テーブルで、削除するエンドポイントの名前をクリックします。 エンドポイント画面が表示されます。
  3. 画面の右上にある Kebab メニューの [Kebab] メニュー アイコン をクリックし、[削除] を選択 します。

エンドポイントを削除する

エンドポイントの正常性の監視

Feature Serving エンドポイントで使用できるログとメトリックの詳細については、「モデルの 品質とエンドポイントの正常性の監視」を参照してください。

アクセス制御

Feature Serving エンドポイントに対するアクセス許可の詳細については、「モデル サービス エンドポイント のアクセス許可を管理する」を参照してください。

ノートブックの例

このノートブックでは、Databricks SDK を使用して、Databricks Online Feature Store を使用してフィーチャー サービス エンドポイントを作成する方法を示します。

オンライン ストアでサンプル ノートブックを提供する機能

ノートブックを取得する