ICYMI: Databricks теперь поддерживает Cosmos DB как интернет-магазин функций. Это объявление дополняет существующую поддержку других сетевых баз данных, таких как Dynamo DB и Azure MySQL.

TLDR. В этом посте мы хотим рассказать, как пользователи могут начать работу с Databricks Feature Store с Cosmos DB. Онлайн-базы данных становятся все более распространенными, поскольку все больше приложений переходят на обслуживание прогнозов машинного обучения в масштабе и с малой задержкой. Однако не многие пользователи знакомы с такими понятиями, как различия между онлайн- и офлайн-функциями и когда использовать одну вместо другой. Поэтому в этой статье мы рассмотрим комплексный пример использования Cosmos DB с хранилищем компонентов Databricks, а также познакомим читателя с тем, что такое интернет-магазины и как они вписываются в жизненный цикл модели машинного обучения.

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

Мы можем классифицировать функции по разным вкусам (как показано на диаграмме ниже). Для предварительно вычисленных функций данные обычно поступают через конвейеры ETL перед преобразованием и сохранением в хранилище функций, таком как хранилище функций Databricks. Для функций реального времени данные поступают «на лету», а не через запланированные рабочие процессы. Преобразования объектов рассчитываются по мере поступления данных, а затем передаются непосредственно в модель для вывода, а не сохраняются в таблице для последующего поиска.

Предварительно вычисленные объекты могут быть дополнительно подразделены на объекты, которые хранятся в слоях автономного или онлайн-хранилища. Уровни автономного хранилища, такие как Delta Lake, могут хранить большие объемы исторических данных. Таким образом, они полезны для обучения моделей машинного обучения или для вывода модели в пакетном режиме. Между тем уровни онлайн-хранилища, такие как Cosmos DB, обычно хранят только самые последние значения функций для данного первичного ключа. Они могут возвращать значения функций с меньшей задержкой по сравнению с автономным магазином. Следовательно, они являются хорошим выбором, когда наша модель должна выполнять вывод с низкими задержками. Примеры приложений с малой задержкой включают обнаружение мошенничества или рекомендации в реальном времени, которые должны возвращать прогнозы клиенту в течение секунды или раньше.

В этих случаях мы хотели бы взять функции, которые мы пишем, в таблицу хранилища функций Delta и опубликовать их в нижестоящей онлайн-базе данных, которая предлагает нам быстрое время поиска, которое нам нужно. Примеры таких баз данных включают Cosmos DB, DynamoDB и Postgres.

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

Как работают интернет-магазины функций

В оставшейся части этой статьи будет рассмотрен пример сквозного рабочего процесса использования Cosmos DB в качестве интернет-магазина функций. Наш рабочий процесс будет включать в себя:

  1. Получение данных
  2. Создание функций и их хранение в таблице Databricks Feature Store
  3. Публикация этих функций из нашей таблицы Databricks Feature Store в Cosmos DB
  4. Использование этих функций и других необработанных данных для обучения модели машинного обучения с использованием Scikit-learn и MLflow.
  5. Создайте конечную точку Обслуживание моделей Databricks, чтобы обслуживать наши прогнозы. Этот вариант обслуживания удобнее, чем другие альтернативы, по нескольким причинам:
  6. Наша конечная точка Databricks Model Serving будет автоматически извлекать значения функций, необходимые для модели, из онлайн-хранилища функций. Конечные точки Model Serving могут автоматически масштабироваться вверх или вниз, чтобы приспособиться к изменяющемуся объему входящих запросов. Кроме того, конечные точки Model Serving созданы для рабочих нагрузок. Они могут поддерживать до 3000 запросов в секунду и связаны с информационными панелями, которые отслеживают работоспособность конечных точек с использованием таких показателей, как количество запросов в секунду, задержка и частота ошибок.

Альтернатива, если не используется обслуживание модели Databricks:

  1. Создайте конечную точку Fast API, которая может обслуживать прогнозы нашей обученной модели.
  2. Использование этой конечной точки для получения необработанных данных в реальном времени, написание пользовательского кода для объединения этих данных с функциями, хранящимися в Cosmos, а затем передача этого набора данных для вывода в нашу модель для получения прогнозов взамен.

Для шагов 1–5 мы используем Пример записной книжки онлайн-магазина функций из документации интернет-магазина Databricks. Этот блокнот использует набор данных Качество вина для прогнозирования качества бутылки вина. В нашем сценарии мы используем Alcohol by Volume (ABV) и Wine ID в качестве наших функций в реальном времени, в то время как другие функции в наборе данных сохраняются в таблице хранилища функций и просматриваются во время обучения модели и вывода. Это разделение иллюстрирует типичное онлайн-приложение, которому требуется сочетание функций реального времени и предварительно вычисленных функций для обработки логического вывода модели.

Данные приема

Создание функций и их хранение в таблице Databricks Feature Store

Публикация этих функций из таблицы Databricks Feature Store в Cosmos DB

Мы видим, что интернет-магазин зарегистрирован в пользовательском интерфейсе Feature Store.

Перейдя на портал Azure, мы можем перепроверить, что у нас есть контейнер в Cosmos DB, созданный с именем feature_store_online_wine_features.

Использование этих функций и других необработанных данных для обучения модели машинного обучения с использованием Scikit-learn и MLFLow. Пример обучающего кода можно найти в Записной книжке с примерами интернет-магазина. После обучения модели мы можем просматривать наши показатели, результаты и модель в пользовательском интерфейсе отслеживания экспериментов MLflow.

Создайте конечную точку бессерверного вывода в реальном времени, чтобы обслуживать прогнозы нашей обученной модели.

  1. Перейдите к модели в реестре моделей MLflow и нажмите «Использовать модель для вывода».

2. Во всплывающем окне укажите, какими должны быть версия модели и имя конечной точки. Нажмите «Создать конечную точку» в правом нижнем углу.

3. Появится страница, показывающая статус конечной точки.

4. Как только конечная точка будет готова, мы можем использовать библиотеку запросов Python для запроса конечной точки.

def create_tf_serving_json(data):
   return {'inputs': {name: data[name].tolist() for name in data.keys()} if isinstance(data, dict) else data.tolist()}

def predict(dataset):
   url = '<Replace with the URL shown in Serving page>'
   headers = {'Authorization': f'Bearer {DATABRICKS_TOKEN}'}
   data_json = dataset.to_dict(orient='split') if isinstance(dataset, pd.DataFrame) else create_tf_serving_json(dataset)
   response = requests.request(method='POST', headers=headers, url=url, json=data_json)
   if response.status_code != 200:
       raise Exception(f'Request failed with status {response.status_code}, {response.text}')
   return response.json()

*note that with SRTI, the payload data should be formatted as: 
{"dataframe_records": [
    {"wine_id": 25, "alcohol": 7.9}, 
    {"wine_id": 25, "alcohol": 11.0}
  ]}

Создание конечной точки Fast API, которая может обслуживать прогнозы нашей обученной модели.

Здесь мы переходим от среды нашего ноутбука к среде IDE. В нашем приложении/папке мы указываем прогноз/конечную точку Fast API, которая может обслуживать прогнозы нашей модели. Структура папок проекта показана ниже, а код для нее можно найти на Github.

Эта конечная точка примет ввод JSON {"alchohol":0, "wine_id":0} и выведет прогнозируемый показатель качества вина.

@app.post(“/predict”)
async def predict(item: Item):
"""Prediction endpoint.
"""

В фоновом режиме после получения запроса эта конечная точка передаст wine_id в качестве параметра запроса в наш контейнер Cosmos DB, чтобы получить функции, относящиеся к конкретному wine_id..

query_text = “SELECT * FROM feature_store_online_wine_features f WHERE f._feature_store_internal__primary_keys = @id”
res = await query_items(container_obj, query_text, id)

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

inputs_and_features = input_df.join(lookups).drop("wine_id", axis=1)
# Make predictions and log
model_output = MODEL.predict(inputs_and_features).tolist()

Если мы откроем локальный экземпляр нашего приложения Fast API, мы сможем проверить, работает ли наша конечная точка.

Мы показали, как функции, зарегистрированные в Databricks Feature Store, могут быть опубликованы в онлайн-базе данных, такой как Cosmos DB, для поиска с малой задержкой во время обслуживания модели. Мы также показали, как приложение REST может запрашивать у Cosmos DB самые последние функции, а затем объединять эти функции с необработанными данными в реальном времени для создания набора данных, который используется для вывода модели. Интернет-магазины все чаще используются для приложений, которым необходимо возвращать результаты в режиме реального или близкого к реальному времени. Надеемся, что это руководство послужит отправной точкой для того, чтобы подумать о пакетных и онлайн-функциях и о том, как они влияют на построение модели и процесс обслуживания.

Спасибо Feifei Wang и Максиму Лукьянову за ценные отзывы об этой публикации