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

Функция — это атрибуты/пояснительные переменные из данных, которые полезны для обучения и вывода модели ML, полученные на основе опыта бизнеса/предметной области. (например, средний рейтинг продукта). Разработка функций — это процесс получения набора данных и создания независимых переменных — функций, которые можно использовать для обучения модели машинного обучения решению бизнес-задачи. Не буду вдаваться в подробности о функциях, разработке функций, хранилище функций, так как по ним доступно много литературы. Сохраню тему блога, посвященную тому, как упростить проектирование функций с помощью SQL (способ без кода)

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

Потребность часа:

Большинство доступных решений по-прежнему требуют сложного процесса для вычисления любой функции, особенно написания кода для выполнения всех шагов вычисления функции, таких как чтение данных, преобразования и запись обратно в хранилища. Это очень трудоемкая задача. Это становится действительно сложным, когда вы работаете с сотнями вариантов использования машинного обучения, для которых требуется несколько сотен функций. Это добавляет накладные расходы организациям, работающим с данными/машинным обучением, чтобы позаботиться о вычислении функций. Если команда data/ML недоступна, то специалисты по данным в конечном итоге тратят много времени на этот процесс. Таким образом, организации сталкиваются с узкими местами в вычислительных ресурсах, итеративный процесс удлиняется и требует драгоценного времени и ресурсов. Таким образом, разработка функций должна быть достаточно гибкой, чтобы все заинтересованные стороны могли создавать функции на лету в кратчайшие сроки.

SQL (способ без кода):

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

Преимущества:

  1. Меньше усилий и больше интуитивности
  2. Экономит время
  3. Любой, кто знает SQL, может создавать функции
  4. Прототипы более быстрых алгоритмов ML
  5. Повторное использование существующей функции для создания новых функций
  6. Повторное использование существующей инфраструктуры для вычислений и хранения

Архитектура

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

Источников, в которых хранятся данные, может быть несколько. Очередь сообщений, такая как Kafka, содержит потоковые данные, и в ней вычисляются функции реального времени. Hive/S3 содержит пакетные данные, предварительно агрегированные данные, выходные данные заданий ETL и т. д. Данные, которые обслуживают запросы о путешествиях во времени (например, изменение цены продукта за неделю до и сейчас), могут присутствовать в таких магазинах, как Apache Hudi и т. д.

Функциональные магазины:

Вычисляемые функции хранятся в хранилищах функций в зависимости от их типа. Функция реального времени сохраняется в хранилищах функций реального времени (работает на Redis и т. д.). Пакетные функции сохраняются в пакетных хранилищах (Hive/S3 и т. д.). Моделирование машинного обучения считывает функции из этого хранилища для обучения и обслуживания моделей. Большинство организаций используют аналогичную архитектуру для хранилищ функций.

Здесь был добавлен один дополнительный компонент — Метаданные функций. Он будет содержать метаданные о группе функций. Группа функций — это логическая группа функций, здесь этот набор функций вычисляется одним и тем же SQL-запросом. Он содержит следующие детали для данной группы функций:

  • feature_group_id
  • feature_group_name
  • версия
  • функции: массив feature_name
  • features_type: массив значений типов данных функций
  • features_defaults: массив значений по умолчанию
  • sql_query: запрос для вычисления заданного набора функций
  • source_details: сведения об источнике данных в формате json.
  • execution_frequency: частота планирования для вычисления этой функции. например. «ежедневно», «0 * * * *» и т. д.
  • upstream_dependencies: список групп функций, которые можно использовать повторно.

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

Особенности инженерных компонентов:

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

Панель функций:

Он состоит в основном из следующих 2 панелей инструментов:

  1. Определение функции:

Он предоставляет возможность определить группу функций с точки зрения SQL вместе с такими деталями, как имя группы функций, источник, частота планирования, функции (необязательно), feature_type (необязательно), feature_defaults (необязательно), версия (необязательно).

  • features, features_type, features_defaults являются необязательными конфигурациями. Если они не указаны, они выводятся из выполнения запроса.
  • Для функций в реальном времени параметр scheduling_frequency равен «в реальном времени».
  • Некоторые атрибуты, такие как сегодняшняя дата (сегодня), текущее_время и т. д., доступны для использования в запросе.

Пример конфигурации:

  • Также некоторые функции требуют преобразования, такие как категориальное кодирование, векторизация функций, бинаризация меток и т. Д. Такие функции обслуживаются библиотекой Hivemall через тот же интерфейс sql.
  • Каждая группа функций связана с версией (обозначается номером). С помощью версии можно создать несколько экземпляров одной и той же группы функций. Если он не указан изначально, он генерируется автоматически и является автоматически инкрементным.
  • Существующие функции можно повторно использовать для создания новых функций (в данном случае источником данных является само хранилище функций). Зависимые функции могут быть упомянуты в разделе «upstream_dependencies», которые позаботятся о порядке выполнения функций.

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

Веб сервер:

Это сервер, написанный на python flask, который соединяет панель пользовательского интерфейса с компонентами обработки и хранилищем метаданных функций через конечные точки http.

  • Он взаимодействует с хранилищем метаданных функций, чтобы активировать функции обнаружения функций.
  • Для запросов определения группы функций он обновляет метаданные функций, создает задачу воздушного потока и добавляет ее в даги воздушного потока (созданные на основе частоты планирования) с использованием API-интерфейсов Airflow python.
  • В случае групп функций реального времени они напрямую отправляются в вычислительный кластер с помощью команд bash или службы супервизора unix. В случае изменения группы функций эти задания искровой потоковой передачи автоматически перезапускаются с измененной конфигурацией. Идентификатор группы функций (ссылка на запись группы в метаданных) передается в качестве аргумента приложения для запуска задания.

Расход воздуха:

Airflow, планировщик рабочего процесса, состоит из DAG (направленный ациклический граф), который представляет собой набор задач, отражающих их отношения и зависимости.

  • Каждая группа функций будет соответствовать одной задаче в DAG.
  • Группы обеспечения доступности баз данных создаются на основе частоты выполнения заданий. Hourly DAG содержит все группы функций, вычисляемые на почасовой основе. Несколько DAG могут быть созданы на основе частоты, например. 5_minute_DAG, 15_minute_DAG, ежечасно, ежедневно и т. д.
  • Типичная конфигурация воздушного потока для групп функций (искровые пакетные задания):
  • Идентификатор группы функций (ссылка на запись группы в метаданных) передается в качестве аргумента приложения для запуска задания.

Спарк Джобс:

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

  • Задания Spark (пакетные + потоковая передача) поддерживают чтение входных данных из различных источников входных данных, таких как Kafka, Hive, S3, Hudi, Feature Stores и т. д. При необходимости можно добавлять новые источники данных.
  • Функции вычисляются и сохраняются в соответствующем хранилище функций.
  • Эти задания можно выполнять в кластере пряжи Hadoop, Aws EMR, Kubernetes и т. д.
  • Можно использовать различные функции sql из кустовых, искровых и пользовательских библиотек. Пользовательские библиотеки состоят из функций/UDF для бизнес-применений, и их можно повторно использовать в разных группах функций.
  • Кроме того, Hivemall используется для поддержки многих функций обработки данных. Hivemall — это набор алгоритмов машинного обучения и универсальных функций анализа данных. Он предоставляет ряд простых в использовании функций машинного обучения через интерфейс Apache Hive UDF/UDAF/UDTF. Список поддерживаемых функций можно найти здесь.
  • Если необязательная конфигурация группы функций не предоставлена ​​пользователем, то же самое предполагается после выполнения sql группы функций в задании Spark, но только во время самого первого запуска данной группы функций и последующего обновления в метаданных функций.
  1. Скелет пакетного задания Spark:

2. Spark Streaming Job Skeleation:
Обычно вычисление признаков в реальном времени сопряжено с дополнительными трудностями по сравнению с пакетным вычислением признаков. С этой архитектурой, основанной на sql, сложность значительно снижается. Аналогичный подход (пакетных функций) может быть расширен для него.
Временные представления создаются для потоковых наборов данных, и над ними выполняется SQL.

Расширенные конфигурации Spark.
Невозможно использовать одинаковые конфигурации Spark для всех заданий. Дополнительные конфигурации искровых заданий можно связать с записью группы функций в метаданных.

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