Megosztás a következőn keresztül:


Végpontot kiszolgáló szolgáltatás üzembe helyezése és lekérdezése

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-táblák és a Databricks szolgáltatáskiszolgáló használatával. A példakód teljes készletét a példajegyzetfüzetben tekinti meg.

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 destination_id (pk) latitude 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 Online tábla létrehozása

Az online táblák az online hozzáférésre optimalizált Delta-tábla írásvédett példányai. További információ: Online táblák használata valós idejű szolgáltatásmegjelenítéshez.

Online tábla létrehozásához használhatja az online tábla létrehozása felhasználói felületet, a REST API-t vagy a Databricks SDK-t, ahogyan az alábbi példában is látható:

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. 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 : FeatureSpec létrehozása.

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énynek következtetési időben, környezeti funkcióként kell megadnia.

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 táblákkal

Jegyzetfüzet beszerzése

További információk

A Python API szolgáltatásfejlesztésével kapcsolatos részletekért tekintse meg a referenciadokumentációt.