Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пошаговый пример развертывания и запроса конечной точки обслуживания функций с помощью пакета SDK Databricks. Вы также можете использовать пользовательский интерфейс Databricks или REST API для создания и запроса конечных точек обслуживания функций. Ссылки на эту документацию включены.
В этом примере у вас есть таблица городов с их расположениями (широтой и долготой) и приложением-рекомендацией, которое учитывает текущее расстояние пользователя от этих городов. Так как расположение пользователя постоянно изменяется, расстояние между пользователем и каждым городом должно быть вычисляться во время вывода. В этом руководстве показано, как выполнять эти вычисления с низкой задержкой с помощью Хранилища компонентов 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 для разработки функций см . в справочной документации.