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 включает в себя множество различных продуктов для поддержки комплексных рабочих процессов машинного обучения. Эта лабораторная работа будет сосредоточена на продуктах, перечисленных ниже: Обучение и рабочие места.
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» .
Шаг 4. Создайте экземпляр Vertex AI Workbench.
В разделе Vertex AI облачной консоли нажмите Workbench:
Включите API ноутбуков, если это еще не сделано.
После включения нажмите «УПРАВЛЯЕМЫЕ НОУТБУКЫ» :
Затем выберите НОВЫЙ НОУТБУК .
Дайте записной книжке имя и нажмите «Дополнительные настройки» .
В разделе «Дополнительные настройки» включите выключение в режиме ожидания и установите количество минут, равное 60. Это означает, что ваш ноутбук будет автоматически отключаться, когда он не используется, поэтому вы не несете ненужных затрат.
В разделе «Безопасность» выберите «Включить терминал», если он еще не включен.
Все остальные дополнительные настройки вы можете оставить как есть.
Далее нажмите Создать . Подготовка экземпляра займет пару минут.
После создания экземпляра выберите «Открыть 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
.
- Данные необходимо сегментировать, то есть каждому работнику назначается подмножество всего набора данных. Таким образом, на каждом этапе каждый рабочий процесс будет обрабатывать глобальный размер пакета неперекрывающихся элементов набора данных. Это сегментирование происходит автоматически с помощью
tf.data.experimental.AutoShardPolicy
, для которого можно установить значениеFILE
илиDATA
. В этом примере функцияcreate_dataset()
устанавливает дляAutoShardPolicy
значениеDATA
поскольку набор данных маниоки не загружается в виде нескольких файлов. Однако, если вы не установили политикуDATA
, вступит в силу политикаAUTO
по умолчанию, и конечный результат будет таким же. Вы можете узнать больше о сегментировании набора данных с помощьюMultiWorkerMirroredStrategy
здесь. - В функции
main()
создается объектMultiWorkerMirroredStrategy
. Далее вы переносите создание переменных модели в область действия стратегии. Этот важный шаг сообщает TensorFlow, какие переменные следует зеркально отображать в репликах. - Размер пакета увеличивается с помощью
num_replicas_in_sync
. Это гарантирует, что каждая реплика обрабатывает одинаковое количество примеров на каждом этапе. Масштабирование размера пакета — лучшая практика при использовании стратегий параллелизма синхронных данных в TensorFlow. - Сохранение вашей модели немного сложнее в случае с несколькими рабочими процессами, поскольку место назначения должно быть разным для каждого из рабочих процессов. Главный рабочий сохранит модель в желаемом каталоге, а другие работники сохранят модель во временных каталогах. Важно, чтобы эти временные каталоги были уникальными, чтобы предотвратить запись нескольких рабочих процессов в одно и то же место. Сбережение может включать в себя коллективные операции, а это означает, что экономить должны все работники, а не только руководитель. Функции
_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 вашей облачной консоли:
Шаг 1. Настройте задание обучения
Нажмите «Создать» , чтобы ввести параметры вашего учебного задания.
- В разделе «Набор данных» выберите «Нет управляемого набора данных».
- Затем выберите «Индивидуальное обучение (расширенное)» в качестве метода обучения и нажмите « Продолжить» .
- Введите
multiworker-cassava
(или как вы хотите назвать свою модель) в поле «Название модели ». - Нажмите Продолжить
На шаге «Настройки контейнера» выберите «Пользовательский контейнер» :
В первом поле ( Образ контейнера ) введите значение переменной IMAGE_URI
из предыдущего раздела. Это должно быть: gcr.io/your-cloud-project/multiworker:cassava
с вашим собственным идентификатором проекта. Остальные поля оставьте пустыми и нажмите «Продолжить» .
Пропустите шаг «Гиперпараметры», снова нажав «Продолжить» .
Шаг 2. Настройка вычислительного кластера
Vertex AI предоставляет 4 рабочих пула для выполнения различных типов машинных задач.
Рабочий пул 0 настраивает основного, главного, планировщика или «главного». В MultiWorkerMirroredStrategy
все машины обозначены как рабочие, то есть физические машины, на которых выполняются реплицированные вычисления. Помимо того, что каждая машина является рабочей, должен быть один рабочий, который берет на себя дополнительную работу, например сохранение контрольных точек и запись файлов сводки в TensorBoard. Эта машина известна как шеф. Всегда есть только один главный работник, поэтому количество рабочих для пула рабочих 0 всегда будет равно 1.
В разделе «Вычисления и цены» оставьте выбранный регион как есть и настройте рабочий пул 0 следующим образом:
В рабочем пуле 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. Если вы хотите полностью удалить блокнот, нажмите кнопку «Удалить».
Чтобы удалить сегмент хранилища, в меню навигации облачной консоли перейдите к разделу «Хранилище», выберите сегмент и нажмите «Удалить»: