Это 29-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Kubeflow
Коротко о Kubeflow
Проект Kubeflow основан на контейнерах и Kubernetes и призван предоставить специалистам по данным, инженерам по машинному обучению и системным операторам гибкую платформу для развертывания, разработки, обучения, выпуска и управления для предприятий машинного обучения. Он использует преимущества облачных технологий, позволяя пользователям быстрее и проще развертывать, использовать и управлять наиболее популярным программным обеспечением для машинного обучения.
Kubeflow интегрирует проекты с открытым исходным кодом во многих областях, таких как Jupyter, TF Serving, Katib, Fairing, Argo и т. д. Им можно управлять на разных этапах машинного обучения: предварительная обработка данных, обучение модели, прогнозирование модели, управление услугами и т. д. Пока Kubernetes установлен, его можно развернуть в локальной, компьютерной и облачной средах.
Основные компоненты Kubeflow
На рисунке выше показан общий процесс машинного обучения в отрасли, от сбора данных, проверки до обучения моделей, выпуска услуг и т. д. И каждый виджет на графике включен в 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, которая в основном разделена на восемь частей:
- 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
чтобы опробовать разные типы моделей или разные фреймворки машинного обучения. Наконец, они соберут и изучат метрики для оценки производительности каждой модели в тестовом наборе данных, а затем решат, какую модель развернуть в рабочей среде.
Очевидно, что это чрезмерное упрощение настоящего рабочего процесса машинного обучения, но дело в том, что этот общий подход требует большого участия человека и не может быть легко использован кем-либо, кроме инженеров, которые изначально его разработали.
мы можем использоватьKubeFlow Pipelines
для решения этих проблем. Вместо того, чтобы рассматривать подготовку данных, обучение модели, проверку модели и развертывание модели как единую кодовую базу для конкретной модели, над которой мы работаем, мы можем рассматривать этот рабочий процесс как серию отдельных модульных шагов, каждый из которых сосредоточен на одной конкретной задаче.
Подготовка окружающей среды
pip install kfp
Рабочий процесс проектирования
Всего мы создадим четыре компонента, как показано на изображении ниже:
-
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.
Затем запустите рабочий процесс, и график DAG после завершения выполнения показан ниже.
Мы также можем просматривать результаты ввода и вывода каждого компонента, а также журналы консоли и т. д.
На данный момент весь рабочий процесс Kubflow Pipelines завершен.
Суммировать
В этой статье описываются базовая архитектура и компоненты Kubflow и Kubflow Pipelines, а также то, как использовать Kubflow Pipelines для реализации простого рабочего процесса машинного обучения, который загружает некоторые данные, обучает модель, оценивает ее на заблокированном наборе данных и «развертывает» ее. Используя Kubeflow Pipelines, мы смогли инкапсулировать каждый шаг этого рабочего процесса в компонент рабочего процесса, каждый из которых работает в своей собственной изолированной среде контейнера Docker. Эта инкапсуляция способствует слабой связи между этапами нашего рабочего процесса машинного обучения и открывает возможность повторного использования компонентов в будущих рабочих процессах. Например, в нашем обучающем компоненте нет ничего конкретного для набора данных о ценах на жилье в Бостоне. Мы можем повторно использовать этот компонент в любое время, когда захотим обучить модель регрессии с помощью Sklearn.
Конечно, в этой статье мы коснулись только самой поверхности Kubeflow Pipelines, но мы надеемся, что эта статья помогла вам понять основы компонентов Kubeflow Pipelines.