Bagikan melalui


Contoh: Menyebarkan dan mengkueri titik akhir penyajian fitur

Artikel ini memperlihatkan cara menyebarkan dan mengkueri fitur yang melayani titik akhir dalam proses langkah demi langkah. Artikel ini menggunakan Databricks SDK. Beberapa langkah juga dapat diselesaikan menggunakan REST API atau UI Databricks dan menyertakan referensi ke dokumentasi untuk metode tersebut.

Dalam contoh ini, Anda memiliki tabel kota dengan lokasi mereka (garis lintang dan bujur) dan aplikasi pemberi rekomendasi yang memperhitungkan jarak pengguna saat ini dari kota-kota tersebut. Karena lokasi pengguna berubah terus-menerus, jarak antara pengguna dan setiap kota harus dihitung pada saat inferensi. Tutorial ini menggambarkan cara melakukan perhitungan tersebut dengan latensi rendah menggunakan Databricks Online Feature Store dan Databricks Feature Serving. Untuk kumpulan lengkap kode contoh, lihat contoh buku catatan .

Langkah 1. Membuat tabel sumber

Tabel sumber berisi nilai fitur yang telah dikomputasi sebelumnya dan bisa menjadi tabel Delta apa pun di Katalog Unity dengan kunci utama. Dalam contoh ini, tabel berisi daftar kota dengan garis lintang dan bujurnya. Kunci utamanya adalah destination_id. Data sampel ditunjukkan di bawah ini.

nama tujuan_id (pk) garis lintang garis bujur
Nashville, Tennessee 0 36.162663 -86.7816
Honolulu, Hawaii 1 21.309885 -157.85814
Las Vegas, Nevada 2 36.171562 -115.1391
New York, New York 3 40.712776 -74.005974

Langkah 2. Membuat penyimpanan fitur online

Untuk detail tentang Penyimpanan Fitur Online Databricks, lihat Penyimpanan Fitur Online Databricks.

from databricks.feature_engineering import FeatureEngineeringClient

fe = FeatureEngineeringClient()

feature_table_name = f"{catalog_name}.{schema_name}.location_features"
function_name = f"{catalog_name}.{schema_name}.distance"


# Create the feature table
fe.create_table(
  name = feature_table_name,
  primary_keys="destination_id",
  df = destination_location_df,
  description = "Destination location features."
)


# Enable Change Data Feed to enable CONTINOUS and TRIGGERED publish modes

spark.sql(f"ALTER TABLE {feature_table_name} SET TBLPROPERTIES (delta.enableChangeDataFeed = 'true')")

# Create an online store with specified capacity
online_store_name = f"{username}-online-store"

fe.create_online_store(
    name=online_store_name,
    capacity="CU_2"  # Valid options: "CU_1", "CU_2", "CU_4", "CU_8"
)

# Wait until the state is AVAILABLE
online_store = fe.get_online_store(name=online_store_name)
online_store.state

# Publish the table

published_table = fe.publish_table(
    online_store=online_store,
    source_table_name=feature_table_name,
    online_table_name=online_table_name
)

Langkah 3. Membuat fungsi di Unity Catalog

Dalam contoh ini, fungsi menghitung jarak antara tujuan (yang lokasinya tidak berubah) dan pengguna (yang lokasinya sering berubah dan tidak diketahui sampai waktu inferensi).

# 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
$$""")

Langkah 4. Membuat spesifikasi fitur di Unity Catalog

Spesifikasi fitur menentukan fitur yang dilayani titik akhir dan kunci pencariannya. Ini juga menentukan fungsi yang diperlukan untuk diterapkan ke fitur yang diambil dengan pengikatannya. Untuk detailnya, lihat Membuat 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

Langkah 5. Membuat titik akhir penyajian fitur

Untuk membuat titik akhir penyajian fitur, Anda dapat menggunakan UI Membuat titik akhir, REST API, atau Databricks SDK, yang diperlihatkan di sini.

Fitur yang melayani titik akhir mengambil feature_spec yang Anda buat di Langkah 4 sebagai parameter.

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)

Langkah 6. Mengkueri fitur yang melayani titik akhir

Saat Anda mengkueri titik akhir, Anda menyediakan kunci utama dan secara opsional data konteks apa pun yang digunakan fungsi. Dalam contoh ini, fungsi mengambil sebagai input lokasi pengguna saat ini (garis lintang dan bujur). Karena lokasi pengguna terus berubah, lokasi tersebut harus diberikan kepada fungsi sebagai fitur konteks pada waktu inferensi.

Anda juga dapat mengkueri titik akhir menggunakan Kueri UI titik akhir menggunakan UI atau REST API.

Untuk kesederhanaan, contoh ini hanya menghitung jarak ke dua kota. Skenario yang lebih realistis mungkin menghitung jarak pengguna dari setiap lokasi dalam tabel fitur untuk menentukan kota mana yang akan direkomendasikan.

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)

Contoh notebook

Lihat buku catatan ini untuk ilustrasi lengkap langkah-langkahnya:

Fitur Menyajikan buku catatan contoh dengan toko online

Ambil buku catatan

Informasi Tambahan

Untuk detail tentang menggunakan rekayasa fitur Python API, lihat dokumentasi referensi.