Продвигайте конвейеры в настроенной многокомпонентной среде с использованием реестра моделей Amazon SageMaker, инструмента HashiCorp Terraform, GitHub и Jenkins CI/CD
Автоматизация процесса развертывания конвейеров в настроенной многокомпонентной среде с помощью реестра моделей Amazon SageMaker, инструмента HashiCorp Terraform, GitHub и Jenkins CI/CD
Построение платформы управления операциями машинного обучения (MLOps) в быстро развивающемся мире искусственного интеллекта (AI) и машинного обучения (ML) для организаций является важным условием для плавного совмещения научных экспериментов и развертывания данных, а также для выполнения требований к производительности моделей, безопасности и соответствием нормам и правилам.
Для выполнения регулирующих и нормативных требований, ключевые моменты при проектировании такой платформы:
- Нейтрализация изменения данных
- Мониторинг производительности модели
- Автоматическая повторная обучение модели
- Утверждение модели
- Сохранение моделей в безопасной среде
В этом посте мы покажем, как создать структуру MLOps, чтобы удовлетворить эти потребности, используя комбинацию сервисов от AWS и сторонних инструментов. Решение включает настройку многопользовательской среды с автоматическим повторным обучением модели, пакетным выводом и мониторинг с помощью Amazon SageMaker Model Monitor, версионирование моделей с SageMaker Model Registry и CI/CD-пайплайном для упрощения развертывания кода и конвейеров ML через среду с использованием Amazon SageMaker, Amazon EventBridge, Amazon Simple Notification Service (Amazon S3), HashiCorp Terraform , GitHub и Jenkins CI/CD. Мы создаем модель для прогнозирования серьезности (доброкачественная или злокачественная) маммографической опухоли, обученной с помощью алгоритма XGBoost с использованием доступного публичного набора данных UCI Mammography Mass и развертываем его с использованием фреймворка MLOps. Полные инструкции с кодом доступны в репозитории GitHub.
Обзор решения
На следующей архитектурной диаграмме показан обзор структуры MLOps с следующими ключевыми компонентами:
- Как установить систему NL2SQL с Azure OpenAI Studio
- Настраивание кодирования партнеров для организаций
- Использование языка для более глубокого понимания открытого мира роботами
- Многопользовательская стратегия – Две разные среды (dev и prod) настраиваются в двух разных учетных записях AWS в соответствии с лучшими практиками AWS Well-Architected, а третья учетная запись настраивается в центральном реестре моделей:
- Среда разработки – Где настраивается домен Amazon SageMaker Studio для разработки моделей, обучения моделей и тестирования конвейеров ML (обучение и вывод), прежде чем модель будет готова к продвижению в более высокие среды.
- Среда продукта – Где конвейеры ML из среды разработки продвигаются в качестве первого шага, а также планируются и мониторятся со временем.
- Центральный реестр моделей – Amazon SageMaker Model Registry настраивается в отдельной учетной записи AWS для отслеживания версий моделей, генерируемых в среде разработки и продукта.
- CI/CD и система контроля версий – Развертывание конвейеров ML в разных средах осуществляется через CI/CD, настроенный с помощью Jenkins, а также система контроля версий обрабатывается через GitHub. Объединение изменений кода в соответствующую ветку git среды триггерит рабочий процесс CI/CD для внесения соответствующих изменений в целевую среду.
- Пакетное прогнозирование с мониторингом модели – Конвейер вывода, созданный с помощью Amazon SageMaker Pipelines, запускается по расписанию для генерации прогнозов, а также выполняется мониторинг модели с помощью SageMaker Model Monitor для обнаружения изменений данных.
- Автоматизированный механизм повторного обучения – Конвейер обучения, построенный с помощью SageMaker Pipelines, запускается при обнаружении изменений данных в конвейере вывода. После обучения модель регистрируется в центральном реестре моделей для одобрения модельным утверждающим. После одобрения обновленная версия модели используется для генерации прогнозов через конвейер вывода.
- Инфраструктура как код – Инфраструктура в виде кода (IaC), созданная с использованием HashiCorp Terraform, поддерживает запланированное выполнение конвейера вывода с помощью EventBridge, запуск конвейера обучения на основе правила EventBridge и отправку уведомлений с использованием Amazon Simple Notification Service (Amazon SNS) темы.
Рабочий процесс MLOps включает следующие шаги:
- Доступ к домену SageMaker Studio в учетной записи разработки, клонирование репозитория GitHub, процесс разработки модели с использованием предоставленной образца модели и создание обучающих и выводных конвейеров.
- Запуск обучающего конвейера в учетной записи разработки, который генерирует артефакты модели для обученной версии модели и регистрирует модель в реестре моделей SageMaker в центральной учетной записи реестра моделей.
- Утверждение модели в реестре моделей SageMaker в центральной учетной записи реестра моделей.
- Загрузка кода (обучающих и выводных конвейеров, и кода Terraform Infrastructure-as-Code для создания расписания EventBridge, правила EventBridge и темы SNS) в ветку функций репозитория GitHub. Создание запроса на вытягивание для слияния кода в главную ветку репозитория GitHub.
- Запуск конвейера Jenkins CI/CD, который настроен с репозиторием GitHub. Конвейер CI/CD развертывает код в продукционной учетной записи для создания обучающих и выводных конвейеров, а также кода Terraform для развертывания расписания EventBridge, правила EventBridge и темы SNS.
- Выводной конвейер запланирован для выполнения ежедневно, тогда как обучающий конвейер настроен для запуска при обнаружении изменения данных из выводного конвейера.
- Уведомления отправляются через тему SNS при сбое в обучающем или выводном конвейере.
Предварительные требования
Для решения вам понадобятся следующие предварительные требования:
- Три учетные записи AWS (разработка, продукция и центральная учетная запись реестра моделей)
- Настроенная область домена SageMaker Studio в каждой из трех учетных записей AWS (см. Подключение к Amazon SageMaker Studio или посмотрите видео Быстрое подключение к Amazon SageMaker Studio для инструкций по настройке)
- Jenkins (мы используем версию Jenkins 2.401.1) с установленными привилегиями администратора в AWS
- Установленная версия Terraform 1.5.5 или более поздняя на сервере Jenkins
В этой публикации мы работаем в регионе us-east-1
для развертывания решения.
Создание ключей KMS в учетных записях разработки и продукции
Наш первый шаг – создание ключей управления ключами AWS (AWS KMS) в учетных записях разработки и продукции.
Создание ключа KMS в учетной записи разработки и предоставление доступа учетной записи продукции
Выполните следующие шаги для создания ключа KMS в учетной записи разработки:
- На консоли AWS KMS выберите Customer managed keys в панели навигации.
- Выберите Create key.
- Для Tипа ключа выберите Симметричный.
- Для Использования ключа выберите Шифрование и дешифрование.
- Выберите Далее.
- Введите номер учетной записи продукции, чтобы предоставить ей доступ к ключу KMS, созданному в учетной записи разработки. Этот шаг обязателен, поскольку первый раз модель обучается в учетной записи разработки, артефакты модели шифруются с помощью ключа KMS перед записью в S3-ведро в центральной учетной записи реестра моделей. Учетной записи продукции необходим доступ к ключу KMS для расшифровки артефактов модели и выполнения выводного конвейера.
- Выберите Далее и завершите создание вашего ключа.
После того, как ключ будет предоставлен, он должен быть видимым на консоли AWS KMS.
Создайте ключ KMS в учетной записи prod
Пройдите по тем же шагам, что и в предыдущем разделе, чтобы создать управляемый пользовательский ключ KMS в учетной записи prod. Вы можете пропустить шаг по передаче ключа KMS другой учетной записи.
Настройка S3-ведра артефактов модели в учетной записи центрального реестра моделей
Создайте S3-ведро по вашему выбору со строкой sagemaker
в соглашении о наименовании как часть имени ведра в учетной записи центрального реестра моделей и обновите политику ведра на S3-ведре, чтобы предоставить разрешения из учетных записей dev и prod для чтения и записи артефактов модели в S3-ведро.
Следующий код является политикой ведра, которую следует обновить на S3-ведре:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<идентификатор-учетной-записи-dev>:root" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<ведро-s3-в-учетной-записи-центрального-реестра-моделей>/*" }, { "Sid": "AddPerm1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<идентификатор-учетной-записи-dev>:root" }, "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::<ведро-s3-в-учетной-записи-центрального-реестра-моделей>", "arn:aws:s3:::<ведро-s3-в-учетной-записи-центрального-реестра-моделей>/*" ] }, { "Sid": "AddPerm2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<идентификатор-учетной-записи-prod>:root" }, "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<ведро-s3-в-учетной-записи-центрального-реестра-моделей>/*" }, { "Sid": "AddPerm3", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<идентификатор-учетной-записи-prod>:root" }, "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::<ведро-s3-в-учетной-записи-центрального-реестра-моделей>", "arn:aws:s3:::<ведро-s3-в-учетной-записи-центрального-реестра-моделей>/*" ] } ]}
Настройка ролей IAM в ваших учетных записях AWS
Следующим шагом является настройка Identity and Access Management (IAM) ролей в ваших учетных записях AWS с разрешениями для AWS Lambda, SageMaker и Jenkins.
Роль выполнения Lambda
Настройте роли выполнения Lambda в учетных записях dev и prod, которые будут использоваться Lambda-функцией, выполняемой в рамках шага SageMaker Pipelines Lambda. В этом шаге будет запущена инференс-процедура для получения последней утвержденной модели, используемой для генерации выводов. Создайте роли IAM в учетных записях dev и prod с соглашением о наименовании arn:aws:iam::<идентификатор-учетной-записи>:role/lambda-sagemaker-role
и прикрепите следующие политики IAM:
-
Политика 1 – Создайте встроенную политику с именем
cross-account-model-registry-access
, которая предоставляет доступ к набору модельных пакетов, настроенных в реестре моделей в центральном аккаунте:{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sagemaker:ListModelPackages", "Resource": "arn:aws:sagemaker:us-east-1:<идентификатор-аккаунта-реестра-моделей>:model-package/mammo-severity-model-package/*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "sagemaker:DescribeModelPackageGroup", "Resource": "arn:aws:sagemaker:us-east-1:<идентификатор-аккаунта-реестра-моделей>:model-package-group/mammo-severity-model-package" } ]}
-
Политика 2 – Прикрепите AmazonSageMakerFullAccess, которая является управляемой политикой AWS и предоставляет полный доступ к SageMaker. Она также предоставляет ограниченный доступ к связанным услугам, таким как AWS Application Auto Scaling, Amazon S3, Amazon Elastic Container Registry (Amazon ECR) и Amazon CloudWatch Logs.
-
Политика 3 – Прикрепите AWSLambda_FullAccess, которая является управляемой политикой AWS и предоставляет полный доступ к Lambda, функциональным возможностям консоли Lambda и другим связанным услугам AWS.
-
Политика 4 – Используйте следующую доверенную политику IAM для роли IAM:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com", "sagemaker.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ]}
Роль выполнения SageMaker
В девелоперских и продакшн аккаунтах должна быть связана роль выполнения SageMaker Studio domains, которую можно найти на вкладке Настройки домена на странице сведений о домене, как показано на следующем скриншоте. Эта роль используется для запуска заданий обучения, обработки и других операций в пределах домена SageMaker Studio.
Добавьте следующие политики в роль выполнения SageMaker в обоих аккаунтах:
-
Политика 1 – Создайте встроенную политику с именем
cross-account-model-artifacts-s3-bucket-access
, которая предоставляет доступ к бакету S3 в центральном аккаунте реестра моделей, в котором хранятся модельные артефакты:{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::<s3-бакет-в-центральном-аккаунте-реестра-моделей>/*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::<s3-бакет-в-центральном-аккаунте-реестра-моделей>", "arn:aws:s3:::<s3-бакет-в-центральном-аккаунте-реестра-моделей>/*" ] } ]}
-
Политика 2 – Создайте встроенную политику с именем
cross-account-model-registry-access
, которая предоставляет доступ к пакету моделей в реестре моделей в центральном аккаунте реестра моделей:{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sagemaker:CreateModelPackageGroup", "Resource": "arn:aws:sagemaker:us-east-1:<идентификатор-аккаунта-реестра-моделей>:model-package-group/mammo-severity-model-package" } ]}
-
Политика 3 – Создайте встроенную политику с именем
kms-key-access-policy
, которая предоставляет доступ к созданному ранее ключу KMS. Укажите идентификатор аккаунта, в котором создается политика, и идентификатор созданного в этом аккаунте ключа KMS.{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUseOfKeyInThisAccount", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "arn:aws:kms:us-east-1:<идентификатор-аккаунта>:key/<идентификатор-ключа-kms>" } ]}
-
Политика 4 – Прикрепите AmazonSageMakerFullAccess, которая является управляемой политикой AWS и предоставляет полный доступ к SageMaker и ограниченный доступ к связанным услугам.
-
Политика 5 – Прикрепите AWSLambda_FullAccess, которая является управляемой политикой AWS и предоставляет полный доступ к Lambda, функциональным возможностям консоли Lambda и другим связанным услугам AWS.
-
Политика 6 – Прикрепите CloudWatchEventsFullAccess, которая является управляемой политикой
Роль Jenkins для кросс-аккаунта
Настройте роль IAM под названием
cross-account-jenkins-role
в аккаунте prod, которую Jenkins будет использовать для развертывания ML-пайплайнов и соответствующей инфраструктуры в аккаунте prod.Добавьте следующие управляемые политики IAM к роли:
CloudWatchFullAccess
AmazonS3FullAccess
AmazonSNSFullAccess
AmazonSageMakerFullAccess
AmazonEventBridgeFullAccess
AWSLambda_FullAccess
Обновите доверительные отношения в роли, чтобы предоставить разрешения учетной записи AWS, на которой размещен сервер Jenkins:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com", "AWS": "arn:aws:iam::<jenkins-account-id>:root" }, "Action": "sts:AssumeRole", "Condition": {} } ]}
Обновите разрешения в роли IAM, связанной с сервером Jenkins
Предполагая, что Jenkins настроен в AWS, обновите роль IAM, связанную с Jenkins, чтобы добавить следующие политики, которые предоставят Jenkins доступ для развертывания ресурсов в аккаунт prod:
-
Политика 1 – Создайте следующую встроенную политику с именем
assume-production-role-policy
:{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<prod-account-id>:role/cross-account-jenkins-role" } ]}
-
Политика 2 – Прикрепите управляемую политику IAM
CloudWatchFullAccess
.
Настройте группу моделей в центральном аккаунте реестра моделей
Из домена SageMaker Studio в центральном аккаунте реестра моделей создайте группу моделей с названием
mammo-severity-model-package
с помощью следующего фрагмента кода (который можно запустить с помощью блокнота Jupyter):import boto3 model_package_group_name = "mammo-severity-model-package"sm_client = boto3.Session().client("sagemaker")create_model_package_group_response = sm_client.create_model_package_group( ModelPackageGroupName=model_package_group_name, ModelPackageGroupDescription="Cross account model package group for mammo severity model",)print('ModelPackageGroup Arn : {}'.format(create_model_package_group_response['ModelPackageGroupArn']))
Настройте доступ к пакету моделей для ролей IAM в аккаунтах dev и prod
Предоставьте доступ к ролям SageMaker execution, созданным в аккаунтах dev и prod, чтобы вы могли регистрировать версии моделей в модельном пакете
mammo-severity-model-package
в центральном аккаунте реестра моделей из обоих аккаунтов. Из домена SageMaker Studio в центральном аккаунте реестра моделей выполните следующий код в блокноте Jupyter:import json import boto3 model_package_group_name = "mammo-severity-model-package"# Преобразуйте политику из словаря JSON в строкуmodel_package_group_policy = dict({ "Version": "2012-10-17", "Statement": [ { "Sid": "AddPermModelPackageGroupCrossAccount", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::<dev-account-id>:root", "arn:aws:iam::<prod-account-id>:root"] }, "Action": [ "sagemaker:DescribeModelPackageGroup" ], "Resource": "arn:aws:sagemaker:us-east-1:<central-model-registry-account>:model-package-group/mammo-severity-model-package" }, { "Sid": "AddPermModelPackageVersionCrossAccount", "Effect": "Allow", "Principal": { "AWS": ["arn:aws:iam::<dev-account-id>:root", "arn:aws:iam::<prod-account-id>:root"] }, "Action": [ "sagemaker:DescribeModelPackage", "sagemaker:ListModelPackages", "sagemaker:UpdateModelPackage", "sagemaker:CreateModelPackage", "sagemaker:CreateModel" ], "Resource": "arn:aws:sagemaker:us-east-1:<central-model-registry-account>:model-package/mammo-severity-model-package/*" } ]})model_package_group_policy = json.dumps(model_package_group_policy)# Добавьте политику к группе моделейsm_client = boto3.Session().client("sagemaker")response = sm_client.put_model_package_group_policy( ModelPackageGroupName = model_package_group_name, ResourcePolicy = model_package_group_policy)
Настройка Jenkins
В этом разделе мы настраиваем Jenkins для создания ML-пайплайнов и соответствующей инфраструктуры Terraform в учетной записи prod через CI/CD-пайплайн Jenkins.
- На консоли CloudWatch создайте группу журналов с именем
jenkins-log
в учетной записи prod, на которую Jenkins будет отправлять журналы из CI/CD-пайплайна. Группа журналов должна быть создана в том же регионе, где настроен сервер Jenkins. - Установите следующие плагины на вашем сервере Jenkins:
- Настройте учетные данные AWS в Jenkins с использованием предоставленной в учетной записи prod поперечной роли IAM (
cross-account-jenkins-role
). - Для конфигурации системы выберите AWS.
- Укажите учетные данные и созданную ранее группу журналов CloudWatch.
- Настройте учетные данные GitHub в Jenkins.
- Создайте новый проект в Jenkins.
- Введите имя проекта и выберите Pipeline.
- На вкладке Общие выберите Проект GitHub и введите URL форка репозитория GitHub.
- Выберите Этот проект параметризован.
- На меню Добавить параметр выберите Строковый параметр.
- Для Имя введите
prodAccount
. - Для Значение по умолчанию введите идентификатор учетной записи prod.
- В разделе Дополнительные параметры проекта для Определения выберите Скрипт пайплайна из SCM.
- Для SCM выберите Git.
- Для URL репозитория введите URL форка репозитория GitHub.
- Для Учетных данных введите учетные данные GitHub, сохраненные в Jenkins.
- Введите
main
в разделе Ветки для сборки, когда будет запущен CI/CD-пайплайн. - Для Путь скрипта введите
Jenkinsfile
. - Выберите Сохранить.
Требуется создать и отобразить Jenkins pipeline на вашей панели инструментов.
Выделение ресурсов для S3-ведер, сбор и подготовка данных
Выполните следующие шаги для настройки ваших S3-ведер и данных:
-
Создайте S3-ведро при помощи выбранной вами строки
sagemaker
в наименовании как часть имени ведра как для учетных записей dev, так и для учетных записей prod, для хранения наборов данных и модельных артефактов. -
Настройте S3-ведро для поддержки состояния Terraform в учетной записи prod.
-
Скачайте и сохраните общедоступный набор данных UCI Mammography Mass в ранее созданное ведро S3 в учетной записи dev.
-
Создайте форк и клонируйте репозиторий на GitHub в пределах домена SageMaker Studio в учетной записи dev. В репозитории имеется следующая структура папок:
- /environments – Скрипт конфигурации для окружения prod
- /mlops-infra – Код для развертывания служб AWS с использованием кода Terraform
- /pipelines – Код для компонентов пайплайна SageMaker
- Jenkinsfile – Скрипт для развертывания через пайплайн Jenkins CI/CD
- setup.py – Необходим для установки требуемых модулей Python и создания команды run-pipeline
- mammography-severity-modeling.ipynb – Позволяет вам создавать и запускать рабочий процесс машинного обучения
-
Создайте папку с именем data внутри папки клонированного репозитория GitHub и сохраните копию общедоступного набора данных UCI Mammography Mass.
-
Следуйте инструкциям в Jupyter-ноутбуке
mammography-severity-modeling.ipynb
. -
Выполните следующий код в ноутбуке для предварительной обработки набора данных и загрузки его в ведро S3 в учетной записи dev:
import boto3import sagemakerimport numpy as npimport pandas as pdfrom sklearn.compose import ColumnTransformerfrom sklearn.impute import SimpleImputerfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScaler, OneHotEncoder#Замените значения в соответствии с созданными ресурсамиdefault_bucket = "<s3-bucket-in-dev-account>"model_artifacts_bucket = "<s3-bucket-in-central-model-registry-account>"region = "us-east-1"model_name = "mammography-severity-model"role = sagemaker.get_execution_role()lambda_role = "arn:aws:iam::<dev-account-id>:role/lambda-sagemaker-role"kms_key = "arn:aws:kms:us-east-1:<dev-account-id>:key/<kms-key-id-in-dev-account>"model_package_group_name="arn:aws:sagemaker:us-east-1:<central-model-registry-account-id>:model-package-group/mammo-severity-model-package"feature_columns_names = [ 'BIRADS', 'Age', 'Shape', 'Margin', 'Density',]feature_columns_dtype = { 'BIRADS': np.float64, 'Age': np.float64, 'Shape': np.float64, 'Margin': np.float64, 'Density': np.float64,}#Чтение исходного набора данныхmammographic_data = pd.read_csv("data/mammographic_masses.data",header=None)# Разделение данных на пакет и исходные наборы данныхbatch_df =mammographic_data.sample(frac=0.05,random_state=200)raw_df =mammographic_data.drop(batch_df.index)# Разделение исходных наборов данных на две части, одна из которых будет использоваться во время обучения# модели в начальный момент, а затем другой набор данных будет использоваться при #повторном обучении моделиtrain_dataset_part2 =raw_df.sample(frac=0.1,random_state=200)train_dataset_part1 =raw_df.drop(train_dataset_part2.index)# Сохранение обучающих наборов данных train_dataset_part1.to_csv("data/mammo-train-dataset-part1.csv",index=False)train_dataset_part2.to_csv("data/mammo-train-dataset-part2.csv",index=False)# Удаление столбца с метками из пакетного набора данных, который будет использоваться для создания выводовbatch_df.drop(5,axis=1,inplace=True)# Создание копии пакетного набора данных batch_modified_df = batch_dfdef preprocess_batch_data(feature_columns_names,feature_columns_dtype,batch_df): batch_df.replace("?", "NaN", inplace = True) batch_df.columns = feature_columns_names batch_df = batch_df.astype(feature_columns_dtype) numeric_transformer = Pipeline( steps=[("imputer", SimpleImputer(strategy="median"))] ) numeric_features = list(feature_columns_names) preprocess = ColumnTransformer( transformers=[ ("num", numeric_transformer, numeric_features) ] ) batch_df = preprocess.fit_transform(batch_df) return batch_df# Сохранение файла пакетного набора данныхbatch_df = preprocess_batch_data(feature_columns_names,feature_columns_dtype,batch_df)pd.DataFrame(batch_df).to_csv("data/mammo-batch-dataset.csv", header=False, index=False)# Модификация пакетного набора данных для введения пропущенных значенийbatch_modified_df.replace("?", "NaN", inplace = True)batch_modified_df.columns = feature_columns_namesbatch_modified_df = batch_modified_df.astype(feature_columns_dtype)# Сохранение файла пакетного набора данных с выбросамиbatch_modified_df.to_csv("data/mammo-batch-dataset-outliers.csv",index=False)
Код будет генерировать следующие наборы данных:
-
- data/ mammo-train-dataset-part1.csv – Будет использоваться для обучения первой версии модели.
- data/ mammo-train-dataset-part2.csv – Будет использоваться для обучения второй версии модели вместе с набором данных mammo-train-dataset-part1.csv.
- data/mammo-batch-dataset.csv – Будет использоваться для генерации выводов.
- data/mammo-batch-dataset-outliers.csv – Будет вносить выбросы в набор данных, чтобы сбой конвейера вывода. Это позволит нам протестировать шаблон для вызова автоматического повторного обучения модели.
-
Загрузите набор данных
mammo-train-dataset-part1.csv
с префиксомmammography-severity-model/train-dataset
и загрузите наборы данныхmammo-batch-dataset.csv
иmammo-batch-dataset-outliers.csv
с префиксомmammography-severity-model/batch-dataset
в S3 бакет, созданный в аккаунте разработчика:import boto3s3_client = boto3.resource('s3')s3_client.Bucket(default_bucket).upload_file("data/mammo-train-dataset-part1.csv","mammography-severity-model/data/train-dataset/mammo-train-dataset-part1.csv")s3_client.Bucket(default_bucket).upload_file("data/mammo-batch-dataset.csv","mammography-severity-model/data/batch-dataset/mammo-batch-dataset.csv")s3_client.Bucket(default_bucket).upload_file("data/mammo-batch-dataset-outliers.csv","mammography-severity-model/data/batch-dataset/mammo-batch-dataset-outliers.csv")
-
Загрузите наборы данных
mammo-train-dataset-part1.csv
иmammo-train-dataset-part2.csv
с префиксомmammography-severity-model/train-dataset
в S3 бакет, созданный в аккаунте продакшена через консоль Amazon S3. -
Загрузите наборы данных
mammo-batch-dataset.csv
иmammo-batch-dataset-outliers.csv
с префиксомmammography-severity-model/batch-dataset
в S3 бакет в аккаунте продакшена.
Запустите конвейер обучения
Под
<project-name>/pipelines/train
вы можете увидеть следующие скрипты на языке Python:- scripts/raw_preprocess.py – Интегрируется с SageMaker Processing для создания признаков
- scripts/evaluate_model.py – Позволяет расчет метрик модели, в данном случае
auc_score
- train_pipeline.py – Содержит код для конвейера обучения модели
Выполните следующие шаги:
-
Загрузите скрипты в Amazon S3:
import boto3s3_client = boto3.resource('s3')s3_client.Bucket(default_bucket).upload_file("pipelines/train/scripts/raw_preprocess.py","mammography-severity-model/scripts/raw_preprocess.py")s3_client.Bucket(default_bucket).upload_file("pipelines/train/scripts/evaluate_model.py","mammography-severity-model/scripts/evaluate_model.py")
-
Получите экземпляр конвейера обучения:
from pipelines.train.train_pipeline import get_pipelinetrain_pipeline = get_pipeline( region=region, role=role, default_bucket=default_bucket, model_artifacts_bucket=model_artifacts_bucket, model_name = model_name, kms_key = kms_key, model_package_group_name= model_package_group_name, pipeline_name="mammo-severity-train-pipeline", base_job_prefix="mammo-severity", )train_pipeline.definition()
-
Отправьте конвейер обучения и запустите его:
train_pipeline.upsert(role_arn=role)train_execution = train_pipeline.start()
На следующей фигуре показан успешный запуск обучающего процесса. Последний шаг в конвейере регистрирует модель в центральном реестре моделей.
Утвердите модель в центральном реестре моделей
Войдите в аккаунт центрального реестра моделей и перейдите в реестр моделей SageMaker в домене SageMaker Studio. Измените статус версии модели на “Утверждено”.
После утверждения статус должен измениться у версии модели.
Запустите восходящий конвейер (необязательно)
Этот шаг необязателен, но вы все равно можете запустить восходящий конвейер для генерации прогнозов в аккаунте разработки.
В разделе
<project-name>/pipelines/inference
вы можете увидеть следующие скрипты на языке Python:- scripts/lambda_helper.py – Извлекает последнюю утвержденную версию модели из аккаунта центрального реестра моделей с помощью шага Lambda Pipelines SageMaker
- inference_pipeline.py – Содержит код для восходящего конвейера инференции модели
Выполните следующие шаги:
-
Загрузите скрипт в корзину S3:
import boto3s3_client = boto3.resource('s3')s3_client.Bucket(default_bucket).upload_file("pipelines/inference/scripts/lambda_helper.py","mammography-severity-model/scripts/lambda_helper.py")
-
Получите экземпляр конвейера инференции, используя обычный пакет набора данных:
from pipelines.inference.inference_pipeline import get_pipelineinference_pipeline = get_pipeline( region=region, role=role, lambda_role = lambda_role, default_bucket=default_bucket, kms_key=kms_key, model_name = model_name, model_package_group_name= model_package_group_name, pipeline_name="mammo-severity-inference-pipeline", batch_dataset_filename = "mammo-batch-dataset" )
-
Отправьте конвейер инференции и запустите его:
inference_pipeline.upsert(role_arn=role)inference_execution = inference_pipeline.start()
На следующей фигуре показан успешный запуск восходящего конвейера. Последний шаг в конвейере генерирует прогнозы и сохраняет их в корзине S3. Мы используем MonitorBatchTransformStep для отслеживания входов в задание пакетной трансформации. Если есть какие-либо выбросы, восходящий конвейер инференции переходит в состояние “Не выполнено”.
Запустите конвейер Jenkins
В папке
environment/
в репозитории GitHub находится скрипт настройки для аккаунта продакшена. Выполните следующие шаги, чтобы запустить конвейер Jenkins:-
Обновите конфигурационный скрипт
prod.tfvars.json
на основе ресурсов, созданных на предыдущих шагах:{ "env_group": "prod", "aws_region": "us-east-1", "event_bus_name": "default", "pipelines_alert_topic_name": "mammography-model-notification", "email":"admin@org.com", "lambda_role":"arn:aws:iam::<prod-account-id>:role/lambda-sagemaker-role", "default_bucket":"<s3-bucket-in-prod-account>", "model_artifacts_bucket": "<s3-bucket-in-central-model-registry-account>", "kms_key": "arn:aws:kms:us-east-1:<prod-account-id>:key/<kms-key-id-in-prod-account>", "model_name": "mammography-severity-model", "model_package_group_name":"arn:aws:sagemaker:us-east-1:<central-model-registry-account-id>:model-package-group/mammo-severity-model-package", "train_pipeline_name":"mammo-severity-train-pipeline", "inference_pipeline_name":"mammo-severity-inference-pipeline", "batch_dataset_filename":"mammo-batch-dataset", "terraform_state_bucket":"<s3-bucket-terraform-state-in-prod-account>", "train_pipeline": { "name": "mammo-severity-train-pipeline", "arn": "arn:aws:sagemaker:us-east-1:<prod-account-id>:pipeline/mammo-severity-train-pipeline", "role_arn": "arn:aws:iam::<prod-account-id>:role/service-role/<sagemaker-execution-role-in-prod-account>" }, "inference_pipeline": { "name": "mammo-severity-inference-pipeline", "arn": "arn:aws:sagemaker:us-east-1:<prod-account-id>:pipeline/mammo-severity-inference-pipeline", "cron_schedule": "cron(0 23 * * ? *)", "role_arn": "arn:aws:iam::<prod-account-id>:role/service-role/<sagemaker-execution-role-in-prod-account>" }}
-
После обновления отправьте код в форкнутый репозиторий GitHub и объедините код в основную ветку.
-
Перейдите в пользовательский интерфейс Jenkins, выберите Собрать с параметрами и запустите созданный ранее конвейер CI/CD.
Когда сборка завершена успешно, вы можете войти в аккаунт prod и увидеть тренировочные и выводные конвейеры в пределах домена SageMaker Studio.
Дополнительно, в аккаунте prod вы увидите три правила EventBridge в консоли EventBridge:
- Запланировать выводной конвейер
- Отправить уведомление об ошибке в тренировочном конвейере
- Когда выводной конвейер не удаётся запустить тренировочный конвейер, отправить уведомление
Наконец, вы увидите тему уведомлений SNS в консоли Amazon SNS, которая отправляет уведомления по электронной почте. Вы получите электронное письмо с просьбой подтвердить принятие этих писем с уведомлениями.
Тестирование выводного конвейера с использованием пакетного набора данных без выбросов
Чтобы протестировать, работает ли выводной конвейер ожидаемым образом в аккаунте prod, вы можете войти в аккаунт prod и запустить выводной конвейер с использованием пакетного набора данных без выбросов.
Запустите конвейер через консоль SageMaker Pipelines в домене SageMaker Studio аккаунта prod, где
transform_input
будет представлять собой S3 URI набора данных без выбросов (s3://<s3-bucket-in-prod-account>/mammography-severity-model/data/mammo-batch-dataset.csv
).Выводной конвейер успешно выполняется и записывает предсказания обратно в бакет S3.
Тестирование выводного конвейера с использованием пакетного набора данных с выбросами
Вы можете запустить выводной конвейер с использованием пакетного набора данных с выбросами, чтобы проверить, работает ли механизм автоматической повторной обучения ожидаемым образом.
Запустите конвейер через консоль SageMaker Pipelines в домене SageMaker Studio аккаунта prod, где
transform_input
будет представлять собой S3 URI набора данных с выбросами (s3://<s3-bucket-in-prod-account>/mammography-severity-model/data/mammo-batch-dataset-outliers.csv
).Выводной конвейер ожидаемо завершается с ошибкой, что запускает правило EventBridge, которое в свою очередь запускает тренировочный конвейер.
Через несколько моментов вы должны увидеть новый запуск поездки по конвейеру SageMaker на консоли Pipelines, который выбирает два разных набора данных для обучения (
mammo-train-dataset-part1.csv
иmammo-train-dataset-part2.csv
), загруженных в корзину S3 для повторного обучения модели.Вы также увидите уведомление, отправленное на адрес электронной почты, подписанный на тему SNS.
Чтобы использовать обновленную версию модели, войдите в учетную запись центрального реестра моделей и утвердите версию модели, которая будет использоваться при следующем запуске конвейера вывода, запущенном по запланированному правилу EventBridge.
Хотя конвейеры обучения и вывода используют статический URL набора данных, вы можете передавать URL набора данных в конвейеры обучения и вывода в качестве динамических переменных, чтобы использовать обновленные наборы данных для повторного обучения модели и получения прогнозов в реальной ситуации.
Очистка
Чтобы избежать будущих расходов, выполните следующие шаги:
- Удалите домен SageMaker Studio во всех учетных записях AWS.
- Удалите все ресурсы, созданные вне SageMaker, включая корзины S3, IAM-роли, правила EventBridge и тему SNS, созданные с помощью Terraform в аккаунте prod.
- Удалите конвейеры SageMaker, созданные в разных аккаунтах, с помощью интерфейса командной строки AWS (AWS CLI).
Заключение
Организации часто нуждаются в согласовании средств в рамках всей предприятия, чтобы обеспечить сотрудничество между различными функциональными областями и командами. Это сотрудничество гарантирует, что ваша платформа MLOps может адаптироваться к изменяющимся бизнес-потребностям и ускоряет принятие во внимание КИ между командами. В этом сообщении объясняется, как создать MLOps-фреймворк в настройке с несколькими средами для автоматического повторного обучения модели, пакетного вывода и мониторинга с помощью Amazon SageMaker Model Monitor, версионирования модели с помощью SageMaker Model Registry и продвижения ML-кода и конвейеров между средами с помощью конвейера CI/CD. Мы показали этот решение с использованием комбинации сервисов AWS и сторонних средств. Инструкции по реализации этого решения смотрите в репозитории GitHub. Вы также можете расширить это решение, добавив собственные источники данных и модельные фреймворки.