Vertex AI: настройка гиперпараметров

1. Обзор

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

Что ты учишь

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

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

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

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

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

Vertex AI включает в себя множество различных продуктов для поддержки комплексных рабочих процессов машинного обучения. Эта лабораторная работа будет сосредоточена на продуктах, перечисленных ниже: Обучение и Инструментальные средства .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Notebook_api

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

Ноутбуки_UI

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

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

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

create_notebook

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

Idle_timeout

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

Enable_terminal

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

Далее нажмите Создать . Подготовка экземпляра займет пару минут.

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

open_jupyterlab

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

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

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

Модель, которую вы будете обучать и настраивать в этой лабораторной работе, представляет собой модель классификации изображений, обученную на наборе данных о лошадях или людях из TensorFlow Datasets .

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

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

Открыть терминал в блокноте

Создайте новый каталог под названием horses_or_humans и перейдите в него:

mkdir horses_or_humans
cd horses_or_humans

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

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

В терминале создайте пустой Dockerfile:

touch Dockerfile

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

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

WORKDIR /

# Installs hypertune library
RUN pip install cloudml-hypertune

# 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"]

Этот Dockerfile использует образ Docker GPU Deep Learning Container TensorFlow Enterprise 2.7 . Контейнеры глубокого обучения в Google Cloud поставляются со многими предустановленными стандартными платформами машинного обучения и обработки данных. После загрузки этого образа этот Dockerfile устанавливает точку входа для обучающего кода. Вы еще не создали эти файлы — на следующем шаге вы добавите код для обучения и настройки модели.

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

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

mkdir trainer
touch trainer/task.py

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

+ Dockerfile
+ trainer/
    + task.py

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

import tensorflow as tf
import tensorflow_datasets as tfds
import argparse
import hypertune

NUM_EPOCHS = 10


def get_args():
  '''Parses args. Must include all hyperparameters you want to tune.'''

  parser = argparse.ArgumentParser()
  parser.add_argument(
      '--learning_rate',
      required=True,
      type=float,
      help='learning rate')
  parser.add_argument(
      '--momentum',
      required=True,
      type=float,
      help='SGD momentum value')
  parser.add_argument(
      '--num_units',
      required=True,
      type=int,
      help='number of units in last hidden layer')
  args = parser.parse_args()
  return args


def preprocess_data(image, label):
  '''Resizes and scales images.'''

  image = tf.image.resize(image, (150,150))
  return tf.cast(image, tf.float32) / 255., label


def create_dataset():
  '''Loads Horses Or Humans dataset and preprocesses data.'''

  data, info = tfds.load(name='horses_or_humans', as_supervised=True, with_info=True)

  # Create train dataset
  train_data = data['train'].map(preprocess_data)
  train_data  = train_data.shuffle(1000)
  train_data  = train_data.batch(64)

  # Create validation dataset
  validation_data = data['test'].map(preprocess_data)
  validation_data  = validation_data.batch(64)

  return train_data, validation_data


def create_model(num_units, learning_rate, momentum):
  '''Defines and compiles model.'''

  inputs = tf.keras.Input(shape=(150, 150, 3))
  x = tf.keras.layers.Conv2D(16, (3, 3), activation='relu')(inputs)
  x = tf.keras.layers.MaxPooling2D((2, 2))(x)
  x = tf.keras.layers.Conv2D(32, (3, 3), activation='relu')(x)
  x = tf.keras.layers.MaxPooling2D((2, 2))(x)
  x = tf.keras.layers.Conv2D(64, (3, 3), activation='relu')(x)
  x = tf.keras.layers.MaxPooling2D((2, 2))(x)
  x = tf.keras.layers.Flatten()(x)
  x = tf.keras.layers.Dense(num_units, activation='relu')(x)
  outputs = tf.keras.layers.Dense(1, activation='sigmoid')(x)
  model = tf.keras.Model(inputs, outputs)
  model.compile(
      loss='binary_crossentropy',
      optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum),
      metrics=['accuracy'])
  return model


def main():
  args = get_args()
  train_data, validation_data = create_dataset()
  model = create_model(args.num_units, args.learning_rate, args.momentum)
  history = model.fit(train_data, epochs=NUM_EPOCHS, validation_data=validation_data)

  # DEFINE METRIC
  hp_metric = history.history['val_accuracy'][-1]

  hpt = hypertune.HyperTune()
  hpt.report_hyperparameter_tuning_metric(
      hyperparameter_metric_tag='accuracy',
      metric_value=hp_metric,
      global_step=NUM_EPOCHS)


if __name__ == "__main__":
    main()

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

  1. Скрипт импортирует библиотеку hypertune . Обратите внимание, что файл Dockerfile из шага 1 содержит инструкции по установке этой библиотеки.
  2. Функция get_args() определяет аргумент командной строки для каждого гиперпараметра, который вы хотите настроить. В этом примере будут настроены гиперпараметры: скорость обучения, значение импульса в оптимизаторе и количество единиц в последнем скрытом слое модели, но вы можете экспериментировать с другими. Значение, переданное в этих аргументах, затем используется для установки соответствующего гиперпараметра в коде.
  3. В конце функции main() библиотека hypertune используется для определения метрики, которую вы хотите оптимизировать. В TensorFlow метод keras model.fit возвращает объект History . Атрибут History.history представляет собой запись значений потерь при обучении и значений метрик в последовательные эпохи. Если вы передаете данные проверки в model.fit атрибут History.history также будет включать в себя потери при проверке и значения метрик. Например, если вы обучили модель для трех эпох с помощью данных проверки и указали accuracy в качестве метрики, атрибут History.history будет выглядеть аналогично следующему словарю.
{
 "accuracy": [
   0.7795261740684509,
   0.9471358060836792,
   0.9870933294296265
 ],
 "loss": [
   0.6340447664260864,
   0.16712145507335663,
   0.04546636343002319
 ],
 "val_accuracy": [
   0.3795261740684509,
   0.4471358060836792,
   0.4870933294296265
 ],
 "val_loss": [
   2.044623374938965,
   4.100203514099121,
   3.0728273391723633
 ]

Если вы хотите, чтобы служба настройки гиперпараметров обнаруживала значения, которые максимизируют точность проверки модели, вы определяете метрику как последнюю запись (или NUM_EPOCS - 1 ) списка val_accuracy . Затем передайте эту метрику экземпляру HyperTune . Вы можете выбрать любую строку для hyperparameter_metric_tag , но вам придется использовать эту строку позже, когда вы начнете задание по настройке гиперпараметра.

Шаг 3. Создайте контейнер.

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

PROJECT_ID='your-cloud-project'

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

IMAGE_URI="gcr.io/$PROJECT_ID/horse-human:hypertune"

Настроить докер

gcloud auth configure-docker

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

docker build ./ -t $IMAGE_URI

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

docker push $IMAGE_URI

Переместив контейнер в реестр контейнеров, вы готовы приступить к настройке гиперпараметров пользовательской модели.

5. Запустите задание по настройке гиперпараметров на Vertex AI.

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

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

меню uCAIP

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

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

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

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

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

В первом поле ( Образ контейнера ) введите значение переменной IMAGE_URI из предыдущего раздела. Это должно быть: gcr.io/your-cloud-project/horse-human:hypertune с вашим собственным именем проекта. Остальные поля оставьте пустыми и нажмите «Продолжить» .

Шаг 2. Настройте задание по настройке гиперпараметров.

Выберите «Включить настройку гиперпараметров» .

Гиперпараметры

Настройка гиперпараметров

Далее вам нужно будет добавить гиперпараметры, которые вы установили в качестве аргументов командной строки в коде обучающего приложения. При добавлении гиперпараметра сначала необходимо указать имя. Оно должно совпадать с именем аргумента, которое вы передали в argparse .

имя_курса_обучения

Затем вы выберете тип, а также границы значений, которые будет использовать служба настройки. Если вы выберете тип Double или Integer, вам потребуется указать минимальное и максимальное значение. И если вы выберете Категориальный или Дискретный, вам нужно будет указать значения.

Learning_rate_typeимя_курса_обучения

Для типов Double и Integer вам также необходимо указать значение масштабирования.

Learning_rate_scale

После добавления гиперпараметра learning_rate добавьте параметры для momentum и num_units .

импульс_конфигурация

numneruons_config

Настроить метрику

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

metric_config

Служба настройки гиперпараметров Vertex AI запустит несколько пробных версий вашего обучающего приложения со значениями, настроенными на предыдущих шагах. Вам нужно будет установить верхнюю границу количества испытаний, которые будет выполнять служба. Большее количество испытаний обычно приводит к лучшим результатам, но наступает момент снижения отдачи, после которого дополнительные испытания практически не влияют на показатель, который вы пытаетесь оптимизировать. Лучше всего начать с меньшего количества испытаний и понять, насколько эффективны выбранные вами гиперпараметры, прежде чем масштабировать их до большого количества испытаний.

Вам также потребуется установить верхнюю границу количества параллельных испытаний. Увеличение количества параллельных испытаний сократит время, необходимое для выполнения задания по настройке гиперпараметра; однако это может снизить эффективность работы в целом. Это связано с тем, что стратегия настройки по умолчанию использует результаты предыдущих испытаний для определения значений в последующих испытаниях. Если вы запускаете слишком много испытаний параллельно, некоторые испытания начнутся без использования результатов еще продолжающихся испытаний.

В демонстрационных целях вы можете установить количество испытаний равным 15, а максимальное количество параллельных испытаний — 3. Вы можете поэкспериментировать с разными числами, но это может привести к увеличению времени настройки и увеличению стоимости.

пробная_конфигурация

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

алгоритм_конфигурации

Нажмите Продолжить .

Шаг 3. Настройте вычисления

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

Тип аппарата

Нажмите «Начать обучение» , чтобы начать задание по настройке гиперпараметров. В разделе «Обучение» консоли на вкладке «ЗАДАНИЯ НАСТРОЙКИ ГИПЕРПАРАМЕТРОВ» вы увидите что-то вроде этого:

Гиперпараметрические вакансии

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

Вывод гиперпараметра

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

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

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

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

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

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

В панели запуска создайте блокнот TensorFlow 2.

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

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

from google.cloud import aiplatform
from google.cloud.aiplatform import hyperparameter_tuning as hpt

Чтобы запустить задание по настройке гиперпараметров, вам необходимо сначала определить следующие спецификации. Вам нужно будет заменить {PROJECT_ID} в image_uri на свой проект.

# The spec of the worker pools including machine type and Docker image
# Be sure to replace PROJECT_ID in the `image_uri` with your project.

worker_pool_specs = [{
    "machine_spec": {
        "machine_type": "n1-standard-4",
        "accelerator_type": "NVIDIA_TESLA_V100",
        "accelerator_count": 1
    },
    "replica_count": 1,
    "container_spec": {
        "image_uri": "gcr.io/{PROJECT_ID}/horse-human:hypertune"
    }
}]


# Dictionary representing metrics to optimize.
# The dictionary key is the metric_id, which is reported by your training job,
# And the dictionary value is the optimization goal of the metric.
metric_spec={'accuracy':'maximize'}

# Dictionary representing parameters to optimize.
# The dictionary key is the parameter_id, which is passed into your training
# job as a command line argument,
# And the dictionary value is the parameter specification of the metric.
parameter_spec = {
    "learning_rate": hpt.DoubleParameterSpec(min=0.001, max=1, scale="log"),
    "momentum": hpt.DoubleParameterSpec(min=0, max=1, scale="linear"),
    "num_units": hpt.DiscreteParameterSpec(values=[64, 128, 512], scale=None)
}

Затем создайте CustomJob . Вам нужно будет заменить {YOUR_BUCKET} на корзину в вашем проекте для промежуточной подготовки.

# Replace YOUR_BUCKET
my_custom_job = aiplatform.CustomJob(display_name='horses-humans-sdk-job',
                              worker_pool_specs=worker_pool_specs,
                              staging_bucket='gs://{YOUR_BUCKET}')

Затем создайте и запустите HyperparameterTuningJob .

hp_job = aiplatform.HyperparameterTuningJob(
    display_name='horses-humans-sdk-job',
    custom_job=my_custom_job,
    metric_spec=metric_spec,
    parameter_spec=parameter_spec,
    max_trial_count=15,
    parallel_trial_count=3)

hp_job.run()

7. Очистка

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

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

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

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