Эта статья предназначена для всех, кто хочет начать работу с MLFlow. Мы изучим концепции MLFlow, реализуя простой сквозной рабочий процесс машинного обучения с использованием MLFlow — от создания модели в записной книжке до упаковки и развертывания модели. После этого я объясню, как этот простой рабочий процесс можно преобразовать в управление моделью на уровне производства.
Мы включим в рабочий процесс несколько концепций MLOps, таких как обучение модели, оценка модели, упаковка и развертывание модели.
Давайте начнем!
MLFlow — это сквозная платформа с открытым исходным кодом для управления жизненным циклом машинного обучения, предоставляемая Databricks. Существует также версия Managed MLFlow для корпоративного использования.
В этой статье я использую версию с открытым исходным кодом.
Большинство специалистов по данным и инженеров машинного обучения могут создавать модели на своих ноутбуках и настольных компьютерах. Они могут использовать Anaconda, Jupyter или какую-либо другую IDE для кодирования своих моделей машинного обучения. Следующие проблемы возникают, когда им необходимо улучшить производительность своей модели с течением времени и когда несколько членов команды работают над одной и той же моделью.
Именно здесь на сцену выходит MLFlow, облегчающий изучение совершенно нового технологического стека для обслуживания, отслеживания и развертывания моделей. Предоставьте простые API, которые вы можете интегрировать в код модели, и вы уже на пути к развертыванию своей модели в рабочей среде.
Прежде чем мы с головой перейдем к части кодирования, нам нужно знать несколько концепций, касающихся MLFlow.
Как специалист по данным или инженер по машинному обучению, вы потратите много времени на улучшение созданных вами моделей. Становится утомительно отслеживать, какие параметры вы настроили, какая конкретная комбинация дает вам лучшую производительность и какие показатели ошибок вам нужно сравнить. Отслеживание модели — важная концепция для понимания. Отслеживать производительность модели и сравнивать модели проще, когда у вас есть все метрики и меры, сведенные в таблицу и легко доступные.
Обо всем этом дополнительном учете заботятся API-интерфейсы отслеживания MLFlow.
Все разрабатываемое программное обеспечение обычно следует шаблону дизайна или архитектуры, но это не тот случай, когда речь идет о машинном обучении. Модели ML не имеют определенной структуры или архитектурного шаблона, каждая проблема связана с другим набором требований и дизайном. Становится сложно совместно использовать код и модель настройки между системами в команде или организации.
MLFlow создает стандартизированный шаблон и структуру, которые охватывают большинство случаев использования машинного обучения и делают код легко переносимым. Вы можете предоставить структуру каталогов, сведения о среде, в которой вы хотите запустить модель, и точки входа для вашей модели, т. е. какие входные данные требуются для вашей модели. Думайте об этом как о кратком обзоре модели машинного обучения, он сообщит вам, что это за модель, что требуется для ее запуска, какие входные данные вам нужно предоставить и какой результат вы получите.
Когда ваша модель будет готова, вы хотите, чтобы она была развернута в облаке или на пограничном устройстве. Вам нужно упаковать модель, чтобы развернуть ее. Упаковка модели включает в себя указание того, какая среда требуется вашей модели, какова подпись вашей модели, т.е. какие входные данные нужны вашей модели и в каком формате должны предоставляться входные данные? После того, как вы упаковали модель, вы можете сохранить ее в формате pickle и развернуть.
MLFlow предоставляет различные встроенные форматы для упаковки модели на основе библиотек или разновидностей. Например: Tensorflow, Sklearn, Keras, H20, XGBoost и т. д.
По мере того, как вы продолжаете улучшать модели с новыми данными, у вас будут разные версии моделей с разной точностью, уровнем ошибок и другими показателями. У вас может быть другая модель в производстве, чем на стадии разработки. Реестр моделей MLflow помогает отслеживать, какая модель присутствует на каком этапе. Вы даже можете заархивировать некоторые из старых моделей, когда они не нужны.
Теперь, когда мы поняли концепции MLFlow, пришло время применить их на практике. Я покажу вам, как вы можете внедрить простые конвейеры машинного обучения в свою локальную систему, а оттуда мы увидим, как они масштабируются до производственных систем.
У нас есть набор данных точек в пространстве. Наша задача состоит в том, чтобы классифицировать, принадлежит ли данная точка команде красных или синих. Мы обучаем классификатор, чтобы помочь нам в задаче. Я предоставил полный набор образцов данных и записную книжку jupyter в этом репозитории github, чтобы вы могли следить за ними.
Примечание. Этот пример поможет вам понять, как проводить и отслеживать эксперименты машинного обучения. Я сосредоточусь на том, как использовать MLFlow для обучения, отслеживания и развертывания, а не на том, как построить или обучить наиболее точный классификатор.
Этот пример создан в системе Linux (Ubuntu). Должен работать в Windows, если у вас установлены Python и Docker.
Вы можете увидеть образцы данных в папке данных в репозитории. Вот визуализация образцов
Как вы можете видеть из данных, красные точки в основном находятся в правой и верхней правой области; синие точки находятся слева и внизу слева. Также вы заметите, как масштаб по осям X и Y постоянно меняется. Поэтому нам нужно разработать бинарный классификатор, способный обучаться с изменением шкалы.
Прежде чем мы приступим к созданию самого лучшего из когда-либо существовавших классификаторов, нам нужно запустить сервер MLFlow в нашей локальной системе. Загрузите библиотеку mlflow, используя python
$ pip3 install mlflow
Клонируйте репозиторий github, который я предоставил, в вашей локальной системе, откройте папку в терминале и выполните следующую команду, чтобы запустить сервер mlflow.
$ mlflow server --backend-store-uri sqlite://mlruns.db --default-artifact-root file://$PWD/mlruns
Эта команда делает 3 вещи
Теперь вы можете перейти по ссылке в своем любимом браузере и просмотреть панель инструментов.
Теперь, когда наш сервер запущен и работает, мы можем приступить к созданию классификатора.
Вы можете запускать ячейки кода в Jupyter Notebook в последовательном порядке. У нас есть 3 функции — transform_data, train_model и scale_data. Эти функции помогают нам обучать наш классификатор.
Здесь мы обучаем два типа классификаторов:
Вы можете запустить ячейки в разделе «Обучение и отслеживание». После запуска ячеек вы получите записи на панели инструментов MLFlow.
Здесь мы замечаем, как аккуратно расставлены для нас серии экспериментов. Фильтр приборной панели позволяет нам даже искать и фильтровать конкретный запуск.
Вы можете спросить — почему мы не использовали весь набор данных, объединив выборки?
Мы могли бы провести обучение по всему набору данных, но моя цель — объяснить, как можно использовать MLFlow в реальных сценариях.
Данные в реальном мире не являются чистыми, данные неправильно отформатированы, данные не являются точными на 100%, и данные никогда не бывают полностью доступными.
Разделив данные на образцы, мы можем воспроизвести, как наша модель будет сталкиваться с новыми данными в течение определенного периода времени, и обучить нашу модель новым данным.
Теперь, когда мы обучили нашу модель, мы можем протестировать ее с отдельными данными, которых она никогда раньше не видела (реальный сценарий). Запустите ячейки в разделе Testing Predictions. Здесь мы загружаем данные, загружаем сохраненный нами Scaler, загружаем модель — вы можете выбрать любую модель, просто подставьте runId из одного из прогонов эксперимента, который у вас есть на панели инструментов.
И вот магия нашего классификатора.
Теперь, когда у нас есть отличный классификатор, вы хотите поделиться им со своими друзьями и товарищами по команде. Есть два способа развернуть модель
Вы можете напрямую запустить модель в своей локальной системе с помощью команды
$ mlflow models serve --model-uri runs:/ede4cc6ace71468ab2e881dc14d25f6b/models --port 5050
Чтобы развернуть ее на серверах или в других системах, нам нужно упаковать модель. Я написал образец Dockerfile, который поможет нам упаковать модель.
FROM python:3.8.12-slim-buster
RUN pip install mlflow pandas flask cloudpickle==1.6.0 psutil==5.8.0 scikit-learn==0.24.1
WORKDIR /model
COPY ./mlruns/1/ede4cc6ace71468ab2e881dc14d25f6b/artifacts/models/ .
CMD ["mlflow","models","serve","-m","./","-h","0.0.0.0","-p","5000","--no-conda"]
EXPOSE 5000
view rawDockerfile hosted with ❤ by GitHub
Примечание. Вы можете изменить runId и номер порта по своему выбору как в команде, так и в Dockerfile.
Создайте образ докера, используя
$ docker build -t my-awesome-model .
Вы можете запустить образ, используя
$ docker run -d -p 5050:5000 my-awesome-model:latest
Вы также можете опубликовать его в Dockerhub или в реестре докеров по вашему выбору.
Вы должны понимать, что модель, которую вы развернули с помощью mlflow serve, предполагает, что вы предоставили ввод, который уже масштабирован, это может быть не всегда так. Иногда нам нужны дополнительные API в нашей модели, скажем,
API или /health
API, чтобы проверить, сколько раз модель использовалась./visitors
Чтобы включить дополнительные конфигурации, мы создаем собственные оболочки, обычно используя для этого Flask или FastAPI. Вы можете найти пример в файле
и Dockerfile в репозитории.app_wrapper.py
Вы можете протестировать модель с помощью приложения Postman, отправить запрос POST, как показано,
при использовании подачи mlflow и /invocations
при использовании пользовательской оболочки./predict
Мы импортировали данные, создали классификатор, обучили его на нескольких образцах данных и развернули локально. Поздравляем! Вы создали свой первый конвейер машинного обучения с помощью MLFlow. 👏
Теперь, когда вы поняли, как рабочий процесс реализован в вашей локальной системе, мы узнаем, как этот рабочий процесс реализуется в рабочей среде.
В производственную установку мы обычно включаем сервер JupyterHub с управлением доступом пользователей для кодирования моделей. Этот сервер JupyterHub подключен к серверу отслеживания MLFlow для регистрации экспериментов. Данные эксперимента записываются в БД Postgres, это мощная база данных с высокой надежностью и производительностью.
Сгенерированные модели хранятся в корзине S3 или на удаленном FTP-сервере.
Как только модели и записи экспериментов будут зарегистрированы, ML Pipeline будет активирован для развертывания. Можно использовать сервер CI/CD, такой как Jenkins или GoCD, этот конвейер выполняет работу по упаковке, сборке и упаковке модели, как мы видели выше. Когда модель упакована и готова, она развертывается в нужном общедоступном или частном облаке.
Вот несколько советов для команд, управляющих рабочим процессом разработки крупномасштабных моделей.
awesome-model:1.2.3
будет model-target.performance.pipeline/data
модель-цель будет серьезным изменением, если модель полностью переработана или целевые данные полностью изменены, производительность будет, если производительность модели улучшилась с течением времени, а последнее число относится либо к другой версии данных, либо к номеру сборки конвейера.Эти наблюдения основаны на моем личном опыте отслеживания моделей и управления ими. Надеюсь, это поможет и вам.😄
Отслеживание, управление и оптимизация моделей — медленный процесс. Продолжайте экспериментировать с MLFlow, со временем вы станете лучше управлять моделями.
Это все на данный момент. До скорого!