В заключительной части нашей серии статей о платформе машинного обучения Gojek мы впервые познакомимся с новой системой тестирования машинного обучения Gojek.

Это последний пост из серии о платформе машинного обучения Gojek. Если вы хотите прочитать его с самого начала, начните здесь. 👇



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

ML - это сложно, тестирование ML сложнее

Проверка правильности программного обеспечения - сложная, но важная задача, особенно для систем машинного обучения. Системы машинного обучения обычно имеют поведение, которое трудно определить (например, Тестовая проблема Oracle), а входные данные сложно моделировать (например, они имеют состояние или зависят от других систем машинного обучения).

Многие команды предпочитают игнорировать эту сложную проблему и полагать, что системы машинного обучения не поддаются тестированию. Справедливо отметить, что это не ограничивается практиками ML, но также часто встречается в таких областях, как проектирование инфраструктуры, которое также сталкивается с проблемой сложных входных данных. Такая ситуация расстраивает строгого инженера-программиста.

Существуют различные способы разделения проблемы тестирования машинного обучения. Глядя на проблему через призму жизненного цикла машинного обучения, мы рассматриваем тестирование машинного обучения как серию этапов:

1. Проверка данных обучения перед обучением

2. Автономная оценка моделей во время обучения.

3. Проверка развернутых моделей и их входных данных после обучения и предварительного вывода.

4. Проверка развернутых моделей и их входных данных во время вывода.

5. Онлайн-оценка моделей после вывода

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

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

Точно так же модели тестирования могут быть выполнены просто или более изощренно. Специалисты по обработке данных обычно проводят автономную оценку модели, используя такие показатели, как точность отзыва, площадь под кривой (AUC) или среднеквадратичная ошибка (MSE). Инженеры машинного обучения могут провести тестирование модели во время развертывания с фиксированным набором входных данных и убедиться, что она завершает вывод и выдает выходные данные с правильными полями и значениями.

Представляем Тьюринга

В Gojek предварительное обучение и вывод данных происходит через Feast. Валидация моделей сразу после их размещения осуществляется через Мерлин. Тьюринг следит за моделями во время их работы и предоставляет метрики онлайн-оценки.

Тьюринг объединяет серверные системы, обеспечивающие удобство работы с мобильными приложениями, и системы машинного обучения, обеспечивающие интеллектуальную функциональность. Turing также интегрируется с Litmus, системой экспериментов Gojek, и Merlin, нашей системой управления / развертывания моделей платформы ML, чтобы обеспечить беспроблемный опыт для наших пользователей. Как и Merlin, он использует ту же систему предварительной обработки, которая поддерживает обогащение функций с помощью Feast.

Прежде чем мы погрузимся глубже, давайте обрисуем некоторую базовую терминологию:

  • Клиент: приложение или веб-служба, вызывающая Тьюринг.
  • Ансамбль. Мы используем определение "ансамбль" в ML, что означает некоторые средства объединения результатов нескольких моделей для повышения производительности. Некоторые известные техники, включая упаковку в мешки, бустинг и укладку.
  • Эксперимент: тест с использованием реальных исходных данных для оценки наиболее эффективного лечения.
  • Результат: окончательный результат эксперимента, например количество конверсий пользователей, время ожидания водителя, процент выполнения заказов.
  • Ответ: конкретные значения, которые мы возвращаем в ответ на запрос клиента, например множитель резкого повышения цен, идентификатор отправляемого драйвера. В этом сообщении «ответ» не будет относиться к тому, как пользователь отреагирует на лечение.
  • Правило: условия, определяющие, какое лечение применять к конкретному блоку. Правила могут учитывать идентификатор объекта, время или место запроса, сегмент клиентов (новый пользователь, опытный пользователь). Как правило, они детерминированы: при заданном идентификаторе объекта они обычно возвращают ту же обработку.
  • Обработка: часть, которую специалисты по обработке данных контролируют и варьируют, и это может быть модель или набор моделей. Обработка вычислит ответ.
  • Единица: наименьший объект, который может получать различные процедуры, например, пользователь, водитель, сеанс или заказ.

Машины Тьюринга

В настоящее время Тьюринг может похвастаться следующими особенностями:

  • Маршрутизация трафика с низкой задержкой и высокой пропускной способностью на неограниченное количество моделей машинного обучения.
  • Правила экспериментов на основе входящих запросов для определения применяемого лечения. Механизм правил в настоящее время - Litmus.
  • Возможность обогащения входящих запросов через Feast.
  • Динамическое ансамблирование моделей для каждого лечения. Лечение не обязательно должно быть одной моделью.
  • Надежные и безопасные откаты в случае тайм-аутов.
  • Простой ответ и отслеживание результатов.

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

  • Механизм правил: Turing реализует клиент Litmus и может в будущем поддерживать Facebook’s PlanOut для динамических политик и возможность создания политик на основе результатов экспериментов, например, для многоруких бандитов или автоматических выключателей. В Тьюринге механизм правил получает идентификатор единицы и возвращает политику экспериментов, основанную на наборе правил, предварительно сконфигурированных специалистом по данным.
    Примером простого правила может быть указание четных идентификаторов пользователей для лечения A и идентификаторы пользователей с нечетными номерами для лечения B для A / B-теста. Сам Litmus поддерживает правила, которые учитывают заранее определенные сегменты клиентов, местоположение пользователя или время суток.
  • Предварительная обработка: препроцессор Тьюринга интегрируется с Feast, но также имеет возможность выполнять произвольные преобразования во входящем запросе. Мы ожидаем, что это будет использоваться для обогащения функций, например, учитывая идентификатор пользователя в запросе, поиск истории прошлых транзакций для пользователя.
  • Постобработка: в настоящее время мы поддерживаем базовый ансамблер, который может вычислять линейную комбинацию выходных данных модели или, в тривиальном случае, сопоставлять каждую обработку модели. Объединение контролируется политикой механизма правил. Специалисты по обработке данных также могут реализовать более сложное ансамблирование.

Транспортный поток как таковой:

A) Входящие запросы от клиента анализируются для извлечения экспериментальной единицы (например, пользователя, сеанса или заказа).

Б) идентификатор модуля передается механизму правил для определения лечения.

C) Одновременно запрос отправляется на этап предварительной обработки, чтобы дополнить его функциями.

D) Предварительно обработанный запрос направляется всем моделям одновременно.

E) Ответы от моделей собираются и отправляются в постпроцессор, где он объединяет запрос на основе политики из механизма правил.

F) Наконец, идентификатор отслеживания добавляется к ансамблевому ответу, и он регистрируется (вместе с индивидуальными ответами модели и исходным запросом) по мере того, как он возвращается клиенту.

G) Позже клиент несет ответственность за регистрацию результата с идентификатором отслеживания.

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

Специалисты по обработке данных для определения эффективности каждого лечения через ведение журнала на уровне запроса: для каждого запроса клиент в конечном итоге регистрирует идентификатор отслеживания и результат эксперимента, например, заказ выполнен, виджет нажат. Turing объединит эти клиентские журналы со своими внутренними журналами, используя идентификатор отслеживания в качестве ключа соединения. Litmus предоставляет пользовательский интерфейс для визуального просмотра результатов таких экспериментов. Результаты здесь также могут быть отправлены обратно в механизм правил при внедрении систем обучения с подкреплением.

Каждое развертывание Turing представляет собой кластер маршрутизаторов с автоматическим масштабированием, предназначенный для поддержки одного типа запросов. Например, один кластер маршрутизаторов будет обрабатывать расчет фактора скачка цен на поездки, а другой кластер будет обслуживать рекомендации по питанию. Кластеры маршрутизаторов управляются централизованно через ядро ​​Тьюринга, которое само является частью нашей платформы машинного обучения. Это означает, что специалисты по данным могут взаимодействовать через Python SDK или веб-интерфейс для настройки и мониторинга всех своих экспериментов в одном месте.

Каждое развертывание включает кластер маршрутизаторов и связанную с ним конфигурацию YAML, созданную ядром. Маршрутизатор Тьюринга построен на нашей библиотеке маршрутизации оптоволоконного трафика, написанной на Golang, и получает свою конфигурацию при запуске. Пример конфигурации может выглядеть так:

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

Что дальше

Turing очень молод и в настоящее время используется в небольшом количестве проектов в Gojek, но он был разработан для замены заказных систем экспериментов в некоторых из наших крупнейших систем машинного обучения (таких как механизм ценообразования и система диспетчеризации драйверов). Эти проекты включают в себя более сложные экспериментальные установки, включая эксперименты с обратным переключением и контекстные бандиты, которые могут быть реализованы через точки расширения Тьюринга. Для этих систем также требуются автоматические выключатели, которые могут быть реализованы с помощью механизма правил и ансамбля в случаях, когда новые модели ведут себя неправильно и наносят ущерб бизнесу.

Чтобы обеспечить производительность Turing для таких критически важных систем, у нас есть возможность перемещать некоторые расширения в процессе, чтобы минимизировать задержки дополнительных сетевых переходов. Но другой вариант - переместить логику маршрутизации Тьюринга из ее текущего автономного двоичного файла Golang и встроить ее непосредственно в нашу сервисную сетку Kubernetes, которая основана на Istio, сэкономив еще один переход.

Turing также будет лучше интегрирован с Merlin и Litmus. Улучшенный пользовательский интерфейс Тьюринга упростит настройку экспериментов в Litmus, настройку соответствующих конечных точек модели из Merlin, а затем просмотр результатов эксперимента в предстоящем пользовательском интерфейсе результатов Litmus.

На этом пока все от нас. Надеюсь, вы нашли эту серию полезной. Мы всегда работаем над созданием вещей и все это документируем. Продолжайте следить за этим пространством, чтобы узнать больше. До скорого! 🖖

Материалы:
Критика Сундарараджан, Роман Возняк

На этом мы завершаем нашу вводную серию о платформе машинного обучения Gojek. Подпишитесь на нашу рассылку, чтобы наши истории доставлялись прямо на ваш почтовый ящик!