이 문서에서는 단계별 프로세스에서 엔드포인트를 제공하는 기능을 배포하고 쿼리하는 방법을 보여줍니다. 이 문서에서는 Databricks SDK를 사용합니다. REST API 또는 Databricks UI를 사용하여 일부 단계를 완료하고 해당 메서드에 대한 설명서에 대한 참조를 포함할 수도 있습니다.
이 예제에서는 해당 위치(위도 및 경도)가 있는 도시 테이블과 해당 도시에서 사용자의 현재 거리를 고려하는 추천 앱이 있습니다. 사용자의 위치는 지속적으로 변경되므로 유추 시 사용자와 각 도시 사이의 거리를 계산해야 합니다. 이 자습서에서는 Databricks 온라인 테이블 및 Databricks 기능 제공을 사용하여 대기 시간이 짧은 계산을 수행하는 방법을 보여 줍니다. 예제 코드 전체는 예제 노트북을 참조하십시오.
1단계. 원본 테이블 만들기
원본 테이블에는 미리 계산된 기능 값이 포함되어 있으며 기본 키가 있는 Unity 카탈로그의 델타 테이블일 수 있습니다. 이 예제에서 테이블에는 위도 및 경도가 있는 도시 목록이 포함되어 있습니다. 기본 키는 destination_id입니다. 샘플 데이터는 다음과 같습니다.
| 이름 | destination_id(pk) | 위도 | 경도 |
|---|---|---|---|
| 테네시주 내슈빌 | 0 | 36.162663 | -86.7816 |
| 호놀룰루, 하와이 | 1 | 21.309885 | -157.85814 |
| 네바다 라스베이거스 | 2 | 36.171562 | -115.1391 |
| 뉴욕 | 3 | 40.712776 | -74.005974 |
2단계. 온라인 테이블 만들기
온라인 테이블은 온라인 액세스에 최적화된 델타 테이블의 읽기 전용 복사본입니다. 자세한 내용은 Databricks 온라인 테이블(레거시)을 참조하세요.
온라인 테이블을 만들려면 다음 예제와 같이 UI UI, REST API또는 Databricks SDK를 사용하여 온라인 테이블을 만들 수 있습니다.
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단계 Unity 카탈로그에서 함수 만들기
이 예제에서 함수는 대상(위치가 변경되지 않음)과 사용자(위치가 자주 변경되고 유추 시점까지 알려지지 않음) 사이의 거리를 계산합니다.
# 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단계 Unity 카탈로그에서 기능 사양 만들기
기능 사양은 엔드포인트가 제공하는 기능과 해당 조회 키를 지정합니다. 또한 바인딩을 사용하여 검색된 기능에 적용하는 데 필요한 함수를 지정합니다. 자세한 내용은 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단계 엔드포인트를 제공하는 기능 만들기
엔드포인트를 제공하는 기능을 만들려면 여기에 표시된 UI 엔드포인트 만들기, REST API 또는 Databricks SDK를 사용할 수 있습니다.
엔드포인트를 제공하는 기능은 4단계에서 만든 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단계 서비스 엔드포인트 기능 쿼리
엔드포인트를 쿼리할 때 기본 키와 필요에 따라 함수에서 사용하는 컨텍스트 데이터를 제공합니다. 이 예제에서 함수는 사용자의 현재 위치(위도 및 경도)를 입력으로 사용합니다. 사용자의 위치는 지속적으로 변경되므로 유추 시 함수에 컨텍스트 기능으로 제공해야 합니다.
UI를 사용하여 엔드 포인트를 쿼리하거나 REST API를 사용하여 엔드포인트를 쿼리할 수 있습니다.
간단히 하기 위해 이 예제에서는 두 도시까지의 거리만 계산합니다. 보다 현실적인 시나리오는 기능 테이블의 각 위치에서 사용자의 거리를 계산하여 추천할 도시를 결정할 수 있습니다.
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)
예제 Notebook
단계에 대한 전체 그림은 이 Notebook을 참조하세요.
온라인 테이블이 있는 기능 제공 예제 전자 필기장
추가 정보
기능 엔지니어링 Python API 사용에 대한 자세한 내용은 참조 설명서를 참조하세요.