Vertex AI: обучение и обслуживание пользовательской модели

1. Обзор

В этой лабораторной работе вы будете использовать Vertex AI для обучения и обслуживания модели TensorFlow с использованием кода в пользовательском контейнере.

Хотя здесь мы используем TensorFlow для кода модели, вы можете легко заменить его другой платформой.

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

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

  • Создание и контейнеризация кода обучения модели в Vertex Workbench.
  • Отправьте задание на обучение пользовательской модели в Vertex AI.
  • Разверните обученную модель в конечной точке и используйте эту конечную точку для получения прогнозов.

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

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

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

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

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

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

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

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

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

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

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

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

Шаг 3. Включите API реестра контейнеров.

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

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

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

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

Оттуда в блокнотах, управляемых пользователем , нажмите «Новый блокнот» :

Создать новый блокнот

Затем выберите последнюю версию типа экземпляра TensorFlow Enterprise (с LTS) без графических процессоров :

Экземпляр TFE

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

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

4. Контейнеризация обучающего кода

Мы отправим это задание по обучению в Vertex, поместив наш обучающий код в контейнер Docker и отправив этот контейнер в реестр контейнеров Google . Используя этот подход, мы можем обучить модель, построенную с помощью любого фреймворка.

Для начала в меню Launcher откройте окно терминала в экземпляре вашего ноутбука:

Открыть терминал в блокноте

Создайте новый каталог с именем mpg и перейдите в него:

mkdir mpg
cd mpg

Шаг 1. Создайте файл Dockerfile.

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

touch Dockerfile

Откройте Dockerfile и скопируйте в него следующее:

FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-6
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

Этот Dockerfile использует образ Docker контейнера глубокого обучения TensorFlow Enterprise 2.3 . Контейнеры глубокого обучения в Google Cloud поставляются со многими предустановленными стандартными платформами машинного обучения и обработки данных. Тот, который мы используем, включает TF Enterprise 2.3, Pandas, Scikit-learn и другие. После загрузки этого образа этот Dockerfile устанавливает точку входа для нашего обучающего кода. Мы еще не создали эти файлы — на следующем шаге мы добавим код для обучения и экспорта нашей модели.

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

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

PROJECT_ID='your-cloud-project'

Затем выполните следующую команду в своем терминале, чтобы создать новую корзину в своем проекте. Флаг -l (местоположение) важен, поскольку он должен находиться в том же регионе, где вы развертываете конечную точку модели далее в этом руководстве:

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

Шаг 3. Добавьте код обучения модели

В своем терминале выполните следующую команду, чтобы создать каталог для нашего обучающего кода и файла Python, куда мы добавим код:

mkdir trainer
touch trainer/train.py

Теперь в вашем каталоге mpg/ должно быть следующее:

+ Dockerfile
+ trainer/
    + train.py

Затем откройте только что созданный файл train.py и скопируйте приведенный ниже код (он адаптирован из руководства в документации TensorFlow).

В начале файла обновите переменную BUCKET , указав имя сегмента хранилища, созданного на предыдущем шаге:

import numpy as np
import pandas as pd
import pathlib
import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers

print(tf.__version__)

"""## The Auto MPG dataset

The dataset is available from the [UCI Machine Learning Repository](https://archive.ics.uci.edu/ml/).

### Get the data
First download the dataset.
"""

dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
dataset_path

"""Import it using pandas"""

column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
                'Acceleration', 'Model Year', 'Origin']
dataset = pd.read_csv(dataset_path, names=column_names,
                      na_values = "?", comment='\t',
                      sep=" ", skipinitialspace=True)

dataset.tail()

# TODO: replace `your-gcs-bucket` with the name of the Storage bucket you created earlier
BUCKET = 'gs://your-gcs-bucket'

"""### Clean the data

The dataset contains a few unknown values.
"""

dataset.isna().sum()

"""To keep this initial tutorial simple drop those rows."""

dataset = dataset.dropna()

"""The `"Origin"` column is really categorical, not numeric. So convert that to a one-hot:"""

dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})

dataset = pd.get_dummies(dataset, prefix='', prefix_sep='')
dataset.tail()

"""### Split the data into train and test

Now split the dataset into a training set and a test set.

We will use the test set in the final evaluation of our model.
"""

train_dataset = dataset.sample(frac=0.8,random_state=0)
test_dataset = dataset.drop(train_dataset.index)

"""### Inspect the data

Have a quick look at the joint distribution of a few pairs of columns from the training set.

Also look at the overall statistics:
"""

train_stats = train_dataset.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
train_stats

"""### Split features from labels

Separate the target value, or "label", from the features. This label is the value that you will train the model to predict.
"""

train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')

"""### Normalize the data

Look again at the `train_stats` block above and note how different the ranges of each feature are.

It is good practice to normalize features that use different scales and ranges. Although the model *might* converge without feature normalization, it makes training more difficult, and it makes the resulting model dependent on the choice of units used in the input.

Note: Although we intentionally generate these statistics from only the training dataset, these statistics will also be used to normalize the test dataset. We need to do that to project the test dataset into the same distribution that the model has been trained on.
"""

def norm(x):
  return (x - train_stats['mean']) / train_stats['std']
normed_train_data = norm(train_dataset)
normed_test_data = norm(test_dataset)

"""This normalized data is what we will use to train the model.

Caution: The statistics used to normalize the inputs here (mean and standard deviation) need to be applied to any other data that is fed to the model, along with the one-hot encoding that we did earlier.  That includes the test set as well as live data when the model is used in production.

## The model

### Build the model

Let's build our model. Here, we'll use a `Sequential` model with two densely connected hidden layers, and an output layer that returns a single, continuous value. The model building steps are wrapped in a function, `build_model`, since we'll create a second model, later on.
"""

def build_model():
  model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
  ])

  optimizer = tf.keras.optimizers.RMSprop(0.001)

  model.compile(loss='mse',
                optimizer=optimizer,
                metrics=['mae', 'mse'])
  return model

model = build_model()

"""### Inspect the model

Use the `.summary` method to print a simple description of the model
"""

model.summary()

"""Now try out the model. Take a batch of `10` examples from the training data and call `model.predict` on it.

It seems to be working, and it produces a result of the expected shape and type.

### Train the model

Train the model for 1000 epochs, and record the training and validation accuracy in the `history` object.

Visualize the model's training progress using the stats stored in the `history` object.

This graph shows little improvement, or even degradation in the validation error after about 100 epochs. Let's update the `model.fit` call to automatically stop training when the validation score doesn't improve. We'll use an *EarlyStopping callback* that tests a training condition for  every epoch. If a set amount of epochs elapses without showing improvement, then automatically stop the training.

You can learn more about this callback [here](https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/EarlyStopping).
"""

model = build_model()

EPOCHS = 1000

# The patience parameter is the amount of epochs to check for improvement
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)

early_history = model.fit(normed_train_data, train_labels, 
                    epochs=EPOCHS, validation_split = 0.2, 
                    callbacks=[early_stop])


# Export model and save to GCS
model.save(BUCKET + '/mpg/model')

Шаг 4. Создайте и протестируйте контейнер локально.

В своем терминале определите переменную с URI вашего образа контейнера в реестре контейнеров Google:

IMAGE_URI="gcr.io/$PROJECT_ID/mpg:v1"

Затем создайте контейнер, запустив следующую команду из корня вашего каталога mpg :

docker build ./ -t $IMAGE_URI

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

docker run $IMAGE_URI

Модель должна завершить обучение через 1–2 минуты с точностью проверки около 72 % (точная точность может варьироваться). Когда вы закончите локальный запуск контейнера, отправьте его в реестр контейнеров Google:

docker push $IMAGE_URI

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

5. Запустите обучающее задание на Vertex AI.

Vertex AI предоставляет вам два варианта обучения моделей:

  • AutoML : обучайте высококачественные модели с минимальными усилиями и опытом машинного обучения.
  • Индивидуальное обучение . Запускайте собственные приложения для обучения в облаке, используя один из готовых контейнеров Google Cloud, или используйте свой собственный.

В этой лабораторной работе мы используем специальное обучение через наш собственный контейнер в реестре контейнеров Google. Для начала перейдите в раздел «Модели» в разделе «Вершины» вашей облачной консоли:

Меню вершин

Шаг 1. Приступайте к обучению

Нажмите «Создать» , чтобы ввести параметры задания обучения и развернутой модели:

  • В разделе «Набор данных» выберите «Нет управляемого набора данных».
  • Затем выберите «Индивидуальное обучение (расширенное)» в качестве метода обучения и нажмите « Продолжить» .
  • Нажмите Продолжить

На следующем шаге введите mpg (или как вы хотите назвать свою модель) в поле «Название модели ». Затем выберите Пользовательский контейнер :

Вариант индивидуального контейнера

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

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

В разделе «Расчеты и цены» оставьте выбранный регион без изменений и выберите n1-standard-4 в качестве типа машины:

Тип машины

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

На этапе «Контейнер прогнозирования» выберите «Предварительно созданный контейнер» , а затем выберите «TensorFlow 2.6».

Оставьте настройки по умолчанию для предварительно созданного контейнера как есть. В разделе «Каталог модели» введите сегмент GCS с подкаталогом mpg. Это путь в сценарии обучения модели, по которому вы экспортируете обученную модель:

Настройки прогнозов

Vertex будет искать это место при развертывании вашей модели. Теперь вы готовы к тренировке! Нажмите Начать обучение , чтобы начать обучение. В разделе «Обучение» консоли вы увидите что-то вроде этого:

Учебные вакансии

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

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

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

Шаг 1. Развертывание конечной точки

Когда ваше задание по обучению завершится, вы должны увидеть модель с именем mpg (или как вы ее назвали) в разделе «Модели» вашей консоли:

Завершенные работы

Когда вы выполнили задание по обучению, Vertex создал для вас ресурс модели. Чтобы использовать эту модель, вам необходимо развернуть конечную точку. У вас может быть много конечных точек для каждой модели. Щелкните модель, а затем нажмите «Развернуть в конечной точке» .

Выберите Создать новую конечную точку и дайте ей имя, например v1. Оставьте выбранным «Стандартный» для Access и нажмите « Продолжить» .

Оставьте разделение трафика равным 100 и введите 1 для параметра «Минимальное количество вычислительных узлов» . В разделе «Тип машины» выберите n1-standard-2 (или любой другой тип машины, который вам нужен). Оставьте выбранными остальные значения по умолчанию и нажмите «Продолжить» . Мы не будем включать мониторинг для этой модели, поэтому нажмите «Развернуть» , чтобы начать развертывание конечной точки.

Развертывание конечной точки займет 10–15 минут. По завершении развертывания вы получите электронное письмо. Когда конечная точка завершит развертывание, вы увидите следующее: одна конечная точка развернута под вашим ресурсом модели:

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

Шаг 2. Получите прогнозы по развернутой модели.

Мы получим прогнозы для нашей обученной модели из блокнота Python, используя API Vertex Python. Вернитесь к экземпляру своего блокнота и создайте блокнот Python 3 с помощью панели запуска:

Открыть блокнот

В своем блокноте выполните следующую команду в ячейке, чтобы установить Vertex AI SDK:

!pip3 install google-cloud-aiplatform --upgrade --user

Затем добавьте ячейку в свой блокнот для импорта SDK и создайте ссылку на только что развернутую конечную точку:

from google.cloud import aiplatform

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/YOUR-PROJECT-NUMBER/locations/us-central1/endpoints/YOUR-ENDPOINT-ID"
)

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

Вы можете найти свой идентификатор конечной точки в разделе конечных точек консоли здесь:

Найдите идентификатор конечной точки

Наконец, сделайте прогноз для своей конечной точки, скопировав и запустив приведенный ниже код в новой ячейке:

test_mpg = [1.4838871833555929,
 1.8659883497083019,
 2.234620276849616,
 1.0187816540094903,
 -2.530890710602246,
 -1.6046416850441676,
 -0.4651483719733302,
 -0.4952254087173721,
 0.7746763768735953]

response = endpoint.predict([test_mpg])

print('API response: ', response)

print('Predicted MPG: ', response.predictions[0][0])

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

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

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

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

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

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

7. Очистка

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

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

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

Удалить конечную точку

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

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