Продвигайте конвейеры в настроенной многокомпонентной среде с использованием реестра моделей 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 с следующими ключевыми компонентами:

  • Многопользовательская стратегия – Две разные среды (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

Рабочий процесс MLOps включает следующие шаги:

  1. Доступ к домену SageMaker Studio в учетной записи разработки, клонирование репозитория GitHub, процесс разработки модели с использованием предоставленной образца модели и создание обучающих и выводных конвейеров.
  2. Запуск обучающего конвейера в учетной записи разработки, который генерирует артефакты модели для обученной версии модели и регистрирует модель в реестре моделей SageMaker в центральной учетной записи реестра моделей.
  3. Утверждение модели в реестре моделей SageMaker в центральной учетной записи реестра моделей.
  4. Загрузка кода (обучающих и выводных конвейеров, и кода Terraform Infrastructure-as-Code для создания расписания EventBridge, правила EventBridge и темы SNS) в ветку функций репозитория GitHub. Создание запроса на вытягивание для слияния кода в главную ветку репозитория GitHub.
  5. Запуск конвейера Jenkins CI/CD, который настроен с репозиторием GitHub. Конвейер CI/CD развертывает код в продукционной учетной записи для создания обучающих и выводных конвейеров, а также кода Terraform для развертывания расписания EventBridge, правила EventBridge и темы SNS.
  6. Выводной конвейер запланирован для выполнения ежедневно, тогда как обучающий конвейер настроен для запуска при обнаружении изменения данных из выводного конвейера.
  7. Уведомления отправляются через тему 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, созданному в учетной записи разработки. Этот шаг обязателен, поскольку первый раз модель обучается в учетной записи разработки, артефакты модели шифруются с помощью ключа KMS перед записью в S3-ведро в центральной учетной записи реестра моделей. Учетной записи продукции необходим доступ к ключу KMS для расшифровки артефактов модели и выполнения выводного конвейера.
  • Выберите Далее и завершите создание вашего ключа. завершение создания ключа

После того, как ключ будет предоставлен, он должен быть видимым на консоли AWS KMS.

Ключ 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 studio domain

Добавьте следующие политики в роль выполнения 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:
      1. Job DSL
      2. Git
      3. Pipeline
      4. Pipeline: AWS Steps
      5. Pipeline Utility Steps
    • Настройте учетные данные 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. Вы также можете расширить это решение, добавив собственные источники данных и модельные фреймворки.