Разработка функций — один из наиболее важных аспектов экосистемы машинного обучения. Он попал в центр внимания в последние пару лет и, вероятно, подорвал слой из более ранних жизненных циклов машинного обучения.
Функция — это атрибуты/пояснительные переменные из данных, которые полезны для обучения и вывода модели ML, полученные на основе опыта бизнеса/предметной области. (например, средний рейтинг продукта). Разработка функций — это процесс получения набора данных и создания независимых переменных — функций, которые можно использовать для обучения модели машинного обучения решению бизнес-задачи. Не буду вдаваться в подробности о функциях, разработке функций, хранилище функций, так как по ним доступно много литературы. Сохраню тему блога, посвященную тому, как упростить проектирование функций с помощью SQL (способ без кода)
Вычисление любой функции является болезненной задачей, поскольку для этого требуется доступ к данным и их извлечение из различных систем, этапы обработки, хранение и экспертные знания в предметной области. Чтобы облегчить этот процесс, сообщества и организации прилагают много усилий. Было разработано множество автоматизированных сред/инструментов для проектирования функций. Но все еще есть много возможностей для улучшения. Два основных аспекта, на которые следует обратить внимание, — это гибкость и скорость.
Потребность часа:
Большинство доступных решений по-прежнему требуют сложного процесса для вычисления любой функции, особенно написания кода для выполнения всех шагов вычисления функции, таких как чтение данных, преобразования и запись обратно в хранилища. Это очень трудоемкая задача. Это становится действительно сложным, когда вы работаете с сотнями вариантов использования машинного обучения, для которых требуется несколько сотен функций. Это добавляет накладные расходы организациям, работающим с данными/машинным обучением, чтобы позаботиться о вычислении функций. Если команда data/ML недоступна, то специалисты по данным в конечном итоге тратят много времени на этот процесс. Таким образом, организации сталкиваются с узкими местами в вычислительных ресурсах, итеративный процесс удлиняется и требует драгоценного времени и ресурсов. Таким образом, разработка функций должна быть достаточно гибкой, чтобы все заинтересованные стороны могли создавать функции на лету в кратчайшие сроки.
SQL (способ без кода):
Здесь SQL приходит нам на помощь. SQL — очень удобный инструмент — с этим согласятся все. Если мы сможем спроектировать наши платформы машинного обучения для определения любой функции с точки зрения SQL, тогда функция может быть создана «на лету» в кратчайшие сроки. SQL-запрос вместе с еще парой конфигураций может служить нашей цели.
Преимущества:
- Меньше усилий и больше интуитивности
- Экономит время
- Любой, кто знает SQL, может создавать функции
- Прототипы более быстрых алгоритмов ML
- Повторное использование существующей функции для создания новых функций
- Повторное использование существующей инфраструктуры для вычислений и хранения
Архитектура
Источники данных:
Источников, в которых хранятся данные, может быть несколько. Очередь сообщений, такая как 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 панелей инструментов:
- Определение функции:
Он предоставляет возможность определить группу функций с точки зрения 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, но только во время самого первого запуска данной группы функций и последующего обновления в метаданных функций.
- Скелет пакетного задания Spark:
2. Spark Streaming Job Skeleation:
Обычно вычисление признаков в реальном времени сопряжено с дополнительными трудностями по сравнению с пакетным вычислением признаков. С этой архитектурой, основанной на sql, сложность значительно снижается. Аналогичный подход (пакетных функций) может быть расширен для него.
Временные представления создаются для потоковых наборов данных, и над ними выполняется SQL.
Расширенные конфигурации Spark.
Невозможно использовать одинаковые конфигурации Spark для всех заданий. Дополнительные конфигурации искровых заданий можно связать с записью группы функций в метаданных.
Таким образом, вычисление функций с помощью SQL делает разработку функций доступной для более широкой аудитории специалистов по обработке данных и может привести к повышению скорости и эффективности. Хотя он не заменяет экспертов в предметной области, он может помочь и сократить время, затрачиваемое на разработку новых функций. Учитывая преимущества производительности, это был бы удобный инструмент для быстрого и автоматизированного проектирования функций.