Compartir a través de


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

Obtener el cuaderno

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.