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 との緊密なインテグレーションを通じて、ノートブック ベースのエンドツーエンドのワークフローをすばやく構築するのに便利です。データ サイエンティストは Vertex AI Workbench を使用して、GCP データサービスへの接続、データセットの分析、各種モデリング手法のテスト、トレーニング済みモデルの本番環境への導入、モデル ライフサイクルを通した MLOps の管理を行うことができます。

3. ユースケースの概要

このラボでは、転移学習を使用して、TensorFlow データセットDeepWeeds データセットで画像分類モデルをトレーニングします。TensorFlow Hub を使用して、ImageNet ベンチマーク データセットで事前トレーニングされた ResNet50InceptionMobileNet などのさまざまなモデル アーキテクチャから抽出された特徴ベクトルを試します。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: データセットをダウンロードして前処理する

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

!pip install tfds-nightly

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

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

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

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 でラップして特徴抽出器を作成します。hub.KerasLayerTensorFlow SavedModel を Keras レイヤとしてラップします。次に、分類レイヤを追加し、Keras Sequential API を使用してモデルを作成します。

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

feature_extractor_model = "inception_v3"

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

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

property_inspector

タグは、ノートブックにメタデータを追加する簡単な方法です。[タグを追加] ボックスに「parameters」と入力し、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] アイコンをクリックします。

executor

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

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

executor_config

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

1 つの NVIDIA GPU を追加します。

環境を 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 のナビゲーション メニューで [ストレージ] を移動してバケットを選択し、[削除] をクリックします。

ストレージを削除