Case study of how small team in Preply started with inheriting an existing ranking model to being able to produce a model per day. In this talk we'll cover steps to take if you find yourself in a similar situation: what kind of technology and processes can you introduce in order to achieve a great speedup in a development speed.
4. Як працювала модель спочатку?
Розробка і тренування: Jupyter Notebooks на локальних машинах
Джерело даних: декілька баз даних, що join’ились за допомогою pandas
Калькуляція ранжування: Jenkins job
Інтеграція з бекендом: Elasticsearch
Час на ітерацію: більше місяця
5. Як ми це вирішували?
Поступово.
1. Джерело даних.
2. Розробка (і production).
3. Джерело даних (ще раз).
4. Розробка і production (ще раз).
8. Стало краще
1. Pandas всередині Jenkins “тупив”, бо даних було забагато
2. Перевикористали уже готову інфраструктуру (Snowflake)
3. Стало набагато зручніше рахувати features
a. Було: SQL in python, pandas to join
b. Стало: SQL in python
9. Які проблеми залишились?
1. Jenkins досі виглядає, як “костиль”.
2. Розробка і тренування моделі досі відбуваються на локальних машинах.
3. SQL запити туплять.
10. Що зробили з SQL запитами?
Оптимізували.
1. Йшли від найбільш “важких” до найбільш “легких” запитів.
2. Більшість запитів оптимізувати було тривіально — використання pre-computed tables для
зменшення часу на сканування таблиці.
12. Мінуси Sagemaker
1. AWS Console UI
2. Доволі “сирий” продукт
a. Ноутбуки “помирали”, якщо сесія закінчиться
b. Виглядає як швидка обгортка AWS над Jupyter notebooks
14. Переваги databricks
1. Легка інтеграція з існуючими хмарними вендорами: AWS, GCP тощо
2. PySpark з коробки
3. “Вертикальне” рішення для data-задач:
a. Notebooks
b. Jobs
c. Data Lake
d. Streaming
e. MLFlow
f. MLOps
19. Feature store
Ціль: перевикористання features
Вирішення:
1. Обраховуємо features кожного дня і зберігаємо
2. SQL використовує features з feature store
Підхід:
1. Feast
2. Databricks feature store
3. Самописний “фреймворк” поверх Snowflake
20. Чому самописний “фреймворк”?
1. Готові продукти не вирішують основної задачі: “як рахувати features?”.
2. Можливість власних абстракцій для калькуляції features
a. Testing
b. Monitoring
c. Вимоги специфічні до нашої моделі
Проблема: абстракції над features лімітують архітектуру моделі.
21. Пролемa залишилась
model_a
– collect_impressions_features.sql
– collect_profile_views_features.sql
model_b
– collect_impressions_features.sql
– collect_profile_views_features.sql
– collect_lessons_features.sql
1. Зменшили к-сть рядків в SQL запитах з тисяч
до десятків/сотень
2. Значно пришвидшилась швидкість збирання
даних для тренування
22. MLFlow / MLOps
1. Data scientists можуть натренувати модель “однією кнопокою”
2. Версіонування
3. Облік: які features використовує модель, на якому наборі даних тренувались
4. Статистичні метрики (AUC, NDCG тощо) зберігаються в одному місці (databricks)
5. Бізнес метрики автоматични рахуються та збергіються в одному місці (databricks)
23. Як зараз проходить тренування моделі?
1. (Опціонально) Додати нові features у feature store
2. Описати модель:
a. Які features з feature store використовувати
b. Прописати SQL для targets
c. Прописати “пост-процессинг”, наприклад feature_c = feature_a / feature_b
3. Натиснути “одну кнопку” в databricks інтерфейсі
27. Проблеми нашого підходу
Feature store і MLOps лімітовані під нашу задачу:
1. Features калькулюються раз в день
a. Якщо захочемо перераховуати ранжування погодинно — доведеться доробляти
2. Привʼязані до певного формату input/output
a. Якщо захочемо робити іншу архітектуру, наприклад, real time — доведеться переробляти
3. Складність додавання features
a. Накидати SQL-скриптик простіше, ніж додати feature у feature store по процесу
Доброго дня, мене звати Євген Євсюгов, я Senior Software Engineer в компанії Preply. Сьгогодні я буду розповідати про те, як Preply зменшила час розробки ML моделі з 1 місяця до 1 дня. Хочу зазначити, що ця доповідь буде більше про процеси, ніж про технології, але певні інструменти я тут також згадаю. Оскільки це доповідь про data science, тому я почну з того, яку задачу ми вирішуємо, а для цього спочатку розповім чим ми в Preply займаємось.
Preply — це продукт, який дозволяє вам знайти викладачів для занять 1 на 1. В основному це заняття з англійської, німецької, іспанської та інших мов, але також є викладачі з математики, музики тощо. Рано чи пізно блукаючи по Preply ви потрапите на оцю сторінку, яку ми називаємо сторінкою пошукової видачі. Тут є список репетиторів, заняття з якими ви можете забронювати. І їх порядок дуже важливий, бо якщо ми покажемо вам тут не дуже привабливих для вас як студента викладачів, то ви підете з платформи і не повернетесь, а якщо покажемо хороших — то ви будете дуже довго користуватись нашим продуктом. І моя команда займається якраз тим, що ми за допомогою ML-моделі намагаємось вирішити цю задачу.
Коли команда сформувалась, то у нас було 2 дата саянтиста і 1 модель, що була ними натренована. Дата саянтисти робили модель “як могли” і раз в місяць-два приходили до бекенд розробників з .pkl файлом, щоб ті запустили новий АБ-тест. Ідея нової команди була в тому, щоб докинути в команду інженерів, і швидше ітерувати над моделлю. Одним з цих інженерів був і я.
Як же ж зʼявлявся цей .pkl файл? Уся розробка велась на локальних машинах, де піднімались джупітер ноутбуки і збирали дані або тренували модель.
Було декілька різних джерел даних, які джойнились прямо у ноутбуці за допомогою pandas.
Для того, щоб це все якось рахувалось в production, запускалась окрема дженкінс джоба.
І коли ця джоба відпрацьовувала, результати моделі потрапляли в elasticsearch, який вже підхоплював бекенд.
Як можна зрозуміти, проблеми тут є на кожному з етапів — від того, що модель може впасти, бо відвалиться вай-фай вдома або в офісі, до того, що jenkins джоба також може впасти, бо їй не вистачить памʼяті. Зібрати дані для тренування також займало більше тижня.
Як ми це вирішували? Поступово.
Ми почали з того, щоб зробити єдину точку входу для джерела даних.
Потім ми почали покращувати інструменти розробки і запуску всього цього в production.
Потім ми знову подивилось на те, що у нас вийшло і вирішили ще покращити джерело даних і розробку.
Приблизно таку архітектуру ви можете собі уявити.
У нас були дві основні бази даних — AWS Redshift, де зберігались івенти і постгрес, де зберігалась основні дані.
Це все добро потрапляло в дженкінс, який вже за допомогою пандас це все джойнив, запихував в модель і потім зберігав.
Перше, що ми зробили — це замінили постгрес і редшифт на сноуфлейк. Тут нам пощастили, адже паралельно інша команда уже налаштувала всі реплікації і ETL потрібні для цього, тому тут нам залишалось лише трішки переписати SQL. Ми також забрали механізм join з pandas, адже тепер всі дані лежали в сноуфлейку і джойнити їх можна було прямо там.
Як я вже казав, стало краще. Основну частину по роботі з даними ми перенесли в Snowflake, що значно полеглшило нам як і локальну розробку, так і роботу наших джобів в проді.
Але ми все ще були далекі від ідеалу. Jenkins досі виглядає як “костиль”.
Розробка і тренування моделі досі відбуваються на локальних машинах.
SQL запити дуууужее повільні, навіть зі сноуфлейком.
Ми вирішили почати з SQL. Оптимізовувати його було досить тривіально — просто налаштували щоденні ETL, які готували дані для основних запитів, що значно пришвидшило швидкодію.
Далі ми вирішили взятись за розробку самих моделей. Ми вирішили переїжджати з локальних ноутбуків на cloud-рішення, яке дозволить нам тренувати моделі на потужніших машинах, ніж макбуки. Оскільки ми дуже активно використоємо AWS в преплі, то ми зразу обрали AWS Sagemaker. Це такий сервіс від AWS, який по факту є обгорткою над jupyter ноутбуками і дозволяє запускати ці самі ноутбуки на AWS машинах.
Працюючи з Sagemaker ми зразу стикнулись з проблемами. Слід зазначити, що це був стан речей 2 роки назад, можливо зараз все змінилось. На мою думку, sagemaker був доволі сирим продуктом на той — працюючи з ним вам доведеться працювати з AWS Console UI, який є далеко не найкращим UI у світі. Але основна наша проблема була в тому, що ноутбуки “помирали” через деякий час. Уявіть собі ситуацію, ви заходите в Sagemaker, запускаєте тренування моделі в свому ноутбуці, потім ідете гуляти, в цей час ноутбук засинає, сесія з AWS перестає бути дійсною і ноутбук помирає. Ви повертаєтесь, бачите це і сумуєте. Консультанти з AWS нам намагались пояснити, що це було звʼязано з тим, що sagemaker — це обгортка над jupyter ноутбуками, а це сам їх логіка так помирати, але я досі не до кінця розумію, як це повинно було працювати на практиці.
Отож тоді нам порадили також глянути на databricks.
І датабрікс виявився коханням з першого погляду: у ньому було все, що нам потрібно та навіть більше. Він ідеально інтегрується з AWS, дає нам доступ до pyspark, а також надає вертикальне рішення для сучасних задач повʼязаних з даними: …. І ви можете щось з цього використовувати, щось не використовувати, щось підлаштовувати під себе. Плюсом також є те, що різні їх продукти класно інтегруються між собою, наприклад MLOps і Feature store тощо. Обіцяю, що датабрікс мені не заплатили, щоб я їх рекламував, вони просто класні.
Отож резюмуючи, ми прийшли до такої архітектури. Локальна розробка відбувається в датабріксі, прод ми також туди перевели. Дані тягнуться з сноуфлейку, процесяться в датабріксі за допомогою пандас, а потім потрапляють в еластік. Однією з проблем досі лишався перформанс, а саме перформанс пандасу для препроцесингу даних, перед тим як закинути їх в модель.
І тут нам на допомогу також прийшов датабрікс. Він з коробки дозволяє працювати з pyspark. Якщо ви не знаєте, то pyspark — це такий фремворк для розподілених обчислень, можете уявити, як пандас, що запускається на кластері, а не на одній машині. Ми досить просто переписали наш процесинг з pandas на pyspark і залишились задоволені нашим пайплайном.
З нашого досвіду snowflake і датабрікс — це класно, sagemaker — не класно. Основна проблема — за все треба платити, і ці продукти можуть бути доволі дорогими. Тут важливо зробити чекпойнт. Все що я до цього описував і те, до чого ми прийшли, теоретично лягає на будь-яку команду або компанію, яка займається ML. Далі я буду розповідати про речі, які вже більше специфічні для преплі і можуть не працювати для вас. Коли ми нарешті налаштували доступ до даних, в нас зʼявився класний датабрікс, то ми перейшли на наступну сходинку піраміди маслоу. Ми почали собі задавати питання: “а як правильно діставати дані?”, “а як правильно організовувати код?”, “а як правильно трекати модель?”. І таким чином у нас зʼявилась ціль — ми хочемо тренувати модель “однією кнопкою”.
Перша проблема, яка стояла на нашому шляху до тренування однією кнопкою, це наша організація коду. Не забувайте, що ми весь час вирішуємо одну і ту саму задачу — ранжування викладачів.