Vertex AI Workbench: обучение модели TensorFlow с данными из BigQuery

1. Обзор

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

Чему вы научитесь

Вы научитесь:

  • Создайте и настройте экземпляр Vertex AI Workbench.
  • Используйте коннектор Vertex AI Workbench к BigQuery.
  • Обучение модели на основе ядра Vertex AI Workbench.

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

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

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

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

Vertex AI Workbench помогает пользователям быстро создавать комплексные рабочие процессы на основе блокнотов благодаря глубокой интеграции с сервисами данных (такими как Dataproc, Dataflow, BigQuery и Dataplex) и Vertex AI. Он позволяет специалистам по обработке данных подключаться к сервисам данных GCP, анализировать наборы данных, экспериментировать с различными методами моделирования, развертывать обученные модели в производственной среде и управлять операциями MLOps на протяжении всего жизненного цикла модели.

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

В этой лабораторной работе вы изучите набор данных London Bicycles Hire . Эти данные содержат информацию о поездках на велосипедах из лондонской программы общественного проката велосипедов с 2011 года. Вы начнете с изучения этого набора данных в BigQuery с помощью коннектора Vertex AI Workbench BigQuery. Затем вы загрузите данные в Jupyter Notebook с помощью pandas и обучите модель TensorFlow для прогнозирования продолжительности поездки на велосипеде на основе времени поездки и пройденного расстояния.

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

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

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

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

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

Шаг 2: Включите API Vertex AI

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

Панель мониторинга Vertex AI

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

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

Меню Vertex AI

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

Notebook_api

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

Notebooks_UI

Затем выберите «Создать новый блокнот» .

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

Присвойте своему блокноту имя, а в разделе «Разрешения» выберите «Учетная запись службы».

сервисный_аккаунт

Выберите «Расширенные настройки» .

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

enable_terminal

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

Далее нажмите «Создать» .

После создания экземпляра выберите «ОТКРЫТЬ JUPYTERLAB» .

enable_terminal

5. Изучите набор данных в BigQuery.

В экземпляре Vertex AI Workbench перейдите в левую часть экрана и щелкните по коннектору BigQuery in Notebooks .

Разъем BQ

Коннектор BigQuery позволяет легко исследовать и запрашивать наборы данных BigQuery. Помимо любых наборов данных в вашем проекте, вы можете исследовать наборы данных в других проектах, нажав кнопку «Добавить проект» .

приколоть

Для этой лабораторной работы вы будете использовать данные из общедоступных наборов данных BigQuery. Прокрутите страницу вниз, пока не найдете набор данных london_bicycles . Вы увидите, что этот набор данных содержит две таблицы: cycle_hire и cycle_stations . Давайте рассмотрим каждую из них.

london_bike_ds

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

cycle_hire_ds

Если вы перейдете на вкладку «Предварительный просмотр» , вы сможете увидеть пример данных. Давайте выполним простой запрос, чтобы посмотреть, какие маршруты пользуются наибольшей популярностью. Сначала нажмите кнопку «Запрос к таблице» .

cycle_hire_preview_ds

Затем вставьте следующий код в редактор SQL и нажмите «Отправить запрос» .

SELECT
  start_station_name,
  end_station_name,
  IF(start_station_name = end_station_name,
    TRUE,
    FALSE) same_station,
  AVG(duration) AS avg_duration,
  COUNT(*) AS total_rides
FROM
  `bigquery-public-data.london_bicycles.cycle_hire`
GROUP BY
  start_station_name,
  end_station_name,
  same_station
ORDER BY
  total_rides DESC

Из результатов поиска видно, что поездки на велосипеде до станции Hyde Park Corner и обратно пользовались наибольшей популярностью.

journey_query_results

Далее дважды щелкните по таблице cycle_stations , которая содержит информацию о каждой станции.

Нам нужно объединить таблицы cycle_hire и cycle_stations . Таблица cycle_stations содержит координаты широты и долготы каждой станции. Вы будете использовать эту информацию для оценки пройденного расстояния за каждую поездку на велосипеде, вычисляя расстояние между начальной и конечной станциями.

Для выполнения этого расчета вы будете использовать географические функции BigQuery . В частности, вы преобразуете каждую строку широты/долготы в объект ST_GEOGPOINT и используете функцию ST_DISTANCE для вычисления расстояния по прямой в метрах между двумя точками. Вы будете использовать это значение в качестве приблизительной величины пройденного расстояния за каждую поездку на велосипеде.

Скопируйте следующий запрос в свой SQL-редактор и нажмите «Отправить запрос». Обратите внимание, что в условии JOIN используются три таблицы, поскольку нам нужно дважды объединить таблицу stations, чтобы получить широту/долготу как для начальной, так и для конечной станции цикла.

WITH staging AS (
    SELECT
        STRUCT(
            start_stn.name,
            ST_GEOGPOINT(start_stn.longitude, start_stn.latitude) AS POINT,
            start_stn.docks_count,
            start_stn.install_date
        ) AS starting,
        STRUCT(
            end_stn.name,
            ST_GEOGPOINT(end_stn.longitude, end_stn.latitude) AS point,
            end_stn.docks_count,
            end_stn.install_date
        ) AS ending,
        STRUCT(
            rental_id,
            bike_id,
            duration, --seconds
            ST_DISTANCE(
                ST_GEOGPOINT(start_stn.longitude, start_stn.latitude),
                ST_GEOGPOINT(end_stn.longitude, end_stn.latitude)
            ) AS distance, --meters
            start_date,
            end_date
        ) AS bike
        FROM `bigquery-public-data.london_bicycles.cycle_stations` AS start_stn
        LEFT JOIN `bigquery-public-data.london_bicycles.cycle_hire` as b
        ON start_stn.id = b.start_station_id
        LEFT JOIN `bigquery-public-data.london_bicycles.cycle_stations` AS end_stn
        ON end_stn.id = b.end_station_id
        LIMIT 700000)

SELECT * from STAGING

6. Обучение модели машинного обучения на ядре TensorFlow.

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

Создать DataFrame

После выполнения запроса нажмите «Скопировать код для DataFrame». Это позволит вам вставить код Python в блокнот, который подключается к клиенту BigQuery и извлекает эти данные в виде DataFrame pandas.

copy_for_df

Далее вернитесь в меню запуска и создайте блокнот TensorFlow 2.

tf_kernel

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

# The following two lines are only necessary to run once.
# Comment out otherwise for speed-up.
from google.cloud.bigquery import Client, QueryJobConfig
client = Client()

query = """WITH staging AS (
    SELECT
        STRUCT(
            start_stn.name,
            ST_GEOGPOINT(start_stn.longitude, start_stn.latitude) AS POINT,
            start_stn.docks_count,
            start_stn.install_date
        ) AS starting,
        STRUCT(
            end_stn.name,
            ST_GEOGPOINT(end_stn.longitude, end_stn.latitude) AS point,
            end_stn.docks_count,
            end_stn.install_date
        ) AS ending,
        STRUCT(
            rental_id,
            bike_id,
            duration, --seconds
            ST_DISTANCE(
                ST_GEOGPOINT(start_stn.longitude, start_stn.latitude),
                ST_GEOGPOINT(end_stn.longitude, end_stn.latitude)
            ) AS distance, --meters
            start_date,
            end_date
        ) AS bike
        FROM `bigquery-public-data.london_bicycles.cycle_stations` AS start_stn
        LEFT JOIN `bigquery-public-data.london_bicycles.cycle_hire` as b 
        ON start_stn.id = b.start_station_id
        LEFT JOIN `bigquery-public-data.london_bicycles.cycle_stations` AS end_stn
        ON end_stn.id = b.end_station_id
        LIMIT 700000)

SELECT * from STAGING"""
job = client.query(query)
df = job.to_dataframe()

Для целей этой лабораторной работы мы ограничиваем набор данных 700 000 значениями, чтобы сократить время обучения. Но вы можете свободно изменять запрос и экспериментировать со всем набором данных.

Далее импортируйте необходимые библиотеки.

from datetime import datetime
import pandas as pd
import tensorflow as tf

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

values = df['bike'].values
duration = list(map(lambda a: a['duration'], values))
distance = list(map(lambda a: a['distance'], values))
dates = list(map(lambda a: a['start_date'], values))
data = pd.DataFrame(data={'duration': duration, 'distance': distance, 'start_date':dates})
data = data.dropna()

Столбец start_date представляет собой объект datetime в Python. Вместо того чтобы использовать этот datetime непосредственно в модели, вы создадите два новых признака, которые будут указывать день недели и час дня, когда произошла велосипедная поездка.

data['weekday'] = data['start_date'].apply(lambda a: a.weekday())
data['hour'] = data['start_date'].apply(lambda a: a.time().hour)
data = data.drop(columns=['start_date'])

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

data['duration'] = data['duration'].apply(lambda x:float(x / 60))

Изучите первые несколько строк отформатированного DataFrame. Для каждой поездки на велосипеде у вас теперь есть данные о дне недели и часе дня, когда состоялась поездка, а также о пройденном расстоянии. На основе этой информации вы попытаетесь предсказать, сколько времени заняла поездка.

data.head()

data_head

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

# Use 80/20 train/eval split
train_size = int(len(data) * .8)
print ("Train size: %d" % train_size)
print ("Evaluation size: %d" % (len(data) - train_size))

# Split data into train and test sets
train_data = data[:train_size]
val_data = data[train_size:]

Создание модели TensorFlow

Вы создадите модель TensorFlow, используя функциональный API Keras . Для предварительной обработки входных данных вы воспользуетесь API слоев предварительной обработки Keras.

Следующая вспомогательная функция создаст объект tf.data.Dataset из DataFrame pandas.

def df_to_dataset(dataframe, label, shuffle=True, batch_size=32):
  dataframe = dataframe.copy()
  labels = dataframe.pop(label)
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(dataframe))
  ds = ds.batch(batch_size)
  ds = ds.prefetch(batch_size)
  return ds

Используйте указанную выше функцию для создания двух tf.data.Dataset : одного для обучения и одного для проверки. Возможно, вы увидите несколько предупреждений, но их можно смело игнорировать.

train_dataset = df_to_dataset(train_data, 'duration')
validation_dataset = df_to_dataset(val_data, 'duration')

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

  • Слой нормализации : выполняет поэлементную нормализацию входных признаков.
  • Слой IntegerLookup : преобразует целочисленные значения категорий в целочисленные индексы.
  • Слой CategoryEncoding : преобразует целочисленные категориальные признаки в однокристальные, многокристальные или TF-IDF плотные представления.

Обратите внимание, что эти слои не обучаемые. Вместо этого вы устанавливаете состояние слоя предварительной обработки, предоставляя ему доступ к обучающим данным с помощью метода adapt() .

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

def get_normalization_layer(name, dataset):
  # Create a Normalization layer for our feature.
  normalizer = tf.keras.layers.Normalization(axis=None)

  # Prepare a Dataset that only yields our feature.
  feature_ds = dataset.map(lambda x, y: x[name])

  # Learn the statistics of the data.
  normalizer.adapt(feature_ds)

  return normalizer

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

def get_category_encoding_layer(name, dataset, dtype, max_tokens=None):
  index = tf.keras.layers.IntegerLookup(max_tokens=max_tokens)

  # Prepare a Dataset that only yields our feature
  feature_ds = dataset.map(lambda x, y: x[name])

  # Learn the set of possible values and assign them a fixed integer index.
  index.adapt(feature_ds)

  # Create a Discretization for our integer indices.
  encoder = tf.keras.layers.CategoryEncoding(num_tokens=index.vocabulary_size())

  # Apply one-hot encoding to our indices. The lambda function captures the
  # layer so we can use them, or include them in the functional model later.
  return lambda feature: encoder(index(feature))

Далее создайте часть модели, отвечающую за предварительную обработку. Сначала создайте слой tf.keras.Input для каждого из признаков.

# Create a Keras input layer for each feature
numeric_col = tf.keras.Input(shape=(1,), name='distance')
hour_col = tf.keras.Input(shape=(1,), name='hour', dtype='int64')
weekday_col = tf.keras.Input(shape=(1,), name='weekday', dtype='int64')

Затем создайте слои нормализации и кодирования категорий, сохранив их в списке.

all_inputs = []
encoded_features = []

# Pass 'distance' input to normalization layer
normalization_layer = get_normalization_layer('distance', train_dataset)
encoded_numeric_col = normalization_layer(numeric_col)
all_inputs.append(numeric_col)
encoded_features.append(encoded_numeric_col)

# Pass 'hour' input to category encoding layer
encoding_layer = get_category_encoding_layer('hour', train_dataset, dtype='int64')
encoded_hour_col = encoding_layer(hour_col)
all_inputs.append(hour_col)
encoded_features.append(encoded_hour_col)

# Pass 'weekday' input to category encoding layer
encoding_layer = get_category_encoding_layer('weekday', train_dataset, dtype='int64')
encoded_weekday_col = encoding_layer(weekday_col)
all_inputs.append(weekday_col)
encoded_features.append(encoded_weekday_col)

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

all_features = tf.keras.layers.concatenate(encoded_features)
x = tf.keras.layers.Dense(64, activation="relu")(all_features)
output = tf.keras.layers.Dense(1)(x)
model = tf.keras.Model(all_inputs, output)

Наконец, скомпилируйте модель.

model.compile(optimizer = tf.keras.optimizers.Adam(0.001),
              loss='mean_squared_logarithmic_error')

Теперь, когда вы определили модель, вы можете визуализировать архитектуру.

tf.keras.utils.plot_model(model, show_shapes=True, rankdir="LR")

keras_model

Обратите внимание, что эта модель довольно сложна для данного простого набора данных. Она предназначена для демонстрационных целей.

Давайте проведем обучение в течение одной эпохи, чтобы просто убедиться, что код работает.

model.fit(train_dataset, validation_data = validation_dataset, epochs = 1)

Обучение модели с помощью графического процессора.

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

Чтобы изменить профиль оборудования, щелкните тип устройства в правом верхнем углу и выберите «Изменить оборудование».

модифицировать_оборудование

Выберите пункт «Подключить графические процессоры» и выберите графический процессор NVIDIA T4 Tensor Core.

add_gpu

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

model.fit(train_dataset, validation_data = validation_dataset, epochs = 5)

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

Вы научились использовать Vertex AI Workbench для:

  • Анализируйте данные в BigQuery.
  • Используйте клиент BigQuery для загрузки данных в Python.
  • Обучение модели TensorFlow с использованием слоев предварительной обработки Keras и графического процессора.

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

7. Уборка

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

удалить