Полезные ресурсы, концепции и уроки для Data Scientist, создающего первый конвейер сквозного машинного обучения в Spark

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

Я думал, что в Spark будет не так много вариантов моделирования, а пакет машинного обучения Spark не будет таким мощным и удобным, как sklearn. Однако, к своему удивлению, я легко нашел все, что мне нужно, в Spark. Я нашел модель, которую хотел использовать, lightgbm, в mmlspark (пакет с открытым исходным кодом для Spark, разработанный Microsfot); и я нашел довольно хорошо задокументированные функции проектирования и конвейерные функции из пакета Spark MLlib.

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

Основополагающие концепции

PySpark против Python

Код и функции Python. Код Python работает с объектами Python (список, словарь, типы данных pandas, типы данных numpy и т. д.), выполняется в PySpark, но они не будут выгода от искры вообще (то есть распределенных вычислений).

Однако код Python нельзя напрямую применять к объектам Spark (RDD, Spark Datasets, Spark Dataframe и т. Д.). При необходимости такой код можно превратить в UDF (определяемые пользователем функции) для применения к каждой строке объектов Spark (точно так же, как map в pandas). Этот блог очень хорошо объясняет UDF, а также есть пример кода из этой записной книжки Databricks.

Код и функции PySpark. Код Pyspark можно применять только к объектам Spark. Они не будут работать при применении к объектам Python.

Преобразование объектов Python и PySpark: можно преобразовать некоторые (но не все) объекты Python (например, фрейм данных pandas) в объекты-искры (например, фреймы данных Spark) и наоборот, когда он достаточно мал, чтобы поместиться в памяти водителя.

spark.mllib против spark.ml

Сначала меня очень сбивало с толку, что при просмотре документации вы увидите, что MLlib используется как имя библиотеки машинного обучения, но все примеры кода импортируются из pyspark.ml. Фактически, и spark.mllib, и spark.ml являются библиотеками машинного обучения компании Spark: spark.mllib - это старая библиотека, которая работает с RDD, а spark.ml - это новый API, построенный на основе фрейма данных Spark. Согласно объявлению искры, API на основе RDD вошел в режим обслуживания начиная со Spark 2.0.0. Это означает, что в pyspark.mllib не будут добавляться новые функции, а после достижения паритета функций API на основе RDD станет устаревшим; Ожидается, что pyspark.mllib будет удален в Spark 3.0. Короче говоря, используйте pyspark.ml и не используйте pyspark.mllib, когда можете.

Извлеченные уроки

Выбор алгоритма

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

Также есть открытая библиотека mmlspark. Он обеспечивает бесшовную интеграцию конвейеров машинного обучения Spark с Microsoft Cognitive Toolkit (CNTK), LightGBM и OpenCV. К сожалению, другой очень популярный фреймворк для обучения, xgboost, не поддерживается в PySpark. Несмотря на то, что существует XGBoost4J-Spark, который интегрирует фрейм xgboost на искре, API Python еще не разработан.

Как упоминалось ранее, технически возможно импортировать модуль python xgboost или lightgbm и применять обучающие функции к фрейму данных pandas в PySpark, если обучающие данные могут поместиться в памяти драйвера. Однако этот подход не принесет никакой пользы от Spark (т.е. обучение будет происходить на одной машине, но не распределено между машинами, как без Spark).

Никаких сверхглубоких деревьев

Одним из сюрпризов для меня является то, что ансамблевые модели случайных лесов и деревьев с градиентным усилением не могут принимать значения больше 30 для параметра max_depth. Время обучения также увеличивается экспоненциально с увеличением max_depth. С моим тренировочным набором, тренировка случайного леса с глубиной 20 заняла 1 час, а с глубиной 30 - 8 часов. На мой взгляд, неглубокое дерево для случайного леса является проблемой, потому что, когда обучающие данные большие, глубокие отдельные деревья могут находить разнообразные «правила», и такое разнообразие должно способствовать производительности.

Настройка распределения ресурсов

Важно выделить достаточно памяти для исполнителей во время обучения, и стоит потратить время на настройку числа ядер, числа исполнителей и памяти исполнителя. Один из моих тренировочных прогонов закончился за 10 минут с правильным распределением ресурсов по сравнению с 2 часами, когда я впервые начал настраивать распределение ресурсов.

Ансамбль Возможности

Большинство, если не все модели Spark принимают в качестве входных данных фрейм данных из 2 столбцов, функции и метки. Столбец Feature представляет собой список всех объединенных значений функций. VecorAssembler - это функция для этого, и ее всегда следует использовать на последнем этапе разработки функций. Пример использования при моделировании конвейера здесь.

Некоторые полезные ресурсы

Поиск функций: документация

Google, конечно, является первым выбором, когда дело доходит до поиска того, что вам нужно, но я обнаружил, что просмотр документации Spark о функциях также очень полезен. Однако важно указать правильную версию Spark (ссылка выше - версия 2.4.3).

Примеры кода конвейера машинного обучения: документация Databricks 'Notebook

В документации Spark MLlib уже есть много примеров кода, но я нашел Документацию по записной книжке Databrick для машинного обучения еще лучше. Этот блокнот проходит через конвейер обучения классификации, а этот блокнот демонстрирует настройку параметров и mlflow для отслеживания. Эти записные книжки созданы, чтобы объяснить, как использовать различные функции Spark MLlib в Databricks, но многие функции, представленные в этих записных книжках, предназначены не только для Databricks.

Общее понимание Spark: вводная страница Wikipedia и Spark

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

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

Заключение

По сравнению с python, сообщество поддерживает pyspark меньше, особенно когда речь идет о задачах машинного обучения. Я также не нашел много разработок с открытым исходным кодом для pyspark, кроме mmlspark. Однако Spark - очень мощный инструмент, когда дело касается больших данных: я смог обучить модель lightgbm в искре с ~ 20 млн строк и ~ 100 функциями за 10 минут. Конечно, время выполнения во многом зависит от параметров модели, но оно демонстрирует мощь Spark.