Хранилище признаков Snowflake и dbt: Мост между данными и ML
На прошлой неделе, летя домой в Детройт и работая над этой статьей в самолете, я впервые увидел недавно соединенную палубу Международного моста Горди Хоу, который пересекает реку Детройт и соединяет США и Канаду. Этот образ запомнился, потому что, в некотором смысле, хранилище признаков является мостом между чистыми, согласованными наборами данных и моделями машинного обучения, которые зависят от этих данных. Но более интересным, чем сам мост, является огромный процесс координации, необходимый для его строительства. Это строительное усилие, как мне кажется, может научить нас многому о процессах и необходимости хранилищ признаков в машинном обучении (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/Data Engineers работу: и разработку, и деплой ML-данных и моделей
dbt — отличный инструмент для развития совместной работы data engineers, ML engineers и data scientists. dbt изначально спроектирован так, чтобы поддерживать коллаборацию и качество data pipelines: контроль версий, окружения и жизненные циклы разработки, а также встроенное тестирование данных и пайплайнов. Используя dbt, data engineers и data scientists могут совместно разрабатывать новые модели и фичи, сохраняя строгие требования к governance и высокому качеству.
Кроме того, dbt Mesh упрощает поддержание доменного владения: он позволяет разбивать проекты и пайплайны на связанные между собой проекты, где критичные модели можно публиковать для использования другими командами, а строгие data contracts обеспечивают качество и соблюдение правил governance. Такой подход поддерживает быструю разработку, поскольку каждый проект остается управляемого размера для контрибьюторов и разработчиков. Контракты на опубликованные модели, используемые между проектами, обеспечивают консистентность интеграционных точек между ними.
Наконец, dbt Cloud предоставляет dbt Explorer — отличный инструмент для каталогизации данных и обмена знаниями о данных организации между разными командами. dbt Explorer служит центральным местом для информации о data pipelines, включая lineage, свежесть данных и качество. Самое важное: dbt Explorer обновляется каждый раз, когда запускаются dbt jobs, поэтому информация всегда актуальна и релевантна.
Какие технологии здесь используются?
Вот что вам нужно со стороны dbt. dbt следует использовать для управления пайплайнами трансформации данных и генерации датасетов, необходимых ML engineers и data scientists, которые поддерживают Snowflake Feature Store. Пользователям dbt Cloud Enterprise стоит использовать dbt Mesh, чтобы создавать разные проекты с понятными владельцами для этих доменов data pipelines. Такая Mesh-архитектура упрощает совместную работу: каждый dbt-проект становится меньше и более управляемым для людей, которые его развивают и поддерживают. dbt также поддерживает трансформации на SQL и Python, что делает его хорошим выбором для AI/ML-воркфлоу, где часто используются оба языка.
Использование dbt для пайплайнов трансформации данных также помогает обеспечить качество и консистентность data products, что критически важно для успешных 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.
Генерация обучающего набора данных
Теперь, когда представление признаков создано, специалисты по данным создают обучающий набор данных, который использует представление признаков. В нашем примере, независимо от того, строит ли специалист по данным модель для обнаружения мошенничества или сегментации, он будет извлекать точные на момент времени признаки для клиента в определенный момент времени, используя метод 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