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

Развертывание обученной модели машинного обучения (ML) — это не конец процесса ML. Вместо этого его следует рассматривать как первую веху, пока инженеры машинного обучения должны поддерживать производительность модели с течением времени. Данные временных рядов или данные, используемые для рекомендательных систем, являются хорошими примерами, иллюстрирующими эту точку зрения; если эти модели не обучать постоянно, они могут потерять способность предсказывать новые события/тенденции.

В этой статье я объясню, как настроить систему, которая может автоматически сканировать отзывы клиентов с сайта электронной коммерции, переобучать модель НЛП при появлении новых входящих данных и эффективно хранить версии моделей с течением времени.

Обзор архитектуры

Архитектура состоит из:

  • AWS EC2 — среда облачных вычислений, в которой я размещаю контейнеры Airflow и MLFlow Docker. Для размещения Airflow инстанс EC2 должен иметь не менее 2 виртуальных процессоров и 4096 МБ оперативной памяти.
  • Airflow: планируйте и автоматизируйте выполнение таких задач, как сканирование данных с веб-сайтов, модель обучения и загрузка результатов в облачные хранилища.
  • MLFlow — платформа для управления жизненным циклом машинного обучения. В проекте я использую эту платформу для регистрации моделей машинного обучения, показателей обучения и параметров.
  • AWS RDS — храните необработанные данные и журналы обучения.
  • AWS S3 — хранилище развернутых версий модели машинного обучения.

Ниже приведены шаги высокого уровня для этой архитектуры:

  1. Настройте контейнеры Docker.
  2. Разработайте Crawling Spider для сбора данных с веб-сайта.
  3. Создайте конвейер машинного обучения для предварительной обработки, обучения и оценки результатов.
  4. Рабочий процесс создания 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.

🙌🙌 Это конец статьи, и я надеюсь, что она вам понравилась.

Если вы считаете эту статью информативной, пожалуйста, поставьте лайк и подпишитесь на меня, чтобы получать уведомления о моих следующих статьях ✌️