Рабочий процесс машинного обучения — это повторяющийся процесс, и полный жизненный цикл машинного обучения включает в себя множество экспериментов. Если этот процесс не будет реализован систематически, могут быть потеряны месяцы работы, что значительно затруднит сотрудничество между специалистами по данным. Как описано в статье Скрытый технический долг в системах машинного обучения, код машинного обучения — это небольшая часть системы машинного обучения. Скрытый технический долг в системах ML может быть дорогостоящим и трудоемким, и может привести к задержкам, ошибкам и другим проблемам при разработке и развертывании систем ML. Важно знать эти проблемы и планировать их при создании и обслуживании систем машинного обучения. Это может помочь избежать скрытого технического долга и обеспечить успешную и эффективную работу системы машинного обучения.

Jupyter Notebook — это широко популярный инструмент, который специалисты по данным используют для изучения данных и обучения своих моделей машинного обучения. Jupyter Notebook — это удобный инструмент для начальных экспериментов из-за его богатых возможностей визуализации и уценки, но он может быстро стать чрезвычайно сложным в управлении. Jupyter Notebooks может быть трудно контролировать версии с помощью Git или других систем контроля версий. Git, который инженеры-программисты обычно используют для контроля версий, предназначен в первую очередь для работы с удобочитаемыми текстовыми файлами. Однако записные книжки Jupyter представляют собой полноформатные документы JSON с исходным кодом, уценкой, HTML и изображениями, объединенными в один файл .jpynb. Кроме того, когда дело доходит до развертывания моделей машинного обучения и управления ими в производственной среде, крайне важно наличие надлежащих инструментов MLOps (Machine Learning Operations).

MLOps, или DevOps для машинного обучения, — это практика применения принципов и методов DevOps (например, контроль версий, CICD, тестирование) к проектам машинного обучения. MLOps стремится сделать процесс создания, развертывания и управления моделями машинного обучения более эффективным, чтобы организации могли легче интегрировать эти модели в свои операции и быстро использовать преимущества информации, которую они предоставляют.

Существуют управляемые платформы MLOps, предоставляемые крупными поставщиками облачных услуг, и некоторые платформы MLOps с открытым исходным кодом (например, Kubeflow и MLflow), которые можно использовать. Некоторые популярные управляемые платформы MLOps включают AWS SageMaker, Google Cloud AI Platform и Azure Machine Learning. Эти платформы предоставляют ряд инструментов и услуг, которые могут помочь в таких задачах, как обучение моделей, развертывание и мониторинг, и могут быть легко интегрированы с другими инструментами в технологическом стеке вашей организации. Важно тщательно оценить функции и возможности различных платформ MLOps, прежде чем выбрать одну из них для своей организации.

Kubeflow и MLFlow — это две платформы с открытым исходным кодом для управления жизненным циклом сквозного машинного обучения (ML), включая обучение моделей, развертывание и управление. Kubeflow построен на основе Kubernetes и ориентирован на упрощение запуска и масштабирования рабочих нагрузок машинного обучения в кластерах Kubernetes. Он включает в себя различные инструменты и компоненты для создания, развертывания и управления моделями машинного обучения, включая блокноты Jupyter, TensorFlow Extended (TFX) и PyTorch. MLFlow, с другой стороны, спроектирован так, чтобы быть более гибким и может использоваться с более широким спектром платформ и сред машинного обучения. Он предоставляет инструменты для отслеживания экспериментов и управления ими, упаковки и развертывания моделей, а также управления версиями и развертываниями моделей.

И Kubeflow, и MLFlow могут быть полезны для управления жизненным циклом машинного обучения, но предлагаемые ими конкретные инструменты и функции могут лучше подходить для различных типов проектов и сред машинного обучения. Есть несколько преимуществ использования Kubeflow в качестве платформы MLOps, в том числе:

  • Он построен на основе Kubernetes, что упрощает запуск и масштабирование рабочих нагрузок машинного обучения в кластере Kubernetes. Это может помочь в развертывании и управлении моделями машинного обучения и базовой инфраструктурой.
  • Он включает в себя различные инструменты и компоненты для создания, развертывания и управления моделями машинного обучения, такие как блокноты Jupyter, TensorFlow Extended (TFX) и PyTorch. Это может помочь в разработке, экспериментировании, развертывании и управлении моделями машинного обучения в производственной среде.
  • Он может помочь в управлении сквозным жизненным циклом машинного обучения, от обучения и экспериментов до развертывания и управления. Это может упростить отслеживание и управление различными этапами проекта машинного обучения, а также сотрудничество с другими членами команды.
  • Это открытый исходный код, что означает, что его можно использовать и изменять бесплатно, и большое сообщество пользователей и разработчиков может оказывать поддержку и вносить свой вклад в проект.

Архитектура Kubeflow

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

Установка Kubeflow на AWS

В этом разделе представлено пошаговое руководство по настройке кластера Kubeflow в инфраструктуре AWS. Первый шаг — убедиться, что у нас есть необходимый доступ IAM для создания кластера EKS. Следуйте этим инструкциям, чтобы создать его и использовать для настройки учетных данных AWS. Для настройки учетных данных AWS рекомендуется использовать AWS-CLI. Чтобы настроить их через aws-cli, нужно сначала установить aws-cli. После установки выполните командуaws configure для настройки AWS-CLI и учетных данных:

$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]:

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

  1. Настроить среду разработки. Мы будем использоватьeksctlдля развертывания кластера EKS с помощью интерфейса командной строки,kubectlдля связи с кластером и Kustomize для применения манифестов Kubeflow к кластеру.
#!/bin/bash

install_kubectl() {
    echo "***********************Install kubectl******************************"
    sudo curl --silent --location -o /usr/local/bin/kubectl \
       https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
    sudo chmod +x /usr/local/bin/kubectl
}

install_eksctl() {
    echo "***********************Lauch EKS cluster******************************"
    curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
    sudo mv -v /tmp/eksctl /usr/local/bin
    eksctl version
}

install_kustomize() {
    echo "***********************Install kustomize ******************************"
    curl --silent --location --remote-name \
    "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.2.3/kustomize_kustomize.v3.2.3_linux_amd64" &&
    chmod a+x kustomize_kustomize.v3.2.3_linux_amd64 &&
    sudo mv kustomize_kustomize.v3.2.3_linux_amd64 /usr/local/bin/kustomize
}

# Call the functions
install_kubectl
install_eksctl
install_kustomize

2. После установки eksctl мы можем использовать команду eksctl create cluster для создания нового кластера EKS. Эта команда принимает различные аргументы, позволяющие определить конфигурацию кластера, включая желаемое количество рабочих узлов и предпочтительную версию Kubernetes. В качестве альтернативы мы можем записать эти аргументы в файл конфигурации, чтобы упростить процесс создания кластера. Чтобы развернуть кластер EKS с помощью eksctl и файла конфигурации, используйте «kubeflow.yaml», показанный ниже.

---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: kubeflow
  region: us-east-1
  version: "1.19"

availabilityZones: ["us-east-1a", "us-east-1b", "us-east-1c"]

managedNodeGroups:
- name: nodegroup
  desiredCapacity: 5
  instanceType: m5.xlarge
  ssh:
    enableSsm: true


secretsEncryption:
  keyARN: <enter your secrete encryption key here>

Чтобы развернуть кластер eks, используйте файл commandeksctl create cluster -f kubeflow.yaml. Важно отметить, что создание кластера EKS требует некоторого времени, так как необходимо подготовить рабочие узлы и настроить плоскость управления Kubernetes. Вы можете проверить статус процесса создания кластера, выполнив команду eksctl get clusters.

Чтобы установить Kubeflow, нам нужно применить манифесты к кластеру EKS. Мы будем использовать Kubeflow on AWS, который представляет собой дистрибутив Kubeflow с открытым исходным кодом для AWS. Загрузите манифесты Kubeflow (Kubeflow v1.4.1, aws-b1.0.0) с их GitHub, используя следующую команду.

#!/bin/bash

download_manifests() {
    export KUBEFLOW_RELEASE_VERSION=v1.4.1
    export AWS_RELEASE_VERSION=v1.4.1-aws-b1.0.0

    echo "***********************Clone Kubeflow manifests repository******************************"
    git clone https://github.com/awslabs/kubeflow-manifests.git && cd kubeflow-manifests
    git checkout ${AWS_RELEASE_VERSION}

    echo "***********************Clone upstream manifests repository******************************"
    git clone --branch ${KUBEFLOW_RELEASE_VERSION} https://github.com/kubeflow/manifests.git upstream
}

# Call the function
download_manifests

Установите все официальные компоненты Kubeflow (находящиеся под apps) и все общие службы (находящиеся под common) с помощью Kustomize или Helm с помощью одной команды:

while ! kustomize build docs/deployment/vanilla | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

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

kubectl get pods -n cert-manager
kubectl get pods -n istio-system
kubectl get pods -n auth
kubectl get pods -n knative-eventing
kubectl get pods -n knative-serving
kubectl get pods -n kubeflow
kubectl get pods -n kubeflow-user-example-com

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

kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80

Это перенаправит порт 8080 на вашем локальном компьютере на службу входящего шлюза в кластере Kubeflow, что позволит вам получить доступ к веб-интерфейсу Kubeflow. Чтобы получить доступ к веб-интерфейсу, откройте веб-браузер и перейдите к http://localhost:8080. Откроется панель управления Kubeflow, как показано на рис. 4. Kubeflow использует Dex в качестве службы входа в систему, а информация о пользователе и пароле по умолчанию — электронная почта: [email protected], пароль: 12341234.

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

Мультиарендность Kubeflow

Мультиарендность Kubeflow — это способность Kubeflow поддерживать и изолировать нескольких независимых пользователей или групп (клиентов). Это одна из самых популярных функций, добавленных сообществом открытого исходного кода в Kubeflow. В мультитенантном развертывании Kubeflow каждый арендатор имеет свои собственные выделенные ресурсы и может получать доступ к платформе Kubeflow и использовать ее, не мешая другим арендаторам. Kubeflow поддерживает мультитенантность с использованием пространств имен в Kubernetes. У каждого арендатора есть выделенное пространство имен, которое обеспечивает логическую изоляцию ресурсов. На следующей диаграмме показан многопользовательский кластер Kubeflow с двумя маршрутами доступа пользователей: через центральную панель управления Kubeflow и через интерфейс командной строки (CLI) kubectl.

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

kubectl get profiles
kubectl describe profile <profile name>   # to get more informaton abot profile

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

kubectl create -f profile.yaml
kubectl apply -f profile.yaml   # if you are modifying the profile

Файл profile.yaml содержит следующую информацию:

apiVersion: kubeflow.org/v1beta1
kind: Profile
metadata:
  name: profileName   # replace with the name of profile you want, this will be user's namespace name
spec:
  owner:
    kind: User
    name: [email protected]   # replace with the email of the user

  resourceQuotaSpec:    # resource quota can be set optionally
   hard:
     cpu: "2"
     memory: 2Gi
     requests.nvidia.com/gpu: "1"
     persistentvolumeclaims: "1"
     requests.storage: "5Gi"

Пользователь Kubeflow.Пользователь Kubeflow — это тот, у кого есть доступ (учетные данные для входа) к некоторому набору ресурсов (профилей) в кластере. Kubeflow использует Dex как способ управления пользователями и аутентификацией для платформы. Dex — это служба идентификации, которая использует подключение OpenID для аутентификации других приложений и предварительно настроена при установке Kubeflow. В рамках установки Kubeflow создается профиль Kubeflow (kubeflow-user-example-com) с пользователем по умолчанию ([email protected]). Чтобы проверить пользователей, зарегистрированных в Dex, используйте следующую команду:

kubectl get configmap dex -n auth -o jsonpath='{.data.config\.yaml}' >dex-yaml.yaml
vim dex-yaml.yaml

Отредактируйте файл dex-yaml.yaml, чтобы добавить или удалить пользователей. Пользователь может быть добавлен с электронной почтой и хешированным паролем bycrypt. Вы можете создать пароль, используя следующую команду python в своем терминале:

python3 -c 'from passlib.hash import bcrypt; import getpass; print(bcrypt.using(rounds=12, ident="2y").hash(getpass.getpass()))'

После обновления файла dex-yaml.yaml его можно применить к кластеру с помощью следующей команды:

kubectl create configmap dex --from-file=config.yaml=dex-yaml.yaml -n auth \
--dry-run=client -o yaml | kubectl apply -f -

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

kubectl rollout restart deployment dex -n auth

Блокноты Kubeflow

Установка Kubeflow позволяет запускать веб-среды разработки внутри модулей. В настоящее время он поддерживает JupyterLab, RStudio и Visual Studio Code (сервер кода). Установка Kubeflow поставляется с несколькими образами контейнеров, но можно создавать собственные образы докеров для конкретных рабочих сред. Мы можем получить общедоступное одно из базовых изображений и расширить его для нашего варианта использования. Этот процесс описывается следующими тремя шагами:

  1. Создайте новый образ контейнера, расширив базовый образ и установив новые библиотеки, которые обычно используются вашими командами. Следующий файл докера берет базовый образ и устанавливает наборы данных TensorFlow, Scikit Learn и библиотеки pandas.
FROM public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter:v1.5.0

USER root 

RUN pip3 install tensorflow-datasets==2.1.0 \
                 scikit-learn==1.1.0 \
                 pandas==1.0.3
ENV NB_PREFIX /
  1. Войдите в ECR, чтобы отправить новый образ блокнота.
REGION=<AWS Region>
ACCOUNT=<AWS account ID>
aws ecr get-login-password - region $REGION | docker login - username AWS - password-stdin $ACCOUNT.dkr.ecr.$REGION.amazonaws.com

2. Создайте и отправьте образ докера в ECR.

REPOSITORY=<your repository name>
IMAGE_NAME=$ACCOUNT.dkr.ecr.$REGION.amazonaws.com/$REPOSITORY
IMAGE_TAG=tensorflow-2.1.0-jupyter-modified
docker build -t $IMAGE_NAME:$IMAGE_TAG .
docker push $ACCOUNT.dkr.ecr.$REGION.amazonaws.com/$REPOSITORY:$IMAGE_TAG

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

Трубопроводы Kubeflow

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

  1. Автоматизация: конвейеры Kubeflow автоматизируют процесс создания и развертывания моделей машинного обучения, упрощая разработку и поддержку высококачественных моделей с течением времени. Это может сэкономить время и усилия и снизить риск ошибок.
  2. Воспроизводимость: конвейеры Kubeflow определяются с использованием спецификации с контролем версий, что упрощает их воспроизведение и отладку. Это важно для обеспечения надежности и воспроизводимости моделей машинного обучения.
  3. Совместная работа: конвейеры Kubeflow поддерживают несколько пользователей и позволяют вам отслеживать и управлять ходом ваших рабочих процессов машинного обучения. Это может упростить сотрудничество с другими членами команды и заинтересованными сторонами.
  4. Масштабируемость. Конвейеры Kubeflow можно запускать на крупномасштабных вычислительных ресурсах, что позволяет масштабировать рабочие процессы машинного обучения для обработки больших объемов данных и вычислительных ресурсов.
  5. Переносимость: конвейеры Kubeflow можно развернуть в любом кластере Kubernetes, что упрощает перенос рабочих процессов машинного обучения между разными средами.

Конвейеры Kubeflow также можно использовать для отслеживания экспериментов и визуализации. На следующем рисунке показан пример конвейера Kubeflow, созданного для классификации различных вин с использованием классификатора случайного леса. Полный код этой задачи можно найти в репозитории GitHub этого проекта. Конвейер получает данные из S3, проверяет данные с помощью Библиотеки больших ожиданий, обучает случайный классификатор, записывает обученную модель в S3 и обслуживает модель с помощью KFServing. Каждый шаг конвейера — это независимый модуль в Kubernetes, между которыми передаются данные. Отдельные шаги могут быть запущены независимо и с использованием журналов, входных и выходных данных и визуализаций. На рисунке ниже Rf_classifier, который является этапом обучения конвейера, включает в себя некоторую визуализацию ROC и матрицы путаницы как часть запуска конвейера.

Заключение

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