Обзор:

Цель этого технического блога — ознакомиться с основами написания конвейера Vertex AI. Будет полезно оценить базовое понимание и основы того, как настроить и запустить конвейер. В основном он будет использоваться в решениях MLOP и/или при настройке бессерверных конвейеров машинного обучения в более крупной архитектуре решения.

Цель:

Создайте сквозной стандартизованный и повторно используемый конвейер Vertex AI для одной модели машинного обучения. Этапы пайплайна будут включать следующие этапы:

  • Прием данных (пример набора данных)
  • Очистка данных
  • Обучение модели
  • Развертывание условной модели
  • Создание конечной точки

Технический стек:

  • Облачное хранилище: облачное хранилище используется для хранения артефактов.
  • Vertex AI: Vertex AI — это сервис, предоставляемый Google Cloud, который объединяет AutoML и платформу AI в единый API, клиентскую библиотеку и пользовательский интерфейс.
  • Рабочий стол: в рабочем столе можно создавать блокноты, которые используются для написания кода для конвейера.
  • Конвейеры: Вершинные конвейеры используются для просмотра визуальной оркестровки закодированного конвейера.
  • Реестр моделей: Здесь будут видны все созданные модели. Они будут использоваться для обслуживания онлайн-прогнозов.
  • Конечные точки: с помощью конечных точек можно обслуживать модели. Прогнозы можно делать из пользовательского интерфейса или через SDK.

Постановка задачи и решение ML:

Мы взяли базовую проблему оттока; код для которого можно найти здесь. Мы преобразовали этот код в конвейерный код Vertex AI.

Подход к решению:

Vertex AI — это унифицированная платформа MLOps, которая помогает специалистам по обработке данных и инженерам машинного обучения расширять эксперименты, ускорять развертывание и уверенно управлять моделями. Его можно рассматривать как управляемый конвейер с другими ключевыми функциями, такими как маркировка данных, обучение на основе AutoML, управление конечными точками и т. д.

Vertex AI — это сервис, предоставляемый Google Cloud, который объединяет AutoML и AI Platform в единый API, клиентскую библиотеку и пользовательский интерфейс. AutoML позволяет обучать модели на изображениях, табличных, текстовых и видеоданных без написания кода, а обучение на AI Platform позволяет запускать собственный обучающий код. С Vertex AI в качестве вариантов реализации доступны как обучение AutoML, так и индивидуальное обучение. С помощью Vertex AI также можно сохранять модели, развертывать модели и запрашивать прогнозы. Для целей этого блога мы будем использовать индивидуальный подход к обучению.

Мы также должны учитывать, где функции Vertex AI в настоящее время доступны для реализации. Не все функции Vertex AI доступны в каждом регионе GC. Поэтому мы должны быть внимательны, предлагая решение в зависимости от доступности услуги в конкретном регионе. Это — это справочная ссылка, указывающая, какая функция Vertex AI доступна в каком регионе.

Требования ИАМ:

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

  • Потребитель использования службы: возможность проверять состояния и операции службы; и использовать квоту и выставление счетов для потребительского проекта.
  • Администратор объекта хранилища. Предоставляет полный контроль над объектами, включая перечисление, создание, просмотр и удаление объектов.
  • Администратор Vertex AI: предоставляет полный доступ ко всем ресурсам в Vertex AI. Если нельзя назначить роль администратора, рассмотрите возможность предоставления роли Vertex AI Editor разработчику конвейера.
  • Сетевые разрешения потребуются в каждом конкретном случае.

Задачи пайплайна:

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

Мы используем новую версию Kubeflow Pipelines SDK, которая совместима с Vertex AI и DSL, что означает предметно-ориентированный язык, поскольку это основной модуль SDK для определения конвейера. Мы также используем Input, Output, Metrics из вышеупомянутого SDK, потому что именно с их помощью мы передаем объекты между компонентами. Когда мы определяем компонент, мы можем указать тип аргумента, намекая на входы и выходы нашего компонента.

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

Прием и предварительная обработка данных:

В нашем случае мы получаем данные из корзины GCS и выполняем шаги предварительной обработки в самом конвейере, используя библиотеку pandas в Python для набора данных. Мы будем выполнять базовые Кодирование меток и Важность функций в упомянутом наборе данных для вышеупомянутого варианта использования Прогнозирование оттока.

Обучение модели и тестирование:

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

Развертывание модели и создание конечной точки:

Мы написали логику условного развертывания модели. Мы будем проверять порог точности на этапе обучения модели. Если он выше требуемого порога, будет развернута только модель и будет создана конечная точка.

Структура трубопровода:

Блокнот:

  • Блокнот доступен из Workbench в Vertex AI. В облачной консоли Vertex AI вы можете просматривать все свои экземпляры ноутбуков из Vertex AI. Код, который вы запускаете внутри экземпляра Notebooks, определяет, где хранится задание, модель или другой ресурс. Другими словами, запросы API Vertex AI создают ресурсы в Vertex AI.
  • Теперь мы можем создать управляемую записную книжку, полностью управляемую Google, или записную книжку, управляемую пользователем, где мы можем указать все детали для типа машины, на которой будет запущен экземпляр записной книжки.
  • Блокнот — неотъемлемая часть нашей работы по написанию пайплайна. Используя записную книжку, мы можем выполнять разработку функций и подготовку данных в наборе данных, создавать и повторять пользовательскую модель обучения или использовать одну из клиентских библиотек Vertex AI для создания сложной модели, а затем сохранять эти ресурсы для использования в Vertex AI.

Компонент:

У конвейера будут разные задачи. Эти задачи можно рассматривать как отдельные компоненты конвейера. Мы должны использовать декоратор компонента, чтобы указать код для задачи. Этот компонент не требует создания нового образа контейнера для каждого изменения кода и предназначен для быстрой итерации в среде записной книжки. Вы можете создать легковесный компонент, просто вызвав декоратор @component. Этот декоратор компилирует базовое определение функции в фактически работающий компонент при запуске конвейера. Мы можем указать следующие параметры:

  • base_image: для загрузки базового образа, на котором будет выполняться функция. Здесь мы можем предоставить готовые или пользовательские образы докеров. В нашем случае мы использовали Python 3.9 в качестве базового образа (Примечание. При использовании этих готовых базовых образов мы должны помнить о том, что при установке внешних пакетов мы можем столкнуться с некоторыми проблемами. Например, У пакета 'scipy' есть некоторые известные проблемы при установке. В таких случаях мы можем изменить базовый образ на предыдущую версию Python (с 3.9 на 3.8) и проверить, работает ли он).
  • output_component_file: загружает компонент в файл YAML для повторного использования. Мы можем загрузить компонент из файла YAML, используя функцию load_component_from_file(‹/path/to/your/component.yaml›).
  • packages_to_install: здесь мы можем указать пакеты для установки, которые являются внешними по отношению к нашему базовому образу. Например, если наш base_image — Python3.9, мы можем установить библиотеку Pandas, просто указав ее в списке.

Мы можем предоставить входные параметры функции и получить выходные данные функции в формате NamedTuple для хранения и использования позже. Ниже приведен пример того же самого:

#defining a component
@component(
packages_to_install=["sklearn", "pandas", "joblib","google-cloud-bigquery"],
base_image="python:3.9",
output_component_file="model_component.yaml",
)
def sklearn_train(
dataset: Input[Dataset],
metrics: Output[Metrics],
model: Output[Model]
)-> NamedTuple("output", [("deploy", str)]):
import pandas as pd
#your code here
deploy = latest_model_threshold_str
return (deploy,)

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

Конвейерная DSL:

Спецификация последовательности задач ML может быть определена с помощью предметно-ориентированного языка Python (DSL). Топология рабочего процесса неявно определяется путем соединения выходов вышестоящего шага с входами нижестоящего шага. Шаг в определении конвейера вызывает компонент в конвейере. В сложном конвейере компоненты могут выполняться несколько раз в циклах или выполняться условно. Используя конвейерный DSL, мы можем установить зависимости между различными определенными компонентами. Чтобы установить зависимости, мы можем использовать after() или вызывать задачи одну за другой. PIPELINE_ROOT — это путь GCS, где мы будем хранить все артефакты для каждого запуска конвейера. Мы можем использовать различные функции DSL, такие как условия условного выполнения определенного компонента. Здесь — это ссылка на фактический фрагмент кода, определяющий компонент конвейера. Ниже приведен пример определения конвейера:

#define a pipeline and create a task from a component:
@pipeline(
# Default pipeline root. You can override it when submitting the pipeline.
pipeline_root = PIPELINE_ROOT,
# A name for the pipeline.
name = "tech-blog-vertex-ai-pin-mlmd-pipeline",
)
def pipeline(
output_data_path: str = "data.csv",
project: str = PROJECT_ID,
region: str = REGION
):
dataset_task = get_dataframe()
model_task = sklearn_train(
dataset_task.output
)
with dsl.Condition(model_task.outputs["deploy"] == "true", name = "if_deploy_tech_blog_model_vertex_ai_pin"):
deploy_task = deploy_model(
model = model_task.outputs["model"],
project = project,
region = region
)

Компиляция пайплайна:

Мы можем использовать compile() для компиляции кода конвейера в сериализованный формат JSON. Этот JSON будет использоваться для запуска конвейера. Здесь — это ссылка на фактический фрагмент кода для компиляции пайплайна. Ниже приведен фрагмент кода для того же:

compiler.Compiler().compile(
pipeline_func = pipeline, package_path = "tech-blog-vertex-ai-pin-mlmd_pipeline.json"
)

Объект PipelineJob:

Этот клиент используется для создания ответа на запуск конвейера. Мы можем использовать приведенную ниже функцию, которая является частью клиента API из Python SDK:

  • Объект PipelineJob: для запуска конвейера с использованием сериализованной версии конвейера вместе с другими параметрами, такими как отображаемое имя, enable_caching и т. д. (когда enable_caching имеет значение TRUE, тогда запуск конвейера будет хранить метаданные и для последующих запусков он будет продолжаться с где он потерпел неудачу или остановился; если FALSE, конвейер выполнит все компоненты).
  • job.submit: для запуска конвейера.

Здесь — это ссылка на фактический фрагмент кода для создания задания конвейера и его отправки. Ниже приведен пример фрагмента кода для того же:

run1 = aiplatform.PipelineJob(
display_name = "tech-blog-vertex-ai-pin-mlmd-pipeline",
template_path = "tech-blog-vertex-ai-pin-mlmd_pipeline.json",
job_id = "tech-blog-vertex-ai-pin-mlmd-pipeline-{0}".format(TIMESTAMP),
enable_caching = True,
)
run1.submit()

Артефакты, созданные Vertex AI:

Мы можем указать расположение папки pipe_root, где будут храниться все метаданные каждого запуска конвейера, как указано в предыдущем разделе. Ниже приведен скриншот артефактов, сохраняемых для каждого запуска в упомянутой корзине PIPELINE_ROOT:

Возможные способы включения конвейера Vertex AI в общую архитектуру:

  • Конвейеры Vertex AI могут использоваться сами по себе для EDA.
  • Кроме того, весь пайплайн можно сохранить в формате JSON. Этот файл JSON можно хранить в корзине GCS и использовать для запуска конвейера.
  • Для реализации CICD вышеупомянутая сохраненная версия конвейера может быть обновлена ​​или обновлена ​​по мере необходимости.
  • Мы можем использовать облачную функцию, чтобы запустить запуск из сохраненного конвейера JSON.
  • Мы также можем использовать задание облачный планировщик для планирования запуска конвейера; внутри трубопроводной среды или снаружи.

Визуальные эффекты вершинного ИИ:

  • Ниже приведены два снимка экрана выполнения конвейера, где на первом развертывание модели не выполняется, а на втором выполняется:

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

  • Ниже приведен снимок экрана управляемого пользователем блокнота, созданного с учетом его спецификаций:

  • Ниже приведен скриншот модели, созданной в реестре моделей:

  • Ниже приведен скриншот отправки запросов прогнозирования в развернутую модель. Он также должен соответствовать указанному ниже формату (JSON):
{
  "instances":
  [
    [
      619,42,2,0.0,1,1,1,101348.88,0,0,0
    ]
  ]
}

  • Ниже приведен скриншот созданной конечной точки:

Код:

Пожалуйста, найдите весь код для этого блога здесь!

(PS: обратите внимание, что набор данных уже был сохранен в упомянутой корзине GCS)

Лучшие практики:

  • Как упоминалось ранее, ноутбуки запускаются на экземплярах вычислительного механизма, поэтому, когда они не используются, рекомендуется останавливать экземпляр ноутбука, чтобы сэкономить на эксплуатационных расходах базового вычислительного механизма.
  • Мы можем развернуть одну модель на одной конечной точке или несколько моделей на одной конечной точке; но в последнем случае нам нужно соответствующим образом разделить трафик для масштабируемости.
  • Одна конечная точка может использоваться несколько раз. Мы можем отменить развертывание ненужной модели и развернуть новую модель на той же конечной точке; вместо создания нового.
  • Если модель больше не используется, мы должны отменить развертывание модели с конечной точки. Затем мы можем удалить конечную точку. А затем мы можем удалить модель в Vertex AI.
  • Ресурсы Vertex AI могут повлечь за собой значительные затраты, если они оставлены без присмотра в течение длительного времени; поэтому, если они не используются, мы должны удалить соответствующие ресурсы.
  • Цены на Vertex AI: Цены на операции Vertex AI и эквивалентные устаревшие операции одинаковы для каждой операции. Например, если вы обучаете модель с помощью AI Platform Training, стоимость такая же, как и при обучении модели с помощью Vertex AI Training. Если вы используете устаревшие продукты платформы искусственного интеллекта, то выставление счетов может быть выражено в единицах обучения. Vertex Pipelines взимает плату за выполнение в размере 0,03 доллара США за каждый запуск конвейера. Вы также платите за ресурсы Google Cloud, которые используете в Vertex Pipelines, например ресурсы Compute Engine, потребляемые компонентами конвейера. Для получения полной информации о ценах нажмите здесь.

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

Приведенные ниже ссылки являются хорошей отправной точкой для начала работы с Vertex AI: