company_banner

Познаём Нирвану – универсальную вычислительную платформу Яндекса

    Машинное обучение превратилось в модный термин, но при работе с большими объёмами данных оно уже много лет является жизненной необходимостью. Яндекс обрабатывает более 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. На Нирване основаны все процессы оценки на асессорах и Толоке, не только важные для Справочника. Например, Нирвана помогает организовывать и настраивать всю работу Пешеходов, актуализирующих карты, работу техподдержки и тестирование асессорами.

    Обсудим?


    В наших офисах регулярно проводятся специальные встречи «Яндекс изнутри». На одной из них мы уже немного рассказывали о Нирване (есть видео про устройство Нирваны, применение Нирваны в машинном обучении), и она вызвала большой интерес. Пока она доступна только сотрудникам Яндекса, но нам хочется узнать ваше мнение об описанном нами устройстве Нирваны, о тех ваших задачах, для которых она была бы полезна. Мы будем благодарны, если вы расскажете о системах, похожих на нашу, в комментариях. Возможно, в ваших компаниях уже применяются подобные вычислительные платформы, и мы будем благодарны за советы и отзывы, истории из практики, рассказы о вашем опыте.
    Яндекс 382,15
    Как мы делаем Яндекс
    Поделиться публикацией
    Комментарии 29
    • +1
      Давно, мечтаю о таком же UI. Но пока всё делаю веб-сервисами и ручками запускаю. Поиск, предиктивная аналитика, рендеринг иконок в различные форматы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                  Были так же менее сложные задачи, имелась возможность создавать вложенные задачи условные запуски job-ов, обработка отказов. Контекст исполнения и данные хранились в Mongo, не было серьезных требований по количеству/объемам так как не открытая платформа была, а так для себэ.
                • +7
                  Слушайте, это конечно отличная идея, обсуждать внутренние инструменты на публичном ресурсе. Но какая внешним людям польза от знания, что внутри яндекса есть такое чудо? Захотеть трудоустроиться в яндекс, только чтобы потыкать пальчком в крутой тул? Серьезно?
                  • +2
                    Спасибо за вопрос. Мы и сами думали перед тем, как написать статью, интересно ли будет широкому кругу читателей, если мы не даем доступа к инструменту, а рассказываем про историю его появления и способы применения. Но ведь и про fml много писали на Хабре, хотя пользоваться им снаружи тоже нельзя. И статьи пользовались вниманием.

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

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

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

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

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

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

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

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

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

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

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

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

                          • –1
                            Apache Spark
                            • +1
                              Больше похоже на Apache Airflow
                            • +1
                              Очень интересно! Может сделаете закрытый бета-тест? Тогда и запрашиваемая обратная связь будет более предметной. А там и по результатам может быть выкатите в узкий паблик.

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

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

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

                                В первой инкарнации Нирваны, рендерилка графов была сделана поверх JsPlumb. Но очень скоро мы уперлись в производительность, на графах 100+ блоков.
                                Поэтому было принято решение написать собственный визуализатор «с нуля». Сейчас это хитрая комбинация canvas и HTML, под капотом там redux + lit-html. Вообще отрисовка (и взаимодействие) графа в 3000+ блоков, это отдельная и очень интересная задача :)
                                • +1
                                  Эту рендерилку было бы неплохо иметь в виде отдельного продукта. Насчёт Нирваны не знаю, но вот качественный «Blueprint-like» редактор графов уже сам по себе много где пригодился бы, а найти что-то похожее, даже за деньги, сильно не просто, а потом ещё и дорабатывать напильником не один месяц.
                                  • +1
                                    Вообще-то есть вполне хорошая библиотека. Раньше стоила несколько тысяч долларов, теперь ее отдали в Open Source: github.com/jgraph/mxgraph
                                    • 0
                                      Штука конечно хорошая, но она принципиально не отличается от прочих найденных библиотек. Это — рисовалка векторных диаграмм, оперирующая графическими примитивами. А нужен редактор визуального языка программирования, оперирующий чем-то вроде AST.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • 0
                                  Оффтоп про шапку: в матрице символы каны были отзеркалены по горизонтали
                                  • 0
                                    Спасибо большое за статью!
                                    Скажите, пожалуйста, как можно подключиться к вашей платформе, мы хотели бы ее использовать для доработки нашей систему по моделированию «умного города».
                                    • 0
                                      Здравствуйте! У нас пока нет открытой Нирваны, только закрытая. Эта статья — в каком-то смысле возможность понять, нужна ли вообще рынку открытая и для чего. Очень много нужно планирования, времени и других ресурсов, чтобы внутренний продукт стал внешним, и не каждому внутреннему продукту это нужно.

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

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое