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

Если вы являетесь частью команды, которая часто обучает и развертывает модели машинного обучения, у вас, вероятно, есть настройка кластера, которая поможет организовать и управлять рабочими нагрузками машинного обучения. Скорее всего, вы используете Kubernetes (и KubeFlow) или Amazon SageMaker.

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

Разве не было бы хорошо, если бы у вас было лучшее из обоих миров?

  • Используйте Kubernetes для управления своими рабочими процессами и получите максимальную мощность с Amazon SageMaker для крупномасштабного распределенного обучения?
  • Разрабатывать алгоритмы и модели с помощью блокнотов Kubeflow Jupyter и проводить масштабные эксперименты с гиперпараметрами с помощью Amazon SageMaker?
  • Обучать модели с помощью Kubeflow и размещать конечную точку вывода Amazon SageMaker, которая может эластично масштабироваться для миллионов пользователей?

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

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

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

Https://github.com/shashankprasanna/kubernetes-sagemaker-demos.git

Чтобы подробно узнать, как реализовать распределенное обучение, настройку моделей и примеры размещения моделей с помощью операторов Amazon SageMaker для Kubernetes, ознакомьтесь с этим сопроводительным постом:

Операторы Amazon SageMaker для Kubernetes - примеры распределенного обучения, настройки гиперпараметров и хостинга моделей

Матч, заключенный в облаке

Проекты Kubernetes и Kubeflow пользуются сильным сообществом пользователей и являются одними из самых быстрорастущих проектов с открытым исходным кодом в области машинного обучения. Если у вас есть собственный опыт настройки, управления и устранения неполадок кластеров Kubernetes, вы можете получить все, что вам нужно как специалист по данным или исследователю машинного обучения - записные книжки Jupyter и поддержку распределенного обучения с помощью KubeFlow, настройку гиперпараметров с помощью KubeFlow и Katib. , и простое развертывание логического вывода с помощью KFServing. Как пользователь Kubernetes, у вас есть полная гибкость в том, где вы его запускаете (локально или в облаке) и на каких системах вы его запускаете. Это также означает, что вы несете ответственность за поддержание высокого уровня использования кластера для снижения эксплуатационных расходов, что может быть непросто, учитывая характер скачкообразных или скачкообразных рабочих нагрузок машинного обучения.

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

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

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

Сценарии и варианты использования

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

Давайте рассмотрим это с помощью пары гипотетических сценариев.

Сценарий №1 - избыточные мощности для масштабного обучения

Допустим, вы сейчас используете кластер Kubernetes в своем локальном центре обработки данных или на AWS с помощью Amazon EKS. При настройке вы закладываете бюджет и выбираете количество процессоров, графических процессоров и хранилища в вашем центре обработки данных в зависимости от рабочих нагрузок на момент выделения ресурсов. Теперь ваша команда выросла или у вас больше данных, и вам нужно больше вычислительных мощностей. У вас есть короткий крайний срок для эксперимента по обучению машинному обучению, который можно завершить за 1 день, если у вас есть доступ к 128 графическим процессорам, но в вашем кластере Kubernetes все они заняты для других проектов. Вам просто нужна избыточная импульсная мощность на короткий период времени.

Ваши варианты

  1. Расширьте существующий кластер Kubernetes и добавьте необходимые ресурсы
  2. Разверните еще один кластер Kubernetes с необходимыми ресурсами
  3. Используйте Amazon SageMaker для выделения ресурсов по требованию

(1) и (2) - это дополнительная работа с инфраструктурой, на которую вы не подписывались. (3) - отличный вариант, но он требует, чтобы вы покинули знакомую среду Kubernetes и которая не интегрирована ни в какую автоматизацию CI / CD, которую вы настроили.

Есть 4-й вариант. Использование операторов Amazon SageMaker для Kubernetes для отправки заданий Amazon SageMaker через kubectl, точно так же, как вы отправляете другие задания Kubernetes. Незаметно для вас будет автоматически выделен управляемый кластер Amazon SageMaker с указанным количеством инстансов. Затем задание по обучению будет выполнено в этом управляемом кластере Amazon SageMaker, и после завершения обучения кластер автоматически отключается, и вам будет представлена ​​точная продолжительность обучения, за которую вам будет выставлен счет.

Сценарий № 2 - размещение масштабируемых конечных точек вывода

Рассмотрим другой сценарий. У вас есть настройка автоматизации CI / CD для обучения, проверки и развертывания в Kubernetes. А модель, которую вы разместили с помощью Kubernetes, потребляет ваши клиенты через конечную точку через мобильное приложение или веб-сайт. Модель размещается на экземпляре графического процессора, поскольку задержка и производительность критически важны для вашего обслуживания клиентов. Вы хотите освободить ресурсы графического процессора для обучения и нуждаетесь в возможности автоматического масштабирования и мониторинга модели в реальном времени. Эти возможности уже доступны в службах хостинга Amazon SageMaker, но вы хотите использовать их, не нарушая существующий рабочий процесс CI / CD. Используя операторы Amazon SageMaker для Kubernetes, вы можете развернуть обученную модель прямо из Kubernetes таким же декларативным образом с файлами конфигурации в YAML, которые легко интегрируются в существующую настройку и по-прежнему позволяют вам пользоваться преимуществами хостинга Amazon SageMaker.

Давайте теперь рассмотрим некоторые распространенные шаблоны использования Kubernetes и Amazon SageMaker вместе.

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

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

Если вы работаете с широко используемыми фреймворками, такими как TensorFlow, PyTorch, MXNet, XGboost и другими, все, что вам нужно сделать, это загрузить свой обучающий сценарий в Amazon S3 в виде файла tar.gz и отправить задание на обучение в Amazon SageMaker через Конфигурационный файл Kubernetes, написанный на YAML. Взгляните на репозиторий GitHub, чтобы найти примеры кода и файлы конфигурации. Вот изменения, которые вам необходимо внести, чтобы отправить свое учебное задание по Amazon SageMaker через Kubernetes kubectl.

Вот отрывок из k8s-sm-dist-training-script.yaml файла, который вы найдете в репозитории GitHub для этого сообщения в блоге.

apiVersion: sagemaker.aws.amazon.com/v1
kind: TrainingJob
metadata:
  name: k8s-sm-dist-training-script 
spec:
    hyperParameters:
        - name: learning-rate
          value: "0.001"
        - name: batch-size
          value: "256"
…
        - name: sagemaker_program
          value: 'cifar10-multi-gpu-horovod-sagemaker.py'
        - name: sagemaker_submit_directory
          value: 's3://sagemaker-jobs/training-scripts/sourcedir.tar.gz'
...
    algorithmSpecification:
        trainingImage: 763104351884.dkr.ecr.us-west-2.amazonaws.com/tensorflow-training:1.15.2-gpu-py27-cu100-ubuntu18.04
        trainingInputMode: File
...
    resourceConfig:
        instanceCount: 128
        instanceType: "ml.p3.2xlarge"
        volumeSizeInGB: 50
...

Это похоже на любую другую конфигурацию Kubernetes, написанную на YAML. Для учебных заданий вы заметите, что kind: TrainingJob вверху

Вот несколько ключевых разделов, в которых вы определяете аспекты своей учебной работы:

  • hyperParameters - Они указаны в спецификации YAML, поэтому вы можете автоматизировать выполнение различных экспериментов, изменяя и отправляя обучающие задания.
  • sagemaker_submit_directory - расположение S3, куда вы загрузили свои учебные сценарии. Это уникально по сравнению с отправкой обучения с использованием Kubernetes, поскольку вам не нужно создавать собственный контейнер! Amazon SageMaker автоматически загрузит ваш обучающий сценарий в существующий контейнер TensorFlow, а затем запустит обучение за вас. Никаких проблем с файлами Docker и пользовательскими контейнерами.
  • resourceConfig - сколько нужно экземпляров какого типа. Эта конфигурация будет запрашивать 128 графических процессоров V100 для запуска распределенного обучения.
  • trainingImage - Выбор из готовых контейнеров для TensorFlow, PyTorch, MXNet, для обучения или вывода, для Python2 или Python 3, а также для CPU или GPU.

Отправьте задание так же, как и любой другой файл конфигурации Kubernetes.

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

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

Если вы работаете с собственными проприетарными алгоритмами и создаете свои собственные контейнеры Docker, то вы предпочитаете указывать образ контейнера, а не учебный сценарий TensorFlow, PyTorch, MXNet и других фреймворков. В отличие от варианта использования №1, вам нужно будет выполнить дополнительные действия, чтобы сначала создать собственный контейнер докеров локально, отправить его в реестр Amazon Elastic Container Registry (ECR) и указать его URI в разделе trainingImage. Если у вас нет пользовательских алгоритмов, требующих создания пользовательских контейнеров, я рекомендую следующий подход в варианте использования №1.

apiVersion: sagemaker.aws.amazon.com/v1
kind: TrainingJob
metadata:
  name: k8s-sm-dist-custom-container 
spec:
    hyperParameters:
        - name: learning-rate
          value: "0.001"
        - name: weight-decay
          value: "0.0002"
...
    algorithmSpecification:
        trainingImage: <ACCOUNT_ID>.dkr.ecr.us-west-2.amazonaws.com/<IMAGE>:latest
        trainingInputMode: File
        metricDefinitions: 
         - name: val_acc
         - regex: 'val_acc: ([0-9\\.]+)'

Код в репозитории GitHub также включает записные книжки Jupyter, которые повторяют эти шаги.

Отправить вакансию:

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

Пример использования № 3 - Оптимизация гиперпараметров в масштабе

Гиперпараметры для модели машинного обучения - это параметры, которые не были оптимизированы или изучены на этапе обучения. Amazon SageMaker предлагает функцию оптимизации гиперпараметров и реализует как байесовский, так и случайный поиск. Это мало чем отличается от возможностей проекта Katib KubeFlow. Чтобы запустить крупномасштабное задание по настройке гиперпараметров в Amazon SageMaker, создайте файл конфигурации Kubernetes типа: HyperparameterTuningJob. Здесь вы указываете диапазоны гиперпараметров вместо фиксированных гиперпараметров. Это указывает Amazon SageMaker попробовать разные варианты, чтобы получить лучшую модель. maxNumberOfTrainingJobs указывает общее количество заданий, которые вы хотите запустить с различными комбинациями гиперпараметров, а maxParallelTrainingJobs указывает, на скольких экземплярах вы хотите запустить это в любой момент времени.

apiVersion: sagemaker.aws.amazon.com/v1
kind: HyperparameterTuningJob
metadata:
    name: k8s-sm-hyperopt-training-script 
spec:
    hyperParameterTuningJobConfig:
        resourceLimits:
            maxNumberOfTrainingJobs: 32
            maxParallelTrainingJobs: 8
        strategy: "Bayesian"
        trainingJobEarlyStoppingType: Auto
        hyperParameterTuningJobObjective:
            type: Maximize
            metricName: 'val_acc'
        parameterRanges:
            continuousParameterRanges:
            - name: learning-rate
              minValue: '0.0001'
              maxValue: '0.1'
              scalingType: Logarithmic
...
            categoricalParameterRanges:
            - name: optimizer
              values:
              - 'sgd'
              - 'adam'
...

Отправить вакансию:

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

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

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

apiVersion: sagemaker.aws.amazon.com/v1
kind: HostingDeployment
metadata:
  name: k8s-sm-inference-host-endpoint 
spec:
    region: us-west-2
    productionVariants:
        - variantName: AllTraffic
          modelName: tf-cifar10-resnet-model
          initialInstanceCount: 1
          instanceType: ml.c5.large
          initialVariantWeight: 1
    models:
        - name: tf-cifar10-resnet-model
          executionRoleArn: arn:aws:iam::<ACCOUNT_ID>:role/service-role/AmazonSageMaker-ExecutionRole-20190820T113591 
          containers:
              - containerHostname: tensorflow
                modelDataUrl: s3://sagemaker-jobs/trained-tf-model/model.tar.gz
                image: 763104351884.dkr.ecr.us-west-2.amazonaws.com/tensorflow-inference:1.15.2-cpu-py36-ubuntu18.04

Готовьтесь к реализации!

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

Пошаговые инструкции по реализации примеров, представленных в этом сообщении блога, можно найти в сопроводительном сообщении:

Операторы Amazon SageMaker для Kubernetes - примеры распределенного обучения, настройки гиперпараметров и хостинга моделей

Чтобы запустить примеры, перейдите на GitHub:
https://github.com/shashankprasanna/kubernetes-sagemaker-demos.git

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