Среда для разработки функций производственного уровня для моделей машинного обучения. Цель этого блога — предоставить обзор основных концепций Chronon.

Нихил Симха Рапролу

Фон

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

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

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

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

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

Представляем Хронон

Этот пост посвящен API и возможностям Chronon. На высоком уровне к ним относятся:

  • Получение данных из различных источников – потоки событий, таблицы фактов/затухания в хранилище, снимки таблиц, таблицы медленно меняющихся измерений, потоки данных об изменениях и т. д.
  • Преобразование этих данных. Он поддерживает стандартные преобразования, подобные SQL, а также более мощные агрегаты на основе времени.
  • Получение результатов как в сети, так и в автономном режимев сети в качестве конечных точек с малой задержкой для обслуживания функций или в автономном режиме в виде таблиц Hive для проведения обучения. данные.
  • Гибкий выбор для обновления результатов. Вы можете выбрать, будут ли значения функций обновляться в режиме реального времени или через фиксированные интервалы с помощью параметра «Точность». Это также обеспечивает такое же поведение даже при обратной засыпке.
  • Использование мощного Python API, который рассматривает агрегирование и работу с окнами на основе времени как первоклассные концепции, наряду со знакомыми примитивами SQL, такими как Group-By, Join, Select и т. д., сохраняя при этом полную гибкость и возможность компоновки, предлагаемые Питон.

Обзор API

Во-первых, давайте начнем с примера. Фрагмент кода вычисляет количество просмотров элемента пользователем за последние пять часов из ленты активности, применяя при этом некоторые дополнительные преобразования и фильтры. При этом используются такие понятия, как GroupBy, Aggregation, EventSource и т. д.

В следующих разделах мы демистифицируем эти концепции.

Понимание точности

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

Chronon позволяет пользователям указать, нужно ли обновлять производные данные в режиме, близком к реальному времени, или через ежедневные интервалы, устанавливая 'Точность' вычисления, которая может быть 'Временной' или 'Снимок'. В Chronon эта точность применяется как к онлайн-обслуживанию данных через конечные точки с малой задержкой, так и к автономному обратному заполнению с помощью заданий пакетных вычислений.

Понимание источников данных

Данные реального мира постоянно поступают в хранилище данных. Существует три типа моделей приема пищи. В Chronon эти шаблоны приема задаются путем объявления «типа» источника данных.

Источники данных о событиях

Действия с временными метками, такие как просмотры, клики, показания датчиков, курсы акций и т. д., публикуются в потоке данных, таком как Kafka.

В озере данных эти события хранятся в таблицах, разделенных по датам (Hive). Предполагая, что метки времени указаны с точностью до миллисекунды, а прием данных разделен по дате — раздел дат «2023–07–04» событий кликов содержит события кликов, которые произошли между «2023–07–04 00:00:00.000» и «2023–». 07–04 23:59:59,999 '. Пользователи могут настроить раздел даты на основе вашего соглашения о хранилище, один раз глобально, как параметр Spark.

— conf «spark.chronon.partition.column=date_key»

В Chronon вы можете объявить EventSource, указав две вещи: "таблицу" (Hive) и, необязательно, "topic" (Kafka). Chronon может использовать таблицу для заполнения данных с временной точностью. Когда предоставляется "тема", мы можем обновлять хранилище пар "ключ-значение" в режиме реального времени, чтобы предоставлять свежие данные приложениям и моделям машинного обучения.

Источники данных сущностей

Метаданные атрибутов, относящиеся к бизнес-сущностям. Несколько примеров для розничного бизнеса: информация о пользователе — с такими атрибутами, как адрес, страна и т. д., или информация о товаре — с такими атрибутами, как цена, доступное количество и т. д. Эти данные обычно передаются онлайн через базы данных OLTP, такие как MySQL, в приложения. Эти таблицы создаются на складе обычно с интервалом в день. Таким образом, раздел «2023–07–04» содержит снимок таблицы информации об элементе, сделанный в «2023–07–04 23:59:59.999».

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

Вы можете создать источник сущности, указав три вещи: 'snapshotTable' и, при необходимости, 'mutationTable' и 'mutationTopic'для 'Temporal ' точность. Когда вы укажете ‘mutationTopic’ —поток данных с мутациями, соответствующими объекту, Chronon сможет поддерживать обновленное представление в реальном времени, из которого можно будет считывать данные с малой задержкой. Когда вы укажете «mutationTable», Chronon сможет заполнять данные в исторические моменты времени с точностью до миллисекунды.

Совокупные источники событий

Эта модель данных обычно используется для записи истории значений медленно меняющихся измерений. Записи базовой таблицы базы данных только вставляются и никогда не обновляются, за исключением суррогата (SCD2).

Они также сохраняются в хранилище данных с использованием того же механизма, что и источники сущностей. Но поскольку они отслеживают все изменения в моментальном снимке, для выполнения вычислений достаточно только самого последнего раздела. И никакой ‘mutationTable’ не требуется.

В Chronon вы можете указать совокупный источник событий, создав источник событий с 'table' и 'topic', как и раньше, а также включив флаг 'isCumulative. '. "Таблица" — это снимок таблицы онлайн-базы данных, которая обслуживает трафик приложения. "Тема" — это поток данных, содержащий все события вставки.

Понимание контекстов вычислений

Chronon может выполнять вычисления в двух контекстах, онлайн и офлайн, с одним и тем же определением вычислений.

Автономные вычисления выполняются в наборах данных хранилища (таблицах Hive) с использованием пакетных заданий. Эти задания выводят новые наборы данных. Chronon предназначен для работы с изменяющимися наборами данных — новыми данными, поступающими в хранилище в виде разделов таблицы Hive.

В сети используется для обслуживания трафика приложений с низкой задержкой (~ 10 мс) при высоком количестве запросов в секунду. Chronon поддерживает конечные точки, которые обслуживают функции, которые обновляются в режиме реального времени, создавая конвейеры «лямбда-архитектуры». Вы можете установить параметр «online = True» в Python, чтобы включить это.

Под капотом Chronon организует конвейеры с использованием Kafka, Spark/Spark Streaming, Hive, Airflow и настраиваемого хранилища ключей и значений, обеспечивающего питание и генерацию обучающих данных.

Понимание типов вычислений

Все определения хрононов делятся на три категории — GroupBy, Join или StagingQuery.

GroupBy — представляет собой примитив агрегации, аналогичный SQL, со встроенной поддержкой оконных и групповых агрегаций. Это поддерживает вычисления как в онлайн-, так и в офлайн-контекстах, а также в обеих моделях точности — Temporal (обновление в реальном времени) и Snapshot (ежедневное обновление). GroupBy имеет понятие ключей, по которым выполняются агрегации.

Join — объединяет данные из различных вычислений GroupBy. В онлайн-режиме запрос на соединение, содержащий ключи, будет разветвлен на запросы по groupBy и внешним службам, а результаты будут объединены и обработаны в виде карты. В автономном режиме соединения, которые можно рассматривать как список запросов в исторические моменты времени, по которым результаты должны быть вычислены в соответствии с моментом времени. Если левая сторона — Entities, мы всегда вычисляем ответы по состоянию на полночь.

StagingQuery — позволяет выполнять произвольные вычисления, выраженные в виде SQL-запроса Spark, которые ежедневно вычисляются в автономном режиме. Chronon производит секционированные наборы данных. Он лучше всего подходит для предварительной или последующей обработки данных.

Понимание агрегатов

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

  1. Windows. При желании вы можете агрегировать только последние данные в пределах окна времени. Это очень важно для машинного обучения, поскольку агрегаты без окон имеют тенденцию расти и перемещаться в своих распределениях, снижая производительность модели. Также крайне важно уделять больше внимания недавним событиям, а не очень старым событиям.
  2. Группирование. При желании вы также можете указать второй уровень агрегации в сегменте — помимо ключей Group-By. Результатом агрегации с сегментами является столбец типа карты, содержащий столбец сегмента в качестве ключей и агрегаты в качестве значения.
  3. Автораспаковка — если входной столбец содержит данные, вложенные в массив, Chronon автоматически распаковывает.
  4. Агрегации на основе времени — например, first_k, last_k, first, last и т. д., если в источнике данных указана метка времени.

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

Собираем все вместе

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

Наша основная цель состояла в том, чтобы сделать разработку функций максимально продуктивной и масштабируемой. С момента выпуска Chronon пользователи разработали более десяти тысяч функций для моделей машинного обучения в Airbnb.

Спонсоры: Дэйв Нэгл Адам Коколоски Пол Эллвуд Джой Чжан Санджив Катария Мукунд Нарасимхан Джек Сонг Вэйпин Пэн Хайчунь Чен Атул Кале

Соавторы: Варант Заноян Пэньюй Хоу Кристиан Фигероа Хаочжэнь Дин Софи Ван Вамси Ярлагадда Евгений Шапиро Патрик Юн

Партнеры: Навджот Сидху Синь Лю Сорен Телфер Ченг Хуанг Том Беннер Ваэль Махмуд Зак Фейн Бен Мендлер Майкл Сестито Иньхэ Ченг Тяньсян Чен Цзе Тан Остин Чан Лось Абдул Кедар Белларе Миа Чжао Ян Ци Коста Ристовски Лиор Малка Дэвид Стауб Чандрамули Рангараджан Гуан Ян Цзянь Чен