42

Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Embed Size (px)

Citation preview

Page 1: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"
Page 2: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

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

Page 3: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

A long time ago in a galaxy far, far away

Отдел машинного обучения AdTech 1/40

Page 4: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Отдел машинного обучения AdTech 2/40

Page 5: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Поставку данных сложномониторить и отлаживать

Отдел машинного обучения AdTech 3/40

Page 6: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Отдел машинного обучения AdTech 4/40

Page 7: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Со стримингом сложновообще все...

Отдел машинного обучения AdTech 5/40

Page 8: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Отдел машинного обучения AdTech 6/40

Page 9: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Со стримингом сложно вообще все...

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

Отдел машинного обучения AdTech 7/40

Page 10: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Отдел машинного обучения AdTech 8/40

Page 11: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Отдел машинного обучения AdTech 9/40

Page 12: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Мониторить тоже сложно

Отдел машинного обучения AdTech 10/40

Page 13: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Joblocker

Отдел машинного обучения AdTech 11/40

Page 14: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Интерфейс мониторинга

Отдел машинного обучения AdTech 12/40

Page 15: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Программироватьнепросто

Отдел машинного обучения AdTech 13/40

Page 16: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

+ Эксперименты в Jupyter notebook ипродакшен код разделены

+ Отлаживать стриминг очень сложно+ Трейны готовятся на лету, поэтомуэкспериментировать с новыми фичамидолго

+ Тесты написать практически невозможно+ Деплоить код на кластер непросто(внешние библиотеки)

Отдел машинного обучения AdTech 14/40

Page 17: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Наше решение

+ Kafka+ Camus+ Spark+ Hive+ Airflow+ Graphite

+ Aerospike+ Jenkins+ Slack+ XGBoost+ Vowpal Wabbit+ Keras

Отдел машинного обучения AdTech 15/40

Page 18: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Новая архитектура

Отдел машинного обучения AdTech 16/40

Page 19: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Кафка + мониторинг

Отдел машинного обучения AdTech 17/40

Page 20: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Так почему Spark?

Отдел машинного обучения AdTech 18/40

Page 21: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Speed

Run programs up to 100xfaster than Hadoop

MapReduce in memory, or10x faster on disk

Отдел машинного обучения AdTech 19/40

Page 22: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Ease of use

text_file = spark.textFile("hdfs://...")

text_file.flatMap(lambda line: line.split()).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)

Отдел машинного обучения AdTech 20/40

Page 23: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Generality

Отдел машинного обучения AdTech 21/40

Page 24: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Runs everywhere

Отдел машинного обучения AdTech 22/40

Page 25: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Витрина фич

+ Разнести обучение и напил фич+ Фичи пилятся независимо (если что-тоупало, остальное работает)

+ Эксперимент: просто набираешь фич какв магазине

Отдел машинного обучения AdTech 23/40

Page 26: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Витрина фич

Отдел машинного обучения AdTech 24/40

Page 27: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

ML. Мы поддержали интерфейс spark.ml и sklearn

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

Отдел машинного обучения AdTech 25/40

Page 28: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Зачем нужны load и save?

+ Есть трансформеры, состояние которыхнадо сохранять (напр. LDA)

+ Pyspark поддерживает сериализациютолько pickle

+ Кастомная сериализация позволяетподдержать версионирование витриныфич

Отдел машинного обучения AdTech 26/40

Page 29: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Как выглядит обучение?

class SparkXGBoostClassifier(SparkSklearnClassifier):def _fit(self, X_train, y_train, weight_train,

X_validate, y_validate, weight_validate):

xgb_options = self.model.get_xgb_params()n_classes = len(np.unique(y_train)...self.model.fit(X_train, y_train, **fit_params)

Отдел машинного обучения AdTech 27/40

Page 30: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Сериализация модели - боль

+ XGBoost сериализуется из коробки+ Vowpal Wabbit сериализуется черезуникальный :) механизм записи бинарноймодели в байтовый массив

Отдел машинного обучения AdTech 28/40

Page 31: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Как выглядит применение?

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

Отдел машинного обучения AdTech 29/40

Page 32: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

В Airflow все видно

Отдел машинного обучения AdTech 30/40

Page 33: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

В Airflow все видно

Отдел машинного обучения AdTech 31/40

Page 34: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Timing (100 executors: 8gb, 2 vcores)

Подзадача Время вычисленийData load and merge 0:08:49Conversion to Pandas 0:07:43Local fit 0:01:44Evaluation 0:04:44Apply 0:46:07Transform to class 0:02:24Total 1:13:05

Отдел машинного обучения AdTech 32/40

Page 35: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

А деплой в Jenkins

Отдел машинного обучения AdTech 33/40

Page 36: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

А Jenkins пишет в Slack

Отдел машинного обучения AdTech 34/40

Page 37: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

И Airflow тоже

Отдел машинного обучения AdTech 35/40

Page 38: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

В сухом остатке

- C Airflow постоянно возникают проблемы- Python API Spark отстает от Scala API- Python API заметно медленней внекоторых задачах (конвертацияобъектов)

- Частые проблемы с сериализациейобъектов

- Требуется время на подбор ресурсовSpark-задач

Отдел машинного обучения AdTech 36/40

Page 39: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

В сухом остатке

- Spark не поддерживает бакеты Hive- Память драйвера инициализируетсятолько через конфиг

- Большой Spark DataFrame можносохранить локально только через HDFS

- При чтении из Hive число партиций Sparkопределяется числом бакетов

- persist - неявный сборщик мусора?

Отдел машинного обучения AdTech 37/40

Page 40: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

В сухом остатке

+ Единая шина данных (Kafka)+ Единый мониторинг для всего (Graphite)+ Удобный и красивый интерфейсмониторинга (Grafana + Airflow)

+ Удобный workflow-менеджер с мощнымвизуальным интерфейсом (Airflow)

+ Витрина фич+ Эксперименты и продакшен в Jupyternotebook

Отдел машинного обучения AdTech 38/40

Page 41: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

В сухом остатке

+ Число и скорость проведенияэкспериментов возросли значительно

+ Простое и удобное тестирование(текущее покрытие кода 60%)

+ Простая и удобная отладка (Airflow +Sentry)

+ Деплой одной кнопкой (Jenkins +SaltStack)

+ Своевременные оповещения опроблемах (Airflow + Jenkins + Slack)

Отдел машинного обучения AdTech 39/40

Page 42: Data Science Week 2016. Rambler & Co. "Пайплайн машинного обучения на Apache Spark"

Вопросы?

Отдел машинного обучения AdTech 40/40