Авторы: Ритеш Агравал, Брэндон Ли

В Varo наша миссия - помочь миллионам американцев достичь финансового благополучия, построив банк для всех нас. Мы инвестируем в создание платформы AI / ML Varo для создания, обучения и развертывания моделей. Хотя машинное обучение (ML) включает математику и алгоритмы, это не менее сложная инженерная и операционная проблема. Запуск моделей машинного обучения в производство требует, чтобы многие компоненты работали синхронно. Ядром этой головоломки является магазин функций. Хранилище функций отвечает за предоставление входных данных для обученной модели во время обучения и производства. В этом посте объясняется необходимость магазина функций, а также наш дизайн и его реализация.

Почему магазин функций

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

1. Transaction time
2. Transaction amount
3. Vendor age, i.e. how long the vendor existed
4. Customer age, i.e. how long the customer has been associated with   
   the bank
5. Median 28-day account balance
6. Distance between user home address and transaction address
7. Customer transaction history

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

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

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

Дизайн магазина функций

Выше представлена ​​высокоуровневая диаграмма архитектуры нашего магазина функций. Наша реализация основана на архитектуре обработки лямбда-данных. Лямбда-архитектура использует различные системы для обработки интерактивных и пакетных функций. Кроме того, мы используем Kafka для предоставления системы издателя и подписчика для создания слабосвязанных модулей.

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

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

Вышеупомянутая система предназначена для поддержки онлайн-моделей в реальном времени и, как таковая, использует простую схему поиска и поддерживает только текущее состояние функции. Однако историческое состояние этих функций имеет решающее значение для целей обучения и отладки. Таким образом, хранилище функций использует Debezium в Kafka, систему отслеживания измененных данных (CDC), чтобы передавать все изменения обратно в наше озеро данных. Все изменения обрабатываются и преобразуются в чистую таблицу, которую наш специалист по данным может использовать для обучения модели и целей отладки.

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

Уроки выучены:

Факты против характеристик. Термин «функция» означает разные вещи для разных команд. С точки зрения бизнес-команды, функции - это факты или атрибуты, такие как демографические данные пользователя, характеристики устройства и т. Д. С точки зрения машинного обучения функции - это конкретные числовые представления, вычисленные путем применения преобразований к указанным выше атрибутам. В нашем случае хранилище функций занимается хранением атрибутов, а не преобразований по нескольким причинам. Во-первых, один атрибут, например код страны, может быть преобразован во множество различных функций путем применения различных преобразований, таких как одноразовое кодирование или целевое кодирование. Хранение различных преобразований одного и того же атрибута не занимает много места. Во-вторых, применение преобразований на уровне хранилища функций нарушает принцип инкапсуляции. Преобразования являются частью процесса разработки модели, поэтому имеет смысл сериализовать преобразования вместе с параметрами модели.

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

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

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