1. Обзор
В ходе этой лабораторной работы вы узнаете, как запустить пользовательское задание обучения в Vertex AI Training с функцией автоматической упаковки. Пользовательские учебные задания в Vertex AI используют контейнеры. Если вы не хотите создавать собственный образ, вы можете использовать автоматическую упаковку, которая создаст собственный образ Docker на основе вашего кода, отправит образ в реестр контейнеров и запустит CustomJob
на основе этого образа.
Что вы узнаете
Вы узнаете, как:
- Используйте локальный режим для тестирования вашего кода.
- Настройте и запустите пользовательское задание обучения с помощью автоупаковки .
Общая стоимость запуска этой лаборатории в Google Cloud составляет около 2 долларов США .
2. Обзор вариантов использования
Используя библиотеки Hugging Face , вы точно настроите модель Берта на наборе данных IMDB . Модель предскажет, будет ли рецензия на фильм положительной или отрицательной. Набор данных будет загружен из библиотеки наборов данных Hugging Face , а модель Берта — из библиотеки трансформеров Hugging Face .
3. Знакомство с Vertex AI
В этой лаборатории используются новейшие продукты искусственного интеллекта, доступные в Google Cloud. Vertex AI интегрирует предложения машинного обучения в Google Cloud в единый процесс разработки. Раньше модели, обученные с помощью AutoML, и пользовательские модели были доступны через отдельные сервисы. Новое предложение объединяет оба API в одном API, а также другие новые продукты. Вы также можете перенести существующие проекты на Vertex AI. Если у вас есть какие-либо отзывы, пожалуйста, посетите страницу поддержки .
Vertex AI включает в себя множество различных продуктов для поддержки комплексных рабочих процессов машинного обучения. Эта лабораторная работа будет посвящена обучению и рабочим местам.
4. Настройте свою среду
Для запуска этой лаборатории кода вам понадобится проект Google Cloud Platform с включенной оплатой. Чтобы создать проект, следуйте инструкциям здесь .
Шаг 1. Включите API Compute Engine.
Перейдите к Compute Engine и выберите «Включить» , если он еще не включен.
Шаг 2. Включите API Vertex AI.
Перейдите в раздел Vertex AI в облачной консоли и нажмите «Включить Vertex AI API» .
Шаг 3. Включите API реестра контейнеров.
Перейдите в реестр контейнеров и выберите «Включить» , если это еще не сделано. Вы будете использовать это для создания контейнера для своего индивидуального задания по обучению.
Шаг 4. Создайте экземпляр Vertex AI Workbench.
В разделе Vertex AI облачной консоли нажмите Workbench:
Оттуда нажмите УПРАВЛЯЕМЫЕ НОУТБУКЫ :
Затем выберите НОВЫЙ НОУТБУК .
Дайте записной книжке имя и нажмите «Дополнительные настройки» .
В разделе «Дополнительные настройки» включите выключение в режиме ожидания и установите количество минут, равное 60. Это означает, что ваш ноутбук будет автоматически отключаться, когда он не используется, поэтому вы не несете ненужных затрат.
Все остальные дополнительные настройки вы можете оставить как есть.
Далее нажмите Создать .
После создания экземпляра выберите «Открыть JupyterLab» .
При первом использовании нового экземпляра вам будет предложено пройти аутентификацию.
5. Напишите обучающий код
Для начала в меню панели запуска откройте окно терминала в экземпляре вашего блокнота:
Создайте новый каталог с именем autopkg-codelab
и перейдите в него.
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
— это модель, которую мы хотим настроить. В данном случае мы используем Берта. - Метод
TFAutoModelForSequenceClassification
загрузит указанную архитектуру языковой модели + веса в TensorFlow и добавит заголовок классификации сверху со случайно инициализированными весами. В этом случае у нас есть проблема двоичной классификации (положительная или отрицательная), поэтому мы указываемnum_labels=2
для этого классификатора.
6. Контейнеризация и запуск обучающего кода локально.
Вы можете использовать команду gcloud ai custom-jobs local-run
чтобы создать образ контейнера Docker на основе вашего обучающего кода и запустить этот образ как контейнер на локальном компьютере. Локальный запуск контейнера выполняет ваш обучающий код аналогично тому, как он выполняется в Vertex AI Training, и может помочь вам отладить проблемы с вашим кодом перед выполнением специального обучения в Vertex AI.
В нашей обучающей работе мы экспортируем обученную модель в корзину облачного хранилища. В своем терминале выполните следующую команду, чтобы определить переменную env для вашего проекта, обязательно заменяя your-cloud-project
идентификатором вашего проекта:
PROJECT_ID='your-cloud-project'
Затем создайте ведро. Если у вас есть существующее ведро, смело используйте его.
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
Когда мы запускаем пользовательское задание обучения в Vertex AI Training, мы будем использовать графический процессор. Но поскольку мы не указали наш экземпляр 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
Откройте файл требований и вставьте следующее
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
.
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
Укажите предварительно созданный образ графического процессора TensorFlow 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
. Функция автоматической упаковки затем установит наборы данных и библиотеки преобразователей, как указано в нашем файле 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. Если вы хотите полностью удалить блокнот, нажмите кнопку «Удалить».
Чтобы удалить сегмент хранилища, в меню навигации облачной консоли перейдите к разделу «Хранилище», выберите сегмент и нажмите «Удалить»: