Vertex AI Workbench: 転移学習とノートブック エグゼキュータを使用して画像分類モデルを構築する

1. 概要

このラボでは、Vertex AI Workbench を使用してノートブックの実行を構成し、起動する方法を学びます。

学習内容

次の方法を学習します。

  • ノートブックでパラメータを使用する
  • Vertex AI Workbench UI からノートブックの実行を構成して起動する

このラボを Google Cloud で実行するための総費用は約 $2 です。

2. Vertex AI の概要

このラボでは、Google Cloud で利用できる最新の AI プロダクトを使用します。Vertex AI は Google Cloud 全体の ML サービスを統合してシームレスな開発エクスペリエンスを提供します。以前は、AutoML でトレーニングしたモデルやカスタムモデルには、個別のサービスを介してアクセスする必要がありました。Vertex AI は、これらの個別のサービスを他の新しいプロダクトとともに 1 つの API へと結合します。既存のプロジェクトを Vertex AI に移行することもできます。ご意見やご質問がありましたら、サポートページからお寄せください。

Vertex AI には、エンドツーエンドの ML ワークフローをサポートするさまざまなプロダクトが含まれています。このラボでは、Vertex AI Workbench を中心に学習します。

Vertex AI Workbench は、データサービス(Dataproc、Dataflow、BigQuery、Dataplex など)や Vertex AI との緊密なインテグレーションを通じて、ノートブック ベースのエンドツーエンドのワークフローをすばやく構築するのに便利です。これにより、データ サイエンティストは GCP データサービスへの接続、データセットの分析、さまざまなモデリング手法のテスト、トレーニング済みモデルの本番環境へのデプロイ、モデル ライフサイクル全体を通じた MLOps の管理が可能になります。

3. ユースケースの概要

このラボでは、転移学習を使用して TensorFlow データセットDeepWeeds データセットで画像分類モデルをトレーニングします。TensorFlow Hub を使用して、ResNet50InceptionMobileNet などのさまざまなモデル アーキテクチャから抽出した特徴ベクトルをテストします。これらはすべて ImageNet ベンチマーク データセットで事前にトレーニングされています。Vertex AI Workbench UI を介してノートブック エグゼキュータを利用して、これらの事前トレーニング済みモデルを使用するジョブを Vertex AI Training で起動し、最後のレイヤを再トレーニングして DeepWeeds データセットのクラスを認識します。

4. 環境の設定

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

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

まだ有効になっていない場合は、[Compute Engine] に移動して [有効にする] を選択します。

ステップ 2: Vertex AI API を有効にする

Cloud コンソールの [Vertex AI] セクションに移動し、[Vertex AI API を有効にする] をクリックします。

Vertex AI ダッシュボード

ステップ 3: Vertex AI Workbench インスタンスを作成する

Cloud Console の [Vertex AI] セクションで [ワークベンチ] をクリックします。

Vertex AI メニュー

Notebooks API をまだ有効にしていない場合は、有効にします。

Notebook_api

有効にしたら、[マネージド ノートブック] をクリックします。

Notebooks_UI

[新しいノートブック] を選択します。

new_notebook

ノートブックに名前を付けて、[詳細設定] をクリックします。

create_notebook

[詳細設定] で、アイドル状態でのシャットダウンを有効にして、シャットダウンまでの時間(分)を 60 に設定します。これにより、使用されていないノートブックが自動的にシャットダウンされるため、不要なコストが発生しません。

idle_timeout

詳細設定のその他の設定はそのままで構いません。

次に、[作成] をクリックします。

インスタンスが作成されたら、[JUPYTERLAB を開く] を選択します。

open_jupyterlab

新しいインスタンスを初めて使用するときは、認証を求められます。

authenticate

Vertex AI Workbench にはコンピューティング互換性レイヤがあり、単一のノートブック インスタンスから TensorFlow、PySpark、R などのカーネルを起動できます。認証後、使用するノートブックの種類をランチャーから選択できるようになります。

このラボでは、TensorFlow 2 カーネルを選択します。

tf_kernel

5. トレーニング コードを作成する

DeepWeeds データセットは、オーストラリア固有の 8 種類の雑草を捉えた 17,509 枚の画像で構成されています。このセクションでは、DeepWeeds データセットの前処理を行うコードを記述し、TensorFlow Hub からダウンロードした特徴ベクトルを使用して画像分類モデルを構築し、トレーニングします。

次のコード スニペットをノートブックのセルにコピーする必要があります。セルの実行は任意です。

ステップ 1: データセットをダウンロードして前処理する

まず、最新バージョンの DeepWeeds データセットを取得できるようにするため、ナイトリー版の TensorFlow データセットをインストールします。

!pip install tfds-nightly

次に、必要なライブラリをインポートします。

import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_hub as hub

TensorFlow データセットからデータをダウンロードし、クラス数とデータセット サイズを抽出します。

data, info = tfds.load(name='deep_weeds', as_supervised=True, with_info=True)
NUM_CLASSES = info.features['label'].num_classes
DATASET_SIZE = info.splits['train'].num_examples

画像データを 255 ずつスケーリングする前処理関数を定義します。

def preprocess_data(image, label):
  image = tf.image.resize(image, (300,300))
  return tf.cast(image, tf.float32) / 255., label

DeepWeeds データセットには、トレーニング用と検証用の分割はありません。トレーニング データセットのみが付属しています。以下のコードでは、そのデータの 80% をトレーニングに、残りの 20% を検証に使用します。

# Create train/validation splits

# Shuffle dataset
dataset = data['train'].shuffle(1000)

train_split = 0.8
val_split = 0.2
train_size = int(train_split * DATASET_SIZE)
val_size = int(val_split * DATASET_SIZE)

train_data = dataset.take(train_size)
train_data  = train_data.map(preprocess_data)
train_data  = train_data.batch(64)

validation_data = dataset.skip(train_size)
validation_data  = validation_data.map(preprocess_data)
validation_data  = validation_data.batch(64)

ステップ 2: モデルを作成する

トレーニング データセットと検証データセットが作成されたので、モデルを構築する準備ができました。TensorFlow Hub は、最上位の分類レイヤのない事前トレーニング済みモデルである特徴ベクトルを提供します。事前にトレーニングされたモデルを hub.KerasLayer でラップして、特徴エクストラクタを作成します。これにより、TensorFlow SavedModel が Keras レイヤとしてラップされます。次に、分類レイヤを追加し、Keras Sequential API を使用してモデルを作成します。

まず、パラメータ feature_extractor_model を定義します。これは、モデルのベースとして使用する TensorFlow Hub 特徴ベクトルの名前です。

feature_extractor_model = "inception_v3"

次に、このセルをパラメータ セルにして、実行時に feature_extractor_model の値を渡すことができます。

まず、セルを選択し、右側のパネルでプロパティ インスペクタをクリックします。

property_inspector

タグは、メタデータをノートブックに追加する簡単な方法です。「パラメータ」と入力[タグを追加]をクリックして Enter キーを押します後で実行を構成するときに、さまざまな値を渡します。この場合は、テストする TensorFlow Hub モデルです。「parameters」という単語を入力する必要があります。これにより、ノートブック エグゼキュータはパラメータ化するセルを判別できます。

add_tag

プロパティ インスペクタを閉じるには、二重の歯車アイコンを再度クリックします。

新しいセルを作成して tf_hub_uri を定義します。ここでは、文字列補間を使用して、ノートブックの特定の実行でベースモデルとして使用する事前トレーニング済みモデルの名前に置き換えます。デフォルトでは feature_extractor_model"inception_v3" に設定されていますが、他の有効な値は "resnet_v2_50" または "mobilenet_v1_100_224" です。その他のオプションは、TensorFlow Hub カタログで確認できます。

tf_hub_uri = f"https://tfhub.dev/google/imagenet/{feature_extractor_model}/feature_vector/5"

次に、hub.KerasLayer を使用して、上で定義した tf_hub_uri を渡して特徴エクストラクタを作成します。上に追加する新しい分類レイヤのみがトレーニングによって変更されるように、trainable=False 引数を設定して変数を固定します。

feature_extractor_layer = hub.KerasLayer(
    tf_hub_uri,
    trainable=False)

モデルを完成させるには、特徴エクストラクタ レイヤを tf.keras.Sequential モデルでラップし、分類用に全結合レイヤを追加します。この分類ヘッドのユニット数は、データセット内のクラス数と同じである必要があります。

model = tf.keras.Sequential([
  feature_extractor_layer,
  tf.keras.layers.Dense(units=NUM_CLASSES)
])

最後にモデルをコンパイルして適合させます。

model.compile(
  optimizer=tf.keras.optimizers.Adam(),
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['acc'])

model.fit(train_data, validation_data=validation_data, epochs=3)

6. ノートブックの実行

ノートブックの上部にある Executor アイコンをクリックします。

エグゼキュータ

ステップ 1: トレーニング ジョブを構成する

実行の名前を指定し、プロジェクトのストレージ バケットを指定します。

executor_config

[マシンタイプ] を [4 CPU、15 GB RAM] に設定します。

NVIDIA GPU を 1 個追加します。

環境を TensorFlow Enterprise 2.6(GPU)に設定します。

[1 回限りの実行] を選択します。

ステップ 2: パラメータを設定する

[詳細オプション] プルダウンをクリックして、パラメータを設定します。ボックスに「feature_extractor_model=resnet_v2_50」と入力します。これにより、ノートブックでこのパラメータに設定したデフォルト値の inception_v3resnet_v2_50 でオーバーライドされます。

advanced_options

[デフォルトのサービス アカウントを使用する] チェックボックスはオンのままにできます。

[送信] をクリックします。

ステップ 3: 結果を確認する

コンソール UI の [実行] タブで、ノートブックの実行ステータスを確認できます。

executions_UI

実行名をクリックすると、ノートブックが実行されている Vertex AI Training ジョブが表示されます。

vertex_training

ジョブが完了したら、[結果を表示] をクリックすると、出力ノートブックを表示できます。

view_result

出力ノートブックで、feature_extractor_model の値が実行時に渡された値によって上書きされていることがわかります。

param_cells

お疲れさまでした

Vertex AI Workbench を使用して次のことを行う方法を学びました。

  • ノートブックでパラメータを使用する
  • Vertex AI Workbench UI からノートブックの実行を構成して起動する

Vertex AI のさまざまな機能の詳細については、こちらのドキュメントをご覧ください。

7. クリーンアップ

デフォルトでは、180 分間操作がないと、マネージド ノートブックは自動的にシャットダウンします。インスタンスを手動でシャットダウンする場合は、コンソールで [Vertex AI] の [ワークベンチ] セクションにある [停止] ボタンをクリックします。ノートブックを完全に削除する場合は、[削除] ボタンをクリックします。

削除

ストレージ バケットを削除するには、Cloud Console のナビゲーション メニューで [ストレージ] を移動してバケットを選択し、[削除] をクリックします。

ストレージを削除