Введение

Классические приложения машинного обучения обычно состоят из двух этапов. На первом этапе используется большой объем данных для обучения моделей, а на втором этапе делается вывод из ранее невидимых данных. Большая часть предыдущей работы в области инфраструктуры машинного обучения была связана с масштабированием первой фазы, то есть обучения модели - именно здесь тратится много вычислений, и ранее обсуждаемые статьи, такие как сервер параметров, посвящены использованию распределенных систем для целей масштабирования. Не было подобного внимания к умозаключениям или масштабированию прогнозов, когда большой поток запросов мог бы перегрузить систему вывода или прогнозирования машинного обучения. Клипер фокусируется на этой второй фазе рабочей нагрузки машинного обучения. Кроме того, clipper предоставляет возможность работать с постоянно растущим списком фреймворков машинного обучения, таких как TensorFlow, Caffe, Spark, Scikit-learn, путем абстрагирования этих фреймворков на общий уровень. Поскольку предполагаемый вариант использования предназначен для приложений реального времени, Clipper сокращает и ограничивает задержку при максимальном увеличении пропускной способности. Clipper также предоставляет новые способы выбора конкретной модели (или использования ансамбля) для повышения точности и надежности прогнозов.

Проблемы с системой вывода в реальном времени

  1. Есть большое количество существующих фреймворков, над которыми нужно работать, и многие другие разрабатываются. Это представляет собой серьезную проблему для разработчиков приложений. Кроме того, приложения машинного обучения постоянно используют итерации изменения-развертывания-изменения. Следовательно, может потребоваться изменение, чтобы использовать гораздо больший набор данных и, следовательно, использовать структуру обучения распределенной модели, которая, возможно, не была необходимой, когда разработка модели началась. Иногда разработчикам приходится иметь дело со многими фреймворками, поскольку некоторые из них оптимизированы только для обучения модели. Clipper решает эти проблемы, добавляя уровень абстракции модели и предоставляя общий интерфейс между абстракцией модели и различными фреймворками.
  2. Для приложений реального времени важна ограниченная задержка в несколько миллисекунд. Большинство фреймворков машинного обучения оптимизированы для автономного пакетного обучения, но не для пакетного вывода. Пакетные запросы для вывода могут быть полезны для BLAS или GPU / SIMD, но текущие структуры обучения машинного обучения оптимизированы только для точечных запросов. Некоторые сложные приложения машинного обучения объединяют множество моделей для повышения точности, но это происходит за счет увеличения задержек хвоста и моделей отставания, которые могут не сходиться быстро. Clipper улучшает задержку за счет адаптивного пакетирования запросов и поддержания ограничений на задержку. Clipper также реализует меры по снижению задержек, чтобы уменьшить задержку за счет снижения точности.
  3. Многие приложения тестируют несколько моделей и пытаются выбрать лучшую, выполняя автономное тестирование устаревших данных или онлайн-тестирование A / B. Автономный анализ может быть неточным из-за того, что он полагается на устаревшие данные, в то время как онлайн-А / тестирование приводит к выбору статической модели, которая может не работать хорошо в будущем либо из-за нарушения функций, либо из-за дрейфа концепции. Кроме того, некоторые модели могут больше подходить для определенных регионов или определенных пользователей (учитывайте речь). Таким образом, Clipper предоставляет онлайн-алгоритм выбора модели. Это также повышает точность за счет использования прогнозов по ансамблю моделей.

Архитектура системы

Чтобы отследить запрос через клиппер, начнем с верхнего слоя. Внешнее приложение выдает запрос на логический вывод в структуру клиппера. Уровень выбора модели затем выбирает модель (и) на основе имеющейся обратной связи для этого приложения / запроса и отправляет запрос на уровень абстракции модели. Уровень абстракции модели затем ищет кешированные результаты и возвращает их, если они есть в кеше. Если нет, то запрос вывода добавляется в очередь для данного контейнера модели. Эта очередь адаптивно группирует запросы на основе модели и инфраструктуры перед их отправкой в ​​модель. Как только результаты возвращаются, кеш заполняется результатами. Слой выбора модели затем объединяет результаты, чтобы дать окончательный прогноз, а также предоставляет оценку достоверности, если использовалось более одной модели. Этот окончательный результат используется во внешнем приложении и обеспечивает обратную связь на уровне выбора модели для улучшения выбора моделей в будущем.

Уровень абстракции модели:

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

Кеширование выполняется с помощью двух API. Первый - «Запрос». Когда требуется вывод, запрос назначается кэшу с использованием этого неблокирующего вызова «Запрос». Если результаты находятся в кеше, они возвращаются. В противном случае API указывает, что результат недоступен в кеше, и кеш выдает запрос к модели. Другой вызов «Fetch» ​​может использоваться для проверки доступности результатов - почти как при опросе. Clipper использует LRU для вытеснения кеша. Кеширование действительно полезно для возврата ответов на популярный контент и разгрузки модели.

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

Адаптивная пакетная обработка позволяет подобрать нужный размер для данной партии. Одним из способов достижения этого в клипере является использование политики «Аддитивное увеличение-мультипликативное уменьшение» (AIMD). То есть клиппер продолжает увеличивать размер партии с постоянными приращениями, пока соблюдаются SLO. Как только SLO задержки пропадает, размер пакета уменьшается мультипликативно. Эта стратегия проста, работает очень эффективно и используется по умолчанию в клипере. Другой подход, который исследовали авторы, заключался в использовании квантильной регрессии в 99 процентиле задержек хвоста и соответствующей установке максимального размера пакета. Это работает аналогично AIMD и не так просто реализовать из-за вычислительной сложности, связанной с квантильными регрессиями.

Отложенное пакетирование полезно при резких или умеренных нагрузках. В таких случаях оптимальный размер партии, выбранный для данной структуры, может быть не достигнут. В таких случаях пакеты могут быть задержаны на несколько миллисекунд, чтобы накопить больше запросов. Такой подход приносит пользу некоторым фреймворкам, таким как scikit-learn, который использует BLAS для оптимизации. Данные из статьи показывают 3-кратное улучшение для scikit-learn за счет задержки пакетов до 2 мс.

Уровень выбора модели:

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

Clipper предоставляет структуру данных состояния (S), которую можно использовать для контекстуализации политики выбора модели, API выбора модели, который зависит от состояния S, способ объединения результатов запроса, который может дать наилучшие результаты (также может предоставить оценку достоверности для results) и API «наблюдения», который может обновлять состояние S, чтобы отразить обратную связь. Что касается выбора модели, то в clipper сразу два алгоритма. Один из них дешевле в вычислительном отношении - exp3, который зависит от выбора одной модели, а другой - ансамблевой подход, который объединяет результаты нескольких моделей, но за счет большего количества вычислений. Используя эти подходы, разработчики приложений могут выбрать подходящую политику в зависимости от своих потребностей.

Выбор одной модели

При таком подходе для данного запроса одновременно выбирается только одна модель. Выбор модели зависит от того, как она работала раньше. Подобно проблеме k-бандита в обучении с подкреплением, здесь есть компромисс между исследованием и использованием. Exp3 выбирает модель и на основе обратной связи об ошибках обновляет вероятность повторного выбора той же модели. Exp3 намного эффективнее по сравнению с экспериментированием вручную или A / B-тестированием. Некоторые подробности об exp3 следующие:

Если si - уверенность, с которой выбирается модель, а L (y, yˆ) - функция потерь между полученным выходом и ожидаемым, новая достоверность обновляется как: si = si * exp (−ηL (y, yˆ) / pi), здесь η можно рассматривать как скорость обучения или как быстро si сходится к оптимальному решению. Вероятность выбора конкретной модели определяется как: si / (сумма si для всех моделей)

Выбор модели ансамбля

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

После рассмотрения как exp3, так и exp4, выбор модели очень удобен, если модель по какой-то причине ухудшается. Из-за постоянной обратной связи в клипере он выберет другой механизм или модель и снизит частоту ошибок. Ниже приведены результаты эксперимента, в котором авторы смоделировали ошибки, а клиппер отреагировал таким образом, чтобы общий коэффициент ошибок оставался низким. В этом случае ошибки были внесены в модель 5 между 5 и 10 тысячами запросов. Хотя для модели 5 частота ошибок резко снижается, как exp3, так и exp4 перенаправляют запросы к другим моделям и поддерживают относительно низкую общую частоту ошибок. После восстановления модели 5 частота ошибок улучшается и в методах exp3, и exp4.

Как справиться с отставанием:

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

Контекстуализация

Контекст может немного улучшить результаты обучения. Модель, обученная определенному диалекту, будет лучше работать для определенных пользователей или региона. Состояние выбора модели S, которое было введено ранее, помогает в этом. Его можно создать для каждого пользователя, сеанса или некоторого контекста. Это состояние, связанное с контекстом, хранится извне в базе данных Redis.

Выводы

Clipper предоставляет независимый от ML-фреймворка подход для вывода. Это само по себе может стать большим благословением для меняющегося ландшафта фреймворков машинного обучения. Кроме того, встроенные преимущества выбора модели очень полезны для обеспечения отказоустойчивости моделей, а также для повышения точности. SLO с задержкой обеспечивают очень высокую пропускную способность, необходимую во время логического вывода.