Сегодня хотим поделиться с сообществом Хабра нашим опытом создания вычислительной платформы Нирвана, которая, среди прочего, применяется для задач машинного обучения.
Нирвана — неспециализированная облачная платформа для управления вычислительными процессами, где приложения запускаются в порядке, указанном пользователем. В Нирване хранятся нужные процессам описания, ссылки, блоки процессов и связанные с ними данные. Процессы оформлены в виде ациклических графов.
Нирваной для решения вычислительных задач пользуются разработчики, аналитики и менеджеры разных департаментов Яндекса — потому что далеко не всё можно посчитать на своем ноутбуке (а почему ещё — мы расскажем в конце статьи, когда перейдем к примерам применения Нирваны).
Мы расскажем, с какими проблемами столкнулись при использовании предыдущего решения, опишем ключевые компоненты Нирваны и объясним, почему для платформы было выбрано именно такое название. А потом посмотрим на скриншот и перейдем к задачам, для которых полезна платформа.
Как появилась Нирвана
Процесс обучения формул ранжирования — постоянная и объемная задача. Яндекс сейчас работает с технологиями 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)
Hixon10
12.03.2018 23:10Привет! Спасибо за рассказ!
1) А можете, пожалуйста, рассказать, как вы распараллеливаете Job-ы? То есть, вот есть у меня какой-то алгоритм. Как я понимаю, я должен запрограммировать его на каком-то языке и собрать в бинарник (наверное, положить в Докер). Всё, что вы сделаете — это запустите несколько инстансов моего контейнера? Или как-то более хитро сможете расспараллелить задачу?
2) А кто и где хостит Процессоры? Я, как пользователь вашего продукта, должен сам задеплоить свой Процессор в частном/публичном облаке? И с скалабилити я тоже должен сам бороться? Или я опять-таки могу завернуть свой Процессор в Докер, дать вам, и вы сами будете подымать и опускать инстансы?
onlinehead
13.03.2018 01:05* Я не разработчик Нирваны и никогда не пользовался ей, но у меня есть определенный опыт с некоторыми системами параллельного запуска задач *
1) Любой по-настоящему параллельный алгоритм позволяет принимать в себя часть данных, обсчитывать их и в дальнейшем объединять для следующего шага. В целом, MapReduce, допустим, работает именно так. То есть да, обычно запускается несколько экземпляров приложения, получающих на вход определенную часть из данных, которую необходимо обработать. Распределить входящие данные и собрать результат обычно проблемы платформы, а не приложения, в этом ее цель. Более хитрое распрделение вряд ли возможно, ну и в любом случае оно ограничено самим алгоритмом, магии тут нет. А что за алгоритм будет запускаться внури и какие сервисы он будет использовать — проблема программиста алгоритма и, частично, проблема платформы.
2) Учитывая ремарку про «полную изоляцию и выделенные ресурсы», job-процессор вероятно и есть контейнер. В этом случае с очень высокой степенью вероятности все будет происходить только в рамках инфраструктуры Я и их облака. Кстати, если модель оплаты будет похожа на Google Bigtables — было бы интересно.
P.S. По описанию Нирвана похожа на Google Cloud Job Discovery, который сейчас в закрытом тестировании. Приятно что Я делает вещи мирового уровня.
Craby
13.03.2018 11:251) А можете, пожалуйста, рассказать, как вы распараллеливаете Job-ы?
Сама Нирвана не занимается распараллеливанием процессов. Это зона ответственности процессоров. Job Processor, например, умеет запускать задачи в режиме master-slave.
Единственная параллельность на уровне Нирваны – это выполнение параллельных веток графа.
2) А кто и где хостит Процессоры?
Процессор для Нирваны — это просто web-сервис, реализующий необходимое REST-API. Так что в принципе, он может хоститьсягде угодно. Но в основном они развернуты на нашем внутреннем хостинге (Qloud).
horevivan
12.03.2018 23:25Давно, мечтаю о таком же UI. Но пока всё делаю веб-сервисами и ручками запускаю. Поиск, предиктивная аналитика, рендеринг иконок в различные форматы.
Пытался пустить данные через Azure Machine Learning (как на картинке), но этот инструмент больше заточен под машинное обучение. К тому же JSON понимает не «из коробки».
Спросил ребят на Open Data Science? мне посоветовали только локальные решения. Из чего я сделал вывод, что облачных решений пока нема, а тут такая манящая статья…
С нетерпением ждём выхода в свет. Как насчёт бета-теста?
kirillkosolapov
12.03.2018 23:57Интересно, для каких задач кроме описанных в статье может быть использован данный инструмент?
Craby
13.03.2018 11:36Если честно, то круг задач довольно широк. навскидку, можно использовать инструмент как систему сборки. Почему нет?
kuzin_mv
13.03.2018 18:23Не уверен на счет нирваны, лет пять назад делали продобный
велосипедпроект (DSL для описания task-ов, проектов в терминах нирваны, видимо и job-ов и даже была попытка графически визуализировать дерево, но забили на это). Но там имелась возможность не только запускать процессы обработки и передачи данных, но и управляющие команды, флоу основной задачи был примерно такой:
1 Просмотр внешних источников данных
2 Если есть конвертация, каждый источник свой конвертер в общий формат
3 Загрузка в Mongo(остановка репликации/запуск репликации (не помню деталей уже))
4 Запуск процедур индексации (полной/инкрементной) полнотекстового поиска по загруженным данным
5 Регенерация сайтмап для поисковых роботов
6 проверка отказов на каждом шаге уведомление по почте об сбоях
7 отложенный запуск через N минут или через K если был обнаружен сбой
Были так же менее сложные задачи, имелась возможность создавать вложенные задачи условные запуски job-ов, обработка отказов. Контекст исполнения и данные хранились в Mongo, не было серьезных требований по количеству/объемам так как не открытая платформа была, а так для себэ.
mickvav
13.03.2018 08:42Слушайте, это конечно отличная идея, обсуждать внутренние инструменты на публичном ресурсе. Но какая внешним людям польза от знания, что внутри яндекса есть такое чудо? Захотеть трудоустроиться в яндекс, только чтобы потыкать пальчком в крутой тул? Серьезно?
readysteady Автор
13.03.2018 10:33+1Спасибо за вопрос. Мы и сами думали перед тем, как написать статью, интересно ли будет широкому кругу читателей, если мы не даем доступа к инструменту, а рассказываем про историю его появления и способы применения. Но ведь и про fml много писали на Хабре, хотя пользоваться им снаружи тоже нельзя. И статьи пользовались вниманием.
Мы ведь и без этой статьи обсуждаем внутренние инструменты публично: на собеседованиях, на конференциях, в кругу ML-увлеченных коллег из других компаний (настолько подробно, насколько нам позволяет NDA).
И в конце статьи мы написали, что в числе прочего нам интересно:
— есть ли у широкого круга читателей опыт по работе с подобными системами (а они существуют),
— есть ли горящие задачи, которые можно было бы решать с помощью Нирваны не только в Яндексе.
Делать систему открытой не только для сотрудников — это большая и ресурсозатратная работа для нескольких подразделений. Прямо сейчас это невозможно сделать. И мы размышляем над тем, есть ли потребность.
Есть ли внешним людям польза от нашего знания — вот в комментариях и хотим прочитать. Возможно, мы провернули кучу работы для этой статьи зря. А может, и нет. Решать каждому конкретному читателю.
Phaker
13.03.2018 18:25Да все же рассказывают про свои внутренние ML-платформы:
Facebook FBLearner Flow
Uber Michelangelo
Google TFX
Ничто из этого нельзя потрогать снаружи, так что заманивают на работу, конечно.
С другой стороны, мы вот у себя внутри тоже платформу пилим, да и все на ML-рынке этим в той или иной степени занимаются. И я с интересом смотрю на опыт других, подмечаю интересные идеи.
customtema
13.03.2018 08:43Зачем Нирване знать о графовой структуре процессов? Зачем ей вообще знать о структуре процессов?
readysteady Автор
13.03.2018 11:09-1Не очень поняла ваш вопрос. Дело в том, что Нирвана сама подразумевает, что у процессов графовая структура. В Нирване ведь нельзя выполнить процесс, у которого не графовая структура. Можно, конечно, создать граф из одного блока, но это вырожденный вариант графовой структуры.
Нирвана состоит нескольких компонентов, и Workflow Processor, как написано в статье, смотрит на структуру графа и каждый блок, для которого пришли все нужные входные данные, отправляет в процессор, который за этот блок отвечает.
То есть знать о структуре процессов Нирване нужно для того, чтобы процессы выполнять. Другое дело что каждый пользователь сам решает, насколько детально он распишет процесс: может, конкретное действие выполнит один блок, а может — вложенный граф на 3500 блоков. Во втором случае можно больше узнать о конкретном действии, глядя на граф (если этапы процесса достаточно понятно описаны автором поблочно, конечно).
DmitryKoterov
13.03.2018 11:29> Нирвана — неспециализированная облачная платформа
Замечательно! А почему на ее аватаре — Себрант? :)readysteady Автор
13.03.2018 11:39Дима, привет :)
Ты имеешь в виду картинку в начале поста? Это не аватар, эту иллюстрацию мы делали для этой статьи специально. Если честно, я связи у образа монаха с Андреем Себрантом не видела, но теперь понимаю, что они могут казаться похожими.
Мы попросили иллюстраторов взять для статьи образ такого знающего, опытного адепта Нирваны — и не имели в виду никого конкретно.
gooddaytoday
13.03.2018 14:27Очень интересно! Может сделаете закрытый бета-тест? Тогда и запрашиваемая обратная связь будет более предметной. А там и по результатам может быть выкатите в узкий паблик.
1. На чем у вас написан UI? Это браузер?
2. Какую библиотечку использовали для графа?Craby
13.03.2018 15:461. На чем у вас написан UI? Это браузер?
Да это браузер. UI полностью написан на Polymer.
2. Какую библиотечку использовали для графа?
В первой инкарнации Нирваны, рендерилка графов была сделана поверх JsPlumb. Но очень скоро мы уперлись в производительность, на графах 100+ блоков.
Поэтому было принято решение написать собственный визуализатор «с нуля». Сейчас это хитрая комбинация canvas и HTML, под капотом там redux + lit-html. Вообще отрисовка (и взаимодействие) графа в 3000+ блоков, это отдельная и очень интересная задача :)adictive_max
14.03.2018 09:42Эту рендерилку было бы неплохо иметь в виде отдельного продукта. Насчёт Нирваны не знаю, но вот качественный «Blueprint-like» редактор графов уже сам по себе много где пригодился бы, а найти что-то похожее, даже за деньги, сильно не просто, а потом ещё и дорабатывать напильником не один месяц.
gooddaytoday
14.03.2018 14:54+1Вообще-то есть вполне хорошая библиотека. Раньше стоила несколько тысяч долларов, теперь ее отдали в Open Source: github.com/jgraph/mxgraph
adictive_max
15.03.2018 04:26Штука конечно хорошая, но она принципиально не отличается от прочих найденных библиотек. Это — рисовалка векторных диаграмм, оперирующая графическими примитивами. А нужен редактор визуального языка программирования, оперирующий чем-то вроде AST.
vserge
14.03.2018 12:47Спасибо большое за статью!
Скажите, пожалуйста, как можно подключиться к вашей платформе, мы хотели бы ее использовать для доработки нашей систему по моделированию «умного города».readysteady Автор
14.03.2018 13:20Здравствуйте! У нас пока нет открытой Нирваны, только закрытая. Эта статья — в каком-то смысле возможность понять, нужна ли вообще рынку открытая и для чего. Очень много нужно планирования, времени и других ресурсов, чтобы внутренний продукт стал внешним, и не каждому внутреннему продукту это нужно.
Спасибо за поддержку.
horevivan
Давно, мечтаю о таком же UI. Но пока всё делаю веб-сервисами и ручками запускаю. Поиск, предиктивная аналитика, рендеринг иконок в различные форматы.
Пытался пустить данные и вычисления через Azure Machine Learning (как на картинке), но этот инструмент больше заточен под машинное обучение. К тому же JSON понимает не «из коробки».
Спросил ребят на Open Data Science, мне посоветовали только локальные решения. Из чего я сделал вывод, что облачных решений пока нема, а тут такая манящая статья…
С нетерпением ждём выхода в свет. Как насчёт бета-теста?
Craby
Спасибо за комментарий!
Azure Machine Learning действительно близок по духу к Нирване, хоть и более узкоспециализированный.
Как уже ниже написала readysteady, мы хотим понять на сколько востребован может быть такой продукт для внешних пользователей. Если все сложиться удачно, то можно будет думать и о бета-тесте :)