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