Машинное обучение превратилось в модный термин, но при работе с большими объёмами данных оно уже много лет является жизненной необходимостью. Яндекс обрабатывает более 200 миллионов запросов ежедневно! Когда-то в интернете было так мало сайтов, что наилучшие из них помещались в каталог, а теперь за релевантность ссылок на страницы в выдаче отвечают сложные формулы, обучающиеся на новых и новых данных. Задача ложится на так называемые конвейеры, регулярные процессы, обучающие и контролирующие эти формулы.

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



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

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

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

Как появилась Нирвана


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

Сервис FML (Friendly Machine Learning) в свое время стал большим шагом в автоматизации и упрощении — он поставил работу с машинным обучением на поток. FML открыл простой доступ к инструментам конфигурации параметров обучения, анализа результатов и управления аппаратными ресурсами для распределённого запуска на кластере.

Но раз пользователи получили FML как готовый инструмент, значит, любые доработки интерфейса и разработка нововведений легли на плечи команды. Сначала казалось, что это удобно — мы добавляем в FML только нужные фичи, следим за релизным циклом, погружаемся в предметную область пользователей и делаем действительно дружелюбный сервис.

Но вместе с этими достоинствами мы получили плохую масштабируемость разработки. Поток заказов на доработки и улучшения форм FML превысил все наши ожидания — а чтобы сделать всё и быстро, пришлось бы расширять команду безгранично.

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

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

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

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

Нирвана не только сделала машинное обучение доступнее, она стала местом встречи: менеджер создает проект, зовет разработчика, затем разработчик собирает процесс и запускает его, а после множества запусков, за которыми наблюдает менеджер, аналитик приходит, чтобы разобраться в результатах. Нирвана позволила переиспользовать операции (или целые графы!), созданные и поддерживаемые другими пользователями, чтобы не приходилось делать двойную работу. Графы бывают очень разными: от нескольких блоков до нескольких тысяч операций и объектов данных. Их можно собирать в графическом интерфейсе (скриншот будет в конце статьи) или с помощью сервисов API.

Как устроена Нирвана


В Нирване есть три больших раздела: Проекты (крупные бизнес-задачи или группы, которыми ребята пилят общие задачи), Операции (библиотека готовых компонентов и возможность создать новый), Данные (библиотека всех загруженных в Нирвану объектов и возможность загрузить новый).

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

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

А потом перейдем к скриншоту интерфейса и примерам из жизни.


Сначала пользователи обычно приходят в графический интерфейс Нирваны (single page application), со временем постоянные процессы многие переносят на сервисы API. В целом Нирване безразлично, каким интерфейсом пользуются, графы запускаются одинаковые. Но чем больше продакшн-процессов переносят в Нирвану, тем заметнее, что через API запускается большинство графов. UI остается для экспериментов и первичной настройки, а также для изменений по необходимости.

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

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



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

Процессор по отношению к Нирване играет роль внешнего сервиса, реализующего заданный API — поэтому можно написать свой процессор, не внося правок ни в Нирвану, ни в уже существующие процессоры. Есть три основных метода: запуск, остановка и получение статуса задачи. Нирвана (а точнее — Workflow Processor), убедившись, что все входящие зависимости операции на графе готовы, отправляет запрос на запуск в указанный в задаче процессор, передаёт конфигурацию и ссылки на входные данные. Мы периодически запрашиваем статус выполнения и в случае готовности переходим далее по зависимостям.

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

Кроме того, приложение при необходимости может быть запущено на нескольких серверах в распределенном режиме (именно так работает Матрикснет). Пользователю достаточно загрузить исполняемый файл, указать командную строчку для запуска и требуемые объёмы вычислительных ресурсов. Всё остальное платформа берёт на себя.



Ещё одним ключевым компонентом Нирваны является key-value хранилище, в котором хранятся как результаты операций, так и загруженные исполняемые файлы или другие ресурсы. Мы заложили в архитектуру Нирваны возможность работать сразу с несколькими локациями и реализациями хранилища, что позволяет улучшать эффективность и структуру хранения данных, а также проводить необходимые миграции, не прерывая процессы пользователей. За время работы платформы мы успели пожить с файловой системой CEPH и с нашей технологией MapReduce-a и хранения данных YT, в конце концов переехали в MDS, ещё одно внутреннее хранилище.

У любой системы хранения есть ограничения. В первую очередь – это максимальный объём хранимых данных. При постоянном росте количества пользователей Нирваны и процессов мы рискуем заполнить любое, даже самое большое хранилище. Но мы считаем, что большинство данных в системе являются временными, а значит, их можно удалить. Благодаря известной структуре эксперимента тот или иной результат можно получить заново, перезапустив соответствующий граф. А если какой-то объект данных нужен пользователю вечно, он может целенаправленно сохранить его в хранилище Нирваны с бесконечным TTL, чтобы защитить от удаления. У нас есть система квот, позволяющая делить хранилище между разными бизнес-задачами.

Как выглядит и для чего полезна Нирвана


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



Для чего сервисы и разработчики Яндекса используют Нирвану? Вот несколько примеров.

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

2. Команда Погоды использует Нирвану для ML-задач. Из-за сезонной изменчивости предсказываемых значений необходимо постоянно переобучать модель, добавляя в обучающую выборку самые актуальные данные. В Нирване есть граф, который в автоматическом режиме клонирует себя через API и перезапускает новые версии на свежих данных, чтобы пересчитывать и регулярно обновлять модель.

Погода также собирает в Нирване эксперименты по улучшению текущего продакшн-решения, тестирует новые фичи, сравнивает между собой ML-алгоритмы, подбирая нужные настройки. Нирвана гарантирует воспроизводимость экспериментов, предоставляет мощности для проведения объемных вычислений, умеет работать с другими внутренними и внешними продуктами (YT, CatBoost и т.д.), избавляет от необходимости локальной установки фреймворков.

3. Команда компьютерного зрения с помощью Нирваны может провести перебор гиперпараметров нейронной сети, запустив сотню копий графа с разными параметрами — и выбрать наилучшие из них. Благодаря Нирване новый классификатор для любой задачи при необходимости создаётся «по кнопке» без помощи специалистов по компьютерному зрению.

4. Команда Справочника проводит через Толоку и асессоров тысячи оценок в день, используя Нирвану для автоматизации этого конвейера. Например, так фильтруются фотографии к организациям, идет сбор новых через мобильную Толоку. Нирвана помогает кластеризовать организации (находить дубли и склеивать их). А главное — строить автоматические процессы для совсем новых оценок можно буквально за часы.

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

Обсудим?


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

Комментарии (29)


  1. horevivan
    12.03.2018 20:57

    Давно, мечтаю о таком же UI. Но пока всё делаю веб-сервисами и ручками запускаю. Поиск, предиктивная аналитика, рендеринг иконок в различные форматы.

    Пытался пустить данные и вычисления через Azure Machine Learning (как на картинке), но этот инструмент больше заточен под машинное обучение. К тому же JSON понимает не «из коробки».

    Спросил ребят на Open Data Science, мне посоветовали только локальные решения. Из чего я сделал вывод, что облачных решений пока нема, а тут такая манящая статья…

    С нетерпением ждём выхода в свет. Как насчёт бета-теста?


    1. Craby
      13.03.2018 11:33

      Спасибо за комментарий!

      Azure Machine Learning действительно близок по духу к Нирване, хоть и более узкоспециализированный.

      Как уже ниже написала readysteady, мы хотим понять на сколько востребован может быть такой продукт для внешних пользователей. Если все сложиться удачно, то можно будет думать и о бета-тесте :)


  1. Hixon10
    12.03.2018 23:10

    Привет! Спасибо за рассказ!

    1) А можете, пожалуйста, рассказать, как вы распараллеливаете Job-ы? То есть, вот есть у меня какой-то алгоритм. Как я понимаю, я должен запрограммировать его на каком-то языке и собрать в бинарник (наверное, положить в Докер). Всё, что вы сделаете — это запустите несколько инстансов моего контейнера? Или как-то более хитро сможете расспараллелить задачу?

    2) А кто и где хостит Процессоры? Я, как пользователь вашего продукта, должен сам задеплоить свой Процессор в частном/публичном облаке? И с скалабилити я тоже должен сам бороться? Или я опять-таки могу завернуть свой Процессор в Докер, дать вам, и вы сами будете подымать и опускать инстансы?


    1. onlinehead
      13.03.2018 01:05

      * Я не разработчик Нирваны и никогда не пользовался ей, но у меня есть определенный опыт с некоторыми системами параллельного запуска задач *
      1) Любой по-настоящему параллельный алгоритм позволяет принимать в себя часть данных, обсчитывать их и в дальнейшем объединять для следующего шага. В целом, MapReduce, допустим, работает именно так. То есть да, обычно запускается несколько экземпляров приложения, получающих на вход определенную часть из данных, которую необходимо обработать. Распределить входящие данные и собрать результат обычно проблемы платформы, а не приложения, в этом ее цель. Более хитрое распрделение вряд ли возможно, ну и в любом случае оно ограничено самим алгоритмом, магии тут нет. А что за алгоритм будет запускаться внури и какие сервисы он будет использовать — проблема программиста алгоритма и, частично, проблема платформы.
      2) Учитывая ремарку про «полную изоляцию и выделенные ресурсы», job-процессор вероятно и есть контейнер. В этом случае с очень высокой степенью вероятности все будет происходить только в рамках инфраструктуры Я и их облака. Кстати, если модель оплаты будет похожа на Google Bigtables — было бы интересно.
      P.S. По описанию Нирвана похожа на Google Cloud Job Discovery, который сейчас в закрытом тестировании. Приятно что Я делает вещи мирового уровня.


    1. Craby
      13.03.2018 11:25

      1) А можете, пожалуйста, рассказать, как вы распараллеливаете Job-ы?

      Сама Нирвана не занимается распараллеливанием процессов. Это зона ответственности процессоров. Job Processor, например, умеет запускать задачи в режиме master-slave.

      Единственная параллельность на уровне Нирваны – это выполнение параллельных веток графа.

      2) А кто и где хостит Процессоры?

      Процессор для Нирваны — это просто web-сервис, реализующий необходимое REST-API. Так что в принципе, он может хоститьсягде угодно. Но в основном они развернуты на нашем внутреннем хостинге (Qloud).


  1. horevivan
    12.03.2018 23:25

    Давно, мечтаю о таком же UI. Но пока всё делаю веб-сервисами и ручками запускаю. Поиск, предиктивная аналитика, рендеринг иконок в различные форматы.

    Пытался пустить данные через Azure Machine Learning (как на картинке), но этот инструмент больше заточен под машинное обучение. К тому же JSON понимает не «из коробки».

    Спросил ребят на Open Data Science? мне посоветовали только локальные решения. Из чего я сделал вывод, что облачных решений пока нема, а тут такая манящая статья…

    С нетерпением ждём выхода в свет. Как насчёт бета-теста?


    1. horevivan
      13.03.2018 03:10

      Извиняюсь за дубликат сообщения, даже не понял как создал его.


  1. kirillkosolapov
    12.03.2018 23:57

    Интересно, для каких задач кроме описанных в статье может быть использован данный инструмент?


    1. Craby
      13.03.2018 11:36

      Если честно, то круг задач довольно широк. навскидку, можно использовать инструмент как систему сборки. Почему нет?


    1. kuzin_mv
      13.03.2018 18:23

      Не уверен на счет нирваны, лет пять назад делали продобный велосипед проект (DSL для описания task-ов, проектов в терминах нирваны, видимо и job-ов и даже была попытка графически визуализировать дерево, но забили на это). Но там имелась возможность не только запускать процессы обработки и передачи данных, но и управляющие команды, флоу основной задачи был примерно такой:

      1 Просмотр внешних источников данных
      2 Если есть конвертация, каждый источник свой конвертер в общий формат
      3 Загрузка в Mongo(остановка репликации/запуск репликации (не помню деталей уже))
      4 Запуск процедур индексации (полной/инкрементной) полнотекстового поиска по загруженным данным
      5 Регенерация сайтмап для поисковых роботов
      6 проверка отказов на каждом шаге уведомление по почте об сбоях
      7 отложенный запуск через N минут или через K если был обнаружен сбой

      Были так же менее сложные задачи, имелась возможность создавать вложенные задачи условные запуски job-ов, обработка отказов. Контекст исполнения и данные хранились в Mongo, не было серьезных требований по количеству/объемам так как не открытая платформа была, а так для себэ.


  1. mickvav
    13.03.2018 08:42

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


    1. readysteady Автор
      13.03.2018 10:33
      +1

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

      Мы ведь и без этой статьи обсуждаем внутренние инструменты публично: на собеседованиях, на конференциях, в кругу ML-увлеченных коллег из других компаний (настолько подробно, насколько нам позволяет NDA).

      И в конце статьи мы написали, что в числе прочего нам интересно:
      — есть ли у широкого круга читателей опыт по работе с подобными системами (а они существуют),
      — есть ли горящие задачи, которые можно было бы решать с помощью Нирваны не только в Яндексе.

      Делать систему открытой не только для сотрудников — это большая и ресурсозатратная работа для нескольких подразделений. Прямо сейчас это невозможно сделать. И мы размышляем над тем, есть ли потребность.

      Есть ли внешним людям польза от нашего знания — вот в комментариях и хотим прочитать. Возможно, мы провернули кучу работы для этой статьи зря. А может, и нет. Решать каждому конкретному читателю.


    1. Phaker
      13.03.2018 18:25

      Да все же рассказывают про свои внутренние ML-платформы:
      Facebook FBLearner Flow
      Uber Michelangelo
      Google TFX
      Ничто из этого нельзя потрогать снаружи, так что заманивают на работу, конечно.
      С другой стороны, мы вот у себя внутри тоже платформу пилим, да и все на ML-рынке этим в той или иной степени занимаются. И я с интересом смотрю на опыт других, подмечаю интересные идеи.


  1. customtema
    13.03.2018 08:43

    Зачем Нирване знать о графовой структуре процессов? Зачем ей вообще знать о структуре процессов?


    1. readysteady Автор
      13.03.2018 11:09
      -1

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

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

      То есть знать о структуре процессов Нирване нужно для того, чтобы процессы выполнять. Другое дело что каждый пользователь сам решает, насколько детально он распишет процесс: может, конкретное действие выполнит один блок, а может — вложенный граф на 3500 блоков. Во втором случае можно больше узнать о конкретном действии, глядя на граф (если этапы процесса достаточно понятно описаны автором поблочно, конечно).


  1. DmitryKoterov
    13.03.2018 11:29

    > Нирвана — неспециализированная облачная платформа

    Замечательно! А почему на ее аватаре — Себрант? :)


    1. readysteady Автор
      13.03.2018 11:39

      Дима, привет :)

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

      Мы попросили иллюстраторов взять для статьи образ такого знающего, опытного адепта Нирваны — и не имели в виду никого конкретно.


  1. Kaigorodov
    13.03.2018 11:51

    В Яндексе Нирвана и Кокаин идут рука об руку


  1. StarMarine
    13.03.2018 13:37

    Apache Spark


    1. kuzin_mv
      13.03.2018 18:05
      +1

      Больше похоже на Apache Airflow


  1. gooddaytoday
    13.03.2018 14:27

    Очень интересно! Может сделаете закрытый бета-тест? Тогда и запрашиваемая обратная связь будет более предметной. А там и по результатам может быть выкатите в узкий паблик.

    1. На чем у вас написан UI? Это браузер?
    2. Какую библиотечку использовали для графа?


    1. Craby
      13.03.2018 15:46

      1. На чем у вас написан UI? Это браузер?

      Да это браузер. UI полностью написан на Polymer.

      2. Какую библиотечку использовали для графа?

      В первой инкарнации Нирваны, рендерилка графов была сделана поверх JsPlumb. Но очень скоро мы уперлись в производительность, на графах 100+ блоков.
      Поэтому было принято решение написать собственный визуализатор «с нуля». Сейчас это хитрая комбинация canvas и HTML, под капотом там redux + lit-html. Вообще отрисовка (и взаимодействие) графа в 3000+ блоков, это отдельная и очень интересная задача :)


      1. adictive_max
        14.03.2018 09:42

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


        1. gooddaytoday
          14.03.2018 14:54
          +1

          Вообще-то есть вполне хорошая библиотека. Раньше стоила несколько тысяч долларов, теперь ее отдали в Open Source: github.com/jgraph/mxgraph


          1. adictive_max
            15.03.2018 04:26

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


  1. novikovag
    13.03.2018 17:22

    Теперь таргетированное рекламы в Яндексе станет больше?


  1. Torvald3d
    13.03.2018 23:39

    Оффтоп про шапку: в матрице символы каны были отзеркалены по горизонтали


  1. vserge
    14.03.2018 12:47

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


    1. readysteady Автор
      14.03.2018 13:20

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

      Спасибо за поддержку.