1. Обзор
В этой лабораторной работе вы узнаете, как запустить пользовательскую задачу обучения на Vertex AI Training с помощью функции автоматической упаковки. Пользовательские задачи обучения на Vertex AI используют контейнеры. Если вы не хотите создавать собственный образ, вы можете использовать автоматическую упаковку, которая создаст пользовательский образ Docker на основе вашего кода, загрузит образ в Container Registry и запустит CustomJob на основе этого образа.
Чему вы научитесь
Вы научитесь:
- Используйте локальный режим для тестирования вашего кода.
- Настройте и запустите пользовательское задание обучения с автоматической упаковкой .
Общая стоимость запуска этой лабораторной работы в Google Cloud составляет около 2 долларов .
2. Обзор вариантов использования
Используя библиотеки из Hugging Face , вы настроите модель Bert на наборе данных IMDB . Модель будет предсказывать, является ли отзыв о фильме положительным или отрицательным. Набор данных будет загружен из библиотеки наборов данных Hugging Face , а модель Bert — из библиотеки трансформеров Hugging Face .
3. Введение в Vertex AI
В этой лабораторной работе используется новейший продукт для искусственного интеллекта, доступный в Google Cloud. Vertex AI интегрирует предложения машинного обучения в Google Cloud в единый процесс разработки. Ранее модели, обученные с помощью AutoML, и пользовательские модели были доступны через отдельные сервисы. Новое предложение объединяет оба варианта в единый API, а также включает другие новые продукты. Вы также можете перенести существующие проекты в Vertex AI. Если у вас есть какие-либо замечания, пожалуйста, посетите страницу поддержки .
Vertex AI предлагает множество различных продуктов для поддержки комплексных рабочих процессов машинного обучения. В этой лабораторной работе мы сосредоточимся на Training и Workbench.

4. Настройте свою среду.
Для выполнения этого практического задания вам потребуется проект Google Cloud Platform с включенной оплатой. Чтобы создать проект, следуйте инструкциям здесь .
Шаг 1: Включите API Compute Engine.
Перейдите в раздел Compute Engine и выберите «Включить», если эта функция еще не включена.
Шаг 2: Включите API Vertex AI
Перейдите в раздел Vertex AI в вашей облачной консоли и нажмите «Включить API Vertex AI» .

Шаг 3: Включите API реестра контейнеров.
Перейдите в Реестр контейнеров и выберите «Включить», если эта опция еще не включена. Это позволит создать контейнер для вашей пользовательской задачи обучения.
Шаг 4: Создайте экземпляр Vertex AI Workbench.
В разделе Vertex AI вашей облачной консоли нажмите на Workbench:

Оттуда нажмите «УПРАВЛЯЕМЫЕ ЗАПИСНЫЕ КНИЖКИ» :

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

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

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

Все остальные расширенные настройки можно оставить без изменений.
Далее нажмите «Создать» .
После создания экземпляра выберите «Открыть JupyterLab» .

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

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

Создайте новую директорию с именем autopkg-codelab и перейдите в неё с помощью команды cd.
mkdir autopkg-codelab
cd autopkg-codelab
В терминале выполните следующую команду, чтобы создать директорию для кода обучения и файл Python, куда вы добавите этот код:
mkdir trainer
touch trainer/task.py
Теперь в каталоге autopkg-codelab/ у вас должно быть следующее:
+ trainer/
+ task.py
Далее откройте только что созданный файл task.py и скопируйте приведенный ниже код.
import argparse
import tensorflow as tf
from datasets import load_dataset
from transformers import AutoTokenizer
from transformers import TFAutoModelForSequenceClassification
CHECKPOINT = "bert-base-cased"
def get_args():
'''Parses args.'''
parser = argparse.ArgumentParser()
parser.add_argument(
'--epochs',
required=False,
default=3,
type=int,
help='number of epochs')
parser.add_argument(
'--job_dir',
required=True,
type=str,
help='bucket to store saved model, include gs://')
args = parser.parse_args()
return args
def create_datasets():
'''Creates a tf.data.Dataset for train and evaluation.'''
raw_datasets = load_dataset('imdb')
tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
tokenized_datasets = raw_datasets.map((lambda examples: tokenize_function(examples, tokenizer)), batched=True)
# To speed up training, we use only a portion of the data.
# Use full_train_dataset and full_eval_dataset if you want to train on all the data.
small_train_dataset = tokenized_datasets['train'].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets['test'].shuffle(seed=42).select(range(1000))
full_train_dataset = tokenized_datasets['train']
full_eval_dataset = tokenized_datasets['test']
tf_train_dataset = small_train_dataset.remove_columns(['text']).with_format("tensorflow")
tf_eval_dataset = small_eval_dataset.remove_columns(['text']).with_format("tensorflow")
train_features = {x: tf_train_dataset[x] for x in tokenizer.model_input_names}
train_tf_dataset = tf.data.Dataset.from_tensor_slices((train_features, tf_train_dataset["label"]))
train_tf_dataset = train_tf_dataset.shuffle(len(tf_train_dataset)).batch(8)
eval_features = {x: tf_eval_dataset[x] for x in tokenizer.model_input_names}
eval_tf_dataset = tf.data.Dataset.from_tensor_slices((eval_features, tf_eval_dataset["label"]))
eval_tf_dataset = eval_tf_dataset.batch(8)
return train_tf_dataset, eval_tf_dataset
def tokenize_function(examples, tokenizer):
'''Tokenizes text examples.'''
return tokenizer(examples['text'], padding='max_length', truncation=True)
def main():
args = get_args()
train_tf_dataset, eval_tf_dataset = create_datasets()
model = TFAutoModelForSequenceClassification.from_pretrained(CHECKPOINT, num_labels=2)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=tf.metrics.SparseCategoricalAccuracy(),
)
model.fit(train_tf_dataset, validation_data=eval_tf_dataset, epochs=args.epochs)
model.save(f'{args.job_dir}/model_output')
if __name__ == "__main__":
main()
Несколько замечаний по поводу кода:
-
CHECKPOINT— это модель, которую мы хотим доработать. В данном случае мы используем Bert. - Метод
TFAutoModelForSequenceClassificationзагрузит указанную архитектуру языковой модели и веса в TensorFlow и добавит сверху классификационный блок со случайно инициализированными весами. В данном случае у нас задача бинарной классификации (положительная или отрицательная), поэтому мы указываемnum_labels=2для этого классификатора.
6. Контейнеризуйте и запустите код обучения локально.
Вы можете использовать команду gcloud ai custom-jobs local-run для создания образа контейнера Docker на основе вашего кода обучения и запуска этого образа в качестве контейнера на локальном компьютере. Запуск контейнера локально выполняет ваш код обучения аналогично тому, как он выполняется в Vertex AI Training, и может помочь вам отладить проблемы с вашим кодом перед выполнением пользовательского обучения в Vertex AI.
В нашей задаче обучения мы экспортируем обученную модель в хранилище Cloud Storage. В терминале выполните следующую команду, чтобы определить переменную окружения для вашего проекта, заменив your-cloud-project на идентификатор вашего проекта:
PROJECT_ID='your-cloud-project'
Затем создайте корзину. Если у вас уже есть существующая корзина, можете использовать её.
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
При запуске пользовательского задания обучения в Vertex AI Training мы будем использовать графический процессор (GPU). Но поскольку мы не указали в настройках экземпляра Workbench наличие графических процессоров, для локального тестирования мы будем использовать образ на базе ЦП. В этом примере мы используем предварительно собранный контейнер Vertex AI Training .
Выполните следующую команду, чтобы задать URI образа Docker, который будет использоваться в качестве базового для контейнера.
BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest
Затем задайте имя для результирующего образа Docker, созданного с помощью команды локального запуска.
OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest
В нашем коде для обучения используются наборы данных Hugging Face и библиотеки трансформеров. Эти библиотеки не включены в изображение, которое мы выбрали в качестве базового, поэтому нам потребуется добавить их в качестве зависимостей. Для этого мы создадим файл requirements.txt в каталоге autopkg-codelab .
Убедитесь, что вы находитесь в каталоге autopkg-codelab , и введите следующее в терминале.
touch requirements.txt
Теперь в каталоге autopkg-codelab должны находиться следующие файлы:
+ requirements.txt
+ trainer/
+ task.py
Откройте файл requirements.txt и вставьте следующее:
datasets==1.18.2
transformers==4.16.2
Наконец, выполните команду gcloud ai custom-jobs local-run , чтобы запустить обучение на нашем экземпляре Workbench, управляемом системой.
gcloud ai custom-jobs local-run \
--executor-image-uri=$BASE_CPU_IMAGE \
--python-module=trainer.task \
--output-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME
Вы должны увидеть процесс сборки образа Docker. Зависимости, добавленные в файл requirements.txt , будут установлены с помощью pip. При первом выполнении этой команды это может занять несколько минут. После сборки образа запустится файл task.py , и вы увидите процесс обучения модели. Вы должны увидеть что-то подобное:

Поскольку мы не используем локальный графический процессор, обучение модели займет много времени. Вы можете нажать Ctrl+c и отменить локальное обучение, вместо того чтобы ждать завершения задачи.
Обратите внимание, что при желании вы можете запустить созданный выше образ напрямую, без переупаковки.
gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1
7. Создайте пользовательское задание
Теперь, когда мы протестировали локальный режим, мы воспользуемся функцией автоматической упаковки, чтобы запустить наше пользовательское задание обучения на Vertex AI Training. С помощью одной команды эта функция выполнит следующие действия:
- Создайте собственный образ Docker на основе вашего кода.
- Загрузите образ в реестр контейнеров.
- Запустите
CustomJobна основе образа.
Вернитесь в терминал и перейдите на один уровень выше каталога autopkg-codelab с помощью команды cd.
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
Укажите предварительно собранный образ TensorFlow GPU для Vertex AI Training в качестве базового образа для пользовательского задания обучения.
BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest
Далее выполните команду gcloud ai custom-jobs create . Сначала эта команда создаст пользовательский образ Docker на основе кода обучения. Базовым образом является предварительно созданный контейнер Vertex AI Training, который мы установили как BASE_GPU_IMAGE . Затем функция автоматической упаковки установит с помощью pip наборы данных и библиотеки трансформеров, как указано в нашем файле requirements.txt .
gcloud ai custom-jobs create \
--region=us-central1 \
--display-name=fine_tune_bert \
--args=--job_dir=$BUCKET_NAME \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,executor-image-uri=$BASE_GPU_IMAGE,local-package-path=autopkg-codelab,python-module=trainer.task
Давайте рассмотрим аргумент worker-pool-spec . Он определяет конфигурацию пула рабочих процессов, используемую пользовательским заданием. Вы можете указать несколько спецификаций пула рабочих процессов, чтобы создать пользовательское задание с несколькими пулами рабочих процессов для распределенного обучения. В этом примере мы указываем только один пул рабочих процессов, поскольку наш код обучения не настроен для распределенного обучения.
Вот некоторые из ключевых областей данной спецификации:
-
machine-type(обязательно): Тип оборудования. Нажмите здесь, чтобы увидеть список поддерживаемых типов. -
replica-count: Количество реплик рабочих процессов, используемых для этого пула рабочих процессов; по умолчанию значение равно 1. -
accelerator-type: Тип графического процессора. Список поддерживаемых типов можно посмотреть здесь . В этом примере мы указали один графический процессор NVIDIA Tesla V100. -
accelerator-count: Количество графических процессоров, которые будет использовать каждая виртуальная машина в пуле рабочих процессов; по умолчанию значение равно 1. -
executor-image-uri: URI образа контейнера, который будет запускать предоставленный пакет. Здесь устанавливается наш базовый образ. -
local-package-path: Локальный путь к папке, содержащей код для обучения. -
python-module: Имя модуля Python, который будет запущен в рамках предоставленного пакета.
Аналогично запуску локальной команды, вы увидите процесс сборки образа Docker, а затем запуск задачи обучения. Однако вместо вывода задачи обучения вы увидите следующее сообщение, подтверждающее запуск задачи обучения. Обратите внимание, что при первом запуске команды custom-jobs create сборка и загрузка образа может занять несколько минут.

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

На выполнение этой работы потребуется около 20 минут.
После завершения процесса в каталоге model_output в вашем хранилище должны отобразиться следующие сохраненные артефакты модели.

🎉 Поздравляем! 🎉
Вы научились использовать Vertex AI для:
- Создайте контейнер и запустите код обучения локально.
- Отправляйте задания на обучение в Vertex AI Training с помощью автоматической упаковки.
Чтобы узнать больше о различных компонентах Vertex AI, ознакомьтесь с документацией .
8. Уборка
Поскольку мы настроили ноутбук на автоматическое завершение работы через 60 минут простоя, нам не нужно беспокоиться о выключении экземпляра. Если вы хотите выключить экземпляр вручную, нажмите кнопку «Стоп» в разделе Vertex AI Workbench в консоли. Если вы хотите полностью удалить ноутбук, нажмите кнопку «Удалить».

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