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

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 включает в себя множество различных продуктов для поддержки комплексных рабочих процессов машинного обучения. Эта лабораторная работа будет посвящена обучению и рабочим местам.

Обзор продукта Vertex

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

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

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

Перейдите к Compute Engine и выберите «Включить» , если он еще не включен.

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

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

Панель управления Vertex AI

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

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

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

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

Меню вершинного AI

Оттуда нажмите УПРАВЛЯЕМЫЕ НОУТБУКЫ :

Ноутбуки_UI

Затем выберите НОВЫЙ НОУТБУК .

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

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

create_notebook

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

Idle_timeout

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

Далее нажмите Создать .

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

open_jupyterlab

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

аутентифицировать

5. Напишите обучающий код

Для начала в меню панели запуска откройте окно терминала в экземпляре вашего блокнота:

launcher_terminal

Создайте новый каталог с именем 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 начнет работать, и вы увидите обучение модели. Вы должны увидеть что-то вроде этого:

local_training

Поскольку мы не используем локально графический процессор, обучение модели займет много времени. Вы можете нажать 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 вашего сегмента.

model_output

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

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

  • Контейнеризация и запуск обучающего кода локально
  • Отправляйте задания по обучению в Vertex AI Training с помощью автоматической упаковки

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

8. Очистка

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

удалить

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

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