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 Tabel Online Databricks dan Penyajian Fitur Databricks. 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 | destination_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 tabel online
Tabel online adalah salinan baca-saja dari Tabel Delta yang dioptimalkan untuk akses online. Untuk informasi selengkapnya, lihat Menggunakan tabel online untuk penyajian fitur real time.
Untuk membuat tabel online, Anda dapat menggunakan UI Membuat tabel online menggunakan UI, REST API, atau Databricks SDK, seperti dalam contoh berikut:
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))
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 harus disediakan untuk fungsi pada waktu inferensi sebagai fitur konteks.
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 tabel online
Informasi Tambahan
Untuk detail tentang menggunakan rekayasa fitur Python API, lihat dokumentasi referensi.