Vertex AI: используйте пользовательские процедуры прогнозирования со Sklearn для предварительной и постобработки данных для прогнозов.

1. Обзор

В этой лабораторной работе вы узнаете, как использовать собственные процедуры прогнозирования в Vertex AI для написания собственной логики предварительной и постобработки. Хотя в этом примере используется Scikit-learn, пользовательские процедуры прогнозирования могут работать с другими платформами машинного обучения Python, такими как XGBoost, PyTorch и TensorFlow.

Что вы узнаете

Вы узнаете, как:

  • Напишите собственную логику прогнозирования с помощью пользовательских процедур прогнозирования.
  • Протестируйте пользовательский обслуживающий контейнер и модель локально.
  • Протестируйте пользовательский обслуживающий контейнер в Vertex AI Predictions

Общая стоимость запуска этой лаборатории в Google Cloud составляет около 1 доллара США.

2. Знакомство с Vertex AI

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

Vertex AI включает в себя множество различных продуктов для поддержки комплексных рабочих процессов машинного обучения. Эта лабораторная работа будет сосредоточена на прогнозах и Workbench .

Обзор продукта Vertex

3. Обзор вариантов использования

Вариант использования

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

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

Введение в пользовательские процедуры прогнозирования

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

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

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

4. Настройте свою среду

Для запуска этой лаборатории кода вам понадобится проект Google Cloud Platform с включенной оплатой. Чтобы создать проект, следуйте инструкциям здесь .

Шаг 1. Включите API Compute Engine.

Перейдите к Compute Engine и выберите «Включить» , если он еще не включен. Это понадобится вам для создания экземпляра блокнота.

Шаг 2. Включите API реестра артефактов.

Перейдите в реестр артефактов и выберите «Включить» , если это еще не сделано. Вы будете использовать это для создания пользовательского обслуживающего контейнера.

Шаг 3. Включите API Vertex AI.

Перейдите в раздел Vertex AI в облачной консоли и нажмите «Включить Vertex AI API» .

Панель управления Vertex AI

Шаг 4. Создайте экземпляр Vertex AI Workbench.

В разделе Vertex AI облачной консоли нажмите Workbench:

Меню вершинного AI

Включите API ноутбуков, если это еще не сделано.

Notebook_api

После включения нажмите ЭКСПРЕССЫ , а затем выберите СОЗДАТЬ НОВЫЙ .

Примите параметры по умолчанию и нажмите «Создать» .

Когда экземпляр будет готов, нажмите OPEN JUPYTERLAB, чтобы открыть его.

5. Напишите обучающий код

Шаг 1. Создайте сегмент облачного хранилища.

Вы сохраните модель и артефакты предварительной обработки в сегменте Cloud Storage. Если в вашем проекте уже есть сегмент, который вы хотите использовать, вы можете пропустить этот шаг.

В панели запуска откройте новый сеанс терминала.

Open_terminal

На своем терминале выполните следующую команду, чтобы определить переменную env для вашего проекта, обязательно заменяя your-cloud-project идентификатором вашего проекта:

PROJECT_ID='your-cloud-project'

Затем выполните следующую команду в своем терминале, чтобы создать новую корзину в своем проекте.

BUCKET="gs://${PROJECT_ID}-cpr-bucket"
gsutil mb -l us-central1 $BUCKET

Шаг 2: Модель поезда

В терминале создайте новый каталог с именем cpr-codelab и перейдите в него.

mkdir cpr-codelab
cd cpr-codelab

В браузере файлов перейдите в новый каталог cpr-codelab , а затем с помощью средства запуска создайте новый блокнот Python 3 с именем task.ipynb .

файл_браузер

Ваш каталог cpr-codelab теперь должен выглядеть так:

+ cpr-codelab/
    + task.ipynb

В блокноте вставьте следующий код.

Сначала напишите файл requirements.txt .

%%writefile requirements.txt
fastapi
uvicorn==0.17.6
joblib~=1.0
numpy~=1.20
scikit-learn>=1.2.2
pandas
google-cloud-storage>=1.26.0,<2.0.0dev
google-cloud-aiplatform[prediction]>=1.16.0

В развертываемой вами модели будет предустановлен другой набор зависимостей, чем в среде вашего блокнота. По этой причине вам потребуется перечислить все зависимости модели в requirements.txt , а затем использовать pip для установки тех же зависимостей в блокнот. Позже вы протестируете модель локально перед ее развертыванием в Vertex AI, чтобы дважды проверить соответствие сред.

Pip установит зависимости в блокнот.

!pip install -U --user -r requirements.txt

Обратите внимание, что вам нужно будет перезапустить ядро ​​после завершения установки pip.

restart_kernel

Затем создайте каталоги, в которых вы будете хранить модель и артефакты предварительной обработки.

USER_SRC_DIR = "src_dir"
!mkdir $USER_SRC_DIR
!mkdir model_artifacts

# copy the requirements to the source dir
!cp requirements.txt $USER_SRC_DIR/requirements.txt

Ваш каталог cpr-codelab теперь должен выглядеть так:

+ cpr-codelab/
    + model_artifacts/
    + scr_dir/
        + requirements.txt
    + task.ipynb
    + requirements.txt

Теперь, когда структура каталогов настроена, пришло время обучить модель!

Сначала импортируйте библиотеки.

import seaborn as sns
import numpy as np
import pandas as pd

from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer

import joblib
import logging

# set logging to see the docker container logs
logging.basicConfig(level=logging.INFO)

Затем определите следующие переменные. Обязательно замените PROJECT_ID идентификатором вашего проекта, а BUCKET_NAME сегментом, созданным на предыдущем шаге.

REGION = "us-central1"
MODEL_ARTIFACT_DIR = "sklearn-model-artifacts"
REPOSITORY = "diamonds"
IMAGE = "sklearn-image"
MODEL_DISPLAY_NAME = "diamonds-cpr"

# Replace with your project
PROJECT_ID = "{PROJECT_ID}"

# Replace with your bucket
BUCKET_NAME = "gs://{BUCKET_NAME}"

Загрузите данные из библиотеки seaborn, а затем создайте два фрейма данных: один с объектами, а другой с меткой.

data = sns.load_dataset('diamonds', cache=True, data_home=None)

label = 'price'

y_train = data['price']
x_train = data.drop(columns=['price'])

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

x_train.head()

И этикетки с соответствующими ценами.

y_train.head()

Теперь определите преобразование столбца sklearn для одного горячего кодирования категориальных функций и масштабирования числовых функций.

column_transform = make_column_transformer(
    (preprocessing.OneHotEncoder(), [1,2,3]),
    (preprocessing.StandardScaler(), [0,4,5,6,7,8]))

Определите модель случайного леса

regr = RandomForestRegressor(max_depth=10, random_state=0)

Далее делаем sklearn-конвейер . Это означает, что данные, подаваемые в этот конвейер, сначала будут закодированы/масштабированы, а затем переданы в модель.

my_pipeline = make_pipeline(column_transform, regr)

Подгоните конвейер к обучающим данным

my_pipeline.fit(x_train, y_train)

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

my_pipeline.predict([[0.23, 'Ideal', 'E', 'SI2', 61.5, 55.0, 3.95, 3.98, 2.43]])

Теперь мы можем сохранить конвейер в каталоге model_artifacts и скопировать его в корзину Cloud Storage.

joblib.dump(my_pipeline, 'model_artifacts/model.joblib')

!gsutil cp model_artifacts/model.joblib {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/

Шаг 3. Сохраните артефакт предварительной обработки

Далее вы создадите артефакт предварительной обработки. Этот артефакт будет загружен в пользовательский контейнер при запуске сервера модели. Артефакт предварительной обработки может иметь практически любую форму (например, файл рассола), но в этом случае вы запишете словарь в файл JSON.

clarity_dict={"Flawless": "FL",
              "Internally Flawless": "IF",
              "Very Very Slightly Included": "VVS1",
              "Very Slightly Included": "VS2",
              "Slightly Included": "S12",
              "Included": "I3"}

Показатель clarity в наших тренировочных данных всегда был в сокращенной форме (т. е. «FL» вместо «Безупречный»). Во время обслуживания мы хотим проверить, что данные для этой функции также сокращены. Это потому, что наша модель умеет горячо кодировать «FL», но не «Безупречно». Эту пользовательскую логику предварительной обработки вы напишете позже. А пока просто сохраните эту таблицу поиска в файле JSON, а затем запишите ее в корзину Cloud Storage.

import json
with open("model_artifacts/preprocessor.json", "w") as f:
    json.dump(clarity_dict, f)

!gsutil cp model_artifacts/preprocessor.json {BUCKET_NAME}/{MODEL_ARTIFACT_DIR}/

Ваш локальный каталог cpr-codelab теперь должен выглядеть так:

+ cpr-codelab/
    + model_artifacts/
        + model.joblib
        + preprocessor.json
    + scr_dir/
        + requirements.txt
    + task.ipynb
    + requirements.txt

6. Создайте собственный контейнер обслуживания, используя сервер модели CPR.

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

Пользовательский обслуживающий контейнер содержит следующие три фрагмента кода:

  1. Сервер модели (он будет создан автоматически SDK и сохранен в scr_dir/ )
    • HTTP-сервер, на котором размещена модель
    • Отвечает за настройку маршрутов/портов/и т.д.
  2. Обработчик запросов
    • Отвечает за аспекты обработки запроса веб-сервером, такие как десериализация тела запроса и сериализация ответа, установка заголовков ответа и т. д.
    • В этом примере вы будете использовать обработчик по умолчанию google.cloud.aiplatform.prediction.handler.PredictionHandler , предоставленный в SDK.
  3. Предсказатель
    • Отвечает за логику ML для обработки запроса прогнозирования.

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

Предиктор отвечает за логику машинного обучения для обработки запроса прогнозирования, например пользовательскую предварительную и постобработку. Чтобы написать собственную логику прогнозирования, вы создадите подкласс интерфейса Vertex AI Predictor.

Этот выпуск пользовательских процедур прогнозирования поставляется с многоразовыми предикторами XGBoost и Sklearn, но если вам нужно использовать другую структуру, вы можете создать свою собственную, создав подкласс базового предиктора.

Ниже вы можете увидеть пример предиктора Sklearn . Это весь код, который вам нужно будет написать для создания сервера собственной модели.

sklearn_predictor

Вставьте в свой блокнот приведенный ниже код, чтобы создать подкласс SklearnPredictor , и запишите его в файл Python в src_dir/ . Обратите внимание, что в этом примере мы настраиваем только методы load , preprocess и postprocess , но не метод predict .

%%writefile $USER_SRC_DIR/predictor.py

import joblib
import numpy as np
import json

from google.cloud import storage
from google.cloud.aiplatform.prediction.sklearn.predictor import SklearnPredictor


class CprPredictor(SklearnPredictor):

    def __init__(self):
        return

    def load(self, artifacts_uri: str) -> None:
        """Loads the sklearn pipeline and preprocessing artifact."""

        super().load(artifacts_uri)

        # open preprocessing artifact
        with open("preprocessor.json", "rb") as f:
            self._preprocessor = json.load(f)


    def preprocess(self, prediction_input: np.ndarray) -> np.ndarray:
        """Performs preprocessing by checking if clarity feature is in abbreviated form."""

        inputs = super().preprocess(prediction_input)

        for sample in inputs:
            if sample[3] not in self._preprocessor.values():
                sample[3] = self._preprocessor[sample[3]]
        return inputs

    def postprocess(self, prediction_results: np.ndarray) -> dict:
        """Performs postprocessing by rounding predictions and converting to str."""

        return {"predictions": [f"${value}" for value in np.round(prediction_results)]}

Давайте более подробно рассмотрим каждый из этих методов.

  • метод load загружает артефакт предварительной обработки, который в данном случае представляет собой словарь, сопоставляющий значения чистоты алмаза с их сокращениями.
  • метод preprocess использует этот артефакт, чтобы гарантировать, что во время обслуживания признак ясности будет в сокращенном формате. Если нет, он преобразует полную строку в ее сокращение.
  • метод postprocess возвращает прогнозируемое значение в виде строки со знаком $ и округляет значение.

Затем используйте Vertex AI Python SDK для создания образа. Используя пользовательские процедуры прогнозирования, будет сгенерирован Dockerfile и создан образ.

from google.cloud import aiplatform

aiplatform.init(project=PROJECT_ID, location=REGION)

import os

from google.cloud.aiplatform.prediction import LocalModel

from src_dir.predictor import CprPredictor  # Should be path of variable $USER_SRC_DIR

local_model = LocalModel.build_cpr_model(
    USER_SRC_DIR,
    f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
    predictor=CprPredictor,
    requirements_path=os.path.join(USER_SRC_DIR, "requirements.txt"),
)

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

import json

sample = {"instances": [
  [0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
  [0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}

with open('instances.json', 'w') as fp:
    json.dump(sample, fp)

Протестируйте контейнер локально, развернув локальную модель.

with local_model.deploy_to_local_endpoint(
    artifact_uri = 'model_artifacts/', # local path to artifacts
) as local_endpoint:
    predict_response = local_endpoint.predict(
        request_file='instances.json',
        headers={"Content-Type": "application/json"},
    )

    health_check_response = local_endpoint.run_health_check()

Посмотреть результаты прогноза можно с помощью:

predict_response.content

7. Развертывание модели в Vertex AI.

Теперь, когда вы протестировали контейнер локально, пришло время отправить изображение в реестр артефактов и загрузить модель в реестр моделей Vertex AI.

Сначала настройте Docker для доступа к реестру артефактов.

!gcloud artifacts repositories create {REPOSITORY} --repository-format=docker \
--location=us-central1 --description="Docker repository"


!gcloud auth configure-docker {REGION}-docker.pkg.dev --quiet

Затем нажмите на изображение.

local_model.push_image()

И загрузите модель.

model = aiplatform.Model.upload(local_model = local_model,
                                display_name=MODEL_DISPLAY_NAME,
                                artifact_uri=f"{BUCKET_NAME}/{MODEL_ARTIFACT_DIR}",)

Когда модель будет загружена, вы должны увидеть ее в консоли:

model_registry

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

endpoint = model.deploy(machine_type="n1-standard-2")

Наконец, протестируйте развернутую модель, получив прогноз.

endpoint.predict(instances=[[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43]])

🎉Поздравляем! 🎉

Вы узнали, как использовать Vertex AI, чтобы:

  • Напишите собственную логику предварительной и постобработки с помощью пользовательских процедур прогнозирования.

Чтобы узнать больше о различных частях Vertex AI, ознакомьтесь с документацией .

8. Очистка

Если вы хотите продолжать использовать записную книжку, созданную в ходе этой лабораторной работы, рекомендуется выключать ее, когда она не используется. В пользовательском интерфейсе Workbench в Google Cloud Console выберите блокнот и нажмите «Стоп» .

Если вы хотите полностью удалить блокнот, нажмите кнопку «Удалить» в правом верхнем углу.

Стоп_нб

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

delete_endpoint

Чтобы удалить образ контейнера, перейдите в реестр артефактов, выберите созданный вами репозиторий и нажмите «Удалить» .

delete_image

Чтобы удалить сегмент хранилища, в меню навигации облачной консоли перейдите к разделу «Хранилище», выберите сегмент и нажмите «Удалить» :

Удалить хранилище