Руководство по развертыванию системы, которая постоянно собирает данные и непрерывно переобучает модели машинного обучения.
Развертывание обученной модели машинного обучения (ML) — это не конец процесса ML. Вместо этого его следует рассматривать как первую веху, пока инженеры машинного обучения должны поддерживать производительность модели с течением времени. Данные временных рядов или данные, используемые для рекомендательных систем, являются хорошими примерами, иллюстрирующими эту точку зрения; если эти модели не обучать постоянно, они могут потерять способность предсказывать новые события/тенденции.
В этой статье я объясню, как настроить систему, которая может автоматически сканировать отзывы клиентов с сайта электронной коммерции, переобучать модель НЛП при появлении новых входящих данных и эффективно хранить версии моделей с течением времени.
Обзор архитектуры
Архитектура состоит из:
- AWS EC2 — среда облачных вычислений, в которой я размещаю контейнеры Airflow и MLFlow Docker. Для размещения Airflow инстанс EC2 должен иметь не менее 2 виртуальных процессоров и 4096 МБ оперативной памяти.
- Airflow: планируйте и автоматизируйте выполнение таких задач, как сканирование данных с веб-сайтов, модель обучения и загрузка результатов в облачные хранилища.
- MLFlow — платформа для управления жизненным циклом машинного обучения. В проекте я использую эту платформу для регистрации моделей машинного обучения, показателей обучения и параметров.
- AWS RDS — храните необработанные данные и журналы обучения.
- AWS S3 — хранилище развернутых версий модели машинного обучения.
Ниже приведены шаги высокого уровня для этой архитектуры:
- Настройте контейнеры Docker.
- Разработайте Crawling Spider для сбора данных с веб-сайта.
- Создайте конвейер машинного обучения для предварительной обработки, обучения и оценки результатов.
- Рабочий процесс создания DAG.
Каталог проекта
Прежде чем начать, хорошо иметь обзор каталога проекта. dags
, logs
, data
и plugins
— это папки, которые будут смонтированы в наш контейнер Airflow Docker.
dags ├── __init__.py ├── automated_ml_dag.py ├── clean_archived_dag.py └── src logs data ├── archived └── staging plugins build-images.sh docker-compose.yaml airflow.Dockerfile mlflow.Dockerfile start-main.sh
Шаг 1 — Настройте контейнеры Docker
На этом этапе мы создаем многоконтейнерную среду Docker:
Для начала я создаю два файла Dockerfile с именами airflow.Dockerfile
и mlflow.Dockerfile
для создания пользовательских образов для нужд проекта.
Затем я начинаю создавать образы с помощью bash-скрипта:
Для docker-compose.yaml
мы можем обратиться к шаблону, предоставленному Apache Airflow по адресу https://airflow.apache.org/docs/apache-airflow/2.3.2/docker-compose.yaml.
В проекте я настраиваю,добавляя некоторые переменные в airflow-common-env и включая изображение mlflow в services:
Наконец, запустите приведенный ниже код, чтобы запустить контейнеры:
docker-compose --env-file env.list up airflow-init docker-compose --env-file env.list up -d
Примечание. Убедитесь, что файл
env.list
, в котором хранятся переменные среды, находится в каталоге для успешного выполнения вышеуказанной команды.
В Docker Desktop мы должны увидеть зеленые сигналы наших контейнеров после успешного запуска.
Шаг 2 — Создайте ползущего паука
Необработанные отзывы с веб-сайта выглядят следующим образом:
Для периодического сбора обзоров я использую библиотеку scrapy
для сканирования результатов с помощью метода API.
В данном случае парсинг предназначен для практики, я предпочитаю не показывать API веб-сайта публично. Тем не менее, приведенный ниже скрипт можно использовать для создания паука для ваших собственных целей.
Чтобы сохранить собранные результаты в базе данных, нам также необходимо создать класс Postgres, чтобы наш паук мог отправлять очищенные результаты в AWS RDS.
Наконец, мы создаем функцию для интеграции паука Scrapy с базой данных.
При каждом запуске процесса очищенные данные загружаются в нашу базу данных AWS RDS.
Шаг 3 — Конвейер машинного обучения
Во-первых, необходимо определить конвейер того, как происходит процесс обучения.
Цель этой статьи не фокусируется на способности модели прогнозировать; Таким образом, в этом случае я использую базовый процесс НЛП: размечаю необработанные данные, применяю TF-IDF и использую GridSearch, чтобы найти лучшие параметры для алгоритма (я использую RandomForestClassifier для этого проекта).
Конвейер готов, но нам нужно разработать родительский процесс для регистрации метрик, параметров и версий обученной модели. И тут нам на помощь приходит MLFlow. С MLFlow мы можем легко отслеживать обученные версии на протяжении всего жизненного цикла машинного обучения.
В этом проекте при каждом обучении модели параметры и показатели загружаются в AWS RDS, а обученные модели сохраняются в AWS S3.
Кроме того, чтобы избежать увеличения размера хранилища, используйте только версии обученной модели, которые превосходят текущую развернутую модель; например, с точки зрения оценки точности, загружаются и заменяют текущий.
Шаг 4 — Рабочий процесс создания DAG
При достижении этого шага наш проект близок к завершению. После проектирования небольших частей все, что нам нужно сделать сейчас, это собрать их все и сделать это полным процессом.
Например, я создаю группу DAG Airflow (находится в папке ./dags
), которая автоматизирует процесс каждый понедельник, среду и пятницу в 8 утра по Гринвичу, и только в пятницу происходит переобучение модели.
В пользовательском интерфейсе Airflow приведенный выше код можно преобразовать в этот график. Для train_model_group у нас есть 3 подзадачи:
- load_data: загрузить данные из базы данных AWS RDS и сохранить их в папке
data/staging
. - train_model: запустить конвейер обучения НЛП.
- archived_data: после обучения мы перемещаем все файлы из папки
data/staging
в папкуdata/archived
, чтобы отслеживать входные данные обучения.
Журналы тренировок также можно отслеживать в пользовательском интерфейсе Airflow:
Чтобы проверить пользовательский интерфейс MLFlow, перейдите к {EC2 Public IP}:5000или localhost:5000, если вы работаете на локальном компьютере.
В приведенном ниже примере мы видим, что развертываются только модели с более высокой точностью, чем текущая (столбец Models).
Также легко отследить идентификатор развернутой модели из пользовательского интерфейса MLFlow и загрузить обученную модель из AWS S3.
🙌🙌 Это конец статьи, и я надеюсь, что она вам понравилась.
Если вы считаете эту статью информативной, пожалуйста, поставьте лайк и подпишитесь на меня, чтобы получать уведомления о моих следующих статьях ✌️