Вопрос или проблема
Я знаю, что этот вопрос задавали много раз и в разных формах. Существует множество блогов, статей, видео и курсов, которые рассматривают его и сравнивают сотни инструментов, библиотек, фреймворков… И это часть моей проблемы: я сталкиваюсь с таким количеством вариантов, что чувствую себя, как осёл Буридана, умирающий от голода из-за того, что не знает, что делать.
Хотя я не хочу писать слишком много, мне нужно немного рассказать о нашей ситуации, чтобы поставить вопрос в наш контекст.
Наша команда
Наша команда маленькая. У нас всего четыре человека, которых можно квалифицировать как начинающих дата-сайентистов. Один из нас имеет профиль, который немного больше похож на “инженера”, поэтому его можно было бы назвать дата-инженером. В любом случае, у нас нет большого опыта ни в Python-проектах, ни в Машинном обучении. У нас есть страсть и любовь к МЛ!
Несколько лет мы работали с SAS, но теперь планируем переход на питоновское окружение, так как оно гораздо более живое и увлекательное. В прошлом году мы сделали два проекта на Python, но без использования каких-либо хороших практик. Каждый шаг был выполнен вручную и подвержен ошибкам, модели не мониторились и даже не развертывались (они использовались только для выполнения пакетных прогнозов), проекты не были правильно структурированы, документация была болезненной…
Мы знаем, что нужно изменить это, прежде чем станет неуправляемо.
Мы не ожидаем, что размер команды скоро увеличится. Скажем, через пару лет мы можем ожидать 10-12 человек, работающих с нами (организация знает о важности Машинного обучения, но экономические вопросы могут стать препятствием).
Наши проекты
На данный момент мы делали только “классическое” Машинное обучение. То есть: никакого Глубокого обучения. Мы использовали Pandas и Scikit-Learn, XGBoost и т. д. И только в пакетном режиме. Но мы ожидаем изменения менее чем через год, потому что нам нужно будет обучить классификатор изображений для выявления аномалий в таможенных посылках, поэтому он должен быть:
Обучен с использованием свёрточной сетевой архитектуры глубокого обучения.
Интегрирован с другими приложениями (написанными на Java) и быстрым (в реальном времени).
Ещё одно изменение, которые мы ожидаем, это потребность в более распределённой обработке, так как нам нужно будет управлять некоторыми огромными базами данных, которые просто не помещаются в датафрейм Pandas. Это самые важные вызовы, с которыми мы сталкиваемся.
Наша компания
Мы работаем на большую компанию, которая также накладывает на нас некоторые ограничения. В основном:
У нас нет бюджета на MLOps решения, поэтому всё должно быть открытым и бесплатным.
Мы не будем нанимать дата-сайентистов / дата-инженеров в ближайшее время.
Существуют инструменты, используемые другими командами, которые мы должны использовать как часть стека MLOps, хотя они и не лучшие в своем классе.
Что касается последнего пункта, краткий список этих ограничений следующий:
-
У нас есть установка Cloudera Express. Это самая базовая и дешёвая опция Cloudera, поэтому она не поставляется с каким-либо инструментом для управления Машинным обучением. Она предоставляет нам только HDFS, Impala, Spark и набор узлов для запуска на них Python-скриптов.
-
У нас есть Control-M в качестве инструмента для оркестровки и управления рабочими процессами.
-
У нас есть DataStage в качестве инструмента ETL.
-
Мы используем SVN в качестве системы управления кодом (да, не git).
-
Мы развертываем наши проекты, используя очень упрощённую и самодельную версию Docker. Это немного странно, и я думаю, что если приложить немного усилий, мы могли бы убедить организацию разрешить нам использовать Docker. Но если Docker достижим, Kubernetes нам не под силу.
-
У нас есть Jenkins для CI.
-
У нас есть профессиональные лицензии Visual Studio Code.
Набор инструментов
С этими условиями у меня есть два разных и противоположных опасения или даже страха.
-
Страх не использовать достаточно инструментов и хороших практик и через пару лет оказаться в состоянии, когда мы не сможет управлять нашим кодом, проектами и моделями.
-
Страх использовать так много инструментов, что они наложат такой груз, который наша маленькая команда не сможет выдержать.
Понятно, что нам нужны некоторые MLOps, но сколько именно, не знаю. Я пересмотрю некоторые вещи, которые читал, и надеюсь, вы поможете мне выбрать правильные инструменты.
Программирование на Python
Похоже, что мы будем программировать, используя Visual Studio. Мы будем использовать удалённый интерпретатор, потому что будем запускать вещи на узлах Cloudera, хотя программировать будем локально и интегрировать код с репозиторием SVN.
Нужны ли нам инструменты для стандартизации нашего кода, такие как PyLint, Flake8, MyPy или Black? Вы бы рекомендовали какие-либо из них?
CI и развертывание
Мы будем использовать Jenkins. Для развертывания нашего кода, является ли Docker очевидным выбором, минимальным стандартом? Я склонен так думать из того, что читал, но хотел бы быть уверенным и иметь хорошие аргументы.
Нужны ли нам дополнительные инструменты?
Шаблон проекта
Я читал о PyScaffold, CookieCutter и, лучше всего (с моей точки зрения), Kedro. Я думаю, что мы остановимся на шаблоне Kedro, потому что он предлагает намного больше функциональности, и мне нравится думать о каждом проекте как о наборе пайплайнов, которые нужно запускать. Что вы думаете о Kedro?
Документация
Вы бы рекомендовали иметь отдельные документы или генерировать документацию из проектов, используя Sphinx или другой подобный инструмент? Я склонен предпочитать второй вариант, потому что первый, скорее всего, приводит к устаревшей документации. Но я не знаю, не является ли “нагрузка” второго варианта слишком большой, и будет ли генерируемая документация достаточной для типичного ML проекта.
Регистрация проектов
Существует ли инструмент, который может использоваться как “регистратор проектов”, например, простой веб-приложение, где мы могли бы переходить по нашим проектам, читать документацию и подобные вещи? Я не знаю. Если нет, регистрацией будет репозиторий SVN со всеми нашими проектами в виде папок, и это всё.
Работа с данными и их подготовка
Я думаю, что Matplotlib, Seaborn и Pandas должны быть достаточно, и когда дело дойдет до больших объёмов данных, мы должны использовать PySpark, Scala или даже обычный SQL в Impala. Однако я знаю, что существует Dask и более новые инструменты, такие как Koalas или Vaex. Что вы думаете?
Для создания пайплайнов преобразования данных мы будем использовать Kedro, хотя существует много инструментов, которые выглядят интересно, такие как Dagster.
Когда мы войдем в пределы “глубокого обучения”, можем ли мы продолжать использовать те же инструменты? Стоит ли использовать другой фреймворк, например, TFX? Я предпочёл бы, чтобы не так, так как изучение одного фреймворка сложно, а двух — хуже. Если решение подходит для всех наших проектов, это лучше. Или TFX подходит и для “классического” МЛ и для Глубокого обучения?
Тесты
Я думаю, что юнит-тестирование может быть слишком большой нагрузкой для нас. Но я наткнулся на библиотеку Great Expectations и думаю, что она хорошо подходит для ML проектов. Вы бы рекомендовали её в качестве важной части нашего MLOps стека?
Кстати, существует плагин Kedro-Great Expectations, поэтому мы могли бы воспользоваться этим.
Хранилище признаков
Насколько это нужно, особенно учитывая размер и опыт нашей команды? Если да, я читал о Feast и Snorkel.
Версионирование данных
Насколько это нужно, особенно учитывая размер и опыт нашей команды? Если да, я читал о DVC.
Экспериментирование
Я думаю, что это важная часть, хотя я задаюсь вопросом, действительно ли нам нужен инструмент или мы могли бы использовать наш собственный стандарт отчетов и артефактов для отслеживания того, что мы пробовали. Но риск того, что это станет неуправляемым, высок.
У Kedro есть журнал, я не знаю, может ли этого быть достаточно. Также у него есть плагин Kedro-MLFlow, так что мы могли бы извлечь выгоду из использования MLFlow в качестве инструмента для экспериментов.
Я также читал о Guild, который кажется действительно лёгким и простым. Я много больше не знаю.
Обучение
Я разработал свою библиотеку для выполнения вложенной кросс-валидации и, с той же функцией:
Оптимизация гиперпараметров (модели и пайплайна).
Генерация отчета об обучении для оценки качества модели.
Она построена на базе Skopt. Я сделал её pip установимой, вот здесь:
https://github.com/JaimeArboleda/nestedcvtraining
Таким образом, мы планируем использовать её с типичными моделями, такими как XGBoost, LightGBM и всем Scikit-Learn. И когда нам понадобятся другие фреймворки, такие как TensorFlow или Keras, мы увидим.
Регистрация моделей
Я думаю, что это важная часть, хотя я не знаю, могли бы мы даже создать свою собственную с использованием стандартной базы данных. Если нет, кажется, что MLFlow является зрелым вариантом.
Обслуживание моделей
Я не уверен, включено ли это в предыдущий пункт или нет. В любом случае, я читал о Streamlit и FastAPI. Вы бы рекомендовали какой-либо из них?
Требуется ли Apache Kafka для прогнозов в реальном времени?
Визуализация
Под этим я имею в виду возможность делиться с организацией базовыми веб-приложениями с настраиваемыми графиками, объясняемыми прогнозами и тому подобное. Я читал о панелях, которые обладают способностью преобразовывать Jupyter Notebook в простое веб-приложение. Это может быть интересно.
Мониторинг моделей
Существует ли хороший бесплатный инструмент для мониторинга моделей и выявления потерь точности, дрейфа данных и тому подобного? Или нам лучше создать свой собственный скрипт для мониторинга, который будет запускаться периодически?
Большие данные
Как я уже говорил, мы планируем использовать в основном Spark по мере необходимости.
Я знаю, это много информации. Возможно, я слишком усложнил себе задачу, и мне следует использовать только 20% от того, что, как я думаю, мне следует. Или, может быть, нет. У меня нет понятия. Любая помоч будет ВЕЛИКОПРЕИМУЩЕСТВОМ. Заранее спасибо.
Я разместил этот вопрос на Reddit и получил много очень интересных ответов. Любой, кто интересуется этой темой, может заглянуть сюда:
https://www.reddit.com/r/MachineLearning/comments/mfca0p/d_whats_the_simplest_most_lightweight_but/
В любом случае, новые ответы будут очень ценны. Поскольку это очень субъективная тема, разные ответы могут иметь смысл и дополнять друг друга.
Ответ или решение
Самое простое и легковесное, но в то же время полное и полностью открытое MLOps-решение
Контекст вашей команды и проекта
Вашей команде из четырёх начинающих специалистов в области данных, работающей в большой компании с рядом ограничений, предстоит перейти с SAS на Python для внедрения более современных практик машинного обучения. Исходя из предоставленных вами данных, важно выбрать инструменты, которые упрощают процессы и при этом соответствуют вашим бюджетным ограничениям.
1. Стандартизация кода
Для поддержания качества кода рекомендуется использовать инструменты статического анализа такие как PyLint или Flake8. Эти инструменты помогут вашей команде следить за синтаксисом и соглашениями Python, таким образом улучшая читаемость и поддерживаемость вашего кода.
2. CI/CD и развертывание
Jenkins уже используется в вашей компании для CI, что является хорошим началом для автоматизации процессов. Docker является стандартом для контейнеризации и может значительно облегчить развертывание приложений. Переход на Docker позволит стандартизировать среды запуска, что будет полезно для вашего развития как общей команды.
3. Проектная структура и управление
Kedro является мощным выбором для структурирования проектов машинного обучения. Он предложит вам структурированный подход к разработке, что упростит управление проектами.
4. Документация
Использование Sphinx для автоматической генерации документации из вашего кода может упростить процессы и минимизировать риск устаревания документации. Это подходит для небольших команд, где поддержание актуальной документации вручную может быть обременительным.
5. Исследование данных и их подготовка
Для исследования данных и подготовки всё ещё могут быть использованы Pandas, Matplotlib и Seaborn. Однако, при необходимости масштабирования на большие данные, PySpark может выступить в роли решения для обработки данных, которые не помещаются в обычные структуры данных, такие как Pandas.
6. Интеграция экспериментирования и управления моделями
MLflow будет полезен для отслеживания экспериментов и управления моделями. Интеграция этого инструмента с Kedro упростит управление полным жизненным циклом моделей, начиная от разработки до эксплуатации.
7. Сервирование и мониторинг моделей
FastAPI может быть полезен для развертывания ваших моделей для сервинга прогнозов в реальном времени благодаря своей легковесной и асинхронной архитектуре. Для мониторинга моделей и обнаружения дрейфа данных можно рассмотреть возможность создания собственных скриптов, основываясь на данных ваших моделей.
Заключение
На ваш текущий размер команды и ограничения бюджета, предложенные инструменты являются достаточно легковесными и смогут обеспечить полную эксплуатационную готовность в соответствии с MLOps-практиками. Четкое планирование и поэтапное внедрение новых технологий позволит вашей команде постепенно адаптироваться к изменениям и повышать эффективность процессов.