Поделиться через


Развертывание и запрос конечной точки обслуживания компонентов

В этой статье показано, как развернуть и запросить конечную точку обслуживания компонентов в пошаговом процессе. В этой статье используется пакет SDK Databricks. Некоторые шаги также можно выполнить с помощью REST API или пользовательского интерфейса Databricks и включить ссылки на документацию для этих методов.

В этом примере у вас есть таблица городов с их расположениями (широтой и долготой) и приложением-рекомендацией, которое учитывает текущее расстояние пользователя от этих городов. Так как расположение пользователя постоянно изменяется, расстояние между пользователем и каждым городом должно быть вычисляться во время вывода. В этом руководстве показано, как выполнять эти вычисления с низкой задержкой с помощью таблиц Databricks Online и службы функций Databricks. Полный набор примера кода см. в примере записной книжки.

Шаг 1. Создание исходной таблицы

Исходная таблица содержит предварительно вычисляемые значения признаков и может быть любой таблицей Delta в каталоге Unity с первичным ключом. В этом примере таблица содержит список городов с их широтой и долготой. Первичный ключ — destination_idэто . Ниже показаны примеры данных.

name destination_id (pk) широта долгота
Нэшвилл, Теннесси 0 36.162663 -86.7816
Гонолулу, Гавайи 1 21.309885 -157.85814
Лас-Вегас, Невада 2 36.171562 -115.1391
Нью-Йорк 3 40.712776 -74.005974

Шаг 2. Создание интерактивной таблицы

Онлайн-таблица — это копия таблицы, доступной только для чтения, оптимизированной для доступа к Интернету. Дополнительные сведения см. в статье "Использование онлайн-таблиц для обслуживания функций в режиме реального времени".

Чтобы создать онлайн-таблицу, можно использовать пользовательский интерфейс создания интерактивной таблицы с помощью пользовательского интерфейса, REST API или пакета SDK Databricks, как показано в следующем примере:

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

Спецификация функций указывает функции, которые конечная точка обслуживает и их ключи подстановки. Он также указывает все необходимые функции для применения к извлеченным функциям со своими привязками. Дополнительные сведения см. в разделе "Создание компонента".

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. Создание конечной точки обслуживания компонентов

Чтобы создать конечную точку обслуживания компонентов, можно использовать конечную точку, REST API или пакет SDK Databricks, показанный здесь.

Конечная точка обслуживания функций принимает feature_spec созданный на шаге 4 в качестве параметра.

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. Запрос конечной точки обслуживания компонентов

При запросе конечной точки укажите первичный ключ и при необходимости все данные контекста, которые использует функция. В этом примере функция принимает в качестве входных данных текущее расположение пользователя (широта и долготу). Так как расположение пользователя постоянно изменяется, оно должно быть предоставлено функции во время вывода в качестве функции контекста.

Вы также можете запросить конечную точку с помощью запроса пользовательского интерфейса к конечной точке с помощью пользовательского интерфейса или 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)

Пример записной книжки

См. эту записную книжку для полной иллюстрации действий.

Примеры записной книжки компонента с онлайн-таблицами

Получить записную книжку

Дополнительная информация:

Дополнительные сведения об использовании API Python для разработки функций см . в справочной документации.