Создайте и разверните модель с помощью Vertex AI.

1. Обзор

В этой лабораторной работе вы узнаете, как использовать Vertex AI — недавно анонсированную управляемую платформу машинного обучения Google Cloud — для создания комплексных рабочих процессов машинного обучения. Вы узнаете, как перейти от необработанных данных к развернутой модели, и покинете этот семинар, готовые к разработке и реализации собственных проектов машинного обучения с помощью Vertex AI. В этой лабораторной работе мы используем Cloud Shell для создания собственного образа Docker для демонстрации пользовательских контейнеров для обучения с помощью Vertex AI.

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

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

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

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

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

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

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

Vertex включает в себя множество различных инструментов, которые помогут вам на каждом этапе рабочего процесса ML, как вы можете видеть на диаграмме ниже. Мы сосредоточимся на использовании Vertex Training and Prediction , как показано ниже.

Сервисы вершин

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

Самостоятельная настройка среды

Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .)

Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!).

Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Шаг 1. Запустите Cloud Shell

В этой лабораторной работе вы будете работать в сеансе Cloud Shell , который представляет собой интерпретатор команд, размещенный на виртуальной машине, работающей в облаке Google. Вы также можете легко запустить этот раздел локально на своем компьютере, но использование Cloud Shell дает каждому доступ к воспроизводимому опыту в согласованной среде. После лабораторной работы вы можете повторить этот раздел на своем компьютере.

Авторизовать облачную оболочку

Активировать Cloud Shell

В правом верхнем углу Cloud Console нажмите кнопку ниже, чтобы активировать Cloud Shell :

Активировать Cloud Shell

Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:

Настройка Cloud Shell

Подготовка и подключение к Cloud Shell займет всего несколько минут.

Инициализация Cloud Shell

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или Chromebook.

После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта уже установлен идентификатор вашего проекта.

Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:

gcloud auth list

Вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:

gcloud config list project

Вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью этой команды:

gcloud config set project <PROJECT_ID>

Вывод команды

Updated property [core/project].

Cloud Shell имеет несколько переменных среды, включая GOOGLE_CLOUD_PROJECT , которая содержит имя нашего текущего проекта Cloud. Мы будем использовать это в разных местах этой лабораторной работы. Вы можете увидеть это, запустив:

echo $GOOGLE_CLOUD_PROJECT

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

На последующих шагах вы увидите, где нужны эти службы (и почему), а пока запустите эту команду, чтобы предоставить вашему проекту доступ к службам Compute Engine, Container Registry и Vertex AI:

gcloud services enable compute.googleapis.com         \
                       containerregistry.googleapis.com  \
                       aiplatform.googleapis.com

Это должно привести к успешному сообщению, похожему на это:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

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

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

BUCKET_NAME=gs://$GOOGLE_CLOUD_PROJECT-bucket
gsutil mb -l us-central1 $BUCKET_NAME

Шаг 4: Псевдоним Python 3

В коде этой лабораторной работы используется Python 3. Чтобы убедиться, что вы используете Python 3 при запуске скриптов, которые вы создадите в этой лабораторной работе, создайте псевдоним, выполнив в Cloud Shell следующую команду:

alias python=python3

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

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

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

Шаг 1. Настройте файлы

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

mkdir mpg
cd mpg
touch Dockerfile
mkdir trainer
touch trainer/train.py

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

+ Dockerfile
+ trainer/
    + train.py

Для просмотра и редактирования этих файлов мы будем использовать встроенный редактор кода Cloud Shell. Вы можете переключаться между редактором и терминалом, нажимая кнопку в верхней правой строке меню Cloud Shell:

Переключиться на редактор в Cloud Shell

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

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

В редакторе файлов Cloud Shell откройте каталог mpg/ и дважды щелкните его, чтобы открыть Dockerfile:

Открыть Докерфайл

Затем скопируйте в этот файл следующее:

FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-3
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 устанавливает точку входа для нашего обучающего кода, который мы добавим на следующем шаге.

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

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

# This will be replaced with your bucket name after running the `sed` command in the tutorial
BUCKET = "BUCKET_NAME"

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.
"""

"""Import it using pandas"""

dataset_path = "https://storage.googleapis.com/io-vertex-codelab/auto-mpg.csv"
dataset = pd.read_csv(dataset_path, na_values = "?")

dataset.tail()

"""### 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')

Скопировав приведенный выше код в файл mpg/trainer/train.py , вернитесь в терминал в Cloud Shell и выполните следующую команду, чтобы добавить в файл собственное имя корзины:

sed -i "s|BUCKET_NAME|$BUCKET_NAME|g" trainer/train.py

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

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

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

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

docker build ./ -t $IMAGE_URI

После создания контейнера отправьте его в реестр контейнеров Google:

docker push $IMAGE_URI

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

Предварительный просмотр реестра контейнеров

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

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

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

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

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

Боковое меню Vertex — обучение

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

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

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

На шаге «Настройки контейнера» выберите «Пользовательский контейнер» :

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

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

Найти контейнер

Остальные поля оставьте пустыми и нажмите «Продолжить» .

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

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

Тип машины

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

На этапе «Контейнер прогнозирования» выберите «Без контейнера прогнозирования» :

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

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

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

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

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

Шаг 1. Установите Vertex SDK

На терминале Cloud Shell выполните следующую команду, чтобы установить Vertex AI SDK:

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

Мы можем использовать этот SDK для взаимодействия со многими различными частями Vertex.

Шаг 2. Создайте модель и разверните конечную точку.

Далее мы создадим файл Python и воспользуемся SDK для создания ресурса модели и его развертывания в конечной точке. В редакторе файлов в Cloud Shell выберите «Файл» , а затем «Новый файл» :

Новый файл в Cloud Shell

Назовите файл deploy.py . Откройте этот файл в редакторе и скопируйте следующий код:

from google.cloud import aiplatform

# Create a model resource from public model assets
model = aiplatform.Model.upload(
    display_name="mpg-imported",
    artifact_uri="gs://io-vertex-codelab/mpg-model/",
    serving_container_image_uri="gcr.io/cloud-aiplatform/prediction/tf2-cpu.2-3:latest"
)

# Deploy the above model to an endpoint
endpoint = model.deploy(
    machine_type="n1-standard-4"
)

Затем вернитесь к терминалу в Cloud Shell, cd в корневой каталог и запустите только что созданный скрипт Python:

cd ..
python3 deploy.py | tee deploy-output.txt

Вы увидите обновления, зарегистрированные на вашем терминале, по мере создания ресурсов. Это займет 10-15 минут. Чтобы убедиться, что все работает правильно, перейдите в раздел «Модели» консоли в Vertex AI:

Модель в консоли Vertex

Нажмите «MGP-imported» , и вы увидите конечную точку для создаваемой модели:

Ожидающая конечная точка

После завершения развертывания конечной точки в терминале Cloud Shell вы увидите примерно следующий журнал:

Endpoint model deployed. Resource name: projects/your-project-id/locations/us-central1/endpoints/your-endpoint-id

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

Шаг 3. Получите прогнозы по развернутой конечной точке.

В редакторе Cloud Shell создайте новый файл с именем predict.py :

Создать файл прогноза

Откройте predict.py и вставьте в него следующий код:

from google.cloud import aiplatform

endpoint = aiplatform.Endpoint(
    endpoint_name="ENDPOINT_STRING"
)

# A test example we'll send to our model for prediction
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])

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

ENDPOINT=$(cat deploy-output.txt | sed -nre 's:.*Resource name\: (.*):\1:p' | tail -1)
sed -i "s|ENDPOINT_STRING|$ENDPOINT|g" predict.py

Теперь пришло время запустить файл predict.py , чтобы получить прогноз от конечной точки нашей развернутой модели:

python3 predict.py

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

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

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

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

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

7. Очистка

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

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

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

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