Павел Клеменков, Head of machine learning department, Rambler & Co. Если вы хотите получить доступ к видео выступления, напишите нам на datascienceweek2016@gmail.com.
9. Со стримингом сложно вообще все...
INSERT OVERWRITE TABLE predict
SELECT TRANSFORM(line)
FROM features_table
USING 'umworld_caller.py apply -f model.vw'
AS ruid, label, probability;
Отдел машинного обучения AdTech 7/40
16. + Эксперименты в Jupyter notebook и
продакшен код разделены
+ Отлаживать стриминг очень сложно
+ Трейны готовятся на лету, поэтому
экспериментировать с новыми фичами
долго
+ Тесты написать практически невозможно
+ Деплоить код на кластер непросто
(внешние библиотеки)
Отдел машинного обучения AdTech 14/40
17. Наше решение
+ Kafka
+ Camus
+ Spark
+ Hive
+ Airflow
+ Graphite
+ Aerospike
+ Jenkins
+ Slack
+ XGBoost
+ Vowpal Wabbit
+ Keras
Отдел машинного обучения AdTech 15/40
21. Speed
Run programs up to 100x
faster than Hadoop
MapReduce in memory, or
10x faster on disk
Отдел машинного обучения AdTech 19/40
22. 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
25. Витрина фич
+ Разнести обучение и напил фич
+ Фичи пилятся независимо (если что-то
упало, остальное работает)
+ Эксперимент: просто набираешь фич как
в магазине
Отдел машинного обучения AdTech 23/40
27. 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
28. Зачем нужны load и save?
+ Есть трансформеры, состояние которых
надо сохранять (напр. LDA)
+ Pyspark поддерживает сериализацию
только pickle
+ Кастомная сериализация позволяет
поддержать версионирование витрины
фич
Отдел машинного обучения AdTech 26/40
29. Как выглядит обучение?
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
30. Сериализация модели - боль
+ XGBoost сериализуется из коробки
+ Vowpal Wabbit сериализуется через
уникальный :) механизм записи бинарной
модели в байтовый массив
Отдел машинного обучения AdTech 28/40
31. Как выглядит применение?
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
32. В Airflow все видно
Отдел машинного обучения AdTech 30/40
33. В Airflow все видно
Отдел машинного обучения AdTech 31/40
34. Timing (100 executors: 8gb, 2 vcores)
Подзадача Время вычислений
Data load and merge 0:08:49
Conversion to Pandas 0:07:43
Local fit 0:01:44
Evaluation 0:04:44
Apply 0:46:07
Transform to class 0:02:24
Total 1:13:05
Отдел машинного обучения AdTech 32/40
35. А деплой в Jenkins
Отдел машинного обучения AdTech 33/40
36. А Jenkins пишет в Slack
Отдел машинного обучения AdTech 34/40
38. В сухом остатке
- C Airflow постоянно возникают проблемы
- Python API Spark отстает от Scala API
- Python API заметно медленней в
некоторых задачах (конвертация
объектов)
- Частые проблемы с сериализацией
объектов
- Требуется время на подбор ресурсов
Spark-задач
Отдел машинного обучения AdTech 36/40
39. В сухом остатке
- Spark не поддерживает бакеты Hive
- Память драйвера инициализируется
только через конфиг
- Большой Spark DataFrame можно
сохранить локально только через HDFS
- При чтении из Hive число партиций Spark
определяется числом бакетов
- persist - неявный сборщик мусора?
Отдел машинного обучения AdTech 37/40
40. В сухом остатке
+ Единая шина данных (Kafka)
+ Единый мониторинг для всего (Graphite)
+ Удобный и красивый интерфейс
мониторинга (Grafana + Airflow)
+ Удобный workflow-менеджер с мощным
визуальным интерфейсом (Airflow)
+ Витрина фич
+ Эксперименты и продакшен в Jupyter
notebook
Отдел машинного обучения AdTech 38/40
41. В сухом остатке
+ Число и скорость проведения
экспериментов возросли значительно
+ Простое и удобное тестирование
(текущее покрытие кода 60%)
+ Простая и удобная отладка (Airflow +
Sentry)
+ Деплой одной кнопкой (Jenkins +
SaltStack)
+ Своевременные оповещения о
проблемах (Airflow + Jenkins + Slack)
Отдел машинного обучения AdTech 39/40