71
Пайплайн машинного обучения на Apache Spark Павел Клеменков, Rambler&Co [email protected]

Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

  • Upload
    ontico

  • View
    152

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Пайплайн машинного обучения на Apache SparkПавел Клеменков, Rambler&[email protected]

Page 2: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Remember when Rambler used to be a search engine?

Pepperidge Farm remembers

Page 3: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 4: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 5: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

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

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

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

Page 6: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 7: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

WTF is this shit?!

Page 8: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 9: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 10: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 11: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 12: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 13: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

SCP

NFS

Custom scripts

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Page 14: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

You got a problemwith that?!

Page 15: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

+

Page 16: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

SCP

NFS

Custom scripts

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Page 17: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

Page 18: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 19: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

RedisCluster

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

Page 20: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

Page 21: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 22: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

Monitoring (DIY)

ML (local)

Kafka

Gobblin

Page 23: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

Page 24: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 25: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Cron + joblocker

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

Page 26: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Airflow

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

Page 27: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 28: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

ML (local)

Airflow

Hive streaming

ML (local)

Kafka

Gobblin

Graphite Grafana

Page 29: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 30: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

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

Page 31: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 32: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 33: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

ValueError: too many values to unpack

Page 34: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 35: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 36: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 37: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

HDFS+

Hive

Aerospike

Hive streaming

Airflow

Kafka

Gobblin

Graphite Grafana

Spark + ML

Page 38: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Почему ?

Page 39: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 40: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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()

Page 41: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 42: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 43: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 44: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 45: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Resilient

Distributed

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

Page 46: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

RDD

Partition

Partition

Partition

Partition

Job

Stage

Task

Task

Task

Task

action

Page 47: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Driver

SparkContext Cluster Manager

Worker Node

Executor Cache

Task Task

Worker Node

Executor Cache

Task Task

Page 48: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №1

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

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

Page 49: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №2

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

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

Page 50: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

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

Page 51: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №3

Избегайте shuffle

Page 52: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 53: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)
Page 54: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 55: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 56: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №4

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

вычислений

Page 57: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №5

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

Page 58: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Use XGBoost, Luke © Unknown Kaggler

Page 59: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 60: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 61: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

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

Page 62: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Причина №3

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

Каче

ство

на

обуч

ении

Page 63: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 64: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Поэтому поддержали 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)

Page 65: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

SparkContext

Py4J

SparkContext

LocalFS

SparkWorker

SparkWorker

Python

Python

Python

Python

Python

Python

SocketPipe

Python JVM

Page 66: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №6

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

Page 67: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Урок №7

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

Page 68: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Talk is cheap.Show me the code!

Page 69: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 70: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

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

Page 71: Пайплайн машинного обучения на Apache Spark / Павел Клеменков (Rambler&Co)

Those, who ask questions.You da real MVP!