Прототипирование моделей в ноутбуках на платформе AI

1. Обзор

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

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

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

  • Создайте и настройте экземпляр блокнотов AI Platform.
  • Отслеживайте код ваших блокнотов с помощью Git, интегрированного непосредственно в AI Platform Notebooks.
  • Воспользуйтесь инструментом «Что если» в своей записной книжке.

Общая стоимость запуска этой лабораторной работы в Google Cloud составляет около 1 доллара . Подробную информацию о ценах на AI Platform Notebooks можно найти здесь .

2. Создайте экземпляр AI Platform Notebooks.

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

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

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

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

Перейдите в раздел «Блокноты платформы ИИ» в вашей облачной консоли и нажмите «Создать экземпляр» . Затем выберите последний тип экземпляра TensorFlow 2 Enterprise без графических процессоров :

9f2bb4dec1ba4f4f.png

Присвойте своему экземпляру имя или используйте имя по умолчанию. Затем мы рассмотрим параметры настройки. Нажмите кнопку «Настроить» :

63be602ba45ca7c9.png

AI Platform Notebooks предлагает множество различных параметров настройки, включая: регион развертывания экземпляра, тип образа, размер машины, количество графических процессоров и многое другое. Мы будем использовать значения по умолчанию для региона и среды. Для конфигурации машины мы будем использовать машину n1-standard-8 :

27101d232f765a17.png

Мы не будем добавлять графические процессоры и будем использовать настройки по умолчанию для загрузочного диска, сети и прав доступа. Выберите «Создать» , чтобы создать свой экземпляр. Это займет несколько минут.

После создания экземпляра в пользовательском интерфейсе Notebooks рядом с ним появится зеленая галочка. Выберите «Открыть JupyterLab» , чтобы открыть свой экземпляр и начать прототипирование:

3598f414887ea9a8.png

После запуска экземпляра создайте новую директорию с именем codelab. Именно в этой директории мы будем работать на протяжении всей лабораторной работы:

c16a821546acd92.png

Перейдите в созданную папку codelab , дважды щелкнув по ней, а затем выберите Python 3 notebook в меню запуска:

4390b1614ae8eae4.png

Переименуйте блокнот в demo.ipynb или в любое другое имя по вашему желанию.

Шаг 4: Импорт пакетов Python

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

import pandas as pd
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

import numpy as np
import json

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

3. Подключите данные BigQuery к своему блокноту.

BigQuery, хранилище больших данных Google Cloud, предоставило множество общедоступных наборов данных для изучения. Блокноты AI Platform Notebooks поддерживают прямую интеграцию с BigQuery без необходимости аутентификации.

Для этой лабораторной работы мы будем использовать набор данных о рождаемости . Он содержит данные почти о каждом рождении в США за 40-летний период, включая вес ребенка при рождении и демографическую информацию о родителях ребенка. Мы будем использовать подмножество этих данных для прогнозирования веса ребенка при рождении.

Шаг 1: Загрузите данные BigQuery в наш блокнот.

Для загрузки данных в DataFrame Pandas мы будем использовать клиентскую библиотеку Python для BigQuery. Исходный набор данных имеет размер 21 ГБ и содержит 123 миллиона строк. Для простоты мы будем использовать только 10 000 строк из набора данных.

Сформируйте запрос и просмотрите полученный DataFrame с помощью следующего кода. Здесь мы получаем 4 признака из исходного набора данных, а также вес ребенка (то, что будет предсказывать наша модель). Набор данных охватывает много лет, но для этой модели мы будем использовать только данные после 2000 года:

query="""
SELECT
  weight_pounds,
  is_male,
  mother_age,
  plurality,
  gestation_weeks
FROM
  publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()

Чтобы получить сводку числовых характеристик в нашем наборе данных, выполните следующую команду:

df.describe()

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

df['is_male'].value_counts()

Похоже, что в наборе данных гендерный баланс практически одинаков (50/50).

Шаг 2: Подготовка набора данных для обучения

Теперь, когда мы загрузили набор данных в наш ноутбук в виде Pandas DataFrame, мы можем выполнить предварительную обработку и разделить его на обучающую и тестовую выборки.

Для начала удалим из набора данных строки с нулевыми значениями и перемешаем данные:

df = df.dropna()
df = shuffle(df, random_state=2)

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

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
data['is_male'] = data['is_male'].astype(int)

Теперь, если вы просмотрите наш набор данных, запустив data.head() , вы увидите четыре признака, которые мы будем использовать для обучения.

4. Инициализация Git

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

Шаг 1: Инициализация репозитория Git.

В папке с кодом JupyterLab выберите Git , а затем Init в верхней строке меню:

d9f1729358f18e58.png

Когда система спросит, хотите ли вы сделать эту директорию репозиторием Git, выберите «Да» . Затем выберите значок Git на левой боковой панели, чтобы увидеть статус ваших файлов и коммитов:

1648d6828f11a6db.png

Шаг 2: Сделайте свой первый коммит.

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

Установите флажок рядом с файлом блокнота demo.ipynb , чтобы добавить его в индекс для фиксации изменений (каталог .ipynb_checkpoints/ можно игнорировать). Введите сообщение для фиксации изменений в текстовом поле, а затем нажмите на галочку, чтобы зафиксировать изменения:

fe7366522a3a268f.png

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

d03567c3592afb77.png

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

5. Создайте и обучите модель TensorFlow.

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

Шаг 1: Разделите данные на обучающую и тестовую выборки.

Для разделения данных перед построением модели мы воспользуемся утилитой train_test_split библиотеки Scikit Learn:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

Теперь мы готовы создать нашу модель TensorFlow!

Шаг 2: Создание и обучение модели TensorFlow.

Мы будем создавать эту модель, используя API Sequential модели tf.keras, который позволяет определить нашу модель как стек слоев. Весь необходимый код для создания модели находится здесь:

model = Sequential([
    Dense(64, activation='relu', input_shape=(len(x_train.iloc[0]),)),
    Dense(32, activation='relu'),
    Dense(1)]
)

Затем мы скомпилируем нашу модель, чтобы её можно было обучить. Здесь мы выберем оптимизатор модели, функцию потерь и метрики, которые модель будет регистрировать во время обучения. Поскольку это регрессионная модель (прогнозирующая числовое значение), в качестве метрики мы используем среднеквадратичную ошибку вместо точности:

model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.MeanSquaredError(),
              metrics=['mae', 'mse'])

Вы можете использовать удобную функцию ` model.summary() ` в Keras, чтобы увидеть форму и количество обучаемых параметров вашей модели на каждом слое.

Теперь мы готовы обучить нашу модель. Все, что нам нужно сделать, это вызвать метод fit() , передав ему наши обучающие данные и метки. Здесь мы будем использовать необязательный параметр validation_split, который будет содержать часть наших обучающих данных для проверки модели на каждом шаге. В идеале вы должны видеть, как уменьшаются потери как на обучающей, так и на валидационной выборках. Но помните, что в этом примере мы больше сосредоточены на модели и инструментах Notebook, чем на качестве модели:

model.fit(x_train, y_train, epochs=10, validation_split=0.1)

Шаг 3: Сгенерируйте прогнозы на тестовых примерах

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

num_examples = 10
predictions = model.predict(x_test[:num_examples])

Затем мы пройдемся по прогнозам нашей модели, сравнивая их с фактическим значением:

for i in range(num_examples):
    print('Predicted val: ', predictions[i][0])
    print('Actual val: ',y_test.iloc[i])
    print()

Шаг 4: Используйте команду `git diff` и зафиксируйте изменения.

Теперь, когда вы внесли изменения в блокнот, вы можете опробовать функцию git diff, доступную в пользовательском интерфейсе Git для блокнотов. Блокнот demo.ipynb теперь должен находиться в разделе «Изменено» в пользовательском интерфейсе. Наведите курсор на имя файла и щелкните значок diff:

a370facb3632fb32.png

После этого вы сможете увидеть разницу в изменениях, примерно так:

461c502bd3ab910e.png

На этот раз мы зафиксируем изменения через командную строку с помощью Терминала. В меню Git в верхней панели меню JupyterLab выберите «Команда Git в Терминале» . Если у вас открыта вкладка Git в левой боковой панели во время выполнения команд ниже, вы сможете увидеть свои изменения в пользовательском интерфейсе Git.

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

git add demo.ipynb

Затем выполните следующую команду, чтобы зафиксировать изменения (вы можете использовать любое сообщение для фиксации):

git commit -m "Build and train TF model"

После этого вы должны увидеть свой последний коммит в истории:

a4b44045e97cb7a7.png

6. Используйте инструмент «Что если» прямо из своего блокнота.

Инструмент What-If — это интерактивный визуальный интерфейс, разработанный для визуализации ваших наборов данных и лучшего понимания результатов работы ваших моделей машинного обучения. Это инструмент с открытым исходным кодом, созданный командой PAIR в Google. Хотя он работает с любым типом моделей, некоторые его функции разработаны специально для платформы Cloud AI Platform.

Инструмент What-If Tool предустановлен в экземплярах Cloud AI Platform Notebooks с TensorFlow. Здесь мы будем использовать его, чтобы оценить общую производительность нашей модели и проанализировать ее поведение на данных из нашего тестового набора.

Шаг 1: Подготовка данных для инструмента «Что если».

Чтобы максимально эффективно использовать инструмент «Что если», мы отправим ему примеры из нашего тестового набора вместе с истинными метками для этих примеров ( y_test ). Таким образом, мы сможем сравнить предсказания нашей модели с истинными значениями. Запустите приведенную ниже строку кода, чтобы создать новый DataFrame с нашими тестовыми примерами и их метками:

wit_data = pd.concat([x_test, y_test], axis=1)

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

def custom_predict(examples_to_infer):
    preds = model.predict(examples_to_infer)
    return preds

Шаг 2: Создайте экземпляр инструмента «Что если».

Мы создадим экземпляр инструмента What-If, передав ему 500 примеров из объединенного тестового набора данных + метки истинных значений, которые мы только что создали. Мы создадим экземпляр WitConfigBuilder для настройки инструмента, передав ему наши данные, пользовательскую функцию прогнозирования, которую мы определили выше, а также нашу целевую переменную (то, что мы прогнозируем) и тип модели:

config_builder = (WitConfigBuilder(wit_data[:500].values.tolist(), data.columns.tolist() + ['weight_pounds'])
  .set_custom_predict_fn(custom_predict)
  .set_target_feature('weight_pounds')
  .set_model_type('regression'))
WitWidget(config_builder, height=800)

При загрузке инструмента «Что если» вы должны увидеть что-то подобное:

fcdc1cb7ed8e364e.png

На оси X вы можете увидеть точки ваших тестовых данных, распределенные в соответствии с прогнозируемым значением веса модели, weight_pounds .

Шаг 3: Изучите поведение модели с помощью инструмента «Что если».

С помощью инструмента «Что если» можно сделать множество интересных вещей. Мы рассмотрим лишь некоторые из них. Для начала давайте посмотрим на редактор точек данных. Вы можете выбрать любую точку данных, чтобы увидеть ее характеристики, и изменить значения характеристик. Начните с щелчка по любой точке данных:

2ba944f16240ff4b.png

Слева вы увидите значения признаков для выбранной точки данных. Вы также можете сравнить истинную метку этой точки данных со значением, предсказанным моделью. В левой боковой панели вы также можете изменить значения признаков и повторно запустить предсказание модели, чтобы увидеть, как это изменение повлияло на вашу модель. Например, мы можем изменить значение gestation_weeks на 30 для этой точки данных, дважды щелкнув по ней и повторно запустив предсказание:

aaa6a937c66758cf.png

Используя выпадающие меню в разделе построения графиков инструмента «Что если», вы можете создавать всевозможные пользовательские визуализации. Например, вот диаграмма, где по оси X отложен прогнозируемый вес моделей, по оси Y — возраст матери, а точки окрашены в соответствии с ошибкой вывода (более темный цвет означает большую разницу между прогнозируемым и фактическим весом). Здесь видно, что по мере уменьшения веса ошибка модели немного увеличивается:

cd2ce527a9044e7b.png

Далее, нажмите кнопку «График частичной зависимости» слева. Она показывает, как каждый параметр влияет на прогноз модели. Например, с увеличением срока беременности прогнозируемый моделью вес новорожденного также увеличивается:

1fec2a64fb03f432.png

Дополнительные идеи для анализа с помощью инструмента «Что если» можно найти по ссылкам в начале этого раздела.

7. Дополнительно: подключите свой локальный репозиторий Git к GitHub.

Наконец, мы узнаем, как связать репозиторий Git в нашем экземпляре ноутбука с репозиторием в нашей учетной записи GitHub. Для выполнения этого шага вам потребуется учетная запись GitHub .

Шаг 1: Создайте новый репозиторий на GitHub.

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

Откройте окно терминала и добавьте свой новый репозиторий в качестве удалённого репозитория. Замените username в URL-адресе репозитория ниже на ваше имя пользователя GitHub, а your-repo на имя только что созданного вами репозитория:

git remote add origin git@github.com:username/your-repo.git

Шаг 2: Пройдите аутентификацию в GitHub в вашем экземпляре ноутбуков.

Далее вам потребуется пройти аутентификацию в GitHub из вашего экземпляра ноутбука. Этот процесс различается в зависимости от того, включена ли у вас двухфакторная аутентификация в GitHub.

Если вы не знаете, с чего начать, следуйте инструкциям в документации GitHub, чтобы создать SSH-ключ , а затем добавьте новый ключ в GitHub .

Шаг 3: Убедитесь, что вы правильно связали свой репозиторий GitHub.

Чтобы убедиться, что все настроено правильно, выполните команду git remote -v в терминале. Вы должны увидеть свой новый репозиторий в списке удаленных репозиториев. Как только вы увидите URL-адрес своего репозитория GitHub и пройдете аутентификацию в GitHub из своего ноутбука, вы будете готовы отправлять изменения непосредственно в GitHub из своего экземпляра ноутбука.

Чтобы синхронизировать локальный репозиторий Git с вашим недавно созданным репозиторием GitHub, нажмите кнопку загрузки в облако в верхней части боковой панели Git:

eec001587bb9cfb1.png

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

На вкладке «История» в пользовательском интерфейсе Git в Notebooks вы можете увидеть, синхронизированы ли ваши локальные коммиты с GitHub. В этом примере origin/master соответствует нашему репозиторию на GitHub:

2c3d1eb7cf95c24e.png

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

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

Вы многого добились в этой лаборатории 👏👏👏

Подводя итог, вы научились:

  • Создайте и настройте экземпляр блокнота для платформы искусственного интеллекта.
  • Инициализируйте локальный репозиторий Git в этом экземпляре, добавляйте коммиты через пользовательский интерфейс Git или командную строку, просматривайте различия Git в пользовательском интерфейсе Git в Notebook.
  • Создайте и обучите простую модель TensorFlow 2.
  • Используйте инструмент «Что если» в своем экземпляре блокнота.
  • Подключите свой репозиторий Git в Notebook к внешнему репозиторию на GitHub.

9. Уборка

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

ba727f9a0aefbc30.png

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

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