Перейти к основному содержимому

Хранилище признаков Snowflake и dbt: Мост между данными и ML

· 13 мин. чтения
Randy Pettus
Luis Leon

На прошлой неделе, летя домой в Детройт и работая над этой статьей в самолете, я впервые увидел недавно соединенную палубу Международного моста Горди Хоу, который пересекает реку Детройт и соединяет США и Канаду. Этот образ запомнился, потому что, в некотором смысле, хранилище признаков является мостом между чистыми, согласованными наборами данных и моделями машинного обучения, которые зависят от этих данных. Но более интересным, чем сам мост, является огромный процесс координации, необходимый для его строительства. Это строительное усилие, как мне кажется, может научить нас многому о процессах и необходимости хранилищ признаков в машинном обучении (ML).

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

Что такое признак?

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

Какую роль играет dbt в подготовке данных для моделей ML?

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

Кто будет использовать это и какие выгоды они получат?

Snowflake и dbt уже являются хорошо зарекомендовавшей себя и надежной комбинацией для обеспечения превосходства данных в корпоративной среде. Возможность регистрировать конвейеры dbt в Snowflake Feature Store еще больше расширяет эту комбинацию для рабочих нагрузок ML и AI, при этом естественно вписываясь в инженерные и функциональные конвейеры данных, уже присутствующие в dbt.

Некоторые из ключевых преимуществ:

  • Сотрудничество по признакам — Специалисты по данным, аналитики данных, инженеры данных и инженеры машинного обучения сотрудничают над признаками, используемыми в моделях машинного обучения как на Python, так и на SQL, что позволяет командам делиться и повторно использовать признаки. В результате команды могут улучшить время до получения ценности от моделей, улучшая понимание их компонентов. Все это поддерживается ролевым управлением доступом (RBAC) и управлением в Snowflake.
  • Согласованность признаков — Команды уверены, что признаки, сгенерированные для обучающих наборов и используемые для вывода модели, согласованы. Это особенно важно для крупных организаций, где могут существовать несколько версий истины. Подобно тому, как dbt и Snowflake помогают предприятиям иметь единственный источник истины данных, теперь они могут иметь единственный источник истины для признаков.
  • Видимость и использование признаков — Snowflake Feature Store предоставляет интуитивно понятный SDK для работы с признаками ML и их связанной метаинформацией. Кроме того, пользователи могут просматривать и искать признаки в интерфейсе Snowflake, что обеспечивает легкий способ идентификации признаков.
  • Точность на момент времени — Snowflake извлекает точные на момент времени признаки, используя ASOF Joins, устраняя значительную сложность в генерации правильного значения признака для данного периода времени, будь то для обучения или пакетного извлечения предсказаний.
  • Интеграция с конвейерами данных — Команды, которые уже построили конвейеры данных в dbt, могут продолжать использовать их с Snowflake Feature Store. Не требуется дополнительной миграции или повторного создания признаков, так как команды подключаются к тем же конвейерам.

Почему мы интегрировали/создали это с Snowflake?

Как dbt помогает с рабочими нагрузками ML сегодня? dbt играет ключевую роль в подготовке данных для моделей ML, преобразуя сырые данные в формат, подходящий для инженерии признаков. Он помогает оркестрировать и автоматизировать эти преобразования, обеспечивая чистоту, согласованность и готовность данных для приложений ML. Сочетание мощного AI Data Cloud от Snowflake и возможностей преобразования dbt делает их непобедимой парой для организаций, стремящихся эффективно масштабировать свои операции ML.

Упрощение создания и развертывания данных и моделей ML для инженеров ML/данных

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

Кроме того, dbt Mesh делает поддержание владения доменом чрезвычайно простым, разбивая части наших проектов данных и конвейеров на связанные проекты, где критические модели могут быть опубликованы для использования другими с жесткими контрактами данных, обеспечивающими качество и управляемость. Эта парадигма поддерживает быстрое развитие, так как каждый проект может быть сохранен в управляемом размере для его участников и разработчиков. Контракты на опубликованные модели, используемые между этими проектами, обеспечивают согласованность точек интеграции между ними.

Наконец, dbt Cloud также предоставляет dbt Explorer — идеальный инструмент для каталогизации и обмена знаниями об организационных данных между разрозненными командами. dbt Explorer предоставляет центральное место для информации о конвейерах данных, включая информацию о происхождении, свежести данных и качестве. И самое лучшее, dbt Explorer обновляется каждый раз, когда выполняются задания dbt, обеспечивая актуальность и релевантность этой информации.

Какие технологии используются?

Вот что вам нужно от dbt. dbt должен использоваться для управления конвейерами преобразования данных и генерации наборов данных, необходимых инженерам ML и специалистам по данным, поддерживающим Snowflake Feature Store. Пользователи dbt Cloud Enterprise должны использовать dbt Mesh для создания различных проектов с четкими владельцами для этих различных доменов конвейеров данных. Этот дизайн Mesh будет способствовать более легкому сотрудничеству, сохраняя каждый проект dbt меньшим и более управляемым для людей, которые его строят и поддерживают. dbt также поддерживает как SQL, так и Python-преобразования, что делает его идеальным для рабочих процессов AI/ML, которые обычно используют оба языка.

Использование dbt для конвейеров преобразования данных также обеспечит качество и согласованность продуктов данных, что критически важно для обеспечения успешных усилий AI/ML.

Обзор Snowflake ML

Feature Store является одним из компонентов интегрированного набора функций машинного обучения Snowflake ML, который обеспечивает полное машинное обучение на одной платформе. Специалисты по данным и инженеры ML используют готовые функции ML или создают пользовательские рабочие процессы ML, все это без перемещения данных или жертвования управляемостью. Snowflake ML включает в себя масштабируемую инженерию признаков и возможности обучения моделей. Между тем, Feature Store и Model Registry позволяют командам хранить и использовать признаки и модели в производстве, предоставляя полный набор для работы с ML-нагрузками в масштабе.

Что нужно сделать, чтобы все это работало?

dbt Cloud предлагает самый быстрый и простой способ запуска dbt. Он предлагает облачную IDE, облачный CLI и даже вариант визуального редактора с низким кодом (в настоящее время в бета-версии), что делает его идеальным для подключения пользователей из разных команд с различными рабочими процессами и предпочтениями инструментов, что очень распространено в рабочих процессах AI/ML. Это инструмент, который вы будете использовать для подготовки и управления данными для AI/ML, содействия сотрудничеству между различными командами, необходимыми для успешного рабочего процесса AI/ML, и обеспечения качества и согласованности базовых данных, которые будут использоваться для создания признаков и обучения моделей.

Организации, заинтересованные в рабочих процессах AI/ML через Snowflake, также должны обратить внимание на новое приложение dbt Snowflake Native App — Snowflake Native Application, которое расширяет функциональность dbt Cloud в Snowflake. Особый интерес представляет Ask dbt — чат-бот, который интегрируется напрямую с Snowflake Cortex и dbt Semantic Layer, позволяя задавать вопросы о данных Snowflake на естественном языке.

Как использовать dbt и Snowflake Feature Store для ML-конвейеров

Давайте предоставим краткий пример того, как выглядит этот рабочий процесс в dbt и Snowflake для создания и использования мощных возможностей Feature Store. В этом примере предположим, что у нас есть конвейер данных в dbt для обработки данных о транзакциях клиентов. Различные команды специалистов по данным в организации должны извлекать признаки из этих транзакций для использования в различных моделях, включая предсказание мошенничества и выполнение сегментации и персонализации клиентов. Эти различные случаи использования все выигрывают от наличия связанных признаков, таких как количество транзакций или суммы покупок за разные периоды времени (например, за последний день, 7 дней или 30 дней) для данного клиента.

Вместо того чтобы специалисты по данным строили свои собственные рабочие процессы для извлечения этих признаков, давайте рассмотрим поток использования dbt для управления конвейером признаков и Snowflake Feature Store для решения этой проблемы. Следующие подразделы описывают рабочий процесс шаг за шагом.

Создание таблиц признаков как моделей dbt

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

Агрегации по окнам играют важную роль в создании признаков. Поскольку логика для этих агрегаций часто сложна, давайте посмотрим, как Snowflake и dbt упрощают этот процесс, используя принципы "Не повторяй себя" (DRY). Мы создадим макрос, который позволит нам использовать синтаксис range between Snowflake повторяемым образом:

{% macro rolling_agg(column, partition_by, order_by, interval='30 days', agg_function='sum') %}
{{ agg_function }}({{ column }}) over (
partition by {{ partition_by }}
order by {{ order_by }}
range between interval '{{ interval }}' preceding and current row
)
{% endmacro %}

Теперь мы используем этот макрос в нашей таблице признаков для построения различных агрегаций транзакций клиентов за последний день, 7 дней и 30 дней. Snowflake значительно упростил генерацию соответствующих значений признаков, а dbt сделал код еще более читаемым и повторяемым. Хотя следующий пример построен на SQL, команды также могут строить эти конвейеры, используя Python непосредственно.

select
tx_datetime,
customer_id,
tx_amount,
{{ rolling_agg("TX_AMOUNT", "CUSTOMER_ID", "TX_DATETIME", "1 days", "sum") }}
as tx_amount_1d,
{{ rolling_agg("TX_AMOUNT", "CUSTOMER_ID", "TX_DATETIME", "7 days", "sum") }}
as tx_amount_7d,
{{ rolling_agg("TX_AMOUNT", "CUSTOMER_ID", "TX_DATETIME", "30 days", "sum") }}
as tx_amount_30d,
{{ rolling_agg("TX_AMOUNT", "CUSTOMER_ID", "TX_DATETIME", "1 days", "avg") }}
as tx_amount_avg_1d,
{{ rolling_agg("TX_AMOUNT", "CUSTOMER_ID", "TX_DATETIME", "7 days", "avg") }}
as tx_amount_avg_7d,
{{ rolling_agg("TX_AMOUNT", "CUSTOMER_ID", "TX_DATETIME", "30 days", "avg") }}
as tx_amount_avg_30d,
{{ rolling_agg("*", "CUSTOMER_ID", "TX_DATETIME", "1 days", "count") }}
as tx_cnt_1d,
{{ rolling_agg("*", "CUSTOMER_ID", "TX_DATETIME", "7 days", "count") }}
as tx_cnt_7d,
{{ rolling_agg("*", "CUSTOMER_ID", "TX_DATETIME", "30 days", "count") }}
as tx_cnt_30d
from {{ ref("stg_transactions") }}

Создание или подключение к Snowflake Feature Store

После создания таблицы признаков в dbt специалисты по данным используют пакет snowflake-ml-python от Snowflake для создания или подключения к существующему Feature Store в Snowflake. Специалисты по данным могут делать это все на Python, включая в Jupyter Notebooks или непосредственно в Snowflake, используя Snowflake Notebooks.

Давайте создадим Feature Store в Snowflake:

from snowflake.ml.feature_store import (
FeatureStore,
FeatureView,
Entity,
CreationMode
)

fs = FeatureStore(
session=session,
database=fs_db,
name=fs_schema,
default_warehouse='WH_DBT',
creation_mode=CreationMode.CREATE_IF_NOT_EXIST,
)

Создание и регистрация сущностей признаков

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

Давайте создадим несколько примеров сущностей.

customer = Entity(name="CUSTOMER", join_keys=["CUSTOMER_ID"])
transaction = Entity(name="TRANSACTION", join_keys=["TRANSACTION_ID"])
fs.register_entity(customer)
fs.register_entity(transaction)

Регистрация таблиц признаков как представлений признаков

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

# Создание датафрейма из нашей таблицы признаков, созданной в dbt
customers_transactions_df = session.sql(f"""
SELECT
CUSTOMER_ID,
TX_DATETIME,
TX_AMOUNT_1D,
TX_AMOUNT_7D,
TX_AMOUNT_30D,
TX_AMOUNT_AVG_1D,
TX_AMOUNT_AVG_7D,
TX_AMOUNT_AVG_30D,
TX_CNT_1D,
TX_CNT_7D,
TX_CNT_30D
FROM {fs_db}.{fs_data_schema}.ft_customer_transactions
""")

# Создание представления признаков на основе этих признаков
customer_transactions_fv = FeatureView(
name="customer_transactions_fv",
entities=[customer],
feature_df=customers_transactions_df,
timestamp_col="TX_DATETIME",
refresh_freq=None,
desc="Признаки транзакций клиентов с агрегатами по окнам")

# Регистрация представления признаков для использования за пределами сессии
customer_transactions_fv = fs.register_feature_view(
feature_view=customer_transactions_fv,
version="1",
#overwrite=True,
block=True)

Поиск и обнаружение признаков в интерфейсе Snowflake

Теперь, когда признаки созданы, команды могут просматривать свои признаки непосредственно в интерфейсе Snowflake, как показано ниже. Это позволяет командам легко искать и просматривать признаки, все это управляется через ролевое управление доступом (RBAC) Snowflake.

Пример интерфейса SnowflakeПример интерфейса Snowflake

Генерация обучающего набора данных

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

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

spine_df = session.create_dataframe(
[
('1', '3937', "2019-05-01 00:00"),
('2', '2', "2019-05-01 00:00"),
('3', '927', "2019-05-01 00:00"),
],
schema=["INSTANCE_ID", "CUSTOMER_ID", "EVENT_TIMESTAMP"])

train_dataset = fs.generate_dataset(
name= "customers_fv",
version= "1_0",
spine_df=spine_df,
features=[customer_transactions_fv],
spine_timestamp_col= "EVENT_TIMESTAMP",
spine_label_cols = []
)

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

Пример обучающего набора данныхПример обучающего набора данных

Обучение и развертывание модели

Теперь с этим обучающим набором специалисты по данным могут использовать Snowflake Snowpark и Snowpark ML Modeling для использования знакомых фреймворков Python для дополнительной предобработки, инженерии признаков и обучения моделей, все это в пределах Snowflake. Модель может быть зарегистрирована в Model Registry Snowflake для безопасного управления моделью. Обратите внимание, что мы оставим обучение модели вам в рамках этого упражнения.

Извлечение признаков для предсказаний

Для вывода конвейеры данных извлекают значения признаков, используя метод retrieve_feature_values. Эти извлеченные значения могут быть переданы непосредственно в возможность предсказания модели в вашей сессии Python, используя разработанную модель или вызывая метод предсказания модели из Model Registry Snowflake. Для целей пакетного скоринга команды могут построить весь этот конвейер, используя Snowflake ML. Следующий код демонстрирует, как признаки извлекаются с использованием этого метода.

infernce_spine = session.create_dataframe(
[
('1', '3937', "2019-07-01 00:00"),
('2', '2', "2019-07-01 00:00"),
('3', '927', "2019-07-01 00:00"),
],
schema=["INSTANCE_ID", "CUSTOMER_ID", "EVENT_TIMESTAMP"])

inference_dataset = fs.retrieve_feature_values(
spine_df=infernce_spine,
features=[customer_transactions_fv],
spine_timestamp_col="EVENT_TIMESTAMP",
)

inference_dataset.to_pandas()

Вот примерный вид наших признаков, созданных для вывода модели.

Пример обучающего набора данныхПример обучающего набора данных

Заключение

Мы только что увидели, как быстро и легко вы можете начать разрабатывать признаки с помощью dbt и использовать Snowflake Feature Store для предоставления предсказательного моделирования в рамках ваших конвейеров данных. Возможность создавать и развертывать модели ML, включая интеграцию хранения признаков, преобразования данных и логики ML в одной платформе, упрощает весь жизненный цикл ML. Сочетание этой новой мощности с хорошо зарекомендовавшим себя партнерством dbt и Snowflake открывает еще больше потенциала для организаций, чтобы безопасно строить и исследовать новые случаи использования AI/ML и способствовать дальнейшему сотрудничеству в организации.

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

Comments

Loading