共用方式為


部署和查詢特徵服務端點

本文說明如何在逐步程序中部署和查詢特徵服務端點。 本文使用 Databricks SDK。 某些步驟也可以使用 REST API 或 Databricks UI 來完成,並包含這些方法的文件參考。

在此範例中,您擁有一個城市列表table,列出城市的所在地點(緯度和經度),以及一個建議應用程式,它會考量使用者與這些城市的當前距離。 由於使用者的位置會不斷變更,因此必須在推斷時計算使用者與每個城市之間的距離。 本教學課程說明如何使用 Databricks Online Tables 和 Databricks 功能服務,以低延遲執行這些計算。 如需完整的範例程式碼 set,請參閱 範例筆記本

步驟 1: 建立來源 table

來源 table 包含預先計算的特徵 values,並且可以是 Unity Catalog 中任何具有主鍵的 Delta table。 在此範例中,table 包含一個城市列表 list,其中記錄了這些城市的緯度和經度。 主索引鍵為 destination_id。 範例資料如下所示。

NAME destination_id (pk) 緯度 經度
美國田納西州納許維爾 0 36.162663 -86.7816
夏威夷火奴魯魯 1 21.309885 -157.85814
內華達州拉斯維加斯 2 36.171562 -115.1391
紐約州紐約 3 40.712776 -74.005974

步驟 2。 建立線上 table

在線 table 是 Delta Table 的只讀複本,經過優化以便於在線存取。 如需詳細資訊,請參閱 使用線上 tables 即時功能服務

若要建立在線 table,您可以使用 UI 使用 UIREST API或 Databricks SDK 建立在線 table,如下列範例所示:

from pprint import pprint
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.catalog import *
import mlflow

workspace = WorkspaceClient()

# Create an online table
feature_table_name = f"main.on_demand_demo.location_features"
online_table_name=f"main.on_demand_demo.location_features_online"

spec = OnlineTableSpec(
 primary_key_columns=["destination_id"],
 source_table_full_name = feature_table_name,
 run_triggered=OnlineTableSpecTriggeredSchedulingPolicy.from_dict({'triggered': 'true'}),
 perform_full_copy=True)

# ignore "already exists" error
try:
 online_table_pipeline = workspace.online_tables.create(name=online_table_name, spec=spec)
except Exception as e:
 if "already exists" in str(e):
   pass
 else:
   raise e

pprint(workspace.online_tables.get(online_table_name))

步驟 3: 在 Unity Catalog 中建立函式

在此範例中,函數會計算目的地 (其位置不會變更) 與使用者 (其位置經常變更,且直到推斷時間才知道) 之間的距離。

# Define the function. This function calculates the distance between two locations.
function_name = f"main.on_demand_demo.distance"

spark.sql(f"""
CREATE OR REPLACE FUNCTION {function_name}(latitude DOUBLE, longitude DOUBLE, user_latitude DOUBLE, user_longitude DOUBLE)
RETURNS DOUBLE
LANGUAGE PYTHON AS
$$
import math
lat1 = math.radians(latitude)
lon1 = math.radians(longitude)
lat2 = math.radians(user_latitude)
lon2 = math.radians(user_longitude)

# Earth's radius in kilometers
radius = 6371

# Haversine formula
dlat = lat2 - lat1
dlon = lon2 - lon1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
distance = radius * c

return distance
$$""")

步驟 4. 在 Unity Catalog 中建立功能規格

特徵規格會指定端點提供的特徵及其查閱索引鍵。 它也會指定要套用至具有繫結之擷取特徵的任何必要函數。 如需詳細資訊,請參閱建立 FeatureSpec

from databricks.feature_engineering import FeatureLookup, FeatureFunction, FeatureEngineeringClient

fe = FeatureEngineeringClient()

features=[
 FeatureLookup(
   table_name=feature_table_name,
   lookup_key="destination_id"
 ),
 FeatureFunction(
   udf_name=function_name,
   output_name="distance",
   input_bindings={
     "latitude": "latitude",
     "longitude": "longitude",
     "user_latitude": "user_latitude",
     "user_longitude": "user_longitude"
   },
 ),
]

feature_spec_name = f"main.on_demand_demo.travel_spec"

# The following code ignores errors raised if a feature_spec with the specified name already exists.
try:
 fe.create_feature_spec(name=feature_spec_name, features=features, exclude_columns=None)
except Exception as e:
 if "already exists" in str(e):
   pass
 else:
   raise e

步驟 5: 建立特徵服務端點

若要建立特徵服務端點,您可以使用建立端點 UI、REST API 或 Databricks SDK,如下所示。

特徵服務端點會採用您在步驟 4 中建立的 feature_spec 作為參數。

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

# Create endpoint
endpoint_name = "fse-location"

try:
 status = workspace.serving_endpoints.create_and_wait(
   name=endpoint_name,
   config = EndpointCoreConfigInput(
     served_entities=[
       ServedEntityInput(
         entity_name=feature_spec_name,
         scale_to_zero_enabled=True,
         workload_size="Small"
       )
     ]
   )
 )
 print(status)

# Get the status of the endpoint
status = workspace.serving_endpoints.get(name=endpoint_name)
print(status)

步驟 6。 查詢特徵服務端點

查詢該端點時,可提供主索引鍵,並選擇性地提供函數使用的任何內容資料。 在此範例中,函數將使用者的目前位置 (緯度和經度) 作為輸入。 由於使用者的位置不斷變更,因此必須在推斷時間將它作為內容特徵提供給函數。

也可以使用透過 UI 查詢端點 UI 或 REST API 來查詢端點。

為了簡單起見,此範例只會計算兩個城市的距離。 更實際的情況可能會計算使用者與功能 table 中每個位置的距離,以判斷要推薦的城市。

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")
response = client.predict(
   endpoint=endpoint_name,
   inputs={
       "dataframe_records": [
           {"destination_id": 1, "user_latitude": 37, "user_longitude": -122},
           {"destination_id": 2, "user_latitude": 37, "user_longitude": -122},
       ]
   },
)

pprint(response)

範例筆記本

如需步驟的完整說明,請參閱此筆記本:

使用線上 tables 提供範例筆記本功能

Get 筆記本

其他資訊

如需有關使用特徵工程 Python API 的詳細資訊,請參閱參考文件