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


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

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

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

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

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

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

Шаг 2. Создание интернет-хранилища компонентов

Дополнительные сведения о хранилищах компонентов Databricks Online см. в разделе Databricks Online Feature Store.

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
)

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

Чтобы создать конечную точку обслуживания компонентов, можно использовать конечную точку, 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 для разработки функций см . в справочной документации.