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

Теодор Мейнард (Theodore Meynard) — старший специалист по данным в группе рекомендаций и релевантности. Наша рекомендательная система помогает клиентам найти мероприятия, наиболее соответствующие их потребностям, и дополнить те, которые они уже забронировали.

Теодор рассказывает, как он и бэкэнд-инженер Жан Карло Мачадо построили современный конвейер непрерывной интеграции/непрерывного развертывания (CI/CD) для использования во всех наших сервисах машинного обучения. Они использовали Jinja для шаблонов, pre-commit для автоматических проверок, Drone CI для непрерывной интеграции и задания Databricks для обучения. Специалист по данным также объясняет, как мы управляем нашими моделями с помощью MLflow и как мы можем организовать рабочий процесс с помощью Apache Airflow.

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

Мы также представили нашу работу на встрече Pydata Berlin — сборе пользователей и разработчиков экосистемы Python в Берлине. Посмотрите полное видео здесь:

Встреча Pydata в Берлине, февраль 2021 г.: основа нашей платформы машинного обучения на GetYourGuide

Инфраструктура до проекта

Команда Продукты данных прошла долгий путь с момента своего основания в 2016 году. В то время как сложность и охват наших моделей росли, наш процесс развертывания отставал. Оркестровка обучения и логического вывода наших моделей осуществляется с помощью Apache Airflow. Вычисления выполняются на Databricks, где мы использовали задания для создания набора данных, обучения наших моделей и выполнения наших пакетных прогнозов. Однако код наших моделей в производстве был на Github, но его необходимо импортировать в Databricks. До того, как мы построили нашу платформу, лучшей практикой было обернуть код в пакет Python, построить колесо и отправить его на S3. Наконец, мы установили пакет в кластер перед запуском задания обучения, а затем сохранили модели или прогнозы в S3.

Вот диаграмма высокого уровня:

Узнайте больше о том, как мы теперь управляем нашим конвейером ETL в Databricks, в статьях Как мы создали наш новый современный конвейер ETL, часть 1 и часть 2.

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

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

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

Принципы и мотивация платформы

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

Узнайте больше о том, как мы подходим к науке о данных, из статьи 15 принципов науки о данных, которыми мы живем.

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

Во всех наших проектах мы стремимся:

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

Если вы хотите узнать больше о том, как мы структурируем наши команды с использованием данных, ознакомьтесь с разделом Общие сведения о продуктах данных и их четырех уровнях владения

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

Дизайн: закладка основы нашей платформы машинного обучения

Основание можно объяснить двумя этапами:

  1. Принципы разработки программного обеспечения — сбор всех передовых методов разработки в шаблоне
  2. Уточнение, связанное с машинным обучением. Демонстрация того, как мы использовали MLflow и докер-контейнеры, чтобы сделать наш запуск воспроизводимым, простым для понимания и развертывания.

Вот схема высокого уровня:

а) Принципы разработки программного обеспечения

Мы создали шаблон со всеми лучшими инженерными практиками для проекта Python с помощью нашей Команды поддержки разработчиков.

Этот шаг начальной загрузки автоматически создает репозитории в Github, настраивает конвейер тестирования в Drone CI и создает необходимую инфраструктуру в Amazon Web Service.

Шаблон также включает предварительную настройку для проверки соответствия кода стандарту перед фиксацией путем запуска проверок git hooks.

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

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

б) Уточнение машинного обучения

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

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

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

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

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

Заключение

К настоящему моменту вы уже знаете, как мы начали создавать основу для нашей платформы машинного обучения, используя инструменты с открытым исходным кодом. Вместо того, чтобы каждый раз изобретать велосипед, мы хотели развернуть новый сервис: мы создали шаблон. Шаблон позволяет нам быстро создать новый сервис с конвейером CI/CD, гарантируя, что мы сможем воспроизвести наше обучение и зафиксировать результаты на информационной панели. У нас есть рабочий конвейер, который может запускать производство, и мы можем сосредоточиться на нашей основной работе: создании продуктов данных, чтобы помочь людям получить невероятные впечатления.

Если вы хотите присоединиться к нашей команде инженеров, ознакомьтесь с нашими открытыми вакансиями.