Vertex AI — это служба в Google Cloud Platform, которая включает в себя несколько служб, необходимых для обеспечения выполнения всех ваших шагов в сквозном жизненном цикле машинного обучения. Начиная с наборов данных и заканчивая обслуживанием всех ваших прогнозов в Интернете. Если вы не слышали об этом или не использовали его, есть несколько ресурсов, которые помогут вам начать работу. Это идеальное универсальное решение для всех ваших потребностей в разработке и развертывании машинного обучения.

Проблема

Недавно я столкнулся с проблемой, когда пытался развернуть модель машинного обучения на конечной точке в Vertex. Те из вас, кто работал с вершинами и развертывал модели на конечных точках, знают, что по умолчанию вершина предполагает, что развернутая модель будет иметь метод прогнозирования. Но не все варианты использования требуют, чтобы это было так. Например, модель сходства изображений, которая принимает извлеченные функции (вложения) изображения и находит похожие изображения с использованием алгоритма ближайших соседей k-NN, требует model.kneighbors для получения результатов результатов. Здесь нет нужды в предсказаниях. Кто-то может возразить, что у вершины есть Matching Engine API, созданный специально для этих случаев использования. Хотя мы можем это использовать, мы потратили время и усилия на создание собственной пользовательской модели и не хотели бы ничего, кроме как развернуть ее и получить прогнозы.

Решение

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

Пользовательские процедуры прогнозирования позволяют определить, какой код запускается при отправке запроса онлайн-прогнозирования в AI Platform Prediction.

Документация Google по Vertex AI CPR хорошо документирована для справки. Но есть также пошаговый подход к использованию CPR в codelab, который был чрезвычайно полезен, и именно на него я буду ссылаться здесь. Мы будем работать с шага 6, поскольку все предыдущие шаги сосредоточены на части обучения модели.

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

  1. Сервер моделей
  2. Обработчик запросов
  3. Предиктор

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

Мы можем сосредоточиться только на части Predictor для этого примера и оставить сервер модели и обработчик запросов по умолчанию. Но его всегда можно изменить в соответствии с нашим вариантом использования. Помимо этого понимания, эти компоненты дают более глубокое понимание того, как вершина работает внутри. Но пока достаточно изменить только предикторную часть. Мы можем найти образцы predictor.py по умолчанию для различных сред, которые у нас есть, и внести только необходимые изменения.

В приведенном выше фрагменте кода мы видим, что мы добавили необходимую библиотеку kneighbors. И в методе прогнозирования мы вызвали метод kneighbors вместо метода прогнозирования. Мы возвращаем результаты прогнозирования в виде массива, поскольку результаты прогнозирования для kneighbors будут кортежем, и в методе постобработки нам придется возвращать результаты в виде списка, а у кортежа нет атрибута для списка. Это простое изменение в нашем коде поможет нам избежать многих осложнений и изменений, которые необходимо внести во все решение. Теперь, когда у нас есть готовый predictor.py, мы можем поместить наш код в контейнер и создать образ.

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 SklearnPredictor 
USER_SRC_DIR = 'path to the src_dir'
local_model = LocalModel.build_cpr_model(
    USER_SRC_DIR,
    f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
    predictor= SklearnPredictor,
    requirements_path=os.path.join(USER_SRC_DIR, "requirements.txt"),
)

Приведенный выше фрагмент кода, в котором мы используем метод LocalModel.build_cpr_model, позаботится о создании образа и его отправке в реестр артефактов. Просто обязательно прочитайте статью из лаборатории кода один раз (шаг 5), чтобы убедиться, что у вас есть все необходимые файлы и готовая файловая структура.

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

  1. Мы можем сделать это на этапе обучения, если вы обучаете свою модель.
  2. Или мы можем импортировать его напрямую через службу реестра моделей, если у вас уже есть готовая модель.

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

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

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

Развертывание конечной точки

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

Затем вы выбираете модель для развертывания, версию и разделение трафика, а также любые дополнительные параметры масштабирования.

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

Мы ждем несколько минут, пока вершина подготовит машину и проверит ваше развертывание.

from google.cloud import aiplatform
endpoint = aiplatform.Endpoint(
    endpoint_name="projects/xxxxxxxxx/locations/us-central1/endpoints/endpointID"
)
response1 = endpoint.predict([image_embeddings])
print('API response: ', response1)
API response:  Prediction(predictions=[[[1.030552931855722e-06, 0.4993490994742281, 0.6216443753085811, 0.6373535585867225, 0.6379856081410106, 0.6472531441836683]], [[774.0, 1583.0, 994.0, 531.0, 553.0, 108.0]]], deployed_model_id='deployed_model_id', model_version_id='1', model_resource_name='projects/xxxxxxxxx/locations/us-central1/models/', explanations=None)

И вот мы получили результаты нашего прогноза, как и ожидали. Надеюсь, это было полезно!

Спасибо и удачного кодирования!!! 😄