Pular para o conteúdo principal

Exemplo: implantado e consultar o site Feature Serving endpoint

Este artigo mostra como implantar e consultar um Feature Serving endpoint em um processo passo a passo. Este artigo usa o endereço Databricks SDK. Algumas etapas também podem ser concluídas usando a API REST ou a interface do usuário do Databricks e incluem referências à documentação desses métodos.

Neste exemplo, você tem uma tabela de cidades com suas localizações (latitude e longitude) e um aplicativo de recomendação que leva em account a distância atual do usuário até essas cidades. Como a localização do usuário muda constantemente, a distância entre o usuário e cada cidade deve ser calculada no momento da inferência. Este tutorial ilustra como realizar esses cálculos com baixa latência usando o Databricks Online Feature Store e o Databricks Feature Serving. Para ver o conjunto completo de exemplos de código, consulte o Notebook de exemplo.

Etapa 1. Crie a tabela de origem

A tabela de origem contém valores de recurso pré-computados e pode ser qualquer tabela Delta em Unity Catalog com um primário key. Neste exemplo, a tabela contém uma lista de cidades com sua latitude e longitude. O site key primário é destination_id. Os dados de amostra são mostrados abaixo.

name

destination_id (pk)

latitude

longitude

Nashville, Tennessee

0

36,162663

-86,7816

Honolulu, Havaí

1

21,309885

-157,85814

Las Vegas, Nevada

2

36,171562

-115,1391

Nova York, Nova York

3

40,712776

-74,005974

o passo 2. Crie o repositório de recursos online

Para obter detalhes sobre o repositório de recursos Databricks Online, consulte repositório de recursosDatabricks Online.

Python
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
)

Etapa 3. Criar uma função no Unity Catalog

Neste exemplo, a função calcula a distância entre o destino (cuja localização não muda) e o usuário (cuja localização muda com frequência e não é conhecida até o momento da inferência).

Python
# 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
$$""")

Etapa 4. Criar uma especificação de recurso no Unity Catalog

A especificação de recurso especifica o recurso que o endpoint atende e sua chave de pesquisa. Ele também especifica quaisquer funções necessárias a serem aplicadas ao recurso recuperado com suas associações. Para obter detalhes, consulte Criar um FeatureSpec.

Python
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

Etapa 5. Crie um Feature Serving endpoint

Para criar um Feature Serving endpoint, o senhor pode usar o UI Create an endpoint, o REST APIou o Databricks SDK, mostrado aqui.

O Feature Serving endpoint usa o feature_spec que o senhor criou na Etapa 4 como parâmetro.

Python
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)

Etapa 6. Consultar o site Feature Serving. endpoint

Ao consultar o endpoint, o senhor fornece o key primário e, opcionalmente, qualquer dado de contexto que a função utilize. Neste exemplo, a função usa como entrada a localização atual do usuário (latitude e longitude). Como a localização do usuário muda constantemente, ela deve ser fornecida à função no momento da inferência como um recurso de contexto.

O senhor também pode consultar o endpoint usando a UI Consultar um endpoint usando a UI ou a API REST.

Para simplificar, este exemplo calcula apenas a distância até duas cidades. Um cenário mais realista poderia calcular a distância do usuário de cada local na tabela de recursos para determinar quais cidades recomendar.

Python
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)

Exemplo de notebook

Consulte este Notebook para obter uma ilustração completa das etapas:

Exemplo Feature Serving : Notebook com funcionalidade online

Open notebook in new tab

Informações adicionais

Para obter detalhes sobre o uso do recurso engenharia Python API, consulte a documentação de referência.