Анализ рабочего процесса машинного обучения Kubflow Pipelines

искусственный интеллект
Анализ рабочего процесса машинного обучения Kubflow Pipelines

Это 29-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Kubeflow

Коротко о Kubeflow

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

Kubeflow интегрирует проекты с открытым исходным кодом во многих областях, таких как Jupyter, TF Serving, Katib, Fairing, Argo и т. д. Им можно управлять на разных этапах машинного обучения: предварительная обработка данных, обучение модели, прогнозирование модели, управление услугами и т. д. Пока Kubernetes установлен, его можно развернуть в локальной, компьютерной и облачной средах.

kubeflow架构图.svg

Основные компоненты Kubeflow

kubeflow-机器学习各个阶段.webp

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

  • Jupyter: Создание и управление многопользовательскими интерактивными блокнотами Jupyter.
  • Tensorflow/PyTorch: в настоящее время основные поддерживаемые механизмы машинного обучения
  • Seldon: Обеспечивает развертывание моделей машинного обучения в Kubernetes.
  • TF-Serving: Обеспечение онлайн-развертывания моделей Tensorflow, поддержка контроля версий и переключения моделей без остановки онлайн-сервисов.
  • Argo: Механизм рабочего процесса на основе Kubernetes.
  • Pipelines: основано наArgoРеализовал проект рабочего процесса, ориентированный на сценарии машинного обучения, обеспечил создание, планирование и управление процессами машинного обучения, а также предоставилWeb UI.
  • Ambassador: Шлюз (API Gateway), предоставляющий унифицированные услуги внешнему миру.
  • Istio: Обеспечивает управление микросервисами, сбор данных телеметрии.
  • Ksonnet: Kubeflow использует ksonnet для развертывания необходимых ресурсов k8s в кластере kubernetes.
  • Operator: Возможность обеспечить планирование ресурсов и распределенное обучение для различных сред машинного обучения (TF-Operator,PyTorch-Operator,Caffe2-Operator,MPI-Operator,MXNet-Operator)
  • Katib: на основе каждогоOperatorРеализован поиск гиперпараметров и простая система поиска структуры модели, поддержка параллельного поиска и распределенного обучения и т. д. Оптимизация гиперпараметров не применялась в больших масштабах в практической работе, поэтому этой части технологии еще нужно время, чтобы созреть.
  • Pachyderm: данные контроля версий Pachyderm, аналогичные тому, что Git делает с кодом. Вы можете отслеживать состояние данных с течением времени, тестировать исторические данные, делиться данными с товарищами по команде и возвращаться к предыдущим состояниям данных.

Возможности Kubeflow

  • Основанный на Kubernetes, он имеет облачные функции: эластичное масштабирование, высокая доступность, DevOps и т. д.
  • Интеграция инструментов, используемых большим количеством машинного обучения

Основные возможности Kubeflow кратко представлены выше. Далее мы подробно расскажем о компоненте Kubeflow Pipelines.

Кратко о конвейерах KubeFlow

существуетKubeflow v0.1.3после,Pipelinesуже сталKubeflowосновные компоненты.KubeflowОсновная цель состоит в том, чтобы упроститьKubernetesПроцесс выполнения задач машинного обучения на платформе и, в конечном итоге, надежда на реализацию полного набора конвейеров для достижения полного набора сквозных процессов от данных до модели. иPipelines— это платформа рабочих процессов, способная компилировать и развертывать рабочие процессы машинного обучения. Итак, на этом уровнеpipelineспособный статьKubeflowОсновные компоненты .

Платформа Kubeflow Pipelines включает в себя:

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

Схема архитектуры конвейеров KubeFlow

kubeflow-pipelines-architecture.png

На приведенном выше рисунке показана архитектура Kubeflow Pipelines, которая в основном разделена на восемь частей:

  • Python SDK: специальный язык (DSL) для создания компонентов kubeflow Pipelines.
  • Компилятор DSL: конвертируйте код Python в файл статической конфигурации YAML (компилятор DSL).
  • Веб-сервер Pipeline: интерфейсный сервис для Pipeline, который собирает различные данные для отображения соответствующих представлений: в настоящее время работаетpipelineсписок,pipelineистория выполнения, о каждомpipelineЗапуск отладочной информации, статус выполнения и т. д.
  • Pipeline Service: внутренняя служба Pipeline, вызывающаяK8Sобслуживание отYAMLСоздайтеpipelineбегать.
  • Ресурсы Kubernetes: создание CRD для запуска конвейеров.
  • Служба метаданных машинного обучения: для мониторингаPipeline ServiceсозданныйKubernetesресурсы и сохранять состояние этих ресурсов в службе метаданных машинного обучения (хранится между контейнерами потока задачinput/outputВзаимодействие данных).
  • Хранилище артефактов: для храненияMetadataиArtifact.Kubeflow PipelinesХранить метаданные вMySQLВ базе данных артефакты хранятся в хранилище артефактов, таком как сервер Minio или облачное хранилище.
  • Контроллеры оркестрации: оркестрация задач, например контроллер рабочего процесса Argo, который управляет рабочими процессами, управляемыми задачами.

Ключевые особенности пайплайнов KubeFlow

  • Сквозная оркестровка. Включите и упростите оркестрацию рабочих процессов машинного обучения.
  • Простое экспериментирование: позволяет легко опробовать несколько идей и подходов и управлять различными экспериментами/экспериментами.
  • Простота повторного использования: позволяет повторно использовать компоненты и рабочие процессы для быстрого создания комплексных решений без повторного повторного использования.

Пример

задний план

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

image.png

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

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

image.png

Подготовка окружающей среды

pip install kfp

Рабочий процесс проектирования

Всего мы создадим четыре компонента, как показано на изображении ниже:

kfp-dag-demo.jpeg

  • preprocess-data: компонент будет загружен изsklearn.datasetsЗагрузите набор данных о ценах на жилье в Бостоне, а затем разделите набор данных на обучающий и тестовый наборы.
  • train-model: этот компонент будет обучать модель прогнозированию средней цены на жилье в Бостоне с использованием набора данных о ценах на жилье в Бостоне.
  • test-model: этот компонент будет вычислять и выводить среднеквадратичную ошибку модели в тестовом наборе данных.
  • deploy-model: в этой статье мы не будем сосредотачиваться на развертывании модели, поэтому компонент просто записывает в журнал сообщение о развертывании модели. В реальном сценарии это может быть общий компонент для развертывания любой модели в рабочей среде.

Далее пишем код, разрабатываем компоненты и делаем зеркала.

Разработка компонентов препроцессинга (preprocess-data)

Сначала напишите код предварительной обработкиpreprocess.py:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split

def _preprocess_data():
     X, y = datasets.load_boston(return_X_y=True)
     X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
     np.save('x_train.npy', X_train)
     np.save('x_test.npy', X_test)
     np.save('y_train.npy', y_train)
     np.save('y_test.npy', y_test)
     
if __name__ == '__main__':
     print('Preprocessing data...')
     _preprocess_data()

Затем запишите файл изображенияDockerfile:

FROM python:3.7-slim

WORKDIR /app

RUN pip install -U scikit-learn numpy

COPY preprocess.py ./preprocess.py

ENTRYPOINT [ "python", "preprocess.py" ]

Далее создайте образ:

docker build -t wintfru/boston_pipeline_preprocess:v1  -f Dockerfile .

Наконец, отправьте образ в удаленный репозиторий:

docker push wintfru/boston_pipeline_preprocess:v1

Разработка оставшихся компонентов (модель обучения, модель тестирования, модель развертывания)

Разработка остальных компонентов аналогична процессу разработки компонентов предварительной обработки (предварительная обработка данных).Справочная документация.

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

Во-первых, мы организуем рабочий процесструбопровод.

import kfp
from kfp import dsl


def preprocess_op():
    return dsl.ContainerOp(
        name='Preprocess Data',
        image='wintfru/boston_pipeline_preprocess:v1',
        arguments=[],
        file_outputs={
            'x_train': '/app/x_train.npy',
            'x_test': '/app/x_test.npy',
            'y_train': '/app/y_train.npy',
            'y_test': '/app/y_test.npy',
        }
    )


def train_op(x_train, y_train):
    return dsl.ContainerOp(
        name='Train Model',
        image='wintfru/boston_pipeline_train:v1',
        arguments=[
            '--x_train', x_train,
            '--y_train', y_train
        ],
        file_outputs={
            'model': '/app/model.pkl'
        }
    )


def test_op(x_test, y_test, model):
    return dsl.ContainerOp(
        name='Test Model',
        image='wintfru/boston_pipeline_test:v1',
        arguments=[
            '--x_test', x_test,
            '--y_test', y_test,
            '--model', model
        ],
        file_outputs={
            'mean_squared_error': '/app/output.txt'
        }
    )


def deploy_model_op(model):
    return dsl.ContainerOp(
        name='Deploy Model',
        image='wintfru/boston_pipeline_deploy:v1',
        arguments=[
            '--model', model
        ]
    )


@dsl.pipeline(
    name='Boston Housing Pipeline',
    description='An example pipeline that trains and logs a regression model.'
)
def boston_pipeline():
    _preprocess_op = preprocess_op()

    _train_op = train_op(
        dsl.InputArgumentPath(_preprocess_op.outputs['x_train']),
        dsl.InputArgumentPath(_preprocess_op.outputs['y_train'])
    ).after(_preprocess_op)

    _test_op = test_op(
        dsl.InputArgumentPath(_preprocess_op.outputs['x_test']),
        dsl.InputArgumentPath(_preprocess_op.outputs['y_test']),
        dsl.InputArgumentPath(_train_op.outputs['model'])
    ).after(_train_op)

    deploy_model_op(
        dsl.InputArgumentPath(_train_op.outputs['model'])
    ).after(_test_op)


# client = kfp.Client()
# client.create_run_from_pipeline_func(boston_pipeline, arguments={})

if __name__ == '__main__':
    kfp.compiler.Compiler().compile(boston_pipeline, __file__ + '.yaml')


Затем мы компилируемpipeline.py, скомпилированный в задачу Kubernetesyamlконфигурационный файл.

python pipeline.py

Выполнить рабочий процесс

Сначала войдите в графический интерфейс Kubflow Pipelines, чтобы загрузить файл Yaml.kfp-上传Pipeline.png

Затем запустите рабочий процесс, и график DAG после завершения выполнения показан ниже.

kfp-执行结果流程图.jpg

Мы также можем просматривать результаты ввода и вывода каждого компонента, а также журналы консоли и т. д.kfp-执行后的流程图.png

На данный момент весь рабочий процесс Kubflow Pipelines завершен.

Суммировать

В этой статье описываются базовая архитектура и компоненты Kubflow и Kubflow Pipelines, а также то, как использовать Kubflow Pipelines для реализации простого рабочего процесса машинного обучения, который загружает некоторые данные, обучает модель, оценивает ее на заблокированном наборе данных и «развертывает» ее. Используя Kubeflow Pipelines, мы смогли инкапсулировать каждый шаг этого рабочего процесса в компонент рабочего процесса, каждый из которых работает в своей собственной изолированной среде контейнера Docker. Эта инкапсуляция способствует слабой связи между этапами нашего рабочего процесса машинного обучения и открывает возможность повторного использования компонентов в будущих рабочих процессах. Например, в нашем обучающем компоненте нет ничего конкретного для набора данных о ценах на жилье в Бостоне. Мы можем повторно использовать этот компонент в любое время, когда захотим обучить модель регрессии с помощью Sklearn.

Конечно, в этой статье мы коснулись только самой поверхности Kubeflow Pipelines, но мы надеемся, что эта статья помогла вам понять основы компонентов Kubeflow Pipelines.

Справочная документация