Пайплайн машинного обучения на Apache Spark / Павел...

Preview:

Citation preview

Пайплайн машинного обучения на Apache SparkПавел Клеменков, Rambler&Cop.klemenkov@rambler-co.ru

Remember when Rambler used to be a search engine?

Pepperidge Farm remembers

Мотивационный пример• Обучили модель CTR (PySpark,

vowpal wabbit• Предикт ~= baseline CTR

• Закинули модель в сервис (Vert.X, VW JNI)• Предикт != baseline CTR• В чем дело?• Из-за sparse-формата,

потерялись некоторые фичи

Что хотим от математика-программиста?• Качественные эксперименты быстро• Доведение эксперимента до продакшена• Поддержка и багфиксы

WTF is this shit?!

All my code works!And I didn’t break the build!

Качественный эксперимент быстро• Знакомое окружение• Все новое и крутое• Витрина фич

Эксперимент в продакшене• Простое тестирование• Окружение как на продакшене• Автоматизация

Эксплуатация и багфиксы• Простой и наглядный мониторинг• Адресные оповещения• Доступная отладка

С чего стартовали?

HDFS+

Hive

SCP

NFS

Custom scripts

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

You got a problemwith that?!

+

HDFS+

Hive

SCP

NFS

Custom scripts

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

HDFS+

Hive

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

HDFS+

Hive

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Airflow

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Airflow

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

Со стриммингом одни проблемы (

Diagnostic Messages for this Task:Error: java.lang.RuntimeException: Hive Runtime Error while closing operators

SELECT TRANSFORM(*) USING 'python script.py'FROM table;

И даже тесты не помогут…

INSERT OVERWRITE TABLE predictSELECT TRANSFORM(line)FROM features_tableUSING 'umworld_caller.py apply -f model.vw' AS uid, probabilities;

Traceback (most recent call last)----> uid, probabilities = '0000000149C7211B6A53058C0942A001 1.3752,-0.37520000000149BBA4BF2CC10CD6043D1401 1.3752,-0.3752'

ValueError: too many values to unpack

Очень долго готовить данные

Типичный алгоритм эксперимента• Выгрузить сэмпл из Hive• Сконвертировать в Pandas• Поиграть с данными• Понять, что чего-то не хватает• Выгрузить другой сэмпл из Hive…

HDFS+

Hive

Aerospike

Hive streaming

Airflow

Kafka

Gobblin

Graphite Grafana

Spark + ML

Почему ?

It is in-memory and there is a Python API!

Pandas vs Spark Dataframeimport pandas as pd

!hive -e "select * from users" > dt.csvdf = pd.read_csv("dt.csv")counts = df[df.age > 30] .groupby("sex") .count()

from pyspark.sql import HiveContext

ctx = HiveContext(sc)df = ctx.sql("select * from users")counts = df[df.age > 30] .groupby("sex") .count()

А на самом деле…

SPARK-15139PySPark TreeEnsemble missing methods

SPARK-18177Add missing ‘subsamplingRate’of pyspark GBTClassifier

SPARK-17025Cannot persist PySpark ML Pipeline model that includes custom Transformer

SPARK-15194Add Python ML API forMultivariateGaussian

Архитектура Spark

Resilient

Distributed

Datasetrdd1.join(rdd2) .groupby(...) .filter(...)

RDD

Partition

Partition

Partition

Partition

Job

Stage

Task

Task

Task

Task

action

Driver

SparkContext Cluster Manager

Worker Node

Executor Cache

Task Task

Worker Node

Executor Cache

Task Task

Урок №1

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

сильно упрощает жизнь

Урок №2

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

сильно усложняет жизнь

Narrow (no shuffle):• map• flatMap• filter• sample

Wide (shuffle):• sortByKey• reduceByKey• groupByKey• join

Урок №3

Избегайте shuffle

Вся прелесть DataFrame

Почему DataFrame такой быстрый?

• RDD – низкоуровневый API без оптимизаций• DataFrame – это Spark SQL• Catalyst – оптимизатор запросов• Tungsten Execution Backend

Урок №4

Используя DataFrame можно меньше париться про оптимизацию

вычислений

Урок №5

При чтении из Hive, Spark создает партиции по числу бакетов таблицы

Use XGBoost, Luke © Unknown Kaggler

Почему мы не используемSpark.ML?

Причина №1• Vowpal Wabbit и XGBoost в старом пайплайне• Новый код для напилки фич

Причина №2SPARK-14374PySpark ml GBTClassifier, Regressorsupport export/import (Resolved: 15/Apr/16)

SPARK-13034PySpark ml.classification support export/import (Resolved: 16/Mar/16)

Причина №3

Объем обучающей выборки

Каче

ство

на

обуч

ении

Но мы верили, чтовсе изменится :)

Поэтому поддержали API Spark.MLfrom pyspark.ml.pipeline import Transformer

class BaseTransformer(Transformer): def __init__(self, day=None) def fit(self, df) def _transform(self, df) def load(self, timestamp) def save(self, timestamp)

SparkContext

Py4J

SparkContext

LocalFS

SparkWorker

SparkWorker

Python

Python

Python

Python

Python

Python

SocketPipe

Python JVM

Урок №6

При работе с PySpark overhead есть не только у самого Python, но и на перегонку объектов в/из JVM

Урок №7

Для сериализации используется cloudpickle, а он не всемогущ

Talk is cheap.Show me the code!

class SparkXGBoostClassifier(SparkSklearnClassifier): def predict_proba(self, df): rdd = df.map(self._create_dataset) df = rdd.toDF()[['uid', 'feature']] v_model = df._sc.broadcast(self.model) res = df.rdd.mapPartitionsWithIndex( partial(apply_model, v_model=v_model)) return res

Timing (100 executors – 8gb, 2 vcores)Подзадача ВремяЗагрузить и сджойнить фичи 0:08:49Сконвертировать трейн в Pandas 0:07:43Настройка модели 0:01:44Вычисление качества 0:04:44Применение модели 0:46:07Сконвертировать вероятность в ответ 0:02:24Итого 1:13:05

Those, who ask questions.You da real MVP!

Recommended