Конвейер непрерывного развертывания вашей модели глубокого обучения в облаке с использованием AWS, S3 и CloudFormation

Введение

MLOps становится все более и более важным. Согласно статьям, подобным этой, 87% проектов по науке о данных никогда не попадают в производство. Это настораживает. Это означает, что в среднем только 13 из 100 моделей попадают в производство. Остальные 87 просто потеряны. Они застряли где-то в репозиториях Git в Jupyter Notebooks. Это катастрофа! С другой стороны, однако, это также возможность. Это возможность для разработчиков, обладающих необходимыми навыками для запуска моделей в производство, поскольку компаниям нужны люди, запускающие свои модели в производство, чтобы использовать их. Так что, если вам интересно, как может работать запуск модели в производство, продолжайте читать! Кроме того, вы можете разветвить мой репозиторий Github и следовать инструкциям в этой статье, чтобы воспроизвести все в своей собственной учетной записи AWS. Это помогает лучше понять тему.

В своей последней статье я работал над конвейером непрерывного развертывания, развертывая обученную модель в AWS Elastic Beanstalk с помощью Github Actions и Docker. В этой статье я также версионировал свою модель вместе с исходным кодом, используя Git LFS (Large File Storage). Прочтите эту статью, чтобы узнать, как создается контейнер Docker и как создать приложение Elastic Beanstalk в AWS и развернуть в нем контейнер Docker.

В этой статье я хочу показать вам более оптимизированную настройку, в которой используются только сервисы AWS. Модель теперь имеет версию и хранится в корзине AWS S3, а не в коде. Конвейер, который я создал для развертывания своей модели, создается с помощью AWS CodePipeline. В конце модель все еще развертывается в Elastic Beanstalk, но на этот раз она сначала развертывается в промежуточной среде, чтобы дать вам или члену команды возможность сначала протестировать ее. И если вы или член вашей команды довольны новой моделью, можно получить одобрение, и новая модель будет развернута в производственной среде.

В прошлой статье я также создал всю инфраструктуру в AWS вручную, но на этот раз я использовал для этого CloudFormation. CloudFormation — это предложение AWS по созданию вашей инфраструктуры как кода. Это имеет то преимущество, что ваша инфраструктура версионируется вместе с вашим кодом, и вы всегда можете создать или удалить все службы одним щелчком мыши вместо того, чтобы создавать или удалять все ресурсы вручную. Подробнее о CloudFormation можно прочитать здесь.

Обзор конвейера

Давайте сначала начнем с более глубокого изучения пайплайна, который я создал. На рис. 2 показан обзор всего конвейера и всех отдельных шагов. Теперь я хочу более подробно объяснить каждый шаг в этом пайплайне.

Клонировать исходный репозиторий

Клонирование исходного репозитория — это первый шаг в конвейере. Здесь репозиторий исходного кода клонируется и упаковывается в zip-файл. Затем этот zip-файл предоставляется в качестве входных данных для следующего шага конвейера. Я также настроил этот этап так, чтобы он всегда выполнялся при обнаружении изменений в репозитории связанного исходного кода. Таким образом, конвейер всегда запускается, как только что-то изменилось в коде, и новое приложение всегда развертывается в промежуточной среде.

На этапе клонирования исходного репозитория используется подключение к AWS CodeStar. Это новый способ в AWS настроить подключения из AWS к вашему репозиторию Github. Я уже создал такое подключение вручную с помощью консоли AWS. Вы можете следовать этому руководству о том, как создать такое подключение к вашему репозиторию Github.

Извлечение модели из S3 и сборка образа Docker

Теперь, когда у нас есть наш код в zip-архиве, пришло время подготовить приложение к развертыванию. Первый шаг — извлечь текущую последнюю версию модели из соответствующей корзины s3. Я создал версионную корзину s3, в которую загрузил свою модель. Вы можете найти bash-скрипт для этого шага в моем репозитории здесь (Код 2). Вы можете выполнить этот сценарий bash в своей консоли Linux, которая уже настроена для использования с AWS. Вы можете следовать этому руководству о том, как настроить консоль для подключения к вашей учетной записи AWS.

После того, как я вытащил модель из s3, я хочу создать образ Docker, который позже также будет построен на AWS Elastic Beanstalk. Это уже помогает гарантировать, что контейнер все еще может быть создан, а последняя версия исходного кода работает правильно, по крайней мере, с точки зрения инфраструктуры.

Оба шага (извлечение из s3 и сборка образа Docker) выполняются на шаге AWS CodeBuild. CodeBuild — это полностью управляемая служба непрерывной интеграции, которая компилирует исходный код, запускает тесты и создает программные пакеты, готовые к развертыванию (Источник). Шаг CodeBuild также определен в файле yaml, который хранится в репозитории исходного кода. Вы можете найти его в моем репозитории или увидеть в фрагменте кода ниже (Код 3).

На этапе CodeBuild я сначала загружаю последнюю модель из s3 (этап pre_build), создаю образ Docker, чтобы убедиться, что приложение все еще можно создать (этап сборки). и, наконец, упакуйте все в zip-пакет, чтобы этот zip-пакет можно было напрямую развернуть в Elastic Beanstalk (раздел артефактов).

Затем на созданную спецификацию сборки ссылается шаг CodeBuild. Вы можете увидеть соответствующий фрагмент yaml в шаблоне CloudFormation ниже (код 4).

Развертывание в Elastic Beanstalk

Теперь, когда мы все еще можем собрать приложение и у нас есть необходимый zip-пакет, пришло время развернуть это приложение в промежуточной среде. Первое развертывание в промежуточной среде важно, так как новое приложение можно сначала протестировать перед развертыванием неработающего приложения в производственной среде, где клиенты взаимодействуют с вашим приложением. Кроме того, не всегда имеет смысл создавать новую производственную версию. Возможно, вы хотите выпускать новую версию для производственной среды только раз в месяц, но при этом хотите всегда тестировать вновь созданные функции в тестовой среде.

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

Установка пайплайна в AWS

Хорошо. Теперь вы видели, что делает конвейер. Давайте теперь установим этот конвейер в AWS. Как я упоминал ранее, я создал конвейер с помощью CloudFormation, чтобы все было доступно в виде кода. Это помогает версионировать конвейер вместе с моим исходным кодом и легко устанавливать или удалять все необходимые службы. В противном случае вам придется устанавливать все службы самостоятельно, что может занять много времени, а также является процессом, подверженным ошибкам. Вы можете найти yaml-файл CloudFormation в моем исходном репозитории здесь.

Я действительно рекомендую вам выполнить следующие шаги для лучшего понимания конвейера. Просто разветвите мой исходный репозиторий и клонируйте его на свой локальный компьютер. Затем вы можете выполнить следующие шаги, чтобы сначала создать корзину s3 и загрузить модель в эту корзину s3, а затем установить стек CloudFormation с помощью соответствующего файла yaml.

Давайте теперь начнем!

Шаг 1. Клонируйте репозиторий на локальный компьютер

Сначала клонируйте репозиторий на локальный компьютер. Вы также должны запустить git lfs pull, чтобы получить обученную модель, так как она была загружена с помощью git lfs.

Шаг 2. Создайте корзину s3 и загрузите модель

Откройте командную строку, чтобы запустить bash-файл create-and-upload-s3.sh. Если вы запускаете его на компьютере с Windows, вы можете установить Git Bash для запуска файла bash также на вашем компьютере с Windows.

В открывшейся командной строке перейдите в папку aws_infra_setup и запустите bash create-and-upload-s3.sh, чтобы создать корзину s3 и загрузить модель из репозитория Git в созданную корзину.

Шаг 3. Создайте подключение к Github и адаптируйте шаблон CloudFormation для использования этого подключения

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

Затем вы можете перейти к этому соединению и скопировать UID этого соединения (рис. 4) и заменить мой UID своим UID (строка 53 yaml шаблона CloudFormation).

Шаг 4. Создайте стек CloudFormation

Перейдите в свою веб-консоль AWS. В строке поиска введите «CloudFormation». Затем нажмите «Создать стопку». Должен открыться новый пользовательский интерфейс, который позволит вам настроить стек CloudFormation. Оставьте первый вариант «Шаблон готов» и в разделе «Укажите шаблон» выберите «Загрузить файл шаблона». Затем вы можете нажать «Выбрать файл» и выбрать файл шаблона CloudFormation (cloud-formation-stack-pipeline.yaml), который находится в папке «aws_cloud_formation».

Затем вы можете нажать «Далее». Введите имя для своего стека (например, birds-classifier-cicd-stack), а затем нажмите «Далее» еще раз. Вы можете оставить все настройки на следующей странице со значениями по умолчанию. Нажмите «Далее» еще раз. На последней странице вам нужно прокрутить вниз и установить флажок, чтобы подтвердить, что AWS CloudFormation может создавать ресурсы IAM. Это необходимо, так как к Pipeline, CodeBuild и Elastic Beanstalk привязаны собственные роли IAM.

Наконец, вы можете нажать «Создать стопку». Теперь CloudFormation должен создать для вас все ресурсы и сервисы. Как только все будет создано, вы можете выполнить поиск «CodePipeline» в строке поиска и щелкнуть конвейер с названием «birds-classifier-cicd». Этот конвейер уже должен работать. При первом запуске произойдет сбой, так как среде Elastic Beanstalk требуется больше времени, пока она не заработает. Но этап развертывания следует повторить, как только среда Elastic Beanstalk будет готова. Затем вы можете перейти в промежуточную среду, проверить приложение и одобрить развертывание в рабочей среде (см. Gif 1 выше).

Заключение

Теперь мы создали профессиональное автоматизированное развертывание ваших обученных моделей машинного обучения. Теперь действительно легко просто выпускать новые модели, и ваша модель теперь является частью 13%, которые попадают в производство, а не частью 87%, которые не делают. Поздравляем!

Спасибо, что дочитали мою статью до конца! Надеюсь, вам понравилась эта статья и проект, над которым я работал. Если вы хотите читать больше подобных статей в будущем, подписывайтесь на меня, чтобы оставаться в курсе.

Контакт

LinkedIn |Github