В Netflix наша цель - предугадать, что вы хотите посмотреть, прежде чем смотреть это. Для этого мы ежедневно запускаем большое количество рабочих процессов машинного обучения (ML). Чтобы поддерживать создание этих рабочих процессов и эффективно использовать ресурсы, мы создали Meson.

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

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

Питание конвейеров машинного обучения

Spark, MLlib, Python, R и Docker играют важную роль в нескольких конвейерах машинного обучения текущего поколения в Netflix.

Давайте посмотрим на типичный конвейер машинного обучения, который управляет видео-рекомендациями, а также на то, как он представлен и обрабатывается в Meson.

Рабочий процесс включает:

  • Выбор группы пользователей - это выполняется с помощью запроса Hive для выбора когорты для анализа.
  • Очистка / подготовка данных - сценарий Python, который создает 2 группы пользователей для обеспечения параллельных путей
  • В параллельных путях один использует Spark для построения и анализа глобальной модели с HDFS в качестве временного хранилища.
    Другой использует R для построения моделей для конкретного региона (страны). Количество регионов меняется в зависимости от когорты, выбранной для анализа. Шаги построения региональной модели и проверки региональной модели на схеме повторяются для каждого региона (страны), расширяются во время выполнения и выполняются с другим набором параметров, как показано ниже.
  • Проверка - код Scala, проверяющий стабильность моделей при схождении двух путей. На этом шаге мы также возвращаемся и повторяем весь процесс, если модель нестабильна.
  • Опубликуйте новую модель - запустите контейнер Docker, чтобы опубликовать новую модель, которую будут использовать другие производственные системы.

На приведенном выше рисунке показано выполнение описанного выше рабочего процесса.

  • Выбор, установленный пользователем, и очистка данных завершены, как показано этапами, отмеченными зеленым цветом.
  • Идут параллельные пути
  • Ветка Spark завершила создание модели и проверку.
  • Для каждой ветви запущено 4 различных региональных модели, и все они находятся в стадии разработки (желтые).
  • Шаг Scala для выбора модели активирован (синий). Это указывает на то, что одна или несколько входящих ветвей завершены, но они все еще не запланированы для выполнения, потому что есть входящие ветки, которые либо (а) не запущены, либо (б) находятся в процессе
  • Контекст и параметры среды выполнения передаются по рабочему процессу для принятия бизнес-решений.

Под капотом

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

Планировщик мезонов

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

Когда шаг готов к планированию, планировщик Meson выбирает правильное предложение ресурсов из Mesos и отправляет задачу мастеру Meson.

Мезон-исполнитель

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

После того, как Mesos планирует задачу Meson, она запускает программу-исполнитель Meson на ведомом устройстве после загрузки всех зависимостей задач. Пока выполняется основная задача, исполнитель выполняет домашние дела, такие как отправка пульса, процента выполнения, сообщений о состоянии и т. Д.

DSL

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

val getUsers = Step("Get Users", ...)
val wrangleData = Step("Wrangle Data", ...)
...
val regionSplit = Step("For Each Region", ...)
val regionJoin = Step("End For Each", ...)
val regions = Seq("US", "Canada", "UK_Ireland", "LatAm", ...)
val wf = start -> getUsers -> wrangleData ==> (
  trainGlobalModel -> validateGlobalModel,
  regionSplit **(reg = regions) --< (trainRegModel, validateRegModel) >-- regionJoin
) >== selectModel -> validateModel -> end
// If verbs are preferred over operators
val wf = sequence(start, getUsers, wrangleData) parallel {
  sequence(trainGlobalModel, validateGlobalModel)
  sequence(regionSplit,
           forEach(reg = regions) sequence(trainRegModel, validateRegModel) forEach,
           regionJoin)
} parallel sequence(selectModel, validateModel, end)

Архитектура расширения

Meson создавался с нуля, чтобы его можно было расширять, чтобы упростить добавление пользовательских шагов и расширений. Spark Submit Step, Hive Query Step, специальные расширения Netflix, которые позволяют нам обращаться к микросервисам или другим системам, таким как Cassandra, являются некоторыми примерами.

В приведенном выше рабочем процессе мы создали специальное расширение Netflix для вызова нашей среды выполнения Docker, которая позволяет разработчикам указывать минимальные параметры для своих образов Docker. Расширение обрабатывает все коммуникации, такие как получение всех URL-адресов состояния, сообщения журнала и мониторинг состояния процесса Docker.

Артефакты

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

Мезо Мастер / Подчиненный

Mesos используется для планирования ресурсов с Meson, зарегистрированным в качестве базовой платформы. Пользовательские исполнители Mesos развернуты на подчиненных серверах. Они отвечают за загрузку всех jar-файлов и настраиваемых артефактов, а также отправку сообщений / контекста / пульса обратно в планировщик Meson. Задания Spark, отправленные из Meson, используют одни и те же ведомые устройства Mesos для выполнения задач, запускаемых заданием Spark.

Встроенная поддержка Spark

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

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

ML конструкции

По мере роста популярности Meson возник класс крупномасштабных проблем распараллеливания, таких как поиск параметров, сложные бутстрапы и перекрестная проверка.

Meson предлагает простую конструкцию «for-loop», которая позволяет специалистам по данным и исследователям выражать развертки параметров, позволяя им запускать десятки тысяч контейнеров докеров для значений параметров. Пользователи этой конструкции могут отслеживать прогресс по тысячам задач в режиме реального времени, находить невыполненные задачи через пользовательский интерфейс и передавать журналы в одно место в Meson, что упрощает управление такими параллельными задачами.

Скриншоты

Вот несколько скриншотов пользовательского интерфейса Meson:

А вот пара интересных рабочих процессов в продакшене:

Заключение

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

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

- Энтони Арокиасами, Кедар Садекар, Раджу Уппалапати, Сатиш Шридхаран, Прасанна Падманабхан, Прашант Рагхаван, Фейсал Закария Сиддики, Эллиот Чоу и у человека нет linkedin (он же Дэвис Шеперд) для команды Meson

Первоначально опубликовано на сайте techblog.netflix.com 31 мая 2016 г.