Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk bemutatja, hogyan helyezhet üzembe és kérdezhet le egy végpontot kiszolgáló funkciót lépésről lépésre. Ez a cikk a Databricks SDK-t használja. Néhány lépés a REST API-val vagy a Databricks felhasználói felületével is elvégezhető, és hivatkozásokat tartalmaz az adott módszerek dokumentációjához.
Ebben a példában egy táblázattal rendelkezik a városok helyeivel (szélesség és hosszúság) és egy ajánló alkalmazással, amely figyelembe veszi a felhasználó aktuális távolságát ezektől a városoktól. Mivel a felhasználó tartózkodási helye folyamatosan változik, a felhasználó és az egyes városok közötti távolságot a következtetés időpontjában kell kiszámítani. Ez az oktatóanyag bemutatja, hogyan hajthatja végre ezeket a számításokat alacsony késéssel a Databricks Online Feature Store és a Databricks szolgáltatáskiszolgáló használatával. A példakód teljes halmazát tekintse meg a példajegyzetfüzetben.
1. lépés A forrástábla létrehozása
A forrástábla előre lefordított funkcióértékeket tartalmaz, és a Unity Katalógus bármely Delta-táblája lehet elsődleges kulccsal. Ebben a példában a táblázat a földrajzi szélességükkel és hosszúságukkal rendelkező városok listáját tartalmazza. Az elsődleges kulcs a .destination_id A mintaadatok alább láthatók.
| név | cél_id (pk) | szélesség | hosszúság |
|---|---|---|---|
| Nashville, Tennessee | 0 | 36.162663 | -86.7816 |
| Honolulu, Hawaii | 0 | 21.309885 | -157.85814 |
| Las Vegas, Nevada | 2 | 36.171562 | -115.1391 |
| New York, New York | 3 | 40.712776 | -74.005974 |
2. lépés Az online szolgáltatástár létrehozása
A Databricks Online szolgáltatástárolókról további információt a Databricks Online szolgáltatástárolókban talál.
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
)
3. lépés Függvény létrehozása a Unity Katalógusban
Ebben a példában a függvény kiszámítja a cél (amelynek helye nem változik) és a felhasználó (akinek a helye gyakran változik, és a következtetés időpontjáig nem ismert).
# 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. lépés: Funkcióspecifikáció létrehozása a Unity Katalógusban
A szolgáltatás specifikációja meghatározza a végpont által kiszolgált szolgáltatásokat és azok keresési kulcsait. Emellett meghatározza azokat a szükséges függvényeket is, amelyek a lekért funkciókra alkalmazhatók a kötésükkel. További részletekért lásd: Create a 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. lépés Végpontot kiszolgáló szolgáltatás létrehozása
A végpontot kiszolgáló szolgáltatás létrehozásához használhatja a végpont, a REST API vagy a Databricks SDK felhasználói felületét, amely itt látható.
A végpontot kiszolgáló szolgáltatás a feature_spec 4. lépésben létrehozott paramétert használja paraméterként.
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. lépés A végpontot kiszolgáló szolgáltatás lekérdezése
A végpont lekérdezésekor meg kell adnia az elsődleges kulcsot és opcionálisan a függvény által használt környezeti adatokat. Ebben a példában a függvény bemenetként veszi fel a felhasználó aktuális helyét (szélesség és hosszúság). Mivel a felhasználó helye folyamatosan változik, a függvény számára következtetési időben, környezeti jellemzőként meg kell adni.
A végpontot a felhasználói felületen is lekérdezheti a végpont lekérdezéséhez a felhasználói felületen vagy a REST API-val.
Az egyszerűség kedvéért ez a példa csak két város távolságát számítja ki. Egy reálisabb forgatókönyv kiszámíthatja a felhasználó távolságát a funkciótáblában található egyes helyektől annak meghatározásához, hogy mely városok ajánlottak.
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)
Példajegyzetfüzet
A lépések teljes ábráját ebben a jegyzetfüzetben találja:
Szolgáltatásmegjelenítési példajegyzetfüzet online áruházzal
További információk
A Python API szolgáltatásfejlesztésével kapcsolatos részletekért tekintse meg a referenciadokumentációt.