В этой статье вы развернете свое приложение Flask на AWS Beanstalk с помощью GitHub Actions. Вы реализуете конвейер MLOps с непрерывной интеграцией и развертыванием, используя простые пошаговые объяснения.

Введение

В предыдущей статье этой серии мы обсудили два разных способа загрузки приложений Flask в AWS Beanstalk. Сначала мы загрузили наше приложение Flask с графическим пользовательским интерфейсом (GUI) AWS Beanstalk. Во-вторых, мы загрузили наше приложение Flask в AWS Beanstalk, используя всего три команды в интерфейсе командной строки. В этой статье мы обсудим, как внедрить конвейер непрерывной интеграции и непрерывного развертывания с использованием GitHub Actions и AWS Beanstalk.

AWS Elastic Beanstalk — это простой в использовании сервис для развертывания и масштабирования веб-приложений и сервисов, разработанных с использованием Java, .NET, PHP, Node.js, Python, Ruby, Go и Docker, на знакомых серверах, таких как Apache, Nginx, Пассажир и IIS. Вы можете просто загрузить свой код, и Elastic Beanstalk автоматически выполнит развертывание, от предоставления ресурсов, балансировки нагрузки, автоматического масштабирования до мониторинга работоспособности приложений (Источник: AWS Elastic Beanstalk).

После этого краткого введения давайте начнем с MLOps CI-CD Pipeline!

Часть CI (непрерывная интеграция)

Для этой части КИ я использовал набор данных о сердечной недостаточности. Вы можете найти подробное обсуждение моих Модели EDA и ML здесь. Я создал новое репо и связал это новое репо с моей локальной папкой. Прежде чем запустить конвейер непрерывной интеграции, давайте подробно рассмотрим файл YAML. Файл YAML позволяет GitHub точно знать, что необходимо сделать на каждом этапе пути.

Конвейер CI будет работать на Ubuntu.

ci_pipeline:
       runs-on: ubuntu-latest

GitHub Actions будет использовать Python версии 3.9.

- name: Set up Python 3.9
          uses: actions/setup-python@v1
          with:
            python-version: 3.9

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

🔵 Черный для форматирования

- name: Format
          run: |
            black application.py

🔵 Pylint для ворса

- name: Lint
          run: |
            pylint --disable=R,C  application.py

🔵 Pytest для теста.

- name: Test
          run: |
            python -m pytest -vv test.py

После контрольных точек мы заархивируем нашу папку и скопируем ее в корзину AWS S3.

🔵 Заархивированная папка для AWS Beanstalk

zip -r ${{ env.ZIP_FILE }} .

Конвейер CI добавляет все файлы в ZIP-папку.

🔵 Доступ к AWS

- name: AWS Access
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id    : ${{secrets.AWS_ACC_KEY}}
aws-secret-access-key: ${{secrets.AWS_SEC_KEY}}
aws-region           : ${{secrets.AWS_REGION}}

🔑 Прежде чем что-либо делать на AWS, нам нужно получить доступ к AWS с соответствующими токенами и ключами. В этом конвейере CI мы будем использовать ранее сохраненный ключ доступа AWS, секретный ключ и имя региона для доступа к AWS. Вы можете перейти на GitHub и сохранить этот ключ как секрет репозитория.

🔵 Скопируйте zip-файл в корзину AWS S3

- name: Copy ZIP file to AWS S3 Bucket
run : aws s3 cp ${{ env.ZIP_FILE }} s3://${{ env.AWS_S3_BUCKET_NAME }}/

Наконец, конвейер CI запускает команду копирования AWS S3, чтобы скопировать zip-файл в ранее определенную корзину AWS S3. Когда наше приложение/модель пройдет эти шаги, оно будет готово перейти ко второй части конвейера. Давайте запустим только часть конвейера CI, а затем загрузим zip-файл в корзину AWS S3.

Все работает нормально! Теперь мы готовы перейти ко второй части нашего пайплайна MLOps.

Знаете ли вы, сколько инженерных часов можно сэкономить, внедрив стратегию MLOps? Мы делаем. Узнай больше сегодня.

Часть CD (непрерывное развертывание)

В этой части мы будем использовать AWS Beanstalk в качестве платформы облачных приложений. Во-первых, давайте посмотрим на CD-часть файла YAML:

Конвейер CD будет работать на Ubuntu. Он не запустится до тех пор, пока часть конвейера CI не будет успешно выполнена. Это важно. Мы не хотим иметь две независимые работы в нашем портфеле. Они должны быть связаны.

cd_pipeline:
runs-on: ubuntu-latest
needs: [ci_pipeline]

🔵 Получить текущую дату

- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y-%m-%d--%M-%S')"

Мы будем использовать информацию о дате, чтобы различать версии приложения.

🔵 Доступ к AWS

- name: AWS Access
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id    : ${{secrets.AWS_ACC_KEY}}
aws-secret-access-key: ${{secrets.AWS_SEC_KEY}}
aws-region           : ${{secrets.AWS_REGION}}

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

🔵 Приложение

- name: App
run: |
aws elasticbeanstalk create-application-version \
--application-name ${{env.AWS_EB_APP_NAME}} \
--version-label "${{ steps.date.outputs.date }}" \
--source-bundle S3Bucket="${{ env.AWS_S3_BUCKET_NAME }}", \
S3Key="${{ env.ZIP_FILE }}" \
--auto-create-application

Мы будем использовать команды AWS CLI (справочная ссылка). Это немного сложно, поэтому давайте подробно рассмотрим каждую часть:

aws elasticbeanstalk create-application-version \
--application-name ${{env.AWS_EB_APP_NAME}}

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

--version-label "${{ steps.date.outputs.date }}"

Каждое обновление должно быть уникальным. С помощью переменной даты мы добьемся этого.

--source-bundle S3Bucket="${{ env.AWS_S3_BUCKET_NAME }}", \
S3Key="${{ env.ZIP_FILE }}"

Мы сообщаем AWS Beanstalk, где он может найти исходную zip-папку. Указываем на корзину AWS S3, в которую мы скопировали zip-папку.

🔵 Обновите среду

- name: Update the Environment
run : |
aws elasticbeanstalk update-environment \
--environment-name ${{env.AWS_EB_ENV_NAME}} \
--version-label "${{ steps.date.outputs.date }}"

Здесь мы снова воспользуемся командами AWS CLI (справочная ссылка). Мы обновим среду новой версией приложения. Я внес несколько изменений в файл index.html, чтобы увидеть конвейер CI-CD в действии.

Теперь мы готовы запустить конвейер MLOps CI-CD. Давайте проследим за действиями GitHub:

Все кажется в порядке. Давайте посмотрим на часть AWS Beanstalk. Во-первых, давайте посмотрим версии приложения:

У нас есть самая новая версия и среда, прикрепленная к ней. Давайте проверим окружение:

У нас есть зеленый свет, чтобы открыть приложение, поэтому давайте продолжим:

У нас есть новейшая версия приложения Flask на AWS Beanstalk.Просто напоминание о необходимости отключить среду, чтобы предотвратить непредвиденные расходы.

Заключение

В этой статье мы реализовали сквозной конвейер MLOps с использованием GitHub Actions и AWS Beanstalk. На веб-сайте AWS есть подробная информация о реализации Beanstalk. Любознательным читателям предлагаю посмотреть документацию AWS Beanstalk и попробовать их реализовать.

Эта статья является частью серии MLOps Best Practices. Остальные статьи цикла вы можете найти здесь, а полный код можно скачать здесь. Я надеюсь, что вы найдете это полезным!

Кстати, когда вам понравится тема, вы можете показать ее, поддержав 👏Не стесняйтесь оставлять комментарии и спасибо за ваше время!

Всего наилучшего 🤘

Если вам нравится читать мой контент, подпишитесь на меня. Также вы можете поддержать других писателей и меня, подписавшись на Medium. Использование моей реферальной ссылки не будет стоить вам дополнительных денег.

Примечание редактора. Heartbeat — это интернет-издание и сообщество, созданное участниками и посвященное предоставлению лучших образовательных ресурсов для специалистов по науке о данных, машинному обучению и глубокому обучению. Мы стремимся поддерживать и вдохновлять разработчиков и инженеров из всех слоев общества.

Независимая от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и командам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим нашим авторам и не продаем рекламу.

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение нашего еженедельного информационного бюллетеня (Еженедельник глубокого обучения), заглянуть в блог Comet, присоединиться к нам в Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов и событий. и многое другое, что поможет вам быстрее создавать более качественные модели машинного обучения.