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 なし)を選択します。
インスタンスに名前を付けるか、デフォルトの名前を使用します。次に、カスタマイズ オプションについて説明します。[カスタマイズ] ボタンをクリックします。
AI Platform Notebooks には、インスタンスのデプロイ先のリージョン、イメージタイプ、マシンサイズ、GPU の数など、さまざまなカスタマイズ オプションがあります。リージョンと環境にはデフォルトを使用します。マシン構成には n1-standard-8 マシンを使用します。
GPU は追加せず、ブートディスク、ネットワーキング、権限にはデフォルトを使用します。[作成] を選択してインスタンスを作成します。完了するまでに数分かかります。
インスタンスが作成されると、ノートブックの UI でインスタンスの横に緑色のチェックマークが表示されます。[JupyterLab を開く] を選択してインスタンスを開き、プロトタイピングを開始します。
インスタンスを開いたら、codelab という新しいディレクトリを作成します。このディレクトリは、このラボ全体で作業するディレクトリです。
新しく作成した codelab ディレクトリをダブルクリックして開き、ランチャーから Python 3 ノートブックを選択します。
ノートブックの名前を 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 でコードを commit したり、JupyterLab で利用可能なターミナルから commit したりできます。このセクションでは、ノートブックで Git リポジトリを初期化し、UI から最初の commit を行います。
ステップ 1: Git リポジトリを初期化する
codelab ディレクトリで、JupyterLab のトップメニューバーから [Git]、[Init] の順に選択します。
このディレクトリを Git リポジトリにするかどうかを尋ねるメッセージが表示されたら、[はい] を選択します。次に、左側のサイドバーで Git アイコンを選択して、ファイルと commit のステータスを確認します。
ステップ 2: 最初の commit を行う
この UI では、commit にファイルを追加したり、ファイルの差分を確認したり(後で説明します)、変更を commit したりできます。まず、追加したノートブック ファイルを commit します。
demo.ipynb
ノートブック ファイルの横にあるチェックボックスをオンにして、commit のステージングを行います(.ipynb_checkpoints/
ディレクトリは無視できます)。テキスト ボックスに commit メッセージを入力し、チェックマークをクリックして変更を commit します。
プロンプトが表示されたら、名前とメールアドレスを入力します。次に、[履歴] タブに戻って最初の commit を確認します。
このラボの公開後に更新が行われたため、スクリーンショットが UI と完全に一致しない場合があります。
5. TensorFlow モデルを構築してトレーニングする
ノートブックにダウンロードした BigQuery natality データセットを使用して、赤ちゃんの体重を予測するモデルを構築します。このラボでは、モデル自体の精度ではなく、ノートブックのツールに焦点を当てます。
ステップ 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
モデル API を使用して構築します。この 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
ノートブックが UI の [変更済み] セクションに表示されます。ファイル名にカーソルを合わせて、差分アイコンをクリックします。
変更の差分が表示されます。次に例を示します。
今回は、ターミナルを使用してコマンドラインから変更を commit します。JupyterLab の上部メニューバーの [Git] メニューから、[Git Command in Terminal] を選択します。以下のコマンドを実行するときに、左側のサイドバーの [git] タブを開いていると、変更内容が git UI に反映されます。
新しいターミナル インスタンスで、次のコマンドを実行してノートブック ファイルをステージングして commit します。
git add demo.ipynb
次のように実行して変更を commit します(任意の commit メッセージを使用できます)。
git commit -m "Build and train TF model"
履歴に最新の commit が表示されます。
6. ノートブックから直接 What-If ツールを使用する
What-If ツールは、データセットを可視化して ML モデルの出力をより深く理解できるように設計されたインタラクティブなビジュアル インターフェースです。これは、Google の PAIR チームが作成したオープンソース ツールです。任意のタイプのモデルで動作しますが、Cloud AI Platform 専用に構築された機能もあります。
シミュレーション ツールは、TensorFlow を搭載した Cloud AI Platform Notebooks インスタンスにプリインストールされています。ここでは、この関数を使用して、モデルの全体的なパフォーマンスを確認し、テストセットのデータポイントに対するモデルの動作を調べます。
ステップ 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: シミュレーション ツールをインスタンス化する
連結したテストデータセットと、先ほど作成したグラウンド トゥルース ラベルから 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)
シミュレーション ツールが読み込まれると、次のような画面が表示されます。
x 軸には、モデルの予測体重値 weight_pounds
によって分散したテストデータポイントが表示されます。
ステップ 3: What-If ツールを使用してモデルの動作を確認する
What-If ツールでは、さまざまな分析を行うことができます。ここでは、そのうちのいくつかについて説明します。まず、データポイント エディタを見てみましょう。任意のデータポイントを選択して特徴を表示し、特徴値を変更できます。まず、任意のデータポイントをクリックします。
左側には、選択したデータポイントの特徴値が表示されます。そのデータポイントのグラウンド トゥルース ラベルを、モデルによって予測された値と比較することもできます。左側のサイドバーで特徴値を変更し、モデル予測を再実行して、この変更がモデルに与える影響を確認することもできます。たとえば、このデータポイントをダブルクリックして予測を再実行すると、妊娠週数を 30 に変更できます。
シミュレーション ツールの [プロット] セクションのプルダウン メニューを使用すると、さまざまなカスタム ビジュアリゼーションを作成できます。たとえば、次のグラフでは、モデルの予測体重が X 軸、母親の年齢が Y 軸に示され、推論エラーによって点の色が異なります(色が濃いほど、予測体重と実際の体重の差が大きくなります)。ここでは、重みが小さくなるとモデルの誤差がわずかに増加しているようです。
次に、左側の [部分依存性プロット] ボタンをオンにします。これは、各特徴量がモデルの予測にどのように影響するかを示しています。たとえば、妊娠期間が長くなると、モデルが予測する新生児の体重も増加します。
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: Notebooks インスタンスで GitHub の認証を行う
次に、ノートブック インスタンス内から GitHub の認証を行う必要があります。このプロセスは、GitHub で 2 段階認証プロセスが有効になっているかどうかによって異なります。
どこから始めればよいかわからない場合は、GitHub ドキュメントの手順に沿って SSH 認証鍵を作成すると 新しい鍵を GitHub に追加する。
ステップ 3: GitHub リポジトリが正しくリンクされていることを確認する
設定が正しいことを確認するには、ターミナルで git remote -v
を実行します。新しいリポジトリがリモートとして表示されます。GitHub リポジトリの URL が表示され、ノートブックから GitHub に対して認証が完了したら、ノートブック インスタンスから GitHub に直接 push できます。
ローカル ノートブックの Git リポジトリを新しく作成した GitHub リポジトリと同期するには、Git サイドバーの上部にあるクラウド アップロード ボタンをクリックします。
GitHub リポジトリを更新すると、以前の commit を含むノートブック コードが表示されます。他のユーザーが GitHub リポジトリにアクセスできる場合、ノートブックに最新の変更を pull ダウンするには、クラウド ダウンロード アイコンをクリックして変更を同期します。
Notebooks Git UI の [History] タブで、ローカル commit が GitHub と同期されているかどうかを確認できます。この例では、origin/master
は GitHub のリポジトリに対応しています。
新しい commit を作成したら、クラウド アップロード ボタンをもう一度クリックして、変更を GitHub リポジトリに push します。
8. おめでとうございます。
このラボでは多くのことを行いました 👏?👏?👏?
ここまで学んだ内容をまとめてみましょう。
- AI Platform Notebook インスタンスを作成してカスタマイズする
- そのインスタンスでローカルの git リポジトリを初期化し、git UI またはコマンドラインから commit を追加し、Notebook git UI で git diff を表示する
- 簡単な TensorFlow 2 モデルを構築してトレーニングする
- ノートブック インスタンス内で What-If ツールを使用する
- Notebook の Git リポジトリを GitHub の外部リポジトリに接続する
9. クリーンアップ
このノートブックを使い続ける場合は、未使用時にオフにすることをおすすめします。Cloud コンソールの Notebooks UI で、ノートブックを選択して [停止] を選択します。
このラボで作成したすべてのリソースを削除する場合は、ノートブック インスタンスを停止するのではなく、削除します。
Cloud コンソールのナビゲーション メニューを使用して [ストレージ] に移動し、モデル アセットを保存するために作成した両方のバケットを削除します。