От прототипа к производству: настройка гиперпараметров

От прототипа к производству:
настройка гиперпараметров

О практической работе

subjectПоследнее обновление: авг. 25, 2022
account_circleАвторы: Nikita Namjoshi

1. Обзор

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

Эта лабораторная работа является частью серии видеороликов «От прототипа к производству» . Обязательно выполните предыдущую лабораторную работу , прежде чем приступать к этой. Чтобы узнать больше, вы можете посмотреть соответствующую серию видеороликов:

.

Что вы узнаете

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

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

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

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

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

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

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

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

Выполните действия, описанные в разделе «Обучение пользовательских моделей с помощью лаборатории Vertex AI», чтобы настроить среду.

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

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

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

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

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

Создайте новый каталог с именем flowers-hptune и перейдите в него:

mkdir flowers-hptune
cd flowers
-hptune

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

mkdir trainer
touch trainer
/task.py

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

+ trainer/
   
+ task.py

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

Вам нужно будет заменить {your-gcs-bucket} в BUCKET_ROOT на корзину Cloud Storage, в которой вы сохранили набор данных цветов в лабораторной работе 1 .

import tensorflow as tf
import numpy as np
import os
import hypertune
import argparse

## 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 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 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(num_units, learning_rate, momentum):
 
'''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(num_units, activation='relu'),
   
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
 
])

 
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=learning_rate, momentum=momentum),
             
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
             
metrics=['accuracy'])
 
 
return model

def main():
 
args = get_args()
 
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)
 
model = create_model(args.num_units, args.learning_rate, args.momentum)
 
history = model.fit(train_dataset, validation_data=validation_dataset, epochs=EPOCHS)

 
# 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=EPOCHS)


if __name__ == "__main__":
   
main()

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

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

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

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

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

touch Dockerfile

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

+ Dockerfile
+ trainer/
   
+ task.py

Откройте Dockerfile и скопируйте в него следующее. Вы заметите, что он почти идентичен файлу Dockerfile, который мы использовали в первой лабораторной работе, за исключением того, что теперь мы устанавливаем библиотеку cloudml-hypertune.

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

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

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

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

PROJECT_ID='your-cloud-project'

Определите репо в реестре артефактов. Мы будем использовать репозиторий, который мы создали в первой лабораторной работе.

REPO_NAME='flower-app'

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

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

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

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

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

docker build ./ -t $IMAGE_URI

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

docker push $IMAGE_URI

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

5. Запустите задание по настройке гиперпараметров с помощью SDK.

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

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

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

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

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

Чтобы запустить задание по настройке гиперпараметров, вам необходимо сначала определить worker_pool_specs , который определяет тип компьютера и образ Docker. В следующей спецификации определяется одна машина с двумя графическими процессорами NVIDIA Tesla V100.

Вам нужно будет заменить {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": "us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image_hptune:latest"
    }
}]

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

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

# 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)
}

Последняя спецификация, которую нужно определить, — это metric_spec , которая представляет собой словарь, представляющий метрику для оптимизации. Ключ словаря — это hyperparameter_metric_tag , который вы установили в коде приложения для обучения, а значение — это цель оптимизации.

# Dictionary representing metric 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'}

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

Вам нужно будет заменить {YOUR_BUCKET} на корзину, которую вы создали ранее.

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

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

hp_job = aiplatform.HyperparameterTuningJob(
    display_name
='flowers-hptune-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()

Стоит отметить несколько аргументов:

  • max_trial_count : вам нужно будет установить верхнюю границу количества испытаний, которые будет запускать служба. Большее количество испытаний обычно приводит к лучшим результатам, но наступает момент снижения отдачи, после которого дополнительные испытания практически не влияют на показатель, который вы пытаетесь оптимизировать. Лучше всего начать с меньшего количества испытаний и понять, насколько эффективны выбранные вами гиперпараметры, прежде чем масштабировать их.
  • Parallel_trial_count : если вы используете параллельные испытания, служба предоставляет несколько кластеров обработки обучения. Увеличение количества параллельных испытаний сокращает время, необходимое для выполнения задания по настройке гиперпараметра; однако это может снизить эффективность работы в целом. Это связано с тем, что стратегия настройки по умолчанию использует результаты предыдущих испытаний для определения значений в последующих испытаниях.
  • search_algorithm : вы можете установить алгоритм поиска по сетке, случайный или по умолчанию (Нет). Опция по умолчанию применяет байесовскую оптимизацию для поиска в пространстве возможных значений гиперпараметра и является рекомендуемым алгоритмом. Подробнее об этом алгоритме можно узнать здесь.

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

hp_job

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

hp_results

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

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

  • Запустите задание автоматической настройки гиперпараметров.

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

6. Очистка

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

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

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

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