Aracılığıyla paylaş


Öğretici: Uç noktaya hizmet veren bir özelliği dağıtma ve sorgulama

Bu makalede, adım adım bir işlemde uç noktaya hizmet veren bir özelliğin nasıl dağıtılacağı ve sorgu yapılacağı gösterilmektedir. Bu makalede Databricks SDK'sı kullanılmaktadır. Bazı adımlar REST API veya Databricks kullanıcı arabirimi kullanılarak da tamamlanabilir ve bu yöntemlerin belgelerine başvurular içerebilir.

Bu örnekte, konumları (enlem ve boylam) olan bir şehir tablonuz ve kullanıcının bu şehirlerle olan geçerli mesafesini dikkate alan bir önerilen uygulamanız vardır. Kullanıcının konumu sürekli değiştiğinden, kullanıcı ile her şehir arasındaki mesafe çıkarılma sırasında hesaplanmalıdır. Bu öğreticide Databricks Online Tables ve Databricks Özellik Sunma kullanılarak düşük gecikme süresiyle bu hesaplamaların nasıl gerçekleştirebileceğiniz gösterilmektedir. Örnek kodun tamamı için örnek not defterine bakın.

1. Adım. Kaynak tabloyu oluşturma

Kaynak tablo önceden derlenmiş özellik değerleri içerir ve Unity Kataloğu'nda birincil anahtara sahip herhangi bir Delta tablosu olabilir. Bu örnekte tablo, enlem ve boylamlarıyla şehirlerin listesini içerir. Birincil anahtardır destination_id. Örnek veriler aşağıda gösterilmiştir.

Adı destination_id (pk) latitude boylam
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

2. Adım. Çevrimiçi tablo oluşturma

Çevrimiçi tablo, çevrimiçi erişim için iyileştirilmiş delta tablosunun salt okunur bir kopyasıdır. Daha fazla bilgi için bkz . Gerçek zamanlı özellik sunma için çevrimiçi tabloları kullanma.

Çevrimiçi tablo oluşturmak için, aşağıdaki örnekte olduğu gibi Kullanıcı arabirimini, REST API'yi veya Databricks SDK'sını kullanarak çevrimiçi tablo oluşturma kullanıcı arabirimini kullanabilirsiniz:

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. Adım. Unity Kataloğu'nda işlev oluşturma

Bu örnekte işlev, hedef (konumu değişmeyen) ile kullanıcı (konumu sık değişen ve çıkarım zamanına kadar bilinmeyen) arasındaki mesafeyi hesaplar.

# 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. Adım. Unity Kataloğu'nda özellik belirtimi oluşturma

Özellik belirtimi, uç noktanın hizmet verdikleri özellikleri ve arama anahtarlarını belirtir. Ayrıca, alınan özelliklere kendi bağlamalarıyla uygulamak için gerekli işlevleri de belirtir. Ayrıntılar için bkz . FeatureSpec oluşturma.

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

Adım 5. Uç noktaya hizmet veren özellik oluşturma

Uç noktaya hizmet veren bir özellik oluşturmak için burada gösterilen Uç nokta oluşturma kullanıcı arabirimini, REST API'yi veya Databricks SDK'sını kullanabilirsiniz.

Özellik sunma uç noktası, 4. Adımda oluşturduğunuz öğesini parametre olarak alır 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. Adım. Özellik sunma uç noktasını sorgulama

Uç noktayı sorguladığınızda birincil anahtarı ve isteğe bağlı olarak işlevin kullandığı bağlam verilerini sağlarsınız. Bu örnekte işlev kullanıcının geçerli konumunu (enlem ve boylam) girdi olarak alır. Kullanıcının konumu sürekli değiştiğinden, işleve bağlam özelliği olarak çıkarım zamanında sağlanmalıdır.

Ayrıca kullanıcı arabirimini kullanarak uç noktayı sorgulayabilirsiniz Kullanıcı arabirimini veya REST API'yi kullanarak bir uç noktayı sorgulama.

Kolaylık olması için, bu örnek yalnızca iki şehre olan uzaklığı hesaplar. Daha gerçekçi bir senaryo, hangi şehirlerin önerileceğini belirlemek için kullanıcının özellik tablosundaki her konumdan uzaklığı hesaplayabilir.

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)

Örnek not defteri

Adımların tam bir çizimi için bu not defterine bakın:

Özellik Çevrimiçi tablolarla örnek not defteri sunma

Not defterini alma

Ek bilgi

Özellik mühendisliği Python API'sini kullanma hakkında ayrıntılı bilgi için başvuru belgelerine bakın.