Всем привет! Добро пожаловать в мой пост на Medium. Во время пандемии мы все должны как можно дольше оставаться дома, сохранять дистанцию ​​в обществе и бла-бла бороться с вирусом. Мы проводим большую часть времени на экранах. Мы смотрим Netflix, заводим хобби, изучаем что-то новое и т. Д. Иногда бывает трудно найти что-то, чем можно заняться, когда мы дома. В один из таких случаев я спросил себя, почему я не пишу статью о том, что я узнал о запуске своих алгоритмов машинного обучения в Amazon SageMaker 😊. Как видите, я закончил писать и подготовил для чтения.

Цель этого поста - дать вам понимание того, как можно использовать SageMaker для создания, обучения и развертывания моделей машинного обучения. К концу этой статьи вы сможете интегрировать популярные сервисы Amazon, такие как API Gateway, Lambda, ECR, S3 и EC2, с SageMaker, чтобы создать рабочий процесс машинного обучения.

Вы можете получить доступ ко всему, что вам нужно в этой статье, в репозитории: https://github.com/osemrt/AWS-SageMaker

Основные темы, которые будут затронуты в посте:

  • Что такое Amazon SageMaker и как он работает
  • Как создать конвейер машинного обучения
  • Как подготовить модель в SageMaker
  • Как использовать докер-контейнеры для обучения и развертывания

SageMaker

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

Это дает вам полный доступ, контроль и прозрачность каждого шага. Вы можете быстро выгружать данные, создавать новые записные книжки, обучать и настраивать модели, перемещаться между шагами для корректировки экспериментов, сравнения результатов и развертывания моделей в производстве - все в одном месте. То, что вы сейчас слышите о SageMaker, - это лишь верхушка айсберга. Он также предлагает такие функции, как SageMaker Marketplace, где вы покупаете и продаете алгоритмы Amazon SageMaker, Автоматическое машинное обучение (AutoML), которое предоставляет решение проблем машинного обучения в виде черного ящика, выбирая правильный способ обработки функций, выбора алгоритма и настройки гиперпараметров в конвейере и многое другое.

Для получения дополнительной информации о SageMaker перейдите по следующей ссылке:



Модель и набор данных

Поскольку эта статья не о машинном обучении, мы будем использовать базовую модель учащегося и набор данных. Я не буду говорить о лучшей модели для нашего набора данных, вместо этого мы будем придерживаться построения, обучения и развертывания в SageMaker. Однако всем рекомендуется выполнить одни и те же шаги для своей собственной модели и набора данных. В этой статье используется логистическая регрессия на наборе данных цветов ириса для классификации. Этот набор данных является одним из самых известных и общедоступных многомерных наборов данных. Набор данных состоит из 50 образцов каждого из трех видов цветов ириса - Iris Setosa, Iris Virginica и Iris Versicolor. Для каждого образца доступны четыре характеристики: длина и ширина чашелистиков и лепестков в сантиметрах. Используя эти четыре функции, мы сможем получить прогнозы нашей модели о видах в конце поста.

Создать сценарий обучения

Нам нужен сценарий обучения Python, в котором мы определяем модель и ее поведение. Этот файл должен содержать все, что вам нужно для обучения вашей собственной модели. Обучающие данные для вашей модели загружаются SageMaker в контейнер по пути S3, который вы указываете при запуске учебного задания. Вы также можете указать любые параметры, которые вам понадобятся для обучения модели. Параметры передаются в сценарий в формате JSON и задаются как параметр кода, запускающего задание обучения. Этот сценарий запускается всякий раз, когда мы отправляем новое задание на обучение в SageMaker. В нашем проекте этот файл python включает следующие коды:

Структура папки контейнера

Когда вы запускаете задание по обучению модели, SageMaker создает определенную структуру папок в каталоге / opt / ml внутри вашего обучающего контейнера:

/opt/ml
├── input
│   ├── config
│   │   ├── hyperparameters.json
│   │   └── resourceConfig.json
│   └── data
│       └── <channel_name>
│           └── <input data>
├── model
│   └── <model files>
└── output
    └── failure

SageMaker сначала загружает данные обучения из указанного вами местоположения Amazon S3 в контейнер. Затем сценарии обучения создают артефакт модели в / opt / ml / model. Все, что у вас есть в этой папке, затем упаковывается в сжатый tar-архив и отправляется Amazon SageMaker в расположение Amazon S3 после завершения обучения. Вот некоторые из важных путей:

  • / opt / ml / data / ‹channel_name› / ‹входные данные› где хранятся ваши данные
  • / opt / ml / model, где артефакты модели находятся внутри

Для получения дополнительной информации посетите:



Как я уже сказал, SageMaker создает структуру папок выше внутри обучающего контейнера, для контейнера вывода у нас есть следующая структура папок:

/opt/program 
├── nginx.conf 
├── wsgi.py 
├── train 
├── serve 
└── predictor.py

В контейнере находятся следующие файлы:

  • nginx.conf, где хранится файл конфигурации для интерфейса nginx.
  • wsgi.py, где у нас есть оболочка для использования приложения Flask.
  • train, где мы храним логику для запуска контейнера для обучения
  • сервер, на котором мы запускаем программу для хостинга
  • predictor.py, где хранятся конечные точки для модели.

Вы можете вносить изменения в эти папки для вашей конкретной конфигурации системы. Однако в этой публикации я хотел бы показать вам только файл predictor.py. Этот файл включает две конечные точки: / ping и / invocations.

/ ping получает запросы GET и возвращает 200, если контейнер запущен и принимает запросы. SageMaker использует эту конечную точку для отладки.

/ invocations - это то место, где мы получаем заключения клиента, чтобы делать прогнозы на основе модели обучения. Когда эта конечная точка получает данные, она преобразует их в правильный формат и получает прогнозы от модели с использованием артефактов модели, которые были загружены в S3 в конце обучения и загружены в / opt / ml / model от SageMaker.

Если вы используете сложную модель и вам нужно изменить формат ввода модели, не стесняйтесь изменить его на тот, который соответствует вашим потребностям. Коды в predictor.py:

Рабочий процесс

С Sagemaker у вас есть возможность либо использовать один из встроенных алгоритмов машинного обучения с торговой площадки SageMaker, упомянутой ранее, либо создать свои собственные алгоритмы машинного обучения. В этой статье мы создадим собственный алгоритм машинного обучения, а затем обучим и развернем его на Amazon. Сначала я дам общий обзор системы, которую мы создадим сегодня, и покажу вам, как вы можете построить ее самостоятельно, шаг за шагом.

Как видите, пользователи взаимодействуют с системой двумя способами. Чтобы иметь возможность получать прогнозы от своих моделей, они сначала должны загрузить данные в корзину S3 и начать работу по обучению в SageMaker из любого места, где они захотят. Это может быть блокнот Jupyter, в котором вы начинаете работу с помощью boto3 (Python SageMaker SDK) или проект Java Spring, как в нашем случае. Следующие процедуры, вкратце, заключаются в создании конечной точки модели (шаг 6) и передаче URL-адреса конечной точки в Lambda. Когда вы вызываете конечную точку в AWS Lambda, пользователи готовы передать свои данные для получения вывода с помощью API Gateway.

Прежде чем двигаться дальше, клонируйте репозиторий проекта, используя следующую команду.

git clone https://github.com/osemrt/AWS-SageMaker

Теперь мы готовы пошагово реализовать описанный выше рабочий процесс. Цифры перед заголовками указывают на то, где мы находимся в рабочем процессе. Я очень рад его начать, а как насчет вас? 🙂. Без лишних слов, давайте перейдем к деталям реализации.

1. Загрузите данные обучения в Amazon S3 Bucket.

Первым шагом в рабочем процессе является загрузка обучающих данных в корзину S3. Если вы не знаете, как создать сегмент, перейдите по следующей ссылке:



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

2. Отправьте образы докеров в реестр Amazon Elastic Container Registry (Amazon ECR).

SageMaker использует контейнеры Docker для выполнения задач. Контейнеры используются для обучения и развертывания алгоритмов машинного обучения. Используя контейнеры, мы можем быстро развернуть в любом масштабе. На этом этапе я покажу, как вы можете отправить свои образы докеров для вывода и обучения в ECR (эластичный реестр контейнеров). Во-первых, у нас должны быть пары ключ доступа и секретный ключ для использования интерфейса командной строки AWS. Чтобы создать ключи доступа, перейдите по следующей ссылке:



Если у вас есть собственные ключи доступа и секретные ключи, введите команду aws configure в терминале и введите свои ключи, регион по умолчанию и т. Д. В моем случае у меня есть результат ниже.

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



Готово! вы должны увидеть свои репозитории, как показано ниже.

Прежде чем отправлять наши изображения, мы должны сказать, куда Docker загружает ваши изображения, когда вы выполняете команду docker push. Сначала введите команду aws ecr get-login - no-include-email, чтобы получить временный код аутентификации. Ваш результат будет таким:

Скопируйте результат команды и вставьте его в тот же терминал. Вы увидите сообщение об успешном входе в систему. После входа в систему вы готовы поместить свои образы Docker в ECR.

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

Начнем с обучающего образа. Внутри учебной папки выполните следующую команду с репозиторием и именем тега. При создании изображений вы можете давать любое имя тега. В моем случае я предпочел присвоить им тег latest.

docker build — tag <repository_name>:<tag_name> .

Выполните ту же команду в папке вывода.

Вы можете увидеть созданные образы, выполнив команду docker image ls.

Теперь пора вставить изображения вывода и обучение в ECR. Выполните следующую команду для образов для обучения и вывода:

docker push <repository_name>:<tag_name>

Наберитесь терпения, загрузка изображений в ECR может занять время. Когда он будет завершен, вы увидите изображения в репозиториях.

3. Обучите модель.

Есть много способов начать обучение в SageMaker. Вы можете запустить его из скрипта Python, Jupyter Notebook, триггера Lambda и т. Д., Однако в этом посте мы сделаем это из проекта Java Sprint.

Перейдите в служебную папку в репозитории Github, чтобы получить доступ к кодам проекта. Обязательно замените следующие конфигурации в файле application.yml на свои собственные и установите зависимости в pom.xml . Как следует из названий, ключи без комментариев ясно показывают, что вы будете вводить, но я закомментировал другие.

amazon:
  accessKey:
  secretKey: 
  region: 
  sagemaker:
    training:
      s3Uri: s3://amazon-sagemaker-s3bucket/dataset/
trainingJobName: myTrainingJob
roleArn: # your SageMaker execution role arn
s3OutputPath: s3://amazon-sagemaker-s3bucket/model/
channelName: training
      trainingImage: <account_id>.dkr.ecr.us-east-2.amazonaws.com/training:latest

Как только проект будет запущен, отправьте запрос на публикацию, чтобы начать обучение.

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

По завершении SageMaker автоматически загружает файлы в папку / opt / ml / model после их архивирования.

4. Создать модель

Перейдите к «Модели» в разделе «Вывод» на левой панели и нажмите кнопку «Создать модель». Укажите имя модели, укажите роль IAM и выберите параметр «Предоставить артефакты модели и расположение образа вывода».

На этом этапе мы указываем URI изображения контейнера вывода и путь S3 артефактов модели. Когда мы даем им возможность создать модель SageMaker, файлы внутри пути загружаются в папку / opt / model в контейнере вывода. Сценарий server будет запущен для обслуживания конечных точек внутри predicator.py.

Вы увидите модель с ее именем после того, как она будет создана.

5. Создайте конфигурацию конечной точки.

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

6. Создайте конечную точку

Перед обслуживанием конечных точек модели последний шаг включает создание конечной точки SageMaker. Конечные точки, полученные на этом этапе, будут вызываться AWS Lambda. Укажите имя конечной точки, выберите параметр «Использовать существующую конфигурацию конечной точки», а затем выберите только что созданную модель.

Имя конечной точки будет использоваться в Lambda для отправки запросов, поэтому сейчас скопируйте имя.

7. Используйте лямбда-функцию, чтобы делать прогнозы

Мы подготовили конечную точку SageMaker, пора создать лямбда-функцию для ее вызова. Чтобы создать лямбда-функцию, сначала дайте имя функции, выберите среду выполнения «Python 3.6» и нажмите кнопку «Создать функцию».

Дайте имя конечной точки, которое вы определили на предыдущем шаге, вашей лямбда-функции в качестве переменной среды.

Затем вставьте следующий скрипт python в вашу лямбда-функцию и нажмите кнопку «Развернуть».

Проверьте, работает ли функция Lambda, запустив тестовый пример, как показано ниже.

Если вы все сделали правильно, вы увидите результат своего прогноза, соответствующий имеющимся у вас данным. Для моего массива функций [2, 42, 1, 3] модель говорит, что его вид - setosa.

8. Вызов функции Lambda из шлюза API.

Это последний шаг в рабочем процессе. На этом этапе мы создадим API и сделаем его общедоступным. Для этого перейдите в сервис Amazon API Gateway, создайте API, выберите следующие параметры и дайте имя API.

Нажмите кнопку «Действия» и выберите «Создать ресурс», дайте имя ресурсу и нажмите «Создать ресурс».

Под только что созданным ресурсом создайте метод POST, щелкнув тот же раскрывающийся список. И выберите лямбда-функцию, регион и введите имя своей лямбда-функции.

Во всплывающем окне нажмите кнопку ОК, чтобы узнать, что шлюз API получит разрешение на вызов функции лямбда. И протестируйте свой API-шлюз. Укажите массив функций в правильном формате JSON, чтобы получить прогноз.

Если у вас все в порядке, давайте развернем API. Нажмите «Развернуть API» под окном, которое открывается, когда вы нажимаете «Действия». Дайте сценическое имя и все. Теперь вы развернули API.

Перейдите в раздел «Этапы» в левой таблице, щелкните имя своего API и скопируйте URL-адрес вызова, чтобы использовать свой API.

Протестируйте свой API

Теперь мы успешно обучили и развернули нашу собственную пользовательскую модель в SageMaker. Теперь вы готовы протестировать API шлюза в любом месте, используя URL-адрес вызова. Когда я отправляю запрос POST на URL-адрес вызова с данными, я могу получить прогноз. Если вы это сделаете, поздравляем !! вы выполнили все шаги и создали конвейер машинного обучения в SageMaker :).

использованная литература