data science week 2016. rambler & co. "Пайплайн машинного обучения...
TRANSCRIPT
Пайплайн машинного обучения наApache Spark
A long time ago in a galaxy far, far away
Отдел машинного обучения AdTech 1/40
Отдел машинного обучения AdTech 2/40
Поставку данных сложномониторить и отлаживать
Отдел машинного обучения AdTech 3/40
Отдел машинного обучения AdTech 4/40
Со стримингом сложновообще все...
Отдел машинного обучения AdTech 5/40
Отдел машинного обучения AdTech 6/40
Со стримингом сложно вообще все...
INSERT OVERWRITE TABLE predictSELECT TRANSFORM(line)FROM features_tableUSING 'umworld_caller.py apply -f model.vw'AS ruid, label, probability;
Отдел машинного обучения AdTech 7/40
Отдел машинного обучения AdTech 8/40
Отдел машинного обучения AdTech 9/40
Мониторить тоже сложно
Отдел машинного обучения AdTech 10/40
Joblocker
Отдел машинного обучения AdTech 11/40
Интерфейс мониторинга
Отдел машинного обучения AdTech 12/40
Программироватьнепросто
Отдел машинного обучения AdTech 13/40
+ Эксперименты в Jupyter notebook ипродакшен код разделены
+ Отлаживать стриминг очень сложно+ Трейны готовятся на лету, поэтомуэкспериментировать с новыми фичамидолго
+ Тесты написать практически невозможно+ Деплоить код на кластер непросто(внешние библиотеки)
Отдел машинного обучения AdTech 14/40
Наше решение
+ Kafka+ Camus+ Spark+ Hive+ Airflow+ Graphite
+ Aerospike+ Jenkins+ Slack+ XGBoost+ Vowpal Wabbit+ Keras
Отдел машинного обучения AdTech 15/40
Новая архитектура
Отдел машинного обучения AdTech 16/40
Кафка + мониторинг
Отдел машинного обучения AdTech 17/40
Так почему Spark?
Отдел машинного обучения AdTech 18/40
Speed
Run programs up to 100xfaster than Hadoop
MapReduce in memory, or10x faster on disk
Отдел машинного обучения AdTech 19/40
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
Generality
Отдел машинного обучения AdTech 21/40
Runs everywhere
Отдел машинного обучения AdTech 22/40
Витрина фич
+ Разнести обучение и напил фич+ Фичи пилятся независимо (если что-тоупало, остальное работает)
+ Эксперимент: просто набираешь фич какв магазине
Отдел машинного обучения AdTech 23/40
Витрина фич
Отдел машинного обучения AdTech 24/40
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
Зачем нужны load и save?
+ Есть трансформеры, состояние которыхнадо сохранять (напр. LDA)
+ Pyspark поддерживает сериализациютолько pickle
+ Кастомная сериализация позволяетподдержать версионирование витриныфич
Отдел машинного обучения AdTech 26/40
Как выглядит обучение?
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
Сериализация модели - боль
+ XGBoost сериализуется из коробки+ Vowpal Wabbit сериализуется черезуникальный :) механизм записи бинарноймодели в байтовый массив
Отдел машинного обучения AdTech 28/40
Как выглядит применение?
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
В Airflow все видно
Отдел машинного обучения AdTech 30/40
В Airflow все видно
Отдел машинного обучения AdTech 31/40
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
А деплой в Jenkins
Отдел машинного обучения AdTech 33/40
А Jenkins пишет в Slack
Отдел машинного обучения AdTech 34/40
И Airflow тоже
Отдел машинного обучения AdTech 35/40
В сухом остатке
- C Airflow постоянно возникают проблемы- Python API Spark отстает от Scala API- Python API заметно медленней внекоторых задачах (конвертацияобъектов)
- Частые проблемы с сериализациейобъектов
- Требуется время на подбор ресурсовSpark-задач
Отдел машинного обучения AdTech 36/40
В сухом остатке
- Spark не поддерживает бакеты Hive- Память драйвера инициализируетсятолько через конфиг
- Большой Spark DataFrame можносохранить локально только через HDFS
- При чтении из Hive число партиций Sparkопределяется числом бакетов
- persist - неявный сборщик мусора?
Отдел машинного обучения AdTech 37/40
В сухом остатке
+ Единая шина данных (Kafka)+ Единый мониторинг для всего (Graphite)+ Удобный и красивый интерфейсмониторинга (Grafana + Airflow)
+ Удобный workflow-менеджер с мощнымвизуальным интерфейсом (Airflow)
+ Витрина фич+ Эксперименты и продакшен в Jupyternotebook
Отдел машинного обучения AdTech 38/40
В сухом остатке
+ Число и скорость проведенияэкспериментов возросли значительно
+ Простое и удобное тестирование(текущее покрытие кода 60%)
+ Простая и удобная отладка (Airflow +Sentry)
+ Деплой одной кнопкой (Jenkins +SaltStack)
+ Своевременные оповещения опроблемах (Airflow + Jenkins + Slack)
Отдел машинного обучения AdTech 39/40
Вопросы?
Отдел машинного обучения AdTech 40/40