Использование Spark MLlib в онлайн-сервисах

машинное обучение Spark
Использование Spark MLlib в онлайн-сервисах

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

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

Онлайн (онлайн) вычисления и офлайн (автономные) вычисления рекомендательных систем

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

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

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

Противоречие между офлайн-обучением и онлайн-прогнозированием

На обычных вычислительных платформах задачи автономного прогнозирования могут быть легко связаны с обучением модели. Spark MLlib предоставляет интерфейс для Pipeline. Он может сочетать обучение модели, предварительную обработку функций, разработку функций, пересечение функций и другие этапы перед обучением конвейеру в определенном порядке и поддерживает сохранение всего обученного конвейера на диске. На этапе прогнозирования вам нужно только загрузить всю модель конвейера, сохраненную во время обучения, в кластер, а затем напрямую ввести исходные функции в конвейер, чтобы получить результат прогнозирования модели. Модель, используемая в распределенном обученииDataFrameУпаковывая обучающие данные, модель также используется в распределенной среде, когда модель прогнозируется в автономном режиме.DataFrameУпаковывает прогнозируемые данные. Этот метод использования также является Spark MLlib.официальная документацияРекомендуемое использование в .

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

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

Автономные вычисления системы мгновенных рекомендаций распределяются в кластере с помощью Spark MLlib, а онлайн-вычисления выполняются в онлайн-сервисе, написанном на Java. В отличие от автономного прогнозирования, прогнозирование онлайн-модели напрямую не использует автономную модель конвейера обучения и хранения, а независимо реализует алгоритм прогнозирования модели и полный набор функций предварительной обработки перед вводом модели. Поэтому в конце каждого автономного обучения, когда модель развертывается онлайн, параметры модели, полученные в результате обучения, необходимо скопировать в онлайн-сервис, а параметры, необходимые в процессе предварительной обработки признаков, также необходимо обновить до онлайн-сервиса. обслуживать синхронно. Другими словами, нам необходимо без изменений реализовать операции предварительной обработки признаков и определенную структуру модели, определенные в автономном обучении.


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

Разработка программного обеспечения с акцентом на важность повторного использования кода. Итак, как повторно использовать код между обучением автономной модели и прогнозированием онлайн-модели? В области глубокого обучения TensorFlow, самый популярный фреймворк в отрасли, предлагает решить эту проблему.TensorFlow Serving. Это система развертывания моделей, предназначенная для производственной среды. Цель состоит в том, чтобы упростить развертывание обученной модели на сервере и делать прогнозы в реальном времени. Традиционные фреймворки машинного обучения, особенно распределенные фреймворки машинного обучения, имеют мало похожих решений. Основная проблема заключается в том, что распределенные среды обучения, такие как Spark MLlib, в основном подходят для сценариев приложений с большими объемами данных. Он использует механизм распределенной пакетной обработки (batch processing), который может обрабатывать большое количество выборок прогнозирования параллельно на нескольких машинах с высокой пропускной способностью. Однако для такой онлайн-службы, как рекомендации в реальном времени, высокая пропускная способность — это не то, что нужно, а низкая задержка — самое большое требование для этой онлайн-службы. Spark MLlib необходимо преобразовать данные вDataFrameТакая распределенная структура данных и такое преобразование будут генерировать накладные расходы второго уровня, что неприемлемо в онлайн-сервисах с миллисекундными задержками.

Таким образом, мы столкнулись с дилеммой: мы надеемся, что модель может быть обучена в автономном режиме распределенным и высокопроизводительным образом, и в то же время мы надеемся, что обученная модель может быть онлайн с низкой задержкой для прогнозирования в реальном времени. . Это противоречие между онлайн-прогнозированием и офлайн-обучением.

Интерфейс для прогнозирования в реальном времени

Для решения упомянутого выше противоречия мы рассматриваем возможность внесения некоторых изменений в интерфейс Spark MLlib, добавив в него интерфейс предсказания в реальном времени.

Универсальность интерфейса конвейера Spark MLlib в значительной степени зависит отDataFrameЭто общая структура данных. Для Spark MLlib данные, проходящие по конвейеру,DataFrameупаковано, каждыйTransformerоба получают одинDataFrame, выполнить над ним операцию «деформации», а затем вывести новыйDataFrame.DataFrameсхема черезTransformerпараметры (Param) Соглашаться.

Этот способ очень хорошо работает в распределенных вычислениях, но не очень подходит для онлайн-сервисов, требующих высокой задержки. Среди них основная причина заключается в том, что в онлайн-автономной вычислительной среде данные преобразуются вDataFrameБудет много ненужных накладных расходов, которые влияют на задержку службы. Итак, интуитивная идея такова: в Spark MLlib дляTransformerобеспечить независимыйDataFrame, так что внутренняя вычислительная логика ядра открыта напрямую, а затем этот интерфейс используется в онлайн-сервисах, тем самым минуя использование данныхDataFrameИнкапсулируйте эту трудоемкую операцию.

После наблюдения мы обнаружили, что наиболее часто используемый конвейер предсказания модели в рекомендательных системах в основном состоит из трех частей: векторизация признаков, предварительная обработка признаков и предсказание модели. Среди них векторизация признаков — это процесс преобразования исходных признаков различных типов данных в векторы, который может быть выполнен с помощью векторизатора признаков, чьим входом являются исходные признаки определенного типа данных (например, Карта), выход — вектор признаков; предварительная обработка признаков — это процесс деформации, нормализации и других операций над вектором признаков, который может состоять из одного или нескольких преобразователей признаков (преобразователей признаков), где вход каждого преобразователя и Вход представляет собой вектор- функция типа; предсказание модели относится к процессу ввода функций в обученный классификатор, регрессор или сортировщик для получения «оценки», где «оценка» может представлять собой дискретные метки (классификации), а также может представлять непрерывное значение (регрессор). или даже ранг (сортировщик), входом которого является функция векторного типа, а выходом — скалярное значение. Поскольку образцы признаков могут не храниться в векторном типе, а процессоры общих признаков предполагают, что признаки являются векторами, обычно мы сначала преобразуем признаки невекторного типа в векторные типы на первом этапе.

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

Абстрактный интерфейс предиктораOnlinePredictor. у него есть параметр типаFeaturesType, указывающий типы функций, которые может получить этот предиктор. Мы заметили, что для некоторых предикторов нам иногда нужно получить два типа оценок предсказания, например, для бинарного классификатора может потребоваться вывести не только метку класса, но и исходную оценку предсказания. Таким образом, вOnlinePredictorимеютpredictиpredictRawДля двух интерфейсов прогнозирования значение результатов двух интерфейсов может быть установлено соответственно в соответствии с конкретными потребностями реализации модели.


OnlinePredictorЭто интерфейс, который можно использовать для онлайн-прогнозирования в реальном времени, поэтому егоpredictТип ввода, принимаемый функцией, является непосредственно типом функции, а не тем, который предоставляется Spark.DataFrame. Кроме того, он также наследуется от Spark MLlib.Transformer, так что тоже может бытьtransformфункция принимаетDataFrameВ качестве входных данных он поддерживает прогнозирование в сценариях распределенных больших пакетов.

если мы предположимOnlinePredictorявляется абстракцией предсказаний модели, тоFeatureTransformerЭто абстракция векторизации признаков и предварительной обработки.FeatureTransformerЕсть два параметра типа,INиOUT, которые представляют тип входного объекта и тип выходного объекта соответственно. иOnlinePredictorаналогично, за исключением того, что он обеспечивает пакетную обработкуDataFrameВ дополнение к интерфейсу он также обеспечивает онлайн-прогнозирование в реальном времени.transformOneиtransformBatch, вы можете напрямую получать функции, не используяDataFrameУпаковка.


чтобыFeatureTransformerИнтерфейс прогнозирования в реальном времени и интерфейс распределенных вычислений имеют общую логику обработки, которая внутренне обеспечиваетtransformFunc,этоIN => OUTтип функции. Обработчику конкретной функции нужно только реализовать логику обработки в этой функции.При обработке онлайн-интерфейса эта функция будет вызываться напрямую, а при обработке пакетных данных эта функция будет упакована как определяемая пользователем функция в Spark., UDF ), широковещательно на каждый узел для распределенной обработки данных.

При предварительной обработке признаков типичной операцией является нормализация признаков. Он подсчитывает среднее значение и стандартное отклонение признаков в каждом измерении и нормализует входные признаки, то есть вычитает среднее значение и делит на стандартное отклонение, так что все признаки имеют среднее значение 0 и стандартное отклонение 1. В интерфейсе, ориентированном на прогнозирование в реальном времени, операция нормализации признаков может выполнятьсяFeatureTransformer[Vector, Vector]Это можно сделать с помощью преобразователя признаков типа, который может получать исходный признак векторного типа и выводить нормализованный признак векторного типа. Внутренне его реализация аналогична реализации в Spark MLlib, за исключением того, что логика преобразования функций реализована вtransformFuncв функции. Таким образом, он может не только преобразоватьDataFrameВы также можете напрямую преобразовать собственные значения векторного типа.

Векторизацию признаков можно рассматривать как особый вид предварительной обработки признаков, который представляет собойFeatureTransformer[FeaturesType, Vector]Преобразователь признаков , гдеFeaturesTypeПредставляет пользовательский тип входного объекта и выводит объект векторного типа.

Конвейер для предсказания в реальном времени

имеютOnlinePredictorиFeatureTransformer, мы можем создавать широкий спектр предикторов и препроцессоров функций и использовать их как в офлайн-распределенных средах, так и в онлайн-предсказаниях в реальном времени. Чтобы лучше инкапсулировать процесс обучения модели, чтобы больше не было необходимости воспринимать какие-либо подробности об обучении модели онлайн, мы также предлагаем конвейер для прогнозирования в реальном времени —OnlinePredictionPipeline.

Как упоминалось выше, наиболее часто используемый конвейер предсказания модели в рекомендательных системах в основном состоит из трех частей: векторизация признаков, предварительная обработка признаков и предсказание модели. Таким образом, вOnlinePredictionPipelineВ , мы также делим компоненты на три части: векторизатор признаков, один или несколько преобразователей признаков и окончательный предиктор. Исходные функции, такие как элементы в конвейере, проходят через векторизацию, деформацию функций и, наконец, предсказание модели, в свою очередь, и, наконец, выводят прогнозируемую оценку.


На уровне API,OnlinePredictionPipelineтакжеOnlinePredictor, он может взять необработанный объект и выполнить для него векторизацию, предварительную обработку и прогнозирование модели; он также может обрабатыватьDataFrame, делать прогнозы для пакетов данных и выводитьDataFrame.

Во время автономного распределенного обучения весьOnlinePredictionPipelineСоберите и обучите, а также сохраните всю обученную модель конвейера в файловой системе. На этапе прогнозирования, если это автономная вычислительная среда, вы можете использовать библиотеку Spark MLlib.transformИнтерфейс для распределенных вычислений; если это онлайн-сервис, то его можно рассматривать как онлайн-сервис без понимания внутренней специфики процесса и реализацииOnlinePredictor,использоватьpredictИнтерфейс предсказывает одну необработанную функцию ввода.


имеютOnlinePredictionPipeline, во время обучения автономной модели, будь то добавление обработчика функций или замена модели прогнозирования, нет необходимости изменять логику прогнозирования онлайн-сервиса, достигая «одна система, две операции».

В то же время, посколькуOnlinePredictorиFeatureTransformerДва интерфейса, ориентированные на прогнозирование в реальном времени, напрямую раскрывают логику вычислений и не требуют преобразования функций в онлайн-сервисы.DataFrame, уменьшая задержку онлайн-сервисов. Эксперименты показывают, что в онлайн-среде по сравнению с прямым использованием Spark MLlibDataFrameИнтерфейс для предсказания в реальном времени может эффективно уменьшить задержку.



в заключении

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

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

----

Автор: Оу Чэнцзу

Ссылка на ссылку:

  1. System Architectures for Personalization and Recommendation - Netflix Tech Blog

  2. ML Pipelines - Spark 2.4.3 Documentation