共用方式為


什麼是 Databricks 特徵服務?

Databricks 特徵服務使 Databricks 平台中的資料可供部署在 Azure Databricks 外部的模型或應用程式使用。 特徵服務端點會自動縮放以適應即時流量,並為提供特徵提供高可用性、低延遲的服務。 此頁面描述如何設定和使用特徵服務。 如需逐步教學課程,請參閱部署和查詢特徵服務端點

當您使用 Mosaic AI 模型服務為使用 Databricks 中的特徵建置的模型提供服務時,此模型會自動查詢和轉換推斷要求的特徵。 透過 Databricks 特徵服務,您可以為擷取擴增生成 (RAG) 應用程式提供結構化資料,以及其他應用程式所需的特徵,例如在 Databricks 外部提供的模型或 Unity Catalog 中需要基於資料的特徵的任何其他應用程式。

何時使用特徵服務

為何使用特徵服務?

Databricks 特徵服務提供單一介面,可為預先具體化和隨選特徵提供服務。 還包括下列優點:

  • 簡單: Databricks 可處理基礎結構。 透過單一 API 呼叫,Databricks 可建立生產就緒的服務環境。
  • 高可用性與延展性。 特徵服務端點會自動擴大和縮小以適應服務要求量。
  • 安全性。 端點部署在安全網路界限中,並使用專用計算,在端點刪除或縮放至零時就會終止。

需求

  • Databricks Runtime 14.2 ML 或更新版本。
  • 若要使用 Python API,特徵服務需要 databricks-feature-engineering 0.1.2 版或更新版本,其內建於 Databricks Runtime 14.2 ML 中。 對於較舊 Databricks Runtime ML 版本,請使用 %pip install databricks-feature-engineering>=0.1.2 手動安裝所需的版本。 如果使用的是 Databricks 筆記本,您必須在新的儲存格中執行此命令來重新啟動 Python 核心:dbutils.library.restartPython()
  • 若要使用 Databricks SDK,特徵服務需要 databricks-sdk 0.18.0 版或更新版本。 若要手動安裝所需的版本,請使用 %pip install databricks-sdk>=0.18.0。 如果使用的是 Databricks 筆記本,您必須在新的儲存格中執行此命令來重新啟動 Python 核心:dbutils.library.restartPython()

Databricks 特徵服務提供了 UI 和數個程式設計選項,可用於建立、更新、查詢和刪除端點。 本文包含下列每個選項的指示:

  • Databricks UI
  • REST API
  • Python API
  • Databricks SDK

若要使用 REST API 或 MLflow 部署 SDK,您必須具有 Databricks API 權杖。

重要

作為生產案例的安全最佳做法,Databricks 建議您在生產期間使用機器對機器 OAuth 權杖進行驗證。

對於測試和開發,Databricks 建議使用屬於服務主體而不是工作區使用者的個人存取權杖。 若要建立服務主體的權杖,請參閱管理服務主體的權杖

特徵服務的驗證

如需有關驗證的資訊,請參閱驗證對 Azure Databricks 資源的存取

建立 FeatureSpec

FeatureSpec 是使用者定義的一組特徵和函數。 您可以在 FeatureSpec 中合併特徵和函數。 FeatureSpecs 儲存在 Unity Catalog 中並由其管理,並顯示在 [目錄總管] 中。

FeatureSpec 中指定的資料表必須發佈至線上資料表或協力廠商線上存放區。 請參閱使用線上資料表提供即時特徵協力廠商線上存放區

您必須使用 databricks-feature-engineering 套件來建立 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 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 可定義端點。 如需詳細資訊,請參閱建立自訂模型服務端點Python API 文件Databricks SDK 文件以取得詳細資料。

注意

對於延遲敏感的工作負載或需要每秒高查詢次數的工作負載,模型服務可在自訂模型服務端點上提供路由最佳化,請參閱在服務端點上設定路由最佳化

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

若要查看端點,請按一下 Databricks UI 左側邊欄中的 [服務]。 當狀態為 [就緒] 時,端點即已準備好回應查詢。 若要深入了解 Mosaic AI 模型服務,請參閱 Mosaic AI 模型服務

取得端點

您可以使用 Databricks SDK 或 Python API 來取得端點的中繼資料和狀態。

Databricks SDK - Python

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

Python API

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

取得端點的結構描述

您可以使用 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 部署 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 查詢端點的範例。

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}
      ]}'

MLflow 部署 SDK

重要

下列範例使用 MLflow 部署 SDK 中的 predict() 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},
        ]
    },
)

使用 UI 查詢端點

您可以直接從服務 UI 查詢服務端點。 UI 包含可用於查詢端點的產生的程式碼範例。

  1. 在 Azure Databricks 工作區的左側邊欄中,按一下 [服務]

  2. 按一下您要查詢的端點。

  3. 在畫面右上角,按一下 [查詢端點]

    查詢端點按鈕

  4. 在 [要求] 方塊中,以 JSON 格式鍵入要求本文。

  5. 按一下 [傳送要求]

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

[查詢端點] 對話方塊包含以 curl、Python 和 SQL 產生的範例程式碼。 按一下索引標籤以檢視並複製範例程式碼。

查詢端點對話方塊

若要複製程式碼,請按一下文字輸入框右上角的複製圖示。

查詢端點對話方塊中的 [複製] 按鈕

更新端點

您可以使用 REST API、Databricks SDK 或服務 UI 來更新端點。

使用 API 更新端點

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
        }
    ]'

Databricks SDK - Python

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"
    )
  ]
)

使用 UI 更新端點

請遵循下列步驟使用服務 UI:

  1. 在 Azure Databricks 工作區的左側邊欄中,按一下 [服務]
  2. 在資料表中,按一下要更新的端點名稱。 端點畫面隨即出現。
  3. 在畫面右上角,按一下 [編輯端點]
  4. 在 [編輯服務端點] 對話方塊中,視需要編輯端點設定。
  5. 按一下 [更新] 以儲存您的變更。

更新端點

刪除端點

警告

這項動作無法復原。

您可以使用 REST API、Databricks SDK、Python API 或服務 UI 來刪除端點。

使用 API 刪除端點

REST API

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

Databricks SDK - Python

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

Python API

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

使用 UI 刪除端點

請遵循下列步驟使用服務 UI 刪除端點:

  1. 在 Azure Databricks 工作區的左側邊欄中,按一下 [服務]
  2. 在資料表中,按一下要刪除的端點名稱。 端點畫面隨即出現。
  3. 在畫面右上角,按一下 kebab 功能表 Kebab 功能表,然後選取 [刪除]

刪除端點

監視端點的健康情況

如需有關特徵服務端點可用的記錄和計量的資訊,請參閱監視模型品質和端點健康情況

存取控制

如需有關特徵服務端點的權限的資訊,請參閱管理模型服務端點的權限

範例筆記本

此筆記本說明如何使用 Databricks SDK,透過 Databricks Online 資料表建立特徵服務端點。

使用線上資料表的特徵服務範例筆記本

取得筆記本