Обзор

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

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

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

Многие ли из вас испытали нечто подобное? Я уверен, многие!

Проблема «последней мили» - это настоящая борьба во всех сферах. В науке о данных и машинном обучении, возможно, даже больше. Это принцип Парето: 80% работы занимает только 20% времени, последние 20% занимают 80% времени. Если организация плохо структурирована и не желает поддерживать своих специалистов по обработке данных ресурсами, необходимыми для прохождения последних 20%, их проекты в области науки о данных потерпят неудачу. Традиционно специалисты по машинному обучению, особенно из академических кругов, должны либо передать право собственности команде Ops, либо овладеть навыками, необходимыми для написания производственных систем с нуля.

Мы с гордостью можем сказать, что в Depop мы решили эту проблему. Давайте начнем.

Эта проблема

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

Это позволило нам создавать и развертывать различные модели за короткий промежуток времени, начиная от классификации кроссовок и заканчивая обнаружением отсутствия приложений в чатах. Гораздо больше предстоит решить (нам предстоит решить несколько действительно интересных задач!).

Нам нужен был более эффективный способ создания и производства надежных, последовательных и проверяемых «моделей», как раньше:

  • До производства нужно много времени.
  • Вовлекайте в работу много инфраструктуры (Terraform и AWS).
  • Сложно отслеживать и откатывать.
  • Есть проблемы с производительностью и масштабируемостью.

Учитывая нашу инфраструктуру данных и характер приложения, многие алгоритмы, модели и системы машинного обучения можно использовать и развертывать одинаково. В первую очередь мы используем брокер сообщений (RabbitMQ) для всех событий, которые могут обрабатываться асинхронно, с целью почти реального времени. Серверные службы отправляют брокеру события (сообщения на жаргоне RabbitMQ) каждый раз, когда происходит что-то важное (например, создается продукт, изменяется описание и т. Д.). Эти события содержат все данные, которые имеют отношение к последующей обработке.

Все модели следуют одним и тем же принципам:

  • Событие получено из RabbitMQ (тип события определяется ключом маршрутизации).
  • Модель применяется к данным события.
  • Делается прогноз, помещается в событие RabbitMQ и отправляется обратно брокеру для последующего использования другими службами.

У нас также есть некоторые жесткие требования и ограничения:

  • Сериализованная модель имеет значительный размер (›100 МБ для маленьких!), Поэтому мы не хотим, чтобы она была в Git.
  • Должно быть легко настроить и использовать (не работают Terraform / CI / AWS).
  • Модели могут долго загружаться в память и занимать много времени, поэтому нам нужно сделать это только один раз.

… А их у нас очень много!

Решение: «универсальная» служба машинного обучения.

Так родилась идея использовать небольшой сервис Python Celery / Kombu в контейнере с Docker, который загружает модель и обрабатывает определенный тип событий с помощью некоторых функций, предоставляемых пользователем. Большая часть работы, связанной с обработкой всех коммуникаций с брокером, одинакова для всех моделей и учитывается в сервисе.

Таким образом, «универсальная» услуга:

  • Это тонкая оболочка Python, не зависящая от реальной модели.
  • Обрабатывает все коммуникации RabbitMQ.
  • Работает на ECS, что упрощает развертывание и откат.
  • Интегрирует ведение журнала и отслеживание показателей.

Что внутри

Одним из требований для работы «универсальной» службы является наличие файла Python, реализующего интерфейс, и файла манифеста.

Файл манифеста содержит информацию о текущей версии модели и особенностях RabbitMQ. Мы используем небольшую собственную библиотеку для настройки задачи сельдерея: https://github.com/depop/celery-message-consumer

Файл интерфейса представляет собой набор функций Python, инструктирующих службу, как загружать и использовать модель. Он должен включать в себя 3 функции:

preprocess_event

Функция preprocess_even t принимает событие (объект JSON) в качестве входных данных, обрабатывает событие и возвращает только необходимую информацию.

apply_model

Функция apply_model принимает предварительно обработанное событие, а также модель в качестве входных данных и возвращает прогноз.

load_model_into_memory

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

Репозиторий моделей

Как упоминалось ранее, мы не хотим использовать Git для хранения моделей машинного обучения. Очевидный выбор с учетом нашего технологического стека - AWS S3.

Конвейер развертывания:

Мы развертываем код оболочки для каждой из моделей в S3 вместе с бинарными моделями. Код оболочки для каждой модели отслеживается в репозитории git. Каждая модель версирована. Это проверяется конвейером Jenkins, отвечающим за объединение кода и сериализованной модели, чтобы убедиться, что версия верна и присутствуют все файлы и функции.

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

Сквозной рабочий процесс

Описанное решение позволило нам оптимизировать способ работы с моделями машинного обучения, и в результате это наш рабочий процесс:

Короче говоря, специалисту по данным или инженеру необходимо:

  1. Поместите сериализованную модель в корзину S3 репозитория моделей в папку WIP /.
  2. Запустите конвейер репозитория модели, который затем объединяет сериализованную модель и ее код оболочки, запускает тесты и, если они проходят, помещает все в корзину репозитория модели в папку с версионным выпуском.
  3. Запустите общий конвейер службы машинного обучения, который объединяет каталог модели и шаблон службы в контейнере докера, чтобы отправить его в ECS (то есть в производство).

Вуаля! Теперь у нас есть красивый ML-сервис с автоматическим масштабированием, потреблением событий и автоматическим выводом метки, предсказанной обратно в RabbitMQ.

Будущие улучшения

Что касается всего, что мы делаем, мы хотим продолжать улучшать наши модельные услуги и возможности развертывания. Вот несколько примеров того, что у нас есть в наличии:

  • Несколько встроенных моделей.
  • Несколько входов и выходов
  • Создание уровня REST API поверх абстракции RabbitMQ.

Мы также планируем миграцию на Kubernetes вместо ECS, поскольку масштабирование с помощью ECS сложно, поскольку мы узнали и говорили об этом!

Заключение

Нам удалось сократить время, необходимое для производства моделей машинного обучения, с месяцев до одного дня. Другими словами, это успех!

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

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

Скоро вы увидите результаты в приложении и, надеюсь, оцените их!

А пока сохраняйте спокойствие и продолжайте делать покупки!

Мы нанимаем!

Вы можете проверить наши открытые роли здесь и подписаться на нашу страницу в LinkedIn. Если у вас есть опыт в области машинного обучения, но вы не видите, что вам подходит, или просто хотите зайти в наши офисы, чтобы поболтать и устроить экскурсию, свяжитесь с нами: [email protected]