AI Platform Notebooks でモデルをプロトタイピング

1. 概要

このラボでは、データの探索や ML モデルのプロトタイピングに使用できる AI Platform Notebooks のさまざまなツールについて説明します。

学習内容

次の方法を学習します。

  • AI Platform Notebooks インスタンスを作成してカスタマイズする
  • AI Platform Notebooks に直接統合された Git を使用してノートブックのコードを追跡する
  • ノートブックで What-If ツールを使用する

このラボを Google Cloud で実行するための総費用は約 $1 です。AI Platform Notebooks の料金について詳しくは、こちらをご覧ください。

2. AI Platform Notebooks インスタンスを作成する

この Codelab を実行するには、課金が有効になっている Google Cloud Platform プロジェクトが必要です。プロジェクトを作成するには、こちらの手順に沿って操作してください。

ステップ 2: Compute Engine API を有効にする

まだ有効になっていない場合は、[Compute Engine] に移動して [有効にする] を選択します。これはノートブック インスタンスを作成するために必要です。

ステップ 3: ノートブック インスタンスを作成する

Cloud コンソールの [AI Platform Notebooks] セクションに移動し、[新しいインスタンス] をクリックします。次に、最新の [TensorFlow 2 Enterprise] インスタンス タイプ(GPU なし)を選択します。

9f2bb4dec1ba4f4f.png

インスタンスに名前を付けるか、デフォルトを使用します。次に、カスタマイズ オプションについて説明します。[カスタマイズ] ボタンをクリックします。

63be602ba45ca7c9.png

AI Platform Notebooks には、インスタンスがデプロイされているリージョン、イメージタイプ、マシンタイプ、GPU の数など、さまざまなカスタマイズ オプションがあります。[リージョン] と [環境] にはデフォルトの値を使用します。マシン構成には n1-standard-8 マシンを使用します。

27101d232f765a17.png

GPU は追加しません。ブートディスク、ネットワーク、権限のデフォルトを使用します。[作成] を選択してインスタンスを作成します。完了するまでに数分かかります。

インスタンスが作成されると、Notebooks UI でインスタンスの横に緑色のチェックマークが表示されます。[JupyterLab を開く] を選択してインスタンスを開き、プロトタイピングを開始します。

3598f414887ea9a8.png

インスタンスを開いたら、Codelab という新しいディレクトリを作成します。このラボ全体を通してこのディレクトリを使用します。

c16a821546acd92.png

新しく作成した codelab ディレクトリをダブルクリックして開き、ランチャーから Python 3 ノートブックを選択します。

4390b1614ae8eae4.png

ノートブックの名前を demo.ipynb など任意の名前に変更します。

ステップ 4: Python パッケージをインポートする

ノートブックに新しいセルを作成し、この Codelab で使用するライブラリをインポートします。

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 データをノートブックに接続する

Google Cloud のビッグデータ ウェアハウスである BigQuery では、多くのデータセットが一般公開されています。AI Platform Notebooks は、認証を必要とせずに BigQuery との直接統合をサポートします。

このラボでは、出生率データセットを使用します。これには、子供の出生時体重や新生児の両親のユーザー属性情報など、米国での 40 年間にわたるほぼすべての出生に関するデータが含まれています。特徴のサブセットを使用して、新生児の出生時体重を予測します。

ステップ 1: BigQuery データをノートブックにダウンロードする

BigQuery 用の Python クライアント ライブラリを使用して、データを Pandas DataFrame にダウンロードします。元のデータセットは 21 GB で、1 億 2,300 万行が含まれています。簡潔にするために、データセットの 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()

数値列の平均値、標準偏差、最小値、その他の指標が表示されます。最後に、赤ちゃんの性別を示すブール値列のデータを取得しましょう。これは、Pandas の value_counts メソッドで実行できます。

df['is_male'].value_counts()

このデータセットは性別でほぼ 50 対 50 のバランスになっているようです。

ステップ 2: トレーニング用のデータセットを準備する

データセットを Pandas DataFrame としてノートブックにダウンロードしたので、前処理を行い、トレーニング セットとテストセットに分割できます。

まず、null 値を持つ行をデータセットから削除し、データをシャッフルします。

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 つの特徴が表示されます。

4. git を初期化する

AI Platform Notebooks は Git と直接統合されているため、ノートブック環境内で直接バージョン管理を行うことができます。これにより、ノートブック UI で直接、または JupyterLab で利用可能なターミナルからコードを commit できます。このセクションでは、ノートブックで Git リポジトリを初期化し、UI を介して最初の commit を行います。

ステップ 1: Git リポジトリを初期化する

Codelab ディレクトリで、[Git] を選択し、JupyterLab の上部メニューバーから [Init] を選択します。

d9f1729358f18e58.png

このディレクトリを Git Repo にするかどうかを尋ねられたら、[Yes] を選択します。次に、左側のサイドバーにある Git アイコンを選択し、ファイルと commit のステータスを確認します。

1648d6828f11a6db.png

ステップ 2: 最初の commit を行う

この UI では、commit にファイルを追加し、ファイルの差分を確認して(これについては後ほど説明します)、変更を commit できます。まず、先ほど追加したノートブック ファイルを commit します。

demo.ipynb ノートブック ファイルの横にあるチェックボックスをオンにして、commit 用にステージングします(.ipynb_checkpoints/ ディレクトリは無視します)。テキスト ボックスに commit メッセージを入力し、チェックマークをクリックして変更を commit します。

fe7366522a3a268f.png

プロンプトが表示されたら、名前とメールアドレスを入力します。次に、[履歴] タブに戻り、最初の commit を確認します。

d03567c3592afb77.png

このラボが公開されてからの更新により、スクリーンショットが実際の UI と正確に一致しない場合があります。

5. TensorFlow モデルを構築してトレーニングする

ノートブックにダウンロードした BigQuery の出生率データセットを使用して、新生児の体重を予測するモデルを構築します。このラボでは、モデル自体の精度ではなく、ノートブック ツールに焦点を当てます。

ステップ 1: データをトレーニング セットとテストセットに分割する

Scikit Learn の train_test_split ユーティリティを使用して、モデルを構築する前にデータを分割します。

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

これで、TensorFlow モデルを構築する準備が整いました。

ステップ 2: TensorFlow モデルを構築してトレーニングする

このモデルは tf.keras Sequential model API を使用して構築します。これにより、モデルをレイヤのスタックとして定義できます。モデルを構築するために必要なコードはすべてここにあります。

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'])

Keras の便利な model.summary() 関数を使用して、各レイヤでモデルのトレーニング可能なパラメータの形状と数を確認できます。

これで、モデルをトレーニングする準備が整いました。あとは fit() メソッドを呼び出して、トレーニング データとラベルを渡すだけです。ここでは、オプションの validation_split パラメータを使用します。このパラメータには、各ステップでモデルを検証するためのトレーニング データの一部が保持されます。トレーニングと検証の損失が両方とも減少することが理想的です。ただし、この例では、モデルの品質よりもモデルとノートブックのツールを重視しています。

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 を使用して変更を commit する

ノートブックに変更を加えたので、Notebooks の Git UI で利用できる git diff 機能を試してみましょう。demo.ipynb ノートブックが [Changed] に表示されます。セクションに表示されますファイル名にカーソルを合わせ、差分アイコンをクリックします。

a370facb3632fb32.png

これにより、次のように変更の差分を確認できます。

461c502bd3ab910e.png

今回は、ターミナルを使用してコマンドラインから変更を commit します。JupyterLab の上部のメニューバーにある [Git] メニューから [ターミナルの Git コマンド] を選択します。以下のコマンドを実行する際に左側のサイドバーの [git] タブを開いたままにすると、Git UI に変更が反映されていることを確認できます。

新しいターミナル インスタンスで、次のコマンドを実行してノートブック ファイルを commit 用にステージングします。

git add demo.ipynb

次に、次のコマンドを実行して変更を commit します(任意の commit メッセージを使用できます)。

git commit -m "Build and train TF model"

最新の commit が履歴に表示されます。

a4b44045e97cb7a7.png

6. ノートブックから直接 What-If ツールを使用する

What-If ツールは、データセットを可視化し、ML モデルの出力をより深く理解できるように設計された、インタラクティブなビジュアル インターフェースです。Google の PAIR チームによって作成されたオープンソース ツールです。あらゆるタイプのモデルに対応していますが、Cloud AI Platform 専用に構築された機能もあります。

What-If ツールは、TensorFlow を含む Cloud AI Platform Notebooks インスタンスにプリインストールされています。ここでは、これを使用してモデルの全体的なパフォーマンスを確認し、テストセットのデータポイントに対するモデルの動作を調べます。

ステップ 1: What-If ツール用のデータを準備する

What-If ツールを最大限に活用するため、テストセットの例とそれらの例の正解ラベル(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 個のサンプルを渡すことで、What-If ツールをインスタンス化します。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)

What-If ツールが読み込まれると、次のように表示されます。

fcdc1cb7ed8e364e.png

X 軸は、モデルの予測された重み値 weight_pounds で分散されたテスト データポイントを示しています。

ステップ 3: What-If ツールを使用してモデルの動作を確認する

What-If ツールでできることはたくさんあります。ここでは、そのほんの一部をご紹介します。まず、データポイント エディタを見てみましょう。任意のデータポイントを選択して、その特徴を表示し、特徴値を変更できます。まず、任意のデータポイントをクリックします。

2ba944f16240ff4b.png

左側に、選択したデータポイントの特徴値が表示されます。また、そのデータポイントのグラウンド トゥルース ラベルを、モデルによって予測された値と比較することもできます。左側のサイドバーでは、特徴値を変更してモデルの予測を再実行し、この変更がモデルに与えた影響を確認することもできます。たとえば、このデータポイントの gestation_weeks を 30 に変更するには、そのデータポイントをダブルクリックして予測を再実行します。

aaa6a937c66758cf.png

What-If ツールのプロット セクションのプルダウン メニューを使用すると、あらゆる種類のカスタム ビジュアリゼーションを作成できます。たとえば、この 2 つのグラフにモデルの予測体重を X 軸に、母親の年齢を Y 軸に、推論誤差で色分けしたポイント(濃いほど、予測体重と実際の体重の差が大きいことを意味します)この例では、重みが減少すると、モデルの誤差がわずかに増加します。

cd2ce527a9044e7b.png

次に、左側の [Partial Dependence Plots] ボタンにチェックを入れます。これは、各特徴量がモデルの予測にどのように影響するかを示しています。たとえば、妊娠期間が長くなると、モデルの予測新生児の体重も増加します。

1fec2a64fb03f432.png

What-If ツールに関するその他のアイデアについては、このセクションの冒頭に記載されているリンクを確認してください。

7. 省略可: ローカルの Git リポジトリを GitHub に接続する

最後に、ノートブック インスタンスの Git リポジトリを GitHub アカウントのリポジトリに接続する方法を学びます。この手順を行うには、GitHub アカウントが必要です。

ステップ 1: GitHub に新しいリポジトリを作成する

GitHub アカウントで、新しいリポジトリを作成します。名前と説明を入力し、公開するかどうかを決定して、[リポジトリを作成] を選択します(README で初期化する必要はありません)。次のページでは、コマンドラインから既存のリポジトリを push する手順に沿って操作します。

ターミナル ウィンドウを開き、新しいリポジトリをリモートとして追加します。以下のリポジトリ URL の username を GitHub ユーザー名に置き換え、your-repo を先ほど作成したユーザー名に置き換えます。

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

ステップ 2: ノートブック インスタンスで GitHub に対する認証を行う

次に、ノートブック インスタンス内から GitHub に対する認証を行う必要があります。このプロセスは、GitHub で 2 要素認証が有効になっているかどうかによって異なります。

どこから始めたらよいかわからない場合は、GitHub のドキュメントの手順に沿って SSH 認証鍵を作成してから、新しい鍵を GitHub に追加します。

ステップ 3: GitHub リポジトリが正しくリンクされていることを確認する

設定が正しく行われたことを確認するには、ターミナルで git remote -v を実行します。新しいリポジトリがリモート リポジトリとして表示されます。GitHub リポジトリの URL が表示され、ノートブックから GitHub への認証が完了したら、ノートブック インスタンスから GitHub に直接 push できます。

ローカル ノートブックの Git リポジトリを新しく作成した GitHub リポジトリと同期するには、Git サイドバーの上部にあるクラウド アップロード ボタンをクリックします。

eec001587bb9cfb1.png

GitHub リポジトリを更新すると、以前の commit を含むノートブック コードが表示されます。他のユーザーが GitHub リポジトリにアクセスできる場合、ノートブックに最新の変更を取り込む場合は、クラウドのダウンロード アイコンをクリックして変更を同期します。

Notebooks の Git UI の [履歴] タブで、ローカル commit が GitHub と同期されているかどうかを確認できます。この例では、origin/master は GitHub 上のリポジトリに対応しています。

2c3d1eb7cf95c24e.png

新しい commit を行うたびに、クラウド アップロード ボタンをもう一度クリックするだけで、変更内容が GitHub リポジトリに push されます。

8. お疲れさまでした。

このラボではいろいろと取り組んでくれました 👏?👏?👏?

復習として、以下の方法を学びました。

  • カスタマイズした AI Platform Notebooks インスタンスを作成する
  • そのインスタンスでローカルの Git リポジトリを初期化し、Git UI またはコマンドラインを使用して commit を追加し、ノートブックの Git UI で git の差分を表示
  • シンプルな TensorFlow 2 モデルを構築してトレーニングする
  • ノートブック インスタンス内で What-If ツールを使用する
  • ノートブックの Git リポジトリを GitHub の外部リポジトリに接続する

9. クリーンアップ

このノートブックを引き続き使用する場合は、未使用時にオフにすることをおすすめします。Cloud コンソールの Notebooks UI で、ノートブックを選択して [停止] を選択します。

ba727f9a0aefbc30.png

このラボで作成したすべてのリソースを削除する場合は、ノートブック インスタンスを停止するのではなく削除します。

Cloud コンソールのナビゲーション メニューで [ストレージ] に移動し、モデルアセットを保存するために作成した両方のバケットを削除します。