Vertex AI: обучение нескольких сотрудников и трансферное обучение с помощью TensorFlow

1. Обзор

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

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

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

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

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

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

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

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

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

3. Обзор вариантов использования

В этой лабораторной работе вы будете использовать трансферное обучение для обучения модели классификации изображений на наборе данных маниоки из TensorFlow Datasets . Архитектура, которую вы будете использовать, — это модель ResNet50 из библиотеки tf.keras.applications , предварительно обученная на наборе данных Imagenet.

Почему распределенное обучение?

Если у вас один графический процессор, TensorFlow будет использовать этот ускоритель для ускорения обучения модели без каких-либо дополнительных усилий с вашей стороны. Однако, если вы хотите получить дополнительный импульс от использования нескольких графических процессоров на одной машине или нескольких машинах (каждая из которых потенциально имеет несколько графических процессоров), вам нужно будет использовать tf.distribute , который представляет собой библиотеку TensorFlow для выполнения вычислений на нескольких устройства. Под устройством понимается ЦП или ускоритель, например графические процессоры или TPU, на какой-либо машине, на которой TensorFlow может выполнять операции.

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

MultiWorkerMirroredStrategy — это стратегия синхронного параллелизма данных, которую можно использовать лишь с небольшими изменениями кода. Копия модели создается на каждом устройстве в вашем кластере. Последующие обновления градиента будут происходить синхронно. Это означает, что каждое рабочее устройство вычисляет прямые и обратные проходы через модель на разных фрагментах входных данных. Вычисленные градиенты каждого из этих срезов затем агрегируются по всем устройствам на машине и всем машинам в кластере и уменьшаются (обычно в среднем) в процессе, известном как all-reduce. Затем оптимизатор выполняет обновления параметров с этими уменьшенными градиентами, тем самым обеспечивая синхронизацию устройств. Чтобы узнать больше о распределенном обучении с помощью TensorFlow, посмотрите видео ниже:

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

Для запуска этой лаборатории кода вам понадобится проект 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

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

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

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

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

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

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

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

mkdir cassava
cd cassava

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

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

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

touch Dockerfile

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

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

WORKDIR /

# 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. Создайте сегмент облачного хранилища.

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

PROJECT_ID='your-cloud-project'

Затем выполните следующую команду в своем терминале, чтобы создать новую корзину в своем проекте.

BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET

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

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

mkdir trainer
touch trainer/task.py

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

+ Dockerfile
+ trainer/
    + task.py

Затем откройте только что созданный файл task.py и скопируйте приведенный ниже код. Вам нужно будет заменить {your-gcs-bucket} именем только что созданного сегмента Cloud Storage.

import tensorflow as tf
import tensorflow_datasets as tfds
import os


PER_REPLICA_BATCH_SIZE = 64
EPOCHS = 2

# TODO: replace {your-gcs-bucket} with the name of the Storage bucket you created earlier
BUCKET = 'gs://{your-gcs-bucket}/mwms'

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

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


def create_dataset(batch_size):
  '''Loads Cassava dataset and preprocesses data.'''

  data, info = tfds.load(name='cassava', as_supervised=True, with_info=True)
  number_of_classes = info.features['label'].num_classes
  train_data = data['train'].map(preprocess_data,
                                 num_parallel_calls=tf.data.experimental.AUTOTUNE)
  train_data  = train_data.shuffle(1000)
  train_data  = train_data.batch(batch_size)
  train_data  = train_data.prefetch(tf.data.experimental.AUTOTUNE)

  # Set AutoShardPolicy
  options = tf.data.Options()
  options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.DATA
  train_data = train_data.with_options(options)

  return train_data, number_of_classes


def create_model(number_of_classes):
  '''Creates and compiles pretrained ResNet50 model.'''

  base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False)
  x = base_model.output
  x = tf.keras.layers.GlobalAveragePooling2D()(x)
  x = tf.keras.layers.Dense(1016, activation='relu')(x)
  predictions = tf.keras.layers.Dense(number_of_classes, activation='softmax')(x)
  model = tf.keras.Model(inputs=base_model.input, outputs=predictions)

  model.compile(
      loss='sparse_categorical_crossentropy',
      optimizer=tf.keras.optimizers.Adam(0.0001),
      metrics=['accuracy'])

  return model


def _is_chief(task_type, task_id):
  '''Helper function. Determines if machine is chief.'''

  return task_type == 'chief'


def _get_temp_dir(dirpath, task_id):
  '''Helper function. Gets temporary directory for saving model.'''

  base_dirpath = 'workertemp_' + str(task_id)
  temp_dir = os.path.join(dirpath, base_dirpath)
  tf.io.gfile.makedirs(temp_dir)
  return temp_dir


def write_filepath(filepath, task_type, task_id):
  '''Helper function. Gets filepath to save model.'''

  dirpath = os.path.dirname(filepath)
  base = os.path.basename(filepath)
  if not _is_chief(task_type, task_id):
    dirpath = _get_temp_dir(dirpath, task_id)
  return os.path.join(dirpath, base)


def main():
  # Create strategy
  strategy = tf.distribute.MultiWorkerMirroredStrategy()

  # Get data
  global_batch_size = PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync
  train_data, number_of_classes = create_dataset(global_batch_size)

  # Wrap variable creation within strategy scope
  with strategy.scope():
    model = create_model(number_of_classes)

  model.fit(train_data, epochs=EPOCHS)

  # Determine type and task of the machine from
  # the strategy cluster resolver
  task_type, task_id = (strategy.cluster_resolver.task_type,
                        strategy.cluster_resolver.task_id)

  # Based on the type and task, write to the desired model path
  write_model_path = write_filepath(BUCKET, task_type, task_id)
  model.save(write_model_path)

if __name__ == "__main__":
    main()

Прежде чем создавать контейнер, давайте более подробно рассмотрим код, который использует MultiWorkerMirroredStrategy из API tf.distribute.Strategy .

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

  1. Данные необходимо сегментировать, то есть каждому работнику назначается подмножество всего набора данных. Таким образом, на каждом этапе каждый рабочий процесс будет обрабатывать глобальный размер пакета неперекрывающихся элементов набора данных. Это сегментирование происходит автоматически с помощью tf.data.experimental.AutoShardPolicy , для которого можно установить значение FILE или DATA . В этом примере функция create_dataset() устанавливает для AutoShardPolicy значение DATA поскольку набор данных маниоки не загружается в виде нескольких файлов. Однако, если вы не установили политику DATA , вступит в силу политика AUTO по умолчанию, и конечный результат будет таким же. Вы можете узнать больше о сегментировании набора данных с помощью MultiWorkerMirroredStrategy здесь.
  2. В функции main() создается объект MultiWorkerMirroredStrategy . Далее вы переносите создание переменных модели в область действия стратегии. Этот важный шаг сообщает TensorFlow, какие переменные следует зеркально отображать в репликах.
  3. Размер пакета увеличивается с помощью num_replicas_in_sync . Это гарантирует, что каждая реплика обрабатывает одинаковое количество примеров на каждом этапе. Масштабирование размера пакета — лучшая практика при использовании стратегий параллелизма синхронных данных в TensorFlow.
  4. Сохранение вашей модели немного сложнее в случае с несколькими рабочими процессами, поскольку место назначения должно быть разным для каждого из рабочих процессов. Главный рабочий сохранит модель в желаемом каталоге, а другие работники сохранят модель во временных каталогах. Важно, чтобы эти временные каталоги были уникальными, чтобы предотвратить запись нескольких рабочих процессов в одно и то же место. Сбережение может включать в себя коллективные операции, а это означает, что экономить должны все работники, а не только руководитель. Функции _is_chief() , _get_temp_dir() , write_filepath() , а также функция main() включают стандартный код, который помогает сохранить модель.

Обратите внимание: если вы использовали MultiWorkerMirroredStrategy в другой среде, возможно, вы настроили переменную среды TF_CONFIG . Vertex AI автоматически устанавливает TF_CONFIG , поэтому вам не нужно определять эту переменную на каждом компьютере в вашем кластере.

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

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

PROJECT_ID='your-cloud-project'

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

IMAGE_URI="gcr.io/$PROJECT_ID/multiworker:cassava"

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

gcloud auth configure-docker

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

docker build ./ -t $IMAGE_URI

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

docker push $IMAGE_URI

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

6. Запустите задание по обучению нескольких сотрудников на Vertex AI.

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

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

меню uCAIP

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

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

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

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

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

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

Пропустите шаг «Гиперпараметры», снова нажав «Продолжить» .

Шаг 2. Настройка вычислительного кластера

Vertex AI предоставляет 4 рабочих пула для выполнения различных типов машинных задач.

Рабочий пул 0 настраивает основного, главного, планировщика или «главного». В MultiWorkerMirroredStrategy все машины обозначены как рабочие, то есть физические машины, на которых выполняются реплицированные вычисления. Помимо того, что каждая машина является рабочей, должен быть один рабочий, который берет на себя дополнительную работу, например сохранение контрольных точек и запись файлов сводки в TensorBoard. Эта машина известна как шеф. Всегда есть только один главный работник, поэтому количество рабочих для пула рабочих 0 всегда будет равно 1.

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

Рабочий_пул_0

В рабочем пуле 1 вы настраиваете рабочие процессы для своего кластера.

Настройте рабочий пул 1 следующим образом:

Рабочий_пул_1

Теперь кластер настроен на наличие двух компьютеров только с ЦП. Когда запускается код обучающего приложения, MultiWorkerMirroredStrategy распределит обучение по обеим машинам.

MultiWorkerMirroredStrategy имеет только типы главных и рабочих задач, поэтому нет необходимости настраивать дополнительные рабочие пулы. Однако если бы вы использовали ParameterServerStrategy TensorFlow, вы бы настроили свои серверы параметров в рабочем пуле 2 . И если вы хотите добавить оценщик в свой кластер, вам нужно настроить эту машину в рабочем пуле 3 .

Нажмите «Начать обучение» , чтобы начать задание по настройке гиперпараметров. В разделе «Обучение» консоли на вкладке «ПРОВОДЫ ОБУЧЕНИЯ» вы увидите недавно запущенное задание:

Учебные вакансии

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

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

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

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

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

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

Вернитесь к экземпляру своего блокнота и создайте блокнот TensorFlow 2 из панели запуска:

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

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

from google.cloud import aiplatform

Чтобы запустить задание обучения нескольких рабочих, сначала необходимо определить спецификацию пула рабочих. Обратите внимание, что использование графических процессоров в спецификации совершенно необязательно, и вы можете удалить accelerator_type и accelerator_count если вам нужен кластер только с процессором, как показано в предыдущем разделе.

# The spec of the worker pools including machine type and Docker image
# Be sure to replace {YOUR-PROJECT-ID} with your project ID.
worker_pool_specs=[
     {
        "replica_count": 1,
        "machine_spec": {
          "machine_type": "n1-standard-8", "accelerator_type": "NVIDIA_TESLA_V100", "accelerator_count": 1
        },
        "container_spec": {"image_uri": "gcr.io/{YOUR-PROJECT-ID}/multiworker:cassava"}
      },
      {
        "replica_count": 1,
        "machine_spec": {
          "machine_type": "n1-standard-8", "accelerator_type": "NVIDIA_TESLA_V100", "accelerator_count": 1
        },
        "container_spec": {"image_uri": "gcr.io/{YOUR-PROJECT-ID}/multiworker:cassava"}
      }
]

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

# Replace YOUR_BUCKET
my_multiworker_job = aiplatform.CustomJob(display_name='multiworker-cassava-sdk',
                              worker_pool_specs=worker_pool_specs,
                              staging_bucket='gs://{YOUR_BUCKET}')

my_multiworker_job.run()

В разделе «Обучение» консоли на вкладке «ПОЛЬЗОВАТЕЛЬСКИЕ ЗАДАНИЯ» вы увидите свое учебное задание:

Индивидуальные задания

8. Очистка

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

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

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

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