Настройка Kubeflow с мультиарендностью, Google Auth, спотовыми инстансами и масштабированием группы узлов до нуля

Перед тем как начать, давайте познакомимся друг с другом. Я специалист по анализу данных, ставший инженером по MLOps, в настоящее время работаю в Fynd в области AML. Я люблю писать код, быть с животными, путешествовать и готовить. Чтобы связаться / узнать больше обо мне, загляните на мой сайт.

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

У него была красивая документация. Я подумал, что, поскольку все этапы налицо, это будет проще простого.

У меня возникли проблемы при настройке Kubeflow, хотя у них есть отличная документация. Чтобы никому больше не приходилось собирать информацию из нескольких источников, я подумал о том, чтобы составить одноразовое руководство по развертыванию, чтобы упростить задачу для всех.

Что такое Kubeflow?

Вероятно, лучший обзор того, что такое Kubeflow и что он может для вас сделать, можно найти в видео по ссылке ниже. Но короче говоря; это набор инструментов для машинного обучения, который помогает построить весь конвейер от начала до конца, от обработки данных, обучения до развертывания в производственной среде с высокой степенью масштабируемости. "Подробнее"

Зачем вам запускать Kubeflow на спотовых инстансах?

Во-первых, давайте поговорим о том, что такое спотовые экземпляры

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

AWS предоставляет неиспользуемые спотовые инстансы со скидкой 60–80% от цены OnDemand.

Учитывая, что скидка в размере 80% немедленно отражается на счетах AWS, это то, что любой человек или бизнес был бы признателен во времена, когда экономика ударила по Covid-19.

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

Итак, в чем подвох? Как это слишком хорошо, чтобы быть правдой? Почему мы не можем использовать спотовые экземпляры для всех рабочих нагрузок?

Что ж, поскольку AWS предоставляет нам эти инстансы по таким доступным ценам, они также имеют право потребовать обратно эти инстансы в короткие сроки.

Насколько короткое уведомление?

2 минуты. Да, это все, что нам нужно, чтобы забрать все наши вещи и отправиться в путь.

Но не бойтесь, Kubernetes придет на помощь!

Представьте, что вы - арендатор, а домовладелец выгнал вас с двухминутным уведомлением. # nightmares

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



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

Планирование Kubernetes помогает нам запускать спотовые экземпляры с минимальными усилиями. Конечно, возможны простои, но наибольшее время простоя, которое вы когда-либо видели, составляет до 15 минут после прерывания спотового экземпляра.

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



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

Снижение, которое мы заметили в Fynd, составило 78,58% по ЕЖЕДНЕВНЫМ ЗАТРАТАМ НА ОБУЧЕНИЕ.

Хватит объяснений, давайте начнем с практических рекомендаций.

В этом руководстве подробно рассказывается о том, как настроить Kubeflow со следующими характеристиками:

  • Облачная среда AWS
  • Кластер EKS Kubernetes
  • Мульти аренды
  • Google OAuth
  • Спотовые экземпляры графического процессора
  • Масштабирование узлов графического процессора до нуля, когда нет ноутбуков / рабочих нагрузок

Сокращение до нуля было для нас наиболее важным фактором. Стоимость узла GPU огромна, когда узел не используется, но остается работающим. Кроме того, еще одним важным условием было запускать всю установку на спотовых инстансах, чтобы значительно снизить затраты на инстансы ноутбуков (что пригодилось, особенно во время пандемии COVID-19).

Начиная

Предпосылки

Единственное, что вам понадобится, это учетная запись AWS со всеми необходимыми разрешениями. Опыт работы с Kubernetes или AWS не требуется, но, безусловно, было бы неплохо.

Начнем с создания ключей AWS для построения нашего кластера Kubernetes. Kubeflow будет работать в этом кластере, чтобы использовать всю мощь Kubernetes.

Шаг 1. Создайте ключи программного доступа AWS

  1. Войдите в консоль AWS, используя свою учетную запись root. Воспользуйтесь следующей ссылкой:
    https://aws.amazon.com/console/
  2. Перейдите в консоль IAM
    https://console.aws.amazon.com/iam/home?region=us-east-1#/home
  3. Нажмите Пользователи ›Добавить пользователя.
  4. Введите имя пользователя и проверьте программный доступ
    Нажмите [Далее: разрешения]
  5. Нажмите «Прикрепить существующие политики напрямую».
  6. Включите доступ администратора и нажмите [Далее: Теги].
  7. Нажмите [Далее: Обзор].
  8. Проверьте и убедитесь, что у вас есть доступ администратора
  9. Нажмите [Создать пользователя].
  10. Загрузите CSV и храните в надежном месте. Убедитесь, что это никому не попадет в руки, так как у него есть полный доступ администратора.
    НИКОМУ НИКОМУ НЕ ДЕЛИТЕСЬ.

Шаг 2. Установка AWS CLI

Перейдите по ссылке ниже и установите AWS CLI в своей операционной системе.



Когда закончите, убедитесь, что команда AWS работает должным образом.

aws --version

Шаг 3. Задайте ключи в профиле AWS

Мы будем использовать именованный профиль для всего этого руководства, поэтому он не повлияет на существующие среды.

aws configure --profile kf-admin

Мы используем us-east-1 в качестве региона по умолчанию, поскольку это один из самых дешевых регионов с доступом к большинству функций. Также во время создания кластера нам нужен был доступ к самому большому экземпляру графического процессора AWS, p3dn.24xlarge, который был доступен только в us-east-1 на момент написания этой статьи.

Некоторые факторы, которые следует учитывать при выборе региона:

  • Расходы
  • Доступность функции / экземпляра
  • Задержка

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





Имея необходимые предварительные условия, мы готовы настроить Kubeflow.
Но для запуска Kubeflow нам нужен кластер Kubernetes.

Построение кластера Kubernetes

Шаг 1. Установка необходимых компонентов

Вам потребуется установить интерфейс командной строки eksctl и kubectl для создания кластера EKS и управления им.

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



Шаг 2. Проверьте предварительные условия для EKS

Как только все это будет установлено на вашем компьютере, готово!

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

export AWS_PROFILE=kf-admin
aws s3 ls

Вывод может немного отличаться, но он должен быть достаточно хорошим, чтобы знать, работают ваши ключи или нет.

Шаг 3: клонировать репозиторий конфигурации

Создайте форк репозитория на Github и клонируйте его

git clone https://github.com/arjun921/aws-spot-instances-kubeflow.git

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

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

В производстве это крайне не рекомендуется.

Если кто-то получит ваш файл .kubeconfig, он получит полные права на управление и удаление всех ресурсов внутри кластера.

Шаг 4: EKS СОЗДАТЬ КЛАСТЕР

export ENVIRONMENT=staging
source envs/$ENVIRONMENT/variables.sh
eksctl create cluster -f envs/$ENVIRONMENT/cluster-spec.yml

Теперь, если все пойдет хорошо, по прошествии длительного времени (около 15–20 минут)
у вас должен быть запущен кластер EKS.

EKS упрощает раскрутку кластера. YAML создает кластер со всеми необходимыми предпосылками для запуска Kubeflow с максимальной экономичностью. Однако, если вы столкнетесь с такими ошибками:

Чтобы исправить ошибку, просто удалите кластер, подождите около 30 минут, пока все ресурсы очистятся, обновите cluster.yml, чтобы исправить ошибку, и создайте заново. Чаще всего это может быть ошибка из-за того, что тип инстанса недоступен в данной зоне доступности. Просто переключите AZ на тот, который предлагается в YAML, и все будет в порядке.

Чтобы удалить кластер, выполните следующую команду

eksctl delete cluster -f envs/$ENVIRONMENT/cluster-spec.yml

Шаг 5: Настройка автомасштабирования узла

Узлы Kubernetes масштабируются автоматическим масштабированием кластера. Чтобы понять, как работает автомасштабирование, посмотрите другую запись в моем блоге.

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

# install cluster autoscaler
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
# Edit deployment 
kubectl -n kube-system edit deployment.apps/cluster-autoscaler
# Update autoscaler deployment flags
 - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/kubeflow-us-east-1
 - --balance-similar-node-groups 
 - --skip-nodes-with-system-pods=false

Шаг 6. Установите обработчик прерывания спотового экземпляра

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

Установите helm с помощью следующей команды

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

И установите обработчик завершения спотового экземпляра с помощью этих команд:

helm repo add eks https://aws.github.io/eks-charts 
helm repo update 
helm install aws-node-termination-handler eks/aws-node-termination-handler \ 
 --namespace kube-system \ 
 --set enableSpotInterruptionDraining="true" \ 
 --set enableScheduledEventDraining="true" \ 
 --set nodeSelector.lifecycle=Ec2Spot

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

helm repo add eks https://aws.github.io/eks-charts 
helm repo update 
helm install aws-node-termination-handler eks/aws-node-termination-handler \ 
 --namespace kube-system \ 
 --set enableSpotInterruptionDraining="true" \ 
 --set enableScheduledEventDraining="true" \ 
 --set nodeSelector.lifecycle=Ec2Spot \ 
 --set webhookURL=https://hooks.slack.com/services/WEBHOOK/INTEGRATION/URL

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

Шаг 7. Установите плагин Nvidia.

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

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta6/nvidia-device-plugin.yml

Резюме

Вот что мы достигли на данный момент.
Мы развернули кластер с включенным автомасштабированием со следующими характеристиками.

  • 10 x m5a.2xlarge
    нг: нг-1
  • 10 x m5a.2xlarge
    нг: нг-2
  • 10 x p2.xlarge
    ng: 1-gpu-spot-p2-xlarge
  • 10 x p3.2xlarge
    ng: 1-gpu-spot-p3–2xlarge
  • 4x p3,8xlarge
    ng: 4-gpu-spot-p3–8xlarge

Но все эти экземпляры не будут работать, если у вас недостаточно рабочей нагрузки. Я также включил goliath p3dn.24xlarge в YAML, который вы можете включить, если хотите, раскомментировав спецификацию внизу.

- name: 8-gpu-spot-p3dn-24xlarge
  minSize: 0
  maxSize: 1
  instancesDistribution:
    # set your own max price. AWS spot instance prices no longer cross OnDemand price.
    # Comment out the field to default to OnDemand as max price.
    maxPrice: 11
    instanceTypes: ["p3dn.24xlarge"]
    onDemandBaseCapacity: 0
    onDemandPercentageAboveBaseCapacity: 0
    spotAllocationStrategy: capacity-optimized
  labels:
    lifecycle: Ec2Spot
    aws.amazon.com/spot: "true"
    gpu-count: "8"
  availabilityZones: ["us-east-1f"]
  taints:
    spotInstance: "true:PreferNoSchedule"
  tags:
    k8s.io/cluster-autoscaler/node-template/label/lifecycle: Ec2Spot
    k8s.io/cluster-autoscaler/node-template/label/aws.amazon.com/spot: "true"
    k8s.io/cluster-autoscaler/node-template/label/gpu-count: "8"
    k8s.io/cluster-autoscaler/node-template/taint/spotInstance: "true:PreferNoSchedule"
    k8s.io/cluster-autoscaler/enabled: "true"
    k8s.io/cluster-autoscaler/kubeflow-us-east-1: "owned"
  iam:
    withAddonPolicies:
      autoScaler: true
      cloudWatch: true
      albIngress: true

Развертывание Kubeflow

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

На момент написания статьи 1.0.2 отсутствовала; но по какой-то причине я просто не мог заставить работать аутентификационную версию. Итак, мы будем развертывать Kubeflow 1.0.1 с нашими скриптами.

Вот предварительные условия:

Шаг 1. Установите kfctl

Скачайте релиз для своей ОС по ссылке



и выполните следующие команды.

tar -xvf kfctl_v1.0.2_<platform>.tar.gz
mv ./kfctl /usr/local/bin
# check if it works 
kfctl version

Шаг 2. Установите AWS IAM Authenticator

Установите AWS IAM Authenticator по ссылке ниже и проверьте, работает ли он должным образом.



Шаг 3. Создайте приложение Auth0

Создайте учетную запись / войдите в Auth0 и сохраните идентификатор клиента и секрет клиента. Мы будем использовать их на следующих этапах. Также обратите внимание на конечную точку приложения Auth0.

Шаг 4. Выпуск подстановочного сертификата

Следуйте этому руководству, чтобы получить сертификат ACM.



Чтобы развернуть инструментарий:

Шаг 1. Запустите сценарий

Запустить скрипт deploy_kubeflow.sh

Когда редактор откроется, замените ключ плагинов следующим.

Подсказка: обязательно обновите ClientID, Client Secret, auth0 URL и Сертификат. ARN с теми, которые вы создали ранее.

Закройте редактор и позвольте настройке начаться.



Шаг 2. Установите субдомен

Получив строку ELB, перейдите на AWS Route 53 и добавьте запись субдомена, указывающую на elb. Вот пример того, как будет выглядеть ваша запись.

Шаг 3. Настройте обратный вызов Auth0

Перейдите в приложение Auth0 и обновите разрешенные URL-адреса обратного вызова вашего приложения, чтобы

Обязательно прокрутите вниз и нажмите «Сохранить»! Как только это будет сделано, вы сможете получить доступ к Kubeflow в указанном собственном домене.

И мы в порядке! Просто запустите Jupyter Notebook с изображением графического процессора, запросите 1-2 графических процессора, и у вас будет ноутбук, работающий примерно через 10 минут. Время, необходимое для подключения узла, может время от времени меняться, но не должно превышать 15 минут.

Если ноутбук с 4 GPU вращается и используются только 2 GPU, 2 из них все еще не используются. Когда запускается новый сервер записных книжек, Kubeflow (или, скорее, Kubernetes) проверяет, есть ли узлы с незафиксированными ресурсами, и назначает записные книжки на тот же экземпляр.

Подведение итогов

Самой сложной частью всего процесса развертывания была правильная настройка конфигурации кластера. Если вы заметили, около 3/4 блога просто строит кластер, а 1/4 - развертывание Kubeflow.

При этом, наконец, готово и вычищено пылью.

Если у вас возникнут какие-либо проблемы с настройкой Kubeflow на AWS с предоставленной спецификацией, у вас есть вопросы или комментарии, не стесняйтесь оставлять свой отзыв в разделе комментариев или обращаться ко мне напрямую по адресу https://arjunsunil.com/

И не забудьте 👏 если вам понравилась эта статья 🙂.

Также не забудьте заглянуть на страницу проекта на Github.



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