Начните свой путь к производству с помощью шаблона проекта

Ранее в этом году я опубликовал пошаговое руководство по автоматизации сквозного жизненного цикла ML с помощью встроенных шаблонов проектов SageMaker MLOps и MLflow. Он объединил управление рабочими процессами, реестр моделей и CI/CD под одной крышей, чтобы упростить выполнение сквозных проектов MLOps.

В этом посте мы пойдем еще дальше и определим шаблон проекта MLOps на основе GitHub, GitHub Actions, MLflow и SageMaker Pipelines, который вы сможете повторно использовать в нескольких проектах для ускорения доставки машинного обучения.

Мы возьмем пример модели, обученной с помощью Random Forest в наборе данных California House Prices, и автоматизируем ее сквозной жизненный цикл до развертывания в службе логического вывода в реальном времени.

Обзор пошагового руководства

Мы решим это в 4 шага:

  • Сначала мы настроим среду разработки с IDE, сервером отслеживания MLflow и подключим GitHub Actions к вашей учетной записи AWS.
  • Во-вторых, я покажу, как вы можете экспериментировать и легко сотрудничать с членами вашей команды. Мы также будем упаковывать код в контейнеры и запускать их в масштабируемых заданиях SageMaker.
  • Затем мы автоматизируем ваш рабочий процесс сборки модели с помощью конвейера SageMaker и запланируем его запуск раз в неделю.
  • Наконец, мы развернем в вашей учетной записи службу логических выводов в реальном времени с конвейером CI/CD на основе GitHub Actions.

Примечание. MLOps может быть чем-то большим, чем развертывание служб логического вывода (например, маркировка данных, управление версиями по дате, мониторинг моделей), и этот шаблон должен предоставить вам достаточную структуру, чтобы адаптировать его к вашим потребностям.

Предпосылки

Чтобы пройти этот пример, убедитесь, что у вас есть следующее:

  1. Посетите раздел Знакомство с Amazon SageMaker Pipelines, если SageMaker Pipelines покажется вам новым.
  2. Знакомство с MLOps with MLFlow и Amazon SageMaker Pipelines.
  3. Знакомство с действиями GitHub. Github Actions — все, что вам нужно знать, чтобы начать работу может стать хорошим началом, если это звучит для вас в новинку.
  4. Этот репозиторий GitHub клонирован в вашу среду.

Шаг 1. Настройка среды проекта

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

  • SageMaker для заданий на основе контейнеров, размещения моделей и конвейеров машинного обучения.
  • MLflow для отслеживания экспериментов и реестра моделей.
  • API Gateway для предоставления нашей конечной точки вывода за API.
  • GitHub в качестве репозитория, планировщик конвейера CI/CD и машинного обучения с GitHub Actions.

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

Работа с вашей любимой IDE

Для повышения производительности убедитесь, что вы работаете в удобной для вас среде IDE. Здесь я размещаю VS Code на экземпляре SageMaker Notebook, а также буду использовать SageMaker Studio для визуализации конвейера машинного обучения.

Инструкции по установке см. в разделе Хост-сервер кода на Amazon SageMaker.

Настройка центрального сервера отслеживания MLflow

Нам нужен центральный сервер отслеживания MLflow для совместной работы над экспериментами и регистрации моделей. Если у вас его нет, вы можете следовать инструкциям и сообщить в блоге, чтобы развернуть версию MLflow с открытым исходным кодом на AWS Fargate.

Вы также можете заменить MLflow на собственные параметры SageMaker, Weights & Biases или любой другой инструмент по вашему выбору.

Подключение GitHub Actions к вашей учетной записи AWS

Далее мы будем использовать OpenID Connect Connect (OIDC), чтобы позволить рабочим процессам GitHub Actions получать доступ к ресурсам в вашей учетной записи без необходимости хранить учетные данные AWS в виде долгоживущих секретов GitHub. Инструкции см. в разделе Настройка OpenID Connect в Amazon Web Services.

Вы можете настроить роль github-actions со следующими доверительными отношениями:

Мы добавляем SageMaker в качестве принципала, чтобы мы могли запускать задания и конвейеры непосредственно из рабочих процессов GitHub. То же самое для Lambda и API Gateway.

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

Настройка секретов репозитория GitHub для проекта

Наконец, мы сохраняем AWS account ID, region name и github-actions role ARN как секреты в репозитории GitHub. Они могут быть конфиденциальной информацией и будут безопасно использоваться вашими рабочими процессами GitHub. Подробнее см. в разделе Зашифрованные секреты.

Теперь мы готовы к работе!

Шаг 2: Экспериментируйте и сотрудничайте в своем проекте

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

Ниже приведен основной блокнот, показывающий, как обучить модель с помощью Random Forest на наборе данных California House Prices и сделать базовый прогноз:

Это простой пример для подражания в нашем комплексном проекте, и вы можете запустить pip install -r requirements.txt для работы с теми же зависимостями, что и члены вашей команды.

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

Вы можете сохранять локальные данные и файлы в папках data и model. Я добавил их в .gitignore, чтобы вам не приходилось отправлять большие файлы на GitHub.

Структурирование репозитория для удобства совместной работы

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

Вы можете найти ниже структуру папок с описаниями:

Отслеживание экспериментов с помощью MLflow

Вы можете отслеживать запуски экспериментов с помощью MLflow независимо от того, запускаете ли вы код в своей среде IDE или в заданиях SageMaker. Здесь я регистрирую запуски в рамках эксперимента housing.

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

Шаг 3. Переход от локальных вычислений к заданиям на основе контейнеров в SageMaker

Локальный запуск кода может работать на ранних стадиях проекта. Однако в какой-то момент вы захотите упаковать зависимости в воспроизводимые образы Docker и использовать SageMaker для запуска масштабируемых заданий на основе контейнеров. Я рекомендую прочитать Подход к началу работы с Amazon SageMaker с подъемом и сдвигом, если это звучит для вас в новинку.

Разбивка рабочего процесса на задания

Вы можете разбить рабочий процесс проекта на этапы. Мы разделили нашу работу на 2 части: мы запускаем обработку данных в заданиях SageMaker Processing и моделируем обучение в заданиях SageMaker Training.

Создание контейнеров и отправка их в ECR

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

sh scripts/build_and_push.sh <ecr-repo-name> <dockerfile-folder>

Использование файлов конфигурации в проекте

Чтобы предотвратить жесткое кодирование, нам нужно место для хранения параметров наших заданий. Эти параметры могут включать URI образа контейнера, URI сервера отслеживания MLflow, расположение сценария точки входа, типы экземпляров, гиперпараметры для использования в коде, выполняющемся в заданиях SageMaker.

Для этого мы будем использовать model_build.yaml. Его структура YAML позволяет легко расширять и поддерживать его с течением времени. Перед запуском заданий обязательно добавьте URI сервера MLflow и только что отправленные URI образа контейнера в конфигурацию.

Выполнение контейнерных заданий в SageMaker

Теперь вы готовы выполнить run_job.py и запустить свой код в заданиях SageMaker. Он прочитает конфигурацию и использует код из src/model_build для запуска заданий обработки и обучения.

SageMaker вставит prepare.py и train.py во время выполнения в соответствующие контейнеры и будет использовать их в качестве точки входа.

Шаг 4: Автоматизация построения модели

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

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

Автоматическое создание образов контейнеров с помощью рабочих процессов GitHub

На предыдущем шаге мы отправили образы контейнеров в ECR с помощью скрипта и запустили их в заданиях SageMaker. Переходя к автоматизации, мы используем этот рабочий процесс GitHub, чтобы управлять процессом за нас.

Рабочий процесс просматривает Dockerfiles в папке docker и срабатывает, когда происходят изменения в ветке репо main. Под капотом он использует составное действие GitHub, которое заботится о входе в ECR, сборке и отправке изображений.

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

Связывание шагов нашего рабочего процесса машинного обучения с конвейером в SageMaker

Затем мы определяем конвейер в SageMaker для выполнения шагов нашего рабочего процесса. Вы можете найти наш пайплайн в папке src/model_build. Он в основном запускает этап обработки, получает местоположение выходных данных и запускает этап обучения. И так же, как и для заданий, выполнение конвейера использует параметры, определенные в нашем model_build.yaml.

Я добавил scripts/submit_pipeline.py в репозиторий, чтобы помочь вам создавать/обновлять конвейер в SageMaker по запросу. Это может помочь в отладке и запуске конвейера в SageMaker, когда это необходимо.

Удовлетворившись конвейером, мы автоматизируем его управление с помощью рабочего процесса GitHub update-pipeline. Он ищет изменения конвейера в ветке main и запускает submit_pipeline для создания/обновления.

Планирование конвейера SageMaker с помощью действий GitHub

Мы можем применять различные триггеры к конвейеру, и здесь мы будем планировать его выполнение с помощью рабочего процесса GitHub schedule-pipeline. Он использует выражение cron для запуска конвейера в 12:00 по пятницам.

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

После каждого выполнения конвейера в MLflow появляется новая версия модели. Это версии модели, которые мы хотим развернуть в производстве.

Шаг 5. Развертывание службы логических выводов в рабочей среде

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

Наш сервис логического вывода в реальном времени

Мы создадим службу логического вывода в реальном времени для нашего проекта. Для этого мы хотим получить артефакты модели из реестра моделей, создать контейнер вывода MLflow и развернуть их в конечной точке SageMaker. Мы предоставим нашу конечную точку через лямбда-функцию и API, которые клиент может вызывать для прогнозов.

Если вам нужно запускать прогнозы в пакетном режиме, вы можете построить конвейер вывода ML, используя тот же подход, который мы использовали для model_build.

Отправка образа контейнера вывода в ECR

Наряду с моделью машинного обучения нам нужен образ контейнера для обработки логического вывода в нашей конечной точке SageMaker. Давайте добавим тот, что предоставлен MLflow, в ECR.

Я добавил рабочий процесс Github build-mlflow-image, чтобы автоматизировать это, и для этого он запустит команду mlflow sagemaker build-and-push-container.

Определение нашего стека API с помощью CDK

Мы используем CDK для развертывания нашей инфраструктуры логического вывода и определяем наш стек в папке model_deploy. app.py — наш основной файл стека. Вы увидите, что он прочитает конфигурацию model_deploy и создаст конечную точку SageMaker, функцию Lambda в качестве прокси-сервера запроса и API с использованием API-шлюза.

Перед развертыванием обязательно обновите конфигурацию model_deploy, указав образ контейнера и URI сервера отслеживания MLflow.

Развертывание в рабочей среде с помощью многоэтапного конвейера CI/CD

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

Рабочий процесс CI/CD определяется в deploy-inference и состоит из 4 шагов:

  • сборка считывает выбранный двоичный файл версии модели из MLflow (определено в конфигурации) и загружает его model.tar.gz в S3. Это делается с помощью mlflow_handler, который также сохраняет местоположение модели S3 в AWS SSM для использования на более поздних этапах CI/CD. Обработчик MLflow также переводит модель в промежуточное состояние в реестре моделей.
  • deploy-staging развертывает стек CDK в тестовом режиме, чтобы мы могли протестировать API перед запуском в рабочую среду. В задании используется составное действие GitHub, которое я создал для развертывания шаблонов CDK в AWS.
  • test-api выполняет базовое тестирование службы логических выводов в Staging. Он отправляет пример полезной нагрузки в API и проверяет, в порядке ли статус ответа. Если все в порядке, обработчик MLflow переведет модель в производственный режим в реестре моделей. Не стесняйтесь добавлять больше тестов, если считаете нужным.
  • deploy-prod развертывает стек CDK в рабочей среде.

Использование службы логического вывода

После успешного развертывания вашего сервиса в рабочей среде вы можете перейти к консоли AWS CloudFormation, просмотреть стек Outputs и скопировать URL-адрес своего API.

Теперь вы готовы вызвать свой API вывода и можете использовать следующий пример точки данных в тексте запроса:

Вы можете использовать такие инструменты, как Postman, чтобы протестировать API вывода со своего компьютера:

Заключение

В этом посте я поделился с вами шаблоном проекта MLOps, объединяющим отслеживание экспериментов, оркестровку рабочих процессов, реестр моделей и CI/CD под одной крышей. Его ключевая цель — сократить усилия по запуску сквозных проектов MLOps и ускорить доставку.

Он использует GitHub, GitHub Actions, MLflow и SageMaker Pipelines, и вы можете повторно использовать его в нескольких проектах.

Чтобы продолжить обучение, вы можете посетить Awesome SageMaker и найти в одном месте все актуальные и актуальные ресурсы, необходимые для работы с SageMaker.