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, а также включает другие новые продукты. Вы также можете перенести существующие проекты в Vertex AI. Если у вас есть какие-либо замечания, пожалуйста, посетите страницу поддержки .

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

Обзор продукции Vertex

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

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

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

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

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

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

Панель мониторинга Vertex AI

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

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

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

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

Меню Vertex AI

Затем в разделе «Управляемые пользователем блокноты» нажмите «Создать блокнот» :

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

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

экземпляр TFE

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

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

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

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

Для начала откройте окно Терминала в вашем ноутбуке из меню «Запуск»:

Откройте терминал в ноутбуке.

Создайте новую директорию с именем mpg и перейдите в неё с помощью команды cd:

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 в хранилище Cloud Storage. Vertex будет использовать это хранилище для чтения экспортированных ресурсов модели и развертывания модели. В терминале выполните следующую команду, чтобы определить переменную окружения для вашего проекта, заменив 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 Container Registry:

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

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

docker build ./ -t $IMAGE_URI

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

docker run $IMAGE_URI

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

docker push $IMAGE_URI

После загрузки нашего контейнера в Container Registry мы готовы запустить задачу обучения пользовательской модели.

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

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

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

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

Меню вершин

Шаг 1: Начните обучение.

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

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

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

Вариант пользовательского контейнера

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

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

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

Тип машины

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

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

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

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

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

Обучение на рабочем месте

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

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

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

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

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

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

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

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

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

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

Развернуть на конечной точке

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

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

Откройте блокнот

Для установки SDK Vertex AI в вашей записной книжке выполните следующую команду в отдельной ячейке:

!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, щелкните по созданной вами конечной точке, а затем выберите «Удалить модель из конечной точки» :

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

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

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