1. Обзор
В этой лабораторной работе вы пройдете полный рабочий процесс обучения модели машинного обучения в Google Cloud, используя PyTorch для ее построения. В среде Cloud AI Platform Notebooks вы узнаете, как упаковать задание обучения для запуска на платформе AI Platform Training с настройкой гиперпараметров.
Чему вы научитесь
Вы научитесь:
- Создайте экземпляр AI Platform Notebooks.
- Создайте модель PyTorch.
- Обучите свою модель с помощью настройки гиперпараметров на платформе AI Platform Training.
Общая стоимость запуска этой лабораторной работы в Google Cloud составляет около 1 доллара .
2. Настройте свою среду.
Для выполнения этого практического задания вам потребуется проект Google Cloud Platform с включенной функцией оплаты. Чтобы создать проект, следуйте инструкциям здесь .
Шаг 1: Включите API моделей облачной платформы ИИ.
Перейдите в раздел «Модели платформы ИИ» в консоли Cloud Console и нажмите «Включить», если эта функция еще не включена.

Шаг 2: Включите API Compute Engine.
Перейдите в Compute Engine и выберите «Включить», если эта опция еще не включена. Она понадобится для создания экземпляра ноутбука.
Шаг 3: Создайте экземпляр AI Platform Notebooks.
Перейдите в раздел «Блокноты платформы ИИ» в вашей облачной консоли и нажмите «Создать экземпляр» . Затем выберите последний тип экземпляра PyTorch (без графических процессоров):

Используйте параметры по умолчанию или при желании задайте собственное имя, а затем нажмите «Создать ». После создания экземпляра выберите «Открыть JupyterLab» :

Далее откройте экземпляр блокнота Python 3 из панели запуска:

Вы готовы начать!
Шаг 5: Импорт пакетов Python
В первой ячейке вашего блокнота добавьте следующие импорты и запустите ячейку. Вы можете запустить её, нажав кнопку со стрелкой вправо в верхнем меню или нажав комбинацию клавиш Command+Enter:
import datetime
import numpy as np
import os
import pandas as pd
import time
Обратите внимание, что мы здесь не импортируем PyTorch. Это потому, что мы запускаем задачу обучения на платформе AI Platform Training, а не из нашего экземпляра Notebook.
3. Создайте пакет для выполнения обучающей работы.
Для запуска нашей задачи обучения на платформе AI Platform Training нам потребуется код обучения, упакованный локально в нашем экземпляре Notebooks, и хранилище Cloud Storage для хранения ресурсов для нашей задачи. Сначала мы создадим хранилище. Вы можете пропустить этот шаг, если у вас его уже есть.
Шаг 1: Создайте сегмент облачного хранилища для нашей модели.
Для начала определим несколько переменных окружения, которые мы будем использовать на протяжении всего остального практического занятия. Заполните приведенные ниже значения именем вашего проекта Google Cloud и именем облачного хранилища, которое вы хотите создать (имя должно быть уникальным для всего мира):
# Update these to your own GCP project, model, and version names
GCP_PROJECT = 'your-gcp-project'
BOCKET_URL = 'gs://storage_bucket_name'
Теперь мы готовы создать хранилище, на которое мы укажем, когда начнём наше обучение.
Выполните следующую команду gsutil в своем ноутбуке, чтобы создать корзину:
!gsutil mb $BUCKET_URL
Шаг 2: Создайте начальные файлы для нашего пакета Python.
Для запуска задачи обучения на платформе ИИ нам потребуется настроить наш код как пакет Python. Это включает в себя файл setup.py в корневом каталоге, который указывает все зависимости внешних пакетов, подкаталог с именем нашего пакета (здесь мы назовем его trainer/ ), и пустой файл __init__.py в этом подкаталоге.
Для начала напишем файл setup.py. Мы используем магические конструкции iPython %%writefile для сохранения файла в нашем экземпляре. Здесь мы указали 3 внешние библиотеки, которые будем использовать в нашем коде обучения: PyTorch, Scikit-learn и Pandas:
%%writefile setup.py
from setuptools import find_packages
from setuptools import setup
REQUIRED_PACKAGES = ['torch>=1.5', 'scikit-learn>=0.20', 'pandas>=1.0']
setup(
name='trainer',
version='0.1',
install_requires=REQUIRED_PACKAGES,
packages=find_packages(),
include_package_data=True,
description='My training application package.'
)
Далее создадим каталог trainer/ и пустой файл init.py внутри него. Python использует этот файл для распознавания того, что это пакет:
!mkdir trainer
!touch trainer/__init__.py
Теперь мы готовы приступить к созданию вакансии для обучения.
4. Предварительный просмотр набора данных
В этой лабораторной работе основное внимание уделяется инструментам для обучения моделей, но давайте быстро взглянем на набор данных, который мы будем использовать для обучения нашей модели. Мы будем использовать набор данных о рождаемости, доступный в BigQuery. Он содержит данные о рождаемости в США за несколько десятилетий. Мы будем использовать несколько столбцов из этого набора данных для прогнозирования веса новорожденного. Исходный набор данных довольно большой, и мы будем использовать его подмножество, которое мы предоставили вам в облачном хранилище.
Шаг 1: Загрузка набора данных о рождаемости BigQuery.
Давайте загрузим версию набора данных, которую мы предоставили вам в Cloud Storage, в DataFrame Pandas и посмотрим её.
natality = pd.read_csv('https://storage.googleapis.com/ml-design-patterns/natality.csv')
natality.head()
Этот набор данных содержит чуть менее 100 000 строк. Для прогнозирования веса новорожденного мы будем использовать 5 признаков: возраст матери и отца, срок беременности в неделях, прибавка в весе матери в фунтах и пол ребенка, представленный в виде логического значения.
5. Определите задачу обучения с помощью настройки гиперпараметров.
Мы запишем наш скрипт обучения в файл с именем model.py в подкаталоге trainer/, который мы создали ранее. Наша задача обучения будет выполняться на платформе AI Platform Training, а также будет использовать сервис настройки гиперпараметров AI Platform для поиска оптимальных гиперпараметров для нашей модели с помощью байесовской оптимизации.
Шаг 1: Создайте скрипт обучения.
Сначала создадим файл Python с нашим скриптом обучения. Затем разберем, что в нем происходит. Выполнение команды %%writefile запишет код модели в локальный файл Python:
%%writefile trainer/model.py
import argparse
import hypertune
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.utils import shuffle
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import normalize
def get_args():
"""Argument parser.
Returns:
Dictionary of arguments.
"""
parser = argparse.ArgumentParser(description='PyTorch MNIST')
parser.add_argument('--job-dir', # handled automatically by AI Platform
help='GCS location to write checkpoints and export ' \
'models')
parser.add_argument('--lr', # Specified in the config file
type=float,
default=0.01,
help='learning rate (default: 0.01)')
parser.add_argument('--momentum', # Specified in the config file
type=float,
default=0.5,
help='SGD momentum (default: 0.5)')
parser.add_argument('--hidden-layer-size', # Specified in the config file
type=int,
default=8,
help='hidden layer size')
args = parser.parse_args()
return args
def train_model(args):
# Get the data
natality = pd.read_csv('https://storage.googleapis.com/ml-design-patterns/natality.csv')
natality = natality.dropna()
natality = shuffle(natality, random_state = 2)
natality.head()
natality_labels = natality['weight_pounds']
natality = natality.drop(columns=['weight_pounds'])
train_size = int(len(natality) * 0.8)
traindata_natality = natality[:train_size]
trainlabels_natality = natality_labels[:train_size]
testdata_natality = natality[train_size:]
testlabels_natality = natality_labels[train_size:]
# Normalize and convert to PT tensors
normalized_train = normalize(np.array(traindata_natality.values), axis=0)
normalized_test = normalize(np.array(testdata_natality.values), axis=0)
train_x = torch.Tensor(normalized_train)
train_y = torch.Tensor(np.array(trainlabels_natality))
test_x = torch.Tensor(normalized_test)
test_y = torch.Tensor(np.array(testlabels_natality))
# Define our data loaders
train_dataset = torch.utils.data.TensorDataset(train_x, train_y)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)
test_dataset = torch.utils.data.TensorDataset(test_x, test_y)
test_dataloader = torch.utils.data.DataLoader(test_dataset, batch_size=128, shuffle=False)
# Define the model, while tuning the size of our hidden layer
model = nn.Sequential(nn.Linear(len(train_x[0]), args.hidden_layer_size),
nn.ReLU(),
nn.Linear(args.hidden_layer_size, 1))
criterion = nn.MSELoss()
# Tune hyperparameters in our optimizer
optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)
epochs = 20
for e in range(epochs):
for batch_id, (data, label) in enumerate(train_dataloader):
optimizer.zero_grad()
y_pred = model(data)
label = label.view(-1,1)
loss = criterion(y_pred, label)
loss.backward()
optimizer.step()
val_mse = 0
num_batches = 0
# Evaluate accuracy on our test set
with torch.no_grad():
for i, (data, label) in enumerate(test_dataloader):
num_batches += 1
y_pred = model(data)
mse = criterion(y_pred, label.view(-1,1))
val_mse += mse.item()
avg_val_mse = (val_mse / num_batches)
# Report the metric we're optimizing for to AI Platform's HyperTune service
# In this example, we're mimizing error on our test set
hpt = hypertune.HyperTune()
hpt.report_hyperparameter_tuning_metric(
hyperparameter_metric_tag='val_mse',
metric_value=avg_val_mse,
global_step=epochs
)
def main():
args = get_args()
print('in main', args)
train_model(args)
if __name__ == '__main__':
main()
Работа инструктора состоит из двух функций, в которых и заключается основная часть труда.
- Функция
get_args()` анализирует аргументы командной строки, которые мы передадим при создании задания на обучение, а также гиперпараметры, которые мы хотим оптимизировать с помощью AI Platform. В этом примере наш список аргументов включает только те гиперпараметры, которые мы будем оптимизировать — скорость обучения модели, момент и количество нейронов в скрытом слое. -
train_model(): Здесь мы загружаем данные в DataFrame Pandas, нормализуем их, преобразуем в тензоры PyTorch, а затем определяем нашу модель. Для построения модели мы используем API PyTorchnn.Sequential, который позволяет определить модель как стек слоев:
model = nn.Sequential(nn.Linear(len(train_x[0]), args.hidden_layer_size),
nn.ReLU(),
nn.Linear(args.hidden_layer_size, 1))
Обратите внимание, что вместо того, чтобы жестко задавать размер скрытого слоя нашей модели, мы делаем его гиперпараметром, который платформа AI Platform настроит за нас. Подробнее об этом в следующем разделе.
Шаг 2: Использование сервиса настройки гиперпараметров платформы AI Platform.
Вместо того чтобы вручную пробовать разные значения гиперпараметров и каждый раз переобучать модель, мы воспользуемся сервисом оптимизации гиперпараметров платформы Cloud AI Platform. Если мы настроим задачу обучения с аргументами гиперпараметров, платформа AI Platform будет использовать байесовскую оптимизацию для поиска оптимальных значений указанных нами гиперпараметров.
При настройке гиперпараметров один пробный запуск состоит из одного тренировочного запуска нашей модели с определенной комбинацией значений гиперпараметров. В зависимости от количества запущенных пробных запусков, платформа ИИ будет использовать результаты завершенных проб для оптимизации гиперпараметров, которые она выберет для будущих запусков. Для настройки гиперпараметров необходимо передать файл конфигурации при запуске задачи обучения, содержащий данные по каждому из оптимизируемых гиперпараметров.
Далее создайте этот конфигурационный файл локально:
%%writefile config.yaml
trainingInput:
hyperparameters:
goal: MINIMIZE
maxTrials: 10
maxParallelTrials: 5
hyperparameterMetricTag: val_mse
enableTrialEarlyStopping: TRUE
params:
- parameterName: lr
type: DOUBLE
minValue: 0.0001
maxValue: 0.1
scaleType: UNIT_LINEAR_SCALE
- parameterName: momentum
type: DOUBLE
minValue: 0.0
maxValue: 1.0
scaleType: UNIT_LINEAR_SCALE
- parameterName: hidden-layer-size
type: INTEGER
minValue: 8
maxValue: 32
scaleType: UNIT_LINEAR_SCALE
Для каждого гиперпараметра мы указываем тип, диапазон значений, которые хотим исследовать, и масштаб, по которому значение увеличивается в разных испытаниях.
В начале задачи мы также указываем метрику, которую оптимизируем. Обратите внимание, что в конце нашей функции train_model() описанной выше, мы сообщаем эту метрику платформе AI Platform каждый раз после завершения испытания. Здесь мы минимизируем среднеквадратичную ошибку нашей модели, поэтому мы хотим использовать гиперпараметры, которые приводят к наименьшей среднеквадратичной ошибке для нашей модели. Название этой метрики ( val_mse ) совпадает с именем, которое мы используем для ее сообщения при вызове функции report_hyperparameter_tuning_metric() в конце испытания.
6. Запустите обучающее задание на платформе ИИ.
В этом разделе мы начнем обучение нашей модели с настройки гиперпараметров на платформе AI Platform.
Шаг 1: Определите несколько переменных среды.
Для начала определим несколько переменных окружения, которые мы будем использовать для запуска нашей задачи обучения. Если вы хотите запустить задачу в другом регионе, обновите переменную REGION ниже:
MAIN_TRAINER_MODULE = "trainer.model"
TRAIN_DIR = os.getcwd() + '/trainer'
JOB_DIR = BUCKET_URL + '/output'
REGION = "us-central1"
Каждое задание по обучению на платформе ИИ должно иметь уникальное имя. Выполните следующую команду, чтобы определить переменную для имени вашего задания, используя метку времени:
timestamp = str(datetime.datetime.now().time())
JOB_NAME = 'caip_training_' + str(int(time.time()))
Шаг 2: Начните обучение.
Мы создадим задание для обучения, используя gcloud, интерфейс командной строки Google Cloud. Мы можем запустить эту команду непосредственно в нашем блокноте, используя переменные, которые мы определили выше:
!gcloud ai-platform jobs submit training $JOB_NAME \
--scale-tier basic \
--package-path $TRAIN_DIR \
--module-name $MAIN_TRAINER_MODULE \
--job-dir $JOB_DIR \
--region $REGION \
--runtime-version 2.1 \
--python-version 3.7 \
--config config.yaml
Если ваше задание было создано корректно, перейдите в раздел «Задания» в консоли вашей платформы ИИ, чтобы просмотреть журналы.
Шаг 3: Следите за своей работой
После того, как вы окажетесь в разделе «Задания» консоли, щелкните по только что запущенному заданию, чтобы просмотреть подробности:

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

По мере завершения испытаний результирующее значение вашей метрики оптимизации (в данном случае val_mse ) будет регистрироваться здесь. Выполнение задачи займет 15-20 минут, и после ее завершения панель мониторинга будет выглядеть примерно так (точные значения могут отличаться):

Для устранения потенциальных проблем и более детального мониторинга задания нажмите «Просмотреть журналы» на странице с подробными сведениями о задании:

Здесь отобразятся все операторы print() в коде обучения вашей модели. Если у вас возникнут проблемы, попробуйте добавить больше операторов print и запустить новое задание обучения.
После завершения обучения найдите гиперпараметры, которые дали наименьшее значение val_mse. Вы можете использовать их либо для обучения и экспорта окончательной версии вашей модели, либо в качестве ориентира для запуска нового процесса обучения с дополнительными попытками настройки гиперпараметров.
7. Уборка
Если вы хотите продолжить использование этого блокнота, рекомендуется выключать его, когда он не используется. В интерфейсе блокнотов в вашей облачной консоли выберите блокнот, а затем выберите «Остановить» :

Если вы хотите удалить все ресурсы, созданные в этой лабораторной работе, просто удалите экземпляр блокнота, а не останавливайте его.
В консоли Cloud Console, используя меню навигации, перейдите в раздел «Хранилище» и удалите оба сегмента, созданных для хранения ресурсов вашей модели.