Implementación y consulta de un punto de conexión que atiende características
En este artículo se muestra cómo implementar y consultar un punto de conexión que atiende características en un proceso paso a paso. En este artículo se usa el SDK de Databricks. Algunos pasos también se pueden completar mediante la API de REST o la interfaz de usuario de Databricks e incluir referencias a la documentación de esos métodos.
En este ejemplo, tiene una tabla de ciudades con sus ubicaciones (latitud y longitud) y una aplicación recomendada que tiene en cuenta la distancia actual del usuario desde esas ciudades. Dado que la ubicación del usuario cambia constantemente, la distancia entre el usuario y cada ciudad debe calcularse en el momento de la inferencia. En este tutorial se muestra cómo realizar esos cálculos con baja latencia mediante tablas en línea de Databricks y el servicio de características de Databricks. Para obtener el conjunto completo de código de ejemplo, consulte el cuaderno de ejemplo.
Paso 1. Creación de la tabla de origen
La tabla de origen contiene valores de características precalculados y puede ser cualquier tabla Delta en el catálogo de Unity con una clave principal. En este ejemplo, la tabla contiene una lista de ciudades con su latitud y longitud. La clave principal es destination_id
. A continuación se muestran los datos de ejemplo.
nombre | destination_id (pk) | latitude | longitude |
---|---|---|---|
Nashville, Tennessee | 0 | 36.162663 | -86.7816 |
Honolulu, Hawái | 1 | 21.309885 | -157.85814 |
Las Vegas, Nevada | 2 | 36.171562 | -115.1391 |
Nueva York, Nueva York | 3 | 40.712776 | -74.005974 |
Paso 2. Creación de una tabla en línea
Una tabla en línea es una copia de solo lectura de una tabla Delta que está optimizada para el acceso en línea. Para obtener más información, consulte Uso de tablas en línea para el servicio de características en tiempo real.
Para crear una tabla en línea, puede usar la interfaz de usuario Crear una tabla en línea mediante la interfaz de usuario, la API de REST o el SDK de Databricks, como en el ejemplo siguiente:
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))
Paso 3. Creación de una función en el catálogo de Unity
En este ejemplo, la función calcula la distancia entre el destino (cuya ubicación no cambia) y el usuario (cuya ubicación cambia con frecuencia y no se conoce hasta el momento de la inferencia).
# 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
$$""")
Paso 4. Creación de una especificación de características en el catálogo de Unity
La especificación de características especifica las características que el punto de conexión atiende y sus claves de búsqueda. También especifica cualquier función necesaria para aplicar a las características recuperadas con sus enlaces. Para obtener más información, consulte Crear una 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
Paso 5. Crear un punto de conexión que atiende características
Para crear un punto de conexión que atiende características, puede usar la interfaz de usuario Crear un punto de conexión, la API de REST o el SDK de Databricks, que se muestra aquí.
El punto de conexión que atiende características toma la feature_spec
que creó en el paso 4 como parámetro.
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)
Paso 6. Consultar el punto de conexión que atiende características
Al consultar el punto de conexión, proporciona la clave principal y, opcionalmente, cualquier dato de contexto que la función utiliza. En este ejemplo, la función toma como entrada la ubicación actual del usuario (latitud y longitud). Dado que la ubicación del usuario cambia constantemente, se debe proporcionar a la función en el momento de la inferencia como una característica de contexto.
También puede consultar el punto de conexión mediante la interfaz de usuario Consultar un punto de conexión mediante la interfaz de usuario o la API de REST.
Por motivos de simplicidad, en este ejemplo solo se calcula la distancia a dos ciudades. Un escenario más realista podría calcular la distancia del usuario desde cada ubicación de la tabla de características para determinar qué ciudades recomendar.
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)
Cuaderno de ejemplo
Consulte este cuaderno para obtener una ilustración completa de los pasos:
Cuaderno de ejemplo de servicio de características con tablas en línea
Información adicional
Para más información sobre el uso de la API de Python de ingeniería de características, consulte la documentación de referencia.