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

Kubeflow Pipelines (KFP) — это мощный инструмент, который позволяет создавать, развертывать и запускать конвейеры машинного обучения масштабируемым и воспроизводимым образом с использованием контейнеров Docker. Он предоставляет ряд инструментов и абстракций, которые помогут вам оптимизировать рабочие процессы машинного обучения, что делает его эффективным и надежным решением для завершения вашего проекта.

Вот краткий обзор основных характеристик Kubeflow Pipelines:

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

Исходя из моего личного опыта, интеграция Kubeflow Pipelines при создании и развертывании конвейеров машинного обучения в моих проектах оказала значительное влияние на мою производительность и результат. Благодаря KFP конечный продукт конвейера машинного обучения стал упрощенным, но масштабируемым и модульным. Он также стал воспроизводимым, что упростило мониторинг и бесшовную интеграцию с нашим процессом CI/CD во время развертывания. Кроме того, Kubeflow упростил отладку благодаря визуализации конвейера DAG, что позволило сэкономить время и ресурсы.

Как вы, вероятно, уже поняли из моих предыдущих статей, моей основной рабочей средой является Google Cloud Platform. И когда дело доходит до GCP, использование Kubeflow Pipelines является естественным выбором из-за следующих ключевых преимуществ.

  1. Встроенная интеграция. Kubeflow Pipelines тесно интегрирована с экосистемой GCP. Он использует Kubernetes и эффективно использует ресурсы, обеспечивая беспрепятственную интеграцию с многочисленными сервисами GCP, такими как BigQuery, Cloud Storage, Vertex AI и AI Platform.
  2. Воспроизводимость и управление версиями. С помощью Kubeflow Pipelines в GCP вы можете легко создавать воспроизводимые конвейеры с контролируемой версией, используя контейнеризацию. Это помогает отслеживать изменения и обеспечивает согласованность в различных средах, упрощая совместное использование ресурсов.
  3. Визуальный интерфейс. GCP любезно предлагает визуализированный интерфейс для конвейеров Kubeflow в конвейерах Vertex AI. Этот интерфейс обеспечивает удобное для пользователя представление структуры конвейера и показывает прогресс в реальном времени во время его выполнения. Кроме того, с помощью этого интерфейса упрощается отладка, поскольку он точно определяет конкретный компонент рабочего процесса, в котором произошла ошибка.
  4. Масштабируемость. GCP предлагает высокую масштабируемость и эластичность для рабочих нагрузок машинного обучения, а Kubeflow Pipelines использует эту мощь. Он позволяет динамически масштабировать конвейеры и без труда справляться с крупномасштабными распределенными заданиями по обучению и логическим выводам.
  5. Мониторинг и отладка: Kubeflow Pipelines предлагает возможности мониторинга и ведения журналов в реальном времени. Вы можете легко отслеживать ход своего конвейера, контролировать использование ресурсов и устранять проблемы с помощью встроенных инструментов, которые могут значительно упростить устранение неполадок.

Как работают конвейеры Kubeflow

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

С этого момента я настоятельно рекомендую вам следовать инструкциям и выполнять примеры кода в своей собственной рабочей среде. Это поможет вам понять концепции фокуса.

Конвейеры Kubeflow состоят из трех частей: 1) Компоненты, 2) Конвейер и 3) Конвейерное задание. Чтобы создать эти экземпляры в среде Google Cloud Platform (GCP), нам необходимо установить три библиотеки: kfp, google-cloud-aiplatform и google-cloud-pipeline-components.

# Install necessary libraries
!pip install kfp
!pip install google-cloud-aiplatform
!pip install google-cloud-pipeline-components

А для создания конвейера Kubeflow нам просто нужно создать пользовательские компоненты, конвейер, который отображает ранее созданные компоненты, а затем экземпляр PipelineJob для выполнения конвейера. Когда PipelineJob будет успешно выполнено, ваше конвейерное задание появится в разделе Vertex-AI → Pipelines, где вы сможете отслеживать задание в режиме реального времени и при необходимости отлаживать его.

Создание пользовательского компонента не сильно отличается от создания функции Python, за исключением того, что есть три дополнительных элемента: декоратор @component, параметр base_image и output_component_file.

  1. Декоратор @component компилирует эту функцию в компонент KFP. Это обязательно для каждого пользовательского компонента, который вы создаете.
  2. Параметр base_image указывает образ контейнера, который будет использовать этот компонент.
  3. Параметр output_component_file является необязательным и указывает файл yaml для записи скомпилированного компонента. После выполнения задания вы должны увидеть этот файл, записанный в экземпляр вашего ноутбука.

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

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

# Load necessary libraries
from typing import NamedTuple
import kfp
from kfp import dsl
from kfp.v2 import compiler
from kfp.v2.dsl import (Artifact, Dataset, Input, InputPath, Model, Output,
                        OutputPath, ClassificationMetrics, Metrics, component)
from kfp.v2.google.client import AIPlatformClient
from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

Шаг 1: Создайте пользовательские компоненты на основе функций Python

Компонент 1)
Это простой компонент на основе функций Python, который принимает целое число в качестве входных данных. Он возвращает то же целое число, что и вывод, без обработки.

@component(base_image="python:3.9", output_component_file="component_one.yaml")
def input_integer(num: int) -> int:
    return num

Компонент 2)
Компонент 2 также основан на функции Python, которая снова принимает целое число в качестве входных данных и выполняет два вычисления: двойное и квадратное. Функция возвращает кортеж с переданным входным целым числом, а также вычисленными значениями типа double и square.

@component(base_image="python:3.9", output_component_file="component_two.yaml")
def double_square(
    num: int
) -> NamedTuple(
    "Outputs",
    [
        ("value", int),  # Return parameters
        ("double", int),
        ("square", int)
    ],
):
    double = num * 2 
    square = num * num

    print(f"input value: {num}, double: {double}, square: {square}") 
    return (num, double, square)

Компонент 3)
Последний компонент в этом конвейере будет использовать выходные данные первых двух компонентов и объединять их для возврата строки:

@component(base_image="python:3.9", output_component_file="component_three.yaml")
def show_results(
    num: int,
    double: int,
    square: int
) -> str:

    end_str = f"The double of {num} is {double}, and the square of {num} is {square}"

    return end_str

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

Шаг 2. Объедините компоненты в конвейер

Чтобы настроить конвейер, мы просто используем @dsl.pipeline декоратор, который принимает имя конвейера, описание и корневой путь в качестве входных параметров. Корневой путь — это каталог в Google Cloud Storage, в который будут записываться выходные файлы конвейера (артефакты). Прежде чем продолжить, настроим переменную PIPELINE_PATH.

BUCKET_NAME={gcs bucket name} # change this to your own 
PIPELINE_ROOT = f"gs://{BUCKET_NAME}"

Затем давайте определим функцию конвейера: intro_pipeline. Обратите внимание на то, что я передаю в качестве входных данных для double_square (компонент 2)и show_results (компонент 3)компоненты.

@dsl.pipeline(
    name="demo-pipeline",
    description="vertex pipeline example",
    pipeline_root=PIPELINE_ROOT,
)
def pipeline(num: int = 5):
    
    # ----- component 1 ------
    input_integer_op = input_integer(num)
    
    # ----- component 2 ------
    double_square_op = double_square(num)
    
    # ----- component 3 ------
    show_results_op = show_results(
            input_integer_op.output,
            double_square_op.outputs["double"],
            double_square_op.outputs["square"] ,
        ) 
    
    # ----- set order ------
    show_results_op.after(input_integer_op)
    show_results_op.after(double_square_op)

Шаг 3. Скомпилируйте и запустите конвейер

Теперь, когда наш конвейер определен, давайте скомпилируем его и запустим. Компилятор сначала сгенерирует файл JSON, который вы будете использовать для запуска конвейера, а затем конвейер запустится на основе компилятора. Есть ряд других параметров, с которыми можно поиграться в Class PipelineJob. Пожалуйста, обратитесь к официальной документации для более подробной информации.

compiler.Compiler().compile(
   pipeline_func=pipeline, package_path="pipeline.json"
)

job = pipeline_jobs.PipelineJob(
   display_name="demo-pipeline-job",
   template_path="pipeline.json",
   pipeline_root = PIPELINE_ROOT,
   location="northamerica-northeast1",
   enable_caching=True # I encourage you to enable caching when testing as it will reduce resource use
)

job.run()

Шаг 4. Мониторинг конвейера

Как отмечалось выше, экземпляр конвейера можно найти в разделе Vertex AI → Pipelines в течение нескольких минут после выполнения кода. На этой странице мы можем отслеживать запущенный экземпляр демо-конвейера, просматривая такие сведения, как статус, имя конвейера, продолжительность задания, а также даты создания и окончания.

При выборе экземпляра внутренние операции конвейера отображаются графически. На диаграмме ниже изображены три компонента: input-integer, double-square и show-results. Очевидно, что экземпляры input-integer и double-square могут выполняться независимо друг от друга без каких-либо зависимостей. Однако компонент show-results зависит от завершения двух других компонентов, прежде чем он сможет работать. Это связано с тем, что входные параметры для show-results получаются из выходных данных двух других компонентов.

Убедившись в успешном выполнении всех трех компонентов, давайте рассмотрим полученные ими результаты. Как и планировалось, входные параметры {num: 5, double: 10, Square: 25} были успешно переданы в компонент show-results (компонент 3). По завершении конвейера он сгенерировал желаемый результат в виде строки, утверждающей: "Двойное число 5 равно 10, а квадрат 5 равно 25". С этой проверкой мы может уверенно отметить конвейер как работающий безупречно и перейти к следующей задаче.

Краткое содержание упражнения

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

  1. Чтобы продемонстрировать простоту создания компонентов и конвейеров с помощью библиотеки KFP в Python.
  2. Чтобы улучшить ваше понимание взаимозависимостей между компонентами в конвейере.
  3. Продемонстрировать преимущества использования конвейеров Kubeflow для создания сквозных конвейеров машинного обучения.

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

Заключение

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

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

Ссылка:





ПИСАТЕЛЬ на MLearning.ai // Интерпретатор кода 88 использует // 800+ инструментов ИИ