Моя команда и я открыли исходный код нашего фреймворка Python MLOps в прошлом году. Его название modelkit предназначено для того, чтобы сделать модели машинного обучения пригодными для повторного использования, надежными, производительными и простыми в развертывании:
https://github.com/Cornerstone-OnDemand/modelkit
Сегодня я хочу поделиться предысторией и историей его создания и выбором, который мы сделали.
Контекст нашей команды
Мы потратили годы, работая над MLOps без какой-либо надлежащей структуры, прежде чем должным образом создали свою собственную.
- Мы – опытная команда по работе с данными: 10 опытных специалистов, работающих над моделями машинного обучения, со всеми навыками, необходимыми для развертывания их в рабочей среде
- Мы работаем над сложным НЛП с глубокими технологиями: в настоящее время у нас развернуто около 200 моделей и алгоритмов машинного обучения. Эти 200 взаимосвязаны (одна модель может вызвать 10 других во время своего логического вывода).
- Мы лишь частично используем стандартизированные библиотеки машинного обучения (sklearn, tensorflow и т. д.), так как большая часть нашей логики представляет собой пользовательский код или оболочку Python.
- Мы сосредоточены на производительности и масштабируемости: у нас более 10 миллионов вызовов в день и частая пакетная обработка, выполняемая параллельно сотнями рабочих.
Основные принципы, повлиявшие на наш проект:
- Мы считаем, что производственный вывод должен быть отделен от процесса обучения. Хотя это верно не для каждой команды, нам не нужны онлайн-обучения или частые обновления моделей. Нам нравится тщательно и вручную выбирать алгоритмы, которые мы хотим запустить в производство, и оптимизировать их. Поэтому мы считаем, что обновление модели требует изменения git и повторного развертывания службы.
- Мы считаем, что логика модели должна быть отделена от обработки ETL (Airflow, Spark, …). Вывод модели должен быть апатридом, и одна обработка никогда не должна занимать больше секунды.
- Мы почти не используем блокноты. Хотя они полезны при исследовании данных, большинство членов команды не используют их. В частности, ни один код не выпускается в производство без экспертной оценки в git.
- Мы хотим, чтобы все конфигурации и процессы разработки моделей находились в git, а не в пользовательском интерфейсе, не в блокнотах и не в базе данных конкретной платформы. MLOps должны следовать логике «Конфигурация как код», а не «без кода».
Где мы чувствовали, что нам нужно оборудовать себя
Мы создали фреймворк Python, ориентированный на «вывод модели». Его ключевые цели:
- чтобы структурировать, как мы пишем наш код Python для всех взаимозависимых моделей и алгоритмов ML
- чтобы сделать его надежным и легким для оптимизации
- чтобы упростить развертывание в любой производственной среде
- чтобы сделать его легко доступным для членов команды или команд
Почему большинство решений/фреймворков на рынке не соответствовали нашим потребностям:
- Большинство платформ машинного обучения ориентировано на незрелые команды,особенно в отношении навыков развертывания (обычная демонстрация «jupyter для развертывания»)
- Большинство платформ машинного обучения сосредоточено на этапе «обучения», что не соответствует потребностям нашей команды. (исследование набора данных, тестирование и сравнение моделей, быстрое и грязное развертывание модели, повторное развертывание старых моделей для сравнения и т. д.)
- Большинство платформ машинного обучения ориентированы на конкретные популярные библиотеки, а не на бесплатный код Python. (обслуживает любую модель sklearn, tensorflow или h20)
- Большинство платформ обслуживания машинного обучения ориентированы на проверку концепции(ср. обычную 5-минутную демонстрацию модели sklearn на AWS), но не могут быть адаптированы к конкретным ограничениям большинства реальных производственных процессов (многооблачная среда, многопользовательская среда, настраиваемая инфраструктура и т. д.), процессов обеспечения безопасности и оптимизации затрат на инфраструктуру.
- Большинство фреймворков охватывают множество процессов MLOps, а не минимальные. Руководствуясь своей бизнес-моделью, большинство фреймворков разрастаются и становятся слишком сложными, чтобы их можно было использовать простым и прозрачным способом.
- Большинство фреймворков требуют интенсивного пользовательского интерфейса, тогда как нам нужна только библиотека Python.
Что мы строим: моделькит
modelkit
— это минималистичная библиотека MLOps для Python, созданная для людей, которые хотят развернуть модели машинного обучения в рабочей среде.
Он включает в себя несколько функций, которые упрощают переход к производственной среде и гарантируют, что один и тот же код будет работать в производственной среде, на вашем компьютере или в конвейерах обработки данных.
Оборачивая код прогноза в modelkit
, вы мгновенно получаете доступ ко всем функциям:
- быстро. Предсказания модели можно группировать для ускорения (вы сами определяете логику пакетной обработки) с минимальными затратами.
- компонуемый: модели могут зависеть от других моделей и оценивать их так, как вам нужно.
- расширяемость: модели могут полагаться на произвольные вспомогательные файлы конфигурации, называемые assets, размещенные в локальных или облачных хранилищах объектов (в настоящее время мы поддерживаем AWS, GCP и Azure).
- безопасность типов: входные и выходные данные моделей могут быть проверены с помощью pydantic, вы получаете аннотации типов для своих прогнозов и можете обнаруживать ошибки с помощью инструментов статического анализа типов во время разработки.
- асинхронный: модели поддерживают асинхронные и синхронные функции прогнозирования.
modelkit
поддерживает вызов асинхронного кода из кода синхронизации, поэтому вам не придется страдать от частично асинхронного кода. - testable: модели содержат свои собственные сценарии модульного тестирования, а инструменты модульного тестирования доступны для pytest или любой другой среды тестирования.
- быстрое развертывание: модели можно обслуживать в одном вызове CLI с использованием fastapi.
Кроме того, вы обнаружите, что modelkit
это:
- просто: используйте pip для установки
modelkit
, это просто библиотека Python. - надежность: следуйте рекомендациям по разработке программного обеспечения: проверяйте версии и тестируйте все свои конфигурации и артефакты.
- настраиваемый: выходите за рамки стандартных моделей: настраиваемая обработка, эвристика, бизнес-логика, различные платформы и т. д.
- независимость от фреймворка: предложите свой собственный фреймворк и используйте любой код или библиотеку, какие пожелаете.
modelkit
не имеет мнения о том, как вы строите или обучаете свои модели. - организованный: Версируйте свою библиотеку машинного обучения и артефакты и делитесь ими с другими в виде пакета Python или службы. Пусть другие используют и оценивают ваши модели!
- быстро кодировать: просто напишите логику предсказания и все. Никакой громоздкой логики предварительной или постобработки, вариантов ветвления и т. д. Шаблонный код минимален и расширяем.
- легко оптимизировать: используйте наш профилировщик, чтобы получить четкое представление о том, как сделать код быстрее и эффективнее.
Установить с помощью pip
:
pip install modelkit
Переход на открытый исходный код
Переход на open source был для нас естественным шагом. Мы гордились нашей библиотекой и думали, что она может быть очень полезна другим командам.
В отличие от многих фреймворков машинного обучения, мы не думаем о бизнес-модели, наша цель — только увидеть, как другие команды получают выгоду от нашей работы и потенциально улучшают ее.
Если вы узнаете себя в контексте команды или хотите узнать больше о проекте, обязательно ознакомьтесь с документацией и этой записью в блоге о подготовке моделей ML к производству с помощью modelkit.
Мы ждем отзывов, свяжитесь со мной или присоединитесь к дискорду https://discord.gg/ayj5wdAArV
Спасибо ;-)