Авторизоваться
Аким Солянкин 12.01.2022 Опубликована

Построение рабочего процесса машинного обучения в вашей локальной системе

Эта статья предназначена для всех, кто хочет начать работу с MLFlow. Мы изучим концепции MLFlow, реализуя простой сквозной рабочий процесс машинного обучения с использованием MLFlow — от создания модели в записной книжке до упаковки и развертывания модели. После этого я объясню, как этот простой рабочий процесс можно преобразовать в управление моделью на уровне производства.

Мы включим в рабочий процесс несколько концепций MLOps, таких как обучение модели, оценка модели, упаковка и развертывание модели.

Давайте начнем!

Что такое MLFlow?

MLFlow — это сквозная платформа с открытым исходным кодом для управления жизненным циклом машинного обучения, предоставляемая Databricks. Существует также версия Managed MLFlow для корпоративного использования.

В этой статье я использую версию с открытым исходным кодом.

Зачем мне нужен MLFlow?

Большинство специалистов по данным и инженеров машинного обучения могут создавать модели на своих ноутбуках и настольных компьютерах. Они могут использовать Anaconda, Jupyter или какую-либо другую IDE для кодирования своих моделей машинного обучения. Следующие проблемы возникают, когда им необходимо улучшить производительность своей модели с течением времени и когда несколько членов команды работают над одной и той же моделью.

  • Следить за всеми настроенными и измененными параметрами модели.
  • Следить за результатами, точностью и ошибками.
  • Вести учет моделей и связанных с ними объектов данных (масштабаторы, преобразователи, кодеры и т.д.)
  • Версия их моделей.
  • Делиться моделью с членами команды — какие предварительные условия/настройки необходимы для того, чтобы другие участники могли запустить модель в своей системе.
  • Обернуть свои модели с помощью API и развернуть их, потребуются дополнительные знания в области кодирования и технического стека.

Именно здесь на сцену выходит MLFlow, облегчающий изучение совершенно нового технологического стека для обслуживания, отслеживания и развертывания моделей. Предоставьте простые API, которые вы можете интегрировать в код модели, и вы уже на пути к развертыванию своей модели в рабочей среде.

Хорошо! Какие понятия мне нужно знать?

Прежде чем мы с головой перейдем к части кодирования, нам нужно знать несколько концепций, касающихся MLFlow.

Отслеживание модели

Как специалист по данным или инженер по машинному обучению, вы потратите много времени на улучшение созданных вами моделей. Становится утомительно отслеживать, какие параметры вы настроили, какая конкретная комбинация дает вам лучшую производительность и какие показатели ошибок вам нужно сравнить. Отслеживание модели — важная концепция для понимания. Отслеживать производительность модели и сравнивать модели проще, когда у вас есть все метрики и меры, сведенные в таблицу и легко доступные.

Обо всем этом дополнительном учете заботятся API-интерфейсы отслеживания MLFlow.

ML проекты

Все разрабатываемое программное обеспечение обычно следует шаблону дизайна или архитектуры, но это не тот случай, когда речь идет о машинном обучении. Модели ML не имеют определенной структуры или архитектурного шаблона, каждая проблема связана с другим набором требований и дизайном. Становится сложно совместно использовать код и модель настройки между системами в команде или организации.

MLFlow создает стандартизированный шаблон и структуру, которые охватывают большинство случаев использования машинного обучения и делают код легко переносимым. Вы можете предоставить структуру каталогов, сведения о среде, в которой вы хотите запустить модель, и точки входа для вашей модели, т. е. какие входные данные требуются для вашей модели. Думайте об этом как о кратком обзоре модели машинного обучения, он сообщит вам, что это за модель, что требуется для ее запуска, какие входные данные вам нужно предоставить и какой результат вы получите.

ML-модели

Когда ваша модель будет готова, вы хотите, чтобы она была развернута в облаке или на пограничном устройстве. Вам нужно упаковать модель, чтобы развернуть ее. Упаковка модели включает в себя указание того, какая среда требуется вашей модели, какова подпись вашей модели, т.е. какие входные данные нужны вашей модели и в каком формате должны предоставляться входные данные? После того, как вы упаковали модель, вы можете сохранить ее в формате pickle и развернуть.

MLFlow предоставляет различные встроенные форматы для упаковки модели на основе библиотек или разновидностей. Например: Tensorflow, Sklearn, Keras, H20, XGBoost и т. д.

Реестр моделей

По мере того, как вы продолжаете улучшать модели с новыми данными, у вас будут разные версии моделей с разной точностью, уровнем ошибок и другими показателями. У вас может быть другая модель в производстве, чем на стадии разработки. Реестр моделей MLflow помогает отслеживать, какая модель присутствует на каком этапе. Вы даже можете заархивировать некоторые из старых моделей, когда они не нужны.

Теперь, когда мы поняли концепции MLFlow, пришло время применить их на практике. Я покажу вам, как вы можете внедрить простые конвейеры машинного обучения в свою локальную систему, а оттуда мы увидим, как они масштабируются до производственных систем.

Пример — красный/синий классификатор

У нас есть набор данных точек в пространстве. Наша задача состоит в том, чтобы классифицировать, принадлежит ли данная точка команде красных или синих. Мы обучаем классификатор, чтобы помочь нам в задаче. Я предоставил полный набор образцов данных и записную книжку jupyter в этом репозитории github, чтобы вы могли следить за ними.

Примечание. Этот пример поможет вам понять, как проводить и отслеживать эксперименты машинного обучения. Я сосредоточусь на том, как использовать MLFlow для обучения, отслеживания и развертывания, а не на том, как построить или обучить наиболее точный классификатор.

Этот пример создан в системе Linux (Ubuntu). Должен работать в Windows, если у вас установлены Python и Docker.

Начнем с данных

Вы можете увидеть образцы данных в папке данных в репозитории. Вот визуализация образцов

Визуализация образцов данных
Визуализация образцов данных

Как вы можете видеть из данных, красные точки в основном находятся в правой и верхней правой области; синие точки находятся слева и внизу слева. Также вы заметите, как масштаб по осям X и Y постоянно меняется. Поэтому нам нужно разработать бинарный классификатор, способный обучаться с изменением шкалы.

Запустите сервер MLFlow локально

Прежде чем мы приступим к созданию самого лучшего из когда-либо существовавших классификаторов, нам нужно запустить сервер MLFlow в нашей локальной системе. Загрузите библиотеку mlflow, используя python

$ pip3 install mlflow

Клонируйте репозиторий github, который я предоставил, в вашей локальной системе, откройте папку в терминале и выполните следующую команду, чтобы запустить сервер mlflow.

$ mlflow server --backend-store-uri sqlite://mlruns.db --default-artifact-root file://$PWD/mlruns

Эта команда делает 3 вещи

  • Создает файл sqlite с именем mlruns.db для записи всех экспериментов и связанных данных.
  • Создает локальную папку mlruns для хранения всех моделей и связанных с ними данных.
  • Запускает сервер MLFlow по адресу http://127.0.0.1:5000/ в вашей системе.

Теперь вы можете перейти по ссылке в своем любимом браузере и просмотреть панель инструментов.

Информационная панель MLFlow
Информационная панель MLFlow

Теперь, когда наш сервер запущен и работает, мы можем приступить к созданию классификатора.

Обучение модели

Вы можете запускать ячейки кода в Jupyter Notebook в последовательном порядке. У нас есть 3 функции — transform_data, train_model и scale_data. Эти функции помогают нам обучать наш классификатор.

Здесь мы обучаем два типа классификаторов:

  • K Классификатор Ближайших Соседей
  • Случайный классификатор Forest

Вы можете запустить ячейки в разделе «Обучение и отслеживание». После запуска ячеек вы получите записи на панели инструментов MLFlow.

Отслеживание MLFlow
Отслеживание MLFlow

Здесь мы замечаем, как аккуратно расставлены для нас серии экспериментов. Фильтр приборной панели позволяет нам даже искать и фильтровать конкретный запуск.

Поиск MLFlow
Поиск MLFlow

Вы можете спросить — почему мы не использовали весь набор данных, объединив выборки?

Мы могли бы провести обучение по всему набору данных, но моя цель — объяснить, как можно использовать MLFlow в реальных сценариях.

Данные в реальном мире не являются чистыми, данные неправильно отформатированы, данные не являются точными на 100%, и данные никогда не бывают полностью доступными.

Разделив данные на образцы, мы можем воспроизвести, как наша модель будет сталкиваться с новыми данными в течение определенного периода времени, и обучить нашу модель новым данным.

Теперь, когда мы обучили нашу модель, мы можем протестировать ее с отдельными данными, которых она никогда раньше не видела (реальный сценарий). Запустите ячейки в разделе Testing Predictions. Здесь мы загружаем данные, загружаем сохраненный нами Scaler, загружаем модель — вы можете выбрать любую модель, просто подставьте runId из одного из прогонов эксперимента, который у вас есть на панели инструментов.

Результат прогноза
Результат прогноза

И вот магия нашего классификатора.

Упаковать и развернуть модель

Теперь, когда у нас есть отличный классификатор, вы хотите поделиться им со своими друзьями и товарищами по команде. Есть два способа развернуть модель

  1. Подача MLFlow (подход без кода)
  2. Пользовательская оболочка для модели

Подача MLFlow

Вы можете напрямую запустить модель в своей локальной системе с помощью команды

$ 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 в нашей модели, скажем, /health API или /visitors API, чтобы проверить, сколько раз модель использовалась.

Чтобы включить дополнительные конфигурации, мы создаем собственные оболочки, обычно используя для этого Flask или FastAPI. Вы можете найти пример в файле app_wrapper.py и Dockerfile в репозитории.

Вы можете протестировать модель с помощью приложения Postman, отправить запрос POST, как показано, /invocations при использовании подачи mlflow и /predict при использовании пользовательской оболочки.

Тест API в Postman
Тест API в Postman

Мы импортировали данные, создали классификатор, обучили его на нескольких образцах данных и развернули локально. Поздравляем! Вы создали свой первый конвейер машинного обучения с помощью MLFlow. 👏

Рабочий процесс производства

Теперь, когда вы поняли, как рабочий процесс реализован в вашей локальной системе, мы узнаем, как этот рабочий процесс реализуется в рабочей среде.

В производственную установку мы обычно включаем сервер JupyterHub с управлением доступом пользователей для кодирования моделей. Этот сервер JupyterHub подключен к серверу отслеживания MLFlow для регистрации экспериментов. Данные эксперимента записываются в БД Postgres, это мощная база данных с высокой надежностью и производительностью.

Сгенерированные модели хранятся в корзине S3 или на удаленном FTP-сервере.

Как только модели и записи экспериментов будут зарегистрированы, ML Pipeline будет активирован для развертывания. Можно использовать сервер CI/CD, такой как Jenkins или GoCD, этот конвейер выполняет работу по упаковке, сборке и упаковке модели, как мы видели выше. Когда модель упакована и готова, она развертывается в нужном общедоступном или частном облаке.

Советы по производству

Вот несколько советов для команд, управляющих рабочим процессом разработки крупномасштабных моделей.

  • Используйте теги для идентификации моделей, что упрощает каталогизацию и поиск по мере роста списка экспериментов.
  • Регистрируйте все метрики, относящиеся к модели, это помогает нам отслеживать происхождение модели и оценивать производительность модели с течением времени.
  • Добавление тегов к данным, используемым в обучении, помогает понять, как данные меняются с течением времени. Используйте GitLFS или DVC для тегов и контроля версий.
  • Создайте новый эксперимент для каждого отдельного набора задач, не втискивайте все эксперименты в один, убедитесь, что имена экспериментов уникальны.
  • Если модель достаточно хороша для тестирования и развертывания, зарегистрируйте модель в MLFlow, это поможет нам отслеживать модель на разных этапах ее жизни.
  • Версируйте свои модели, простой стиль управления версиями может быть трехточечным. т.е. awesome-model:1.2.3 будет model-target.performance.pipeline/data модель-цель будет серьезным изменением, если модель полностью переработана или целевые данные полностью изменены, производительность будет, если производительность модели улучшилась с течением времени, а последнее число относится либо к другой версии данных, либо к номеру сборки конвейера.
  • Старайтесь сохранять четкую и последовательную входную сигнатуру и формат. Если модели требуется ввод в виде кадра данных или тензора, укажите это. Поскольку большинство отправляемых запросов имеют формат JSON, MLFlow неявно преобразует его, но если вы пишете пользовательскую оболочку для модели, разработчику необходимо знать о преобразовании данных или масштаба.
  • MLFlow может развертывать модель непосредственно в Sagemaker и Azure, гарантируя, что вы выберете правильный тип экземпляра для развертывания, а не выберете параметры по умолчанию вслепую (т. е. использование большого экземпляра c5 на AWS для модели размером 30 МБ будет пустой тратой вычислительная мощность).
  • Если вы используете оболочку для развертывания модели, обязательно используйте готовые оболочки, такие как FastAPI. Если используется Flask/Django, добавьте автономные контейнеры WSGI.
  • Используйте корзину S3 или хранилище на основе S3 (Minio) для хранения моделей. Это помогает поддерживать и передавать модели между развернутыми экземплярами.
  • На данный момент ограничения доступа могут быть добавлены в хранилище S3 и Jupyterhub при использовании MLFlow с открытым исходным кодом. Управляемый MLFlow предлагает проверку подлинности и правила ACL с интеграцией ноутбуков для корпоративного использования.

Эти наблюдения основаны на моем личном опыте отслеживания моделей и управления ими. Надеюсь, это поможет и вам.😄

Отслеживание, управление и оптимизация моделей — медленный процесс. Продолжайте экспериментировать с MLFlow, со временем вы станете лучше управлять моделями.

Это все на данный момент. До скорого!

Коментарии
Авторизоваться что-бы оставить комментарий
Присоединяйся в тусовку
Наш сайт использует файлы cookie для вашего максимального удобства. Пользуясь сайтом, вы даете свое согласие с условиями пользования cookie