Узнайте, как написать собственные файлы конфигурации YAML для использования операторов Amazon SageMaker для Kubernetes

На re: Invent 2019 AWS анонсировала Операторы Amazon SageMaker для Kubernetes, которые позволяют пользователям Kubernetes обучать модели машинного обучения, оптимизировать гиперпараметры, запускать задания пакетного преобразования и настраивать конечные точки вывода с помощью Amazon SageMaker - не выходя из кластера Kubernetes. Вы можете вызвать функциональность Amazon SageMaker, написав знакомые файлы конфигурации Kubernetes в YAML и применив их к своему кластеру Kubernetes с помощью kubectl инструмента CLI.

Это позволяет расширить емкость и возможности кластера Kubernetes для машинного обучения, переложив рабочие нагрузки обучения и логического вывода в Amazon SageMaker. Чтобы получить более подробную информацию об операторах Amazon SageMaker для Kubernetes, прочтите следующее сообщение в блоге:

Kubernetes и Amazon SageMaker для машинного обучения - лучшее из обоих миров

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

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

Весь код, файлы конфигурации и демонстрационные записные книжки Jupyter доступны на GitHub: https://github.com/shashankprasanna/kubernetes-sagemaker-demos.git

Операторы Amazon SageMaker для Kubernetes и способы их использования

Операторы Amazon SageMaker для Kubernetes реализованы как настраиваемый ресурс в Kubernetes и позволяют Kubernetes вызывать функциональные возможности Amazon SageMaker. Ниже я предоставлю пошаговые инструкции по реализации каждого из этих сценариев использования:

  • Пример использования 1. Распределенное обучение с помощью TensorFlow, PyTorch, MXNet и других фреймворков.
  • Пример использования 2: распределенное обучение с настраиваемым контейнером.
  • Вариант использования 3: масштабная оптимизация гиперпараметров с помощью TensorFlow
  • Вариант использования 4: размещение конечной точки вывода с моделью BYO

Чтобы продолжить, я предполагаю, что у вас есть учетная запись AWS и инструмент AWS CLI, установленные на вашем хост-компьютере.

Весь код, файлы конфигурации и демонстрационные записные книжки Jupyter доступны на GitHub: https://github.com/shashankprasanna/kubernetes-sagemaker-demos.git

Настраивать

Начнем с развертывания кластера Kubernetes. С инструментом CLI eksctl все, что требуется, - это простая команда и 15 минут вашего времени для очень простого кластера с парой узлов.

Следуйте инструкциям в документации AWS для установки инструмента eksctl CLI. После этого выполните следующую команду и идите выпить чашку кофе. Эта команда запускает кластер Amazon Elastic Kubernetes Service (EKS) с одним узлом, чего достаточно для примеров в этой публикации. Обратите внимание, что вы по-прежнему можете запускать крупномасштабное распределенное обучение и задания по настройке гиперпараметров на сотнях узлов Amazon SageMaker с помощью операторов Amazon SageMaker для Kubernetes.

Создайте кластер Kubernetes

eksctl create cluster \
    --name sm-operator-demo \
    --version 1.14 \
    --region us-west-2 \
    --nodegroup-name test-nodes \
    --node-type c5.xlarge \
    --nodes 1 \
    --node-volume-size 50 \
    --node-zones us-west-2a \
    --timeout=40m \
    --auto-kubeconfig

Установите операторы Amazon SageMaker для Kubernetes

После запуска кластера следуйте инструкциям в руководстве пользователя, чтобы установить операторы Amazon SageMaker для Kubernetes. Вы также можете обратиться к этому полезному сообщению в блоге, чтобы направить процесс установки: Знакомство с операторами Amazon SageMaker для Kubernetes

Чтобы проверить установку, запустите

kubectl get crd | grep sagemaker

Вы должны получить примерно такой результат:

batchtransformjobs.sagemaker.aws.amazon.com                 2020-02-29T21:21:24Z
endpointconfigs.sagemaker.aws.amazon.com                    2020-02-29T21:21:24Z
hostingdeployments.sagemaker.aws.amazon.com                 2020-02-29T21:21:24Z
hyperparametertuningjobs.sagemaker.aws.amazon.com         2020-02-29T21:21:24Z
models.sagemaker.aws.amazon.com                                2020-02-29T21:21:24Z
trainingjobs.sagemaker.aws.amazon.com                           2020-02-29T21:21:24Z

Это все задачи, которые вы можете выполнять в Amazon SageMaker с помощью операторов Amazon SageMaker для Kubernetes, и мы более подробно рассмотрим (1) учебные задания (2) задания по настройке гиперпараметров (3) развертывание хостинга.

Скачать примеры с GitHub

Загрузите учебные сценарии, файлы конфигурации и записные книжки Jupyter на свой хост-компьютер.

git clone https://github.com/shashankprasanna/kubernetes-sagemaker-demos.git

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

cd kubernetes-sagemaker-demos/0-upload-dataset-s3

Примечание. TensorFlow должен быть установлен на хост-компьютере, чтобы загрузить набор данных и преобразовать его в формат TFRecord.

Выполните upload_dataset_s3.ipynb, чтобы загрузить свой набор тренировочных данных на Amazon.

Пример использования 1. Распределенное обучение с помощью TensorFlow, PyTorch, MXNet и других фреймворков.

Если вы новичок в Amazon SageMaker, одна из его приятных особенностей при использовании популярных фреймворков, таких как TensorFlow, PyTorch, MXNet, XGBoost и других, заключается в том, что вам не нужно беспокоиться о создании пользовательских контейнеров с вашим кодом и его продвижении. в реестр контейнеров. Amazon SageMaker может автоматически загружать любые обучающие сценарии и зависимости в контейнер фреймворка и запускать его в нужном масштабе. Таким образом, вам просто нужно версировать свои учебные сценарии и управлять ими, и вам вообще не придется иметь дело с контейнерами. С операторами Amazon SageMaker для Kubernetes вы по-прежнему можете получить тот же опыт.

Перейдите в каталог с 1-м примером:

cd kubernetes-sagemaker-demos/1-tf-dist-training-training-script/
ls -1

Выход:

cifar10-multi-gpu-horovod-sagemaker.py
k8s-sm-dist-training-script.yaml
model_def.py
upload_source_to_s3.ipynb

Два файла python в этом каталоге cifar10-multi-gpu-horovod-sagemaker.py и model_def.py представляют собой обучающие скрипты TensorFlow, которые реализуют Horovod API для распределенного обучения.

Выполните upload_source_to_s3.ipynb, чтобы создать tar-файл со сценариями обучения и загрузить его в указанную корзину Amazon S3.

k8s-sm-dist-training-script.yaml конфигурационный файл, который применяется с использованием kubectl ударов распределенного обучающего задания. Откройте его в своем любимом текстовом редакторе, чтобы поближе познакомиться.

Сначала вы заметите, что kind: TrainingJob. Это предполагает, что вы отправите задание на обучение Amazon SageMaker.

В разделе гиперпараметры укажите гиперпараметры, которые cifar10-multi-gpu-horovod-sagemaker.py могут принимать в качестве входных данных.

Укажите дополнительные параметры для распределенного обучения:

  • sagemaker_program - cifar10-multi-gpu-horovod-sagemaker.py Обучающий скрипт TensorFlow, реализующий Horovod API для распределенного обучения
  • sagemaker_submit_directory - место на Amazon S3, где находятся обучающие скрипты
  • sagemaker_mpi_enabled и sagemaker_mpi_custom_mpi_options - включить обмен данными MPI для распределенного обучения.
  • sagemaker_mpi_num_of_processes_per_host - установлено количество графических процессоров в запрошенном экземпляре. Для экземпляра p3dn.24xlarge с 8 графическими процессорами установите это значение на 8.

Укажите контейнер фреймворка глубокого обучения, выбрав соответствующий контейнер отсюда:

Https://docs.aws.amazon.com/dlami/latest/devguide/deep-learning-containers-images.html

Amazon SageMaker автоматически загрузит обучающие сценарии, указанные в sagemaker_submit_directory, в контейнер, созданный из trainingImage.

Для отслеживания производительности вы также можете указать определение метрики.

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

Наконец, укажите расположение набора данных на Amazon S3. Это должно быть то же имя корзины, которое вы выбрали при запуске записной книжки Jupyter upload_source_to_s3.ipynb для загрузки набора обучающих данных.

Чтобы начать распределенное обучение, запустите:

kubectl apply -f k8s-sm-dist-training-script.yaml

Выход:

trainingjob.sagemaker.aws.amazon.com/k8s-sm-dist-training-script created

Чтобы получить информацию о работе по обучению:

kubectl get trainingjob

Выход:

NAME                          STATUS       SECONDARY-STATUS   CREATION-TIME          SAGEMAKER-JOB-NAME
k8s-sm-dist-training-script   InProgress   Starting           2020-03-03T08:25:40Z   k8s-sm-dist-training-script-91027b685d2811ea97a20e30c8d9dadc

Теперь перейдите к AWS Console > Amazon SageMaker > Training jobs

И вы увидите, что новое задание по обучению с тем же названием, что и результат kubectl get trainingjob

Чтобы просмотреть журналы обучения, щелкните задание по обучению в консоли и нажмите «Просмотр журналов» в разделе «Монитор». Это приведет вас к CloudWatch, где вы сможете просмотреть журналы тренировок.

В качестве альтернативы, если вы установили плагин smlogs, вы можете запустить следующее для просмотра журналов с помощью kubectl:

kubectl smlogs trainingjob k8s-sm-dist-training-script

Пример использования 2: распределенное обучение с настраиваемым контейнером

Если вы работаете с собственными проприетарными алгоритмами, вам придется создавать собственные контейнеры Docker. Чтобы отправить задание на обучение с помощью настраиваемого контейнера, вам сначала нужно создать образ контейнера локально и отправить его в Amazon Elastic Container Registry (ECR). После того, как вы отправите изображение в ECR, вы обновите файл конфигурации задания Kubernetes, указав свой путь ECR, а не путь к контейнеру TensorFlow, который мы указали в предыдущем примере.

Перейдите в каталог со вторым примером:

cd kubernetes-sagemaker-demos/2-tf-dist-training-custom-container/docker
ls -1

Выход:

build_docker_push_to_ecr.ipynb
cifar10-multi-gpu-horovod-sagemaker.py
Dockerfile
model_def.py

Выполните build_docker_push_to_ecr.ipynb, чтобы создать файл докера и отправить его в реестр ECR.

Перейдите к AWS Console > Amazon ECR. Здесь вы должны увидеть свой недавно отправленный контейнер Docker:

Перейдите к

cd kubernetes-sagemaker-demos/2-tf-dist-training-custom-container/

Откройте k8s-sm-dist-custom-container.yaml файл конфигурации в своем любимом текстовом редакторе, чтобы рассмотреть его поближе.

Единственное изменение, которое вам нужно сделать, - это раздел trainingImage, где вам нужно будет указать место в вашем реестре ECR, куда вы поместили свой настраиваемый контейнер.

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

kubectl apply -f k8s-sm-dist-custom-container.yaml

Выход:

trainingjob.sagemaker.aws.amazon.com/k8s-sm-dist-custom-container created

Пример использования 3: масштабная оптимизация гиперпараметров с помощью TensorFlow

Гиперпараметры для модели машинного обучения - это параметры, которые не оптимизируются и не изучаются на этапе обучения, но влияют на производительность модели. Чтобы отправить задание по настройке гиперпараметров Amazon SageMaker, вам необходимо создать файл конфигурации Kubernetes с kind: hyperparameterTuningJob вместо trainingJob, как в предыдущих двух примерах.

Другое отличие состоит в том, что здесь вместо фиксированных гиперпараметров вы указываете диапазоны гиперпараметров, чтобы Amazon SageMaker мог пробовать разные варианты для получения наилучшей модели.

Перейдите в каталог с 3-м примером:

cd kubernetes-sagemaker-demos/3-tf-hyperopt-training-script
ls -1

Выход

cifar10-training-script-sagemaker.py
inference.py
k8s-sm-hyperopt-training-script.yaml
requirements.txt
upload_source_to_s3.ipynb

Выполните upload_source_to_s3.ipynb, чтобы загрузить сценарии обучения в Amazon S3.

Откройте k8s-sm-hyperopt-training-script.yaml файл конфигурации в своем любимом текстовом редакторе, чтобы рассмотреть его поближе.

kind: HyperParameterTuningJob предполагает, что это работа по настройке модели Amazon SageMaker.

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

Гиперпараметры могут иметь вид integerParameterRanges, continuousParameterRanges или категориальныйParameterRanges. В приведенном выше примере оптимизатор и размер пакета являются категориальными, что означает, что Amazon SageMaker случайным образом выберет одно из указанных значений. Для скорости обучения и импульса Amazon SageMaker случайным образом выберет непрерывное значение в указанном диапазоне.

Чтобы запустить задание по настройке гиперпараметров, запустите:

kubectl apply -f k8s-sm-hyperopt-training-script.yaml

Выход:

hyperparametertuningjob.sagemaker.aws.amazon.com/k8s-sm-hyperopt-training-script created

Чтобы получить дополнительные сведения о задании настройки гиперпараметров, запустите:

kubectl get hyperparametertuningjob

Выход

NAME                              STATUS       CREATION-TIME          COMPLETED   INPROGRESS   ERRORS   STOPPED   BEST-TRAINING-JOB   SAGEMAKER-JOB-NAME
k8s-sm-hyperopt-training-script   InProgress   2020-03-03T09:13:58Z   0           2            0        0                             50d11d175d2f11ea89ac02f05b3bb36a

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

kubectl get trainingjob

Выход

NAME                                            STATUS       SECONDARY-STATUS   CREATION-TIME          SAGEMAKER-JOB-NAME
50d11d175d2f11ea89ac02f05b3bb36a-001-673da61b   InProgress   Starting           2020-03-03T09:14:11Z   50d11d175d2f11ea89ac02f05b3bb36a-001-673da61b
50d11d175d2f11ea89ac02f05b3bb36a-002-7952d388   InProgress   Downloading        2020-03-03T09:14:11Z   50d11d175d2f11ea89ac02f05b3bb36a-002-7952d388

Перейдите к AWS Console > Amazon SageMaker > Hyperparameter tuning jobs

Вы должны увидеть, что выполняется настройка гиперпараметров.

Пример использования 4: размещение конечной точки вывода с моделью BYO

Чтобы развернуть модель в сервисах хостинга Amazon SageMaker, вам просто нужно внести свою собственную модель в сжатый tar-файл. Если вы хотите разместить модель, которую вы обучили в Amazon SageMaker, выходные данные уже будут в требуемом формате.

Если вы выполнили приведенный выше пример, просто перейдите к корзине Amazon S3, где результаты работы по обучению были сохранены AmazonS3 > YOUR_BUCKET > JOB_NAME > output. Здесь вы должны найти файл с именем model.tar.gz, который включает обучающую модель.

Перейдите в каталог с 4-м примером:

cd kubernetes-sagemaker-demos/3-tf-hyperopt-training-script
ls -1

Выход

k8s-sm-inference-host-endpoint.yaml

Откройте k8s-sm-inference-host-endpoint.yaml файл конфигурации в своем любимом текстовом редакторе, чтобы рассмотреть его поближе.

Укажите тип экземпляра для размещения в поле instanceType и укажите вес для A / B-тестирования, если вы размещаете несколько моделей. В поле modelDataUrl укажите расположение обученной модели на Amazon S3.

Чтобы развернуть модель, запустите:

kubectl apply -f k8s-sm-inference-host-endpoint.yaml

Выход:

hostingdeployment.sagemaker.aws.amazon.com/k8s-sm-inference-host-endpoint created

Чтобы просмотреть подробную информацию о развертывании хостинга, запустите:

kubectl get hostingdeployments

Выход:

NAME STATUS SAGEMAKER-ENDPOINT-NAME
k8s-sm-inference-host-endpoint Creating k8s-sm-inference-host-endpoint-cdbb6db95d3111ea97a20e30c8d9dadc

Перейдите к AWS Console > Amazon SageMaker > Endpoints

Вы должны увидеть, как работает конечная точка Amazon SageMaker, и готовы принимать запросы.

Заключение

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

Я представил краткий обзор операторов Amazon SageMaker для Kubernetes и того, как вы можете использовать его для использования возможностей Amazon SageMaker, таких как распределенное обучение, оптимизация гиперпараметров и хостинг конечных точек вывода, которые могут эластично масштабироваться. После этого я показал вам пошаговый процесс отправки запросов на обучение и развертывание с помощью Kubernetes CLI kubect.

Я сделал все файлы конфигурации доступными на GitHub, так что не стесняйтесь использовать их, изменять и делать своими собственными. Спасибо за чтение, весь код и примеры доступны на GitHub здесь:
https://github.com/shashankprasanna/kubernetes-sagemaker-demos.git

Если у вас есть вопросы, напишите мне в Twitter (@shshnkp), LinkedIn или оставьте комментарий ниже. Наслаждаться!