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

1. Обзор

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

Эта лабораторная работа является частью видеосерии «От прототипа к производству» . Вы создадите модель классификации изображений, используя набор данных Flowers . Для получения дополнительной информации вы можете посмотреть прилагаемое видео:

.

Чему вы научитесь

Вы научитесь:

  • Создайте управляемый блокнот Vertex AI Workbench.
  • Настройте и запустите пользовательское задание обучения из пользовательского интерфейса Vertex AI.
  • Настройте и запустите пользовательское задание обучения с помощью Python SDK от Vertex AI.

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

2. Введение в Vertex AI

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Меню Vertex AI

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

Notebook_api

После включения нажмите «УПРАВЛЯЕМЫЕ ЗАПИСНЫЕ КНИЖКИ» :

Notebooks_UI

Затем выберите «Создать новый блокнот» .

новый_ноутбук

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

создать_блокнот

Выберите «Расширенные настройки» .

В разделе «Безопасность» выберите «Включить терминал», если он еще не включен.

enable_terminal

Все остальные расширенные настройки можно оставить без изменений.

Далее нажмите «Создать» . Создание экземпляра займет несколько минут.

После создания экземпляра выберите «ОТКРЫТЬ JUPYTERLAB» .

open_jupyterlab

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

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

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

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

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

В этой задаче по обучению вам нужно будет экспортировать обученную модель TensorFlow в хранилище Cloud Storage. Вы также будете хранить данные для обучения в хранилище Cloud Storage.

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

PROJECT_ID='your-cloud-project'

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

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

Шаг 2: Скопируйте данные в хранилище Cloud Storage.

Нам нужно загрузить наш набор данных о цветах в Cloud Storage. В демонстрационных целях сначала загрузите набор данных в этот экземпляр Workbench, а затем скопируйте его в хранилище (bucket).

Скачайте и распакуйте архив с данными.

wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz

Затем скопируйте его в только что созданный вами бакет. Мы добавляем параметр -r, потому что хотим скопировать всю директорию целиком, и -m для выполнения многопроцессорного копирования, что ускорит процесс.

gsutil -m cp -r flower_photos $BUCKET

Шаг 3: Напишите код для обучения.

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

mkdir flowers
cd flowers

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

mkdir trainer
touch trainer/task.py

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

+ trainer/
    + task.py

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

Далее откройте только что созданный файл task.py и скопируйте приведенный ниже код.

Вам нужно заменить {your-gcs-bucket} на имя созданного вами хранилища Cloud Storage.

С помощью инструмента Cloud Storage FUSE обучающие задачи на платформе Vertex AI Training могут получать доступ к данным в Cloud Storage в виде файлов в локальной файловой системе. При запуске пользовательской обучающей задачи она видит каталог /gcs , содержащий все ваши сегменты Cloud Storage в качестве подкаталогов. Именно поэтому пути к данным в коде обучения начинаются с /gcs .

import tensorflow as tf
import numpy as np
import os

## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'

# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32

IMG_HEIGHT = 180
IMG_WIDTH = 180

DATA_DIR = f'{BUCKET_ROOT}/flower_photos'

def create_datasets(data_dir, batch_size):
  '''Creates train and validation datasets.'''
  
  train_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  validation_dataset = tf.keras.utils.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=123,
    image_size=(IMG_HEIGHT, IMG_WIDTH),
    batch_size=batch_size)

  train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
  validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

  return train_dataset, validation_dataset


def create_model():
  '''Creates model.'''

  model = tf.keras.Sequential([
    tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
    tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
    tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
    tf.keras.layers.MaxPooling2D(),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
  ])
  return model

# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)

# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])

# TRAIN MODEL
history = model.fit(
  train_dataset,
  validation_data=validation_dataset,
  epochs=EPOCHS
)

# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')

Шаг 4: Создайте Dockerfile.

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

В терминале создайте пустой Dockerfile в корневом каталоге вашего проекта flowers:

touch Dockerfile

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

+ Dockerfile
+ trainer/
    + task.py

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

FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8

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

Давайте рассмотрим команды в этом файле.

Команда FROM указывает базовый образ, который является родительским образом, на основе которого будет создан создаваемый вами образ. В качестве базового образа вы будете использовать образ Docker Deep Learning Container TensorFlow Enterprise 2.8 GPU . Контейнеры глубокого обучения в Google Cloud поставляются со многими распространенными фреймворками для машинного обучения и анализа данных, предварительно установленными.

Команда WORKDIR указывает каталог на образе, в котором выполняются последующие инструкции.

Команда COPY копирует код обучения в образ Docker. Обратите внимание, что в этом примере у нас в каталоге trainer находится только один файл Python, но в более реалистичном примере у вас, вероятно, будет больше файлов. Возможно, один с именем data.py , который обрабатывает предварительную обработку данных, и один с именем model.py , который содержит только код модели и т. д. Для более сложного кода обучения ознакомьтесь с документацией Python по упаковке проектов Python.

Если вам нужно добавить какие-либо дополнительные библиотеки, вы можете использовать команду RUN для установки pip (например: RUN pip install -r requirements.txt ). Но для нашего примера нам ничего дополнительного не нужно.

Наконец, команда ENTRYPOINT устанавливает точку входа для запуска программы обучения. Именно она будет выполняться при запуске нашей задачи обучения. В нашем случае это выполнение файла task.py

Подробнее о написании Docker-файлов для обучения Vertex AI можно узнать здесь.

Шаг 4: Создайте контейнер

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

PROJECT_ID='your-cloud-project'

Создайте репозиторий в реестре артефактов.

REPO_NAME='flower-app'

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"

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

IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest

Настройка Docker

gcloud auth configure-docker \
    us-central1-docker.pkg.dev

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

docker build ./ -t $IMAGE_URI

Наконец, отправьте его в Реестр артефактов:

docker push $IMAGE_URI

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

5. Запустите пользовательское задание обучения на Vertex AI.

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

Для начала перейдите в раздел «Обучение» в разделе Vertex вашей облачной консоли:

меню поезда

Шаг 1: Настройка задания обучения

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

создать_обучение

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

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

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

В первом поле ( Образ контейнера ) введите значение вашей переменной IMAGE_URI из предыдущего раздела. Оно должно быть следующим: us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest , указав идентификатор вашего проекта. Оставьте остальные поля пустыми и нажмите «Продолжить» .

Чтобы пропустить шаг с гиперпараметрами, снова нажмите кнопку «Продолжить» .

Шаг 2: Настройка вычислительного кластера

Настройте пул рабочих процессов 0 следующим образом:

worker_pool_0

Шаг 6 пока пропустите, а настройку контейнера прогнозирования вы выполните в следующей лабораторной работе из этой серии.

Нажмите кнопку «НАЧАТЬ ОБУЧЕНИЕ» , чтобы запустить процесс обучения. В разделе «Обучение» вашей консоли на вкладке «КОНВЕЙЕРЫ ОБУЧЕНИЯ» вы увидите только что запущенное задание:

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

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

Вы научились использовать Vertex AI для:

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

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

6. [Необязательно] Используйте Python SDK от Vertex AI.

В предыдущем разделе было показано, как запустить задачу обучения через пользовательский интерфейс. В этом разделе вы увидите альтернативный способ отправки задачи обучения с помощью Python SDK от Vertex AI .

Вернитесь к своему экземпляру блокнота и создайте блокнот TensorFlow 2 из панели запуска:

новый_ноутбук

Импортируйте Vertex AI SDK.

from google.cloud import aiplatform

Затем создайте объект CustomContainerTrainingJob . Вам нужно будет заменить {PROJECT_ID} в container_uri на имя вашего проекта, а {BUCKET} в staging_bucket на созданный вами ранее бакет.

my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
                                               container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
                                               staging_bucket='gs://{BUCKET}')

Затем запустите задание.

my_job.run(replica_count=1,
           machine_type='n1-standard-8',
           accelerator_type='NVIDIA_TESLA_V100',
           accelerator_count=1)

В демонстрационных целях данная задача настроена для выполнения на более мощном компьютере, чем в предыдущем разделе. Кроме того, мы используем графический процессор (GPU). Если вы не укажете machine-type , accelerator_type или accelerator_count , задача по умолчанию будет выполняться на n1-standard-4 .

В разделе «Обучение» вашей консоли, на вкладке «ПОЛЬЗОВАТЕЛЬСКИЕ ЗАДАНИЯ», вы увидите свое задание по обучению.

7. Уборка

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

Остановить экземпляр

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

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