このチュートリアルでは、tf.distribute.TPUStrategy
を使用して Cloud TPU で Keras EfficientNet モデルをトレーニングする方法を説明します。
Cloud TPU に精通していない場合は、クイックスタートで Cloud TPU と Compute Engine VM の作成方法を確認することを強くおすすめします。
目標
- データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
- ImageNet データセットに類似したフェイク ImageNet データセットを準備します。
- トレーニング ジョブを実行します。
- 出力結果を確認します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Compute Engine
- Cloud TPU
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
このチュートリアルを開始する前に、Google Cloud プロジェクトが正しく設定されていることを確認します。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成した TPU VM リソースを必ずクリーンアップしてください。
Cloud TPU 単一デバイスのトレーニング
このセクションでは、Cloud TPU リソースを構成し、単一の Cloud TPU デバイスを使用して EfficientNet モデルをトレーニングする方法について説明します。
Cloud Shell ウィンドウを開きます。
プロジェクト ID の変数を作成します。
export PROJECT_ID=project-id
Cloud TPU を作成するプロジェクトを使用するように Google Cloud CLI を構成します。
gcloud config set project ${PROJECT_ID}
このコマンドを新しい Cloud Shell VM で初めて実行すると、
Authorize Cloud Shell
ページが表示されます。ページの下部にある [Authorize
] をクリックして、gcloud
に認証情報を使用した API の呼び出しを許可します。gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。Cloud TPU プロジェクトのサービス アカウントを作成します。
サービス アカウントにより、Cloud TPU サービスが他の Google Cloud サービスにアクセスできるようになります。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
TPU の設定変数をエクスポートする
モデルをトレーニングするゾーンを設定し、トレーニング関連のデータを保存します。
$ export ZONE=europe-west4-a
次のコマンドを使用して Cloud Storage バケットを作成します。
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。gcloud compute tpus tpu-vm コマンドを使用して、前のステップで設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。
バケットのロケーションは、Compute Engine(VM)および Cloud TPU ノードと同じリージョンにする必要があります。
データセットは、独自に用意するか、fake_imagenetfake_imagenet を使用します。
ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードを数百、数千もの画像で表しています。
このチュートリアルでは、ImageNet の完全版のデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、ストレージ容量と所要時間を ImageNet の完全版のデータセットに対してモデルを実行する際に通常必要となるものより抑えながらチュートリアルを試すことができます。
fake_imagenet データセットは Cloud Storage の次のロケーションにあります。
gs://cloud-tpu-test-datasets/fake_imagenet
fake_imagenet データセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルは有意なものではありません。
完全な ImageNet データセットを使用する場合は、ImageNet データセットのダウンロード、前処理、アップロードをご覧ください。
gcloud
コマンドを使用して TPU リソースを起動します。$ gcloud compute tpus tpu-vm create efficientnet-tutorial \ --zone=${ZONE} \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.17.0-pjrt
コマンドフラグの説明
zone
- Cloud TPU を作成するゾーン。
accelerator-type
- アクセラレータ タイプでは、作成する Cloud TPU のバージョンとサイズを指定します。TPU のバージョンごとにサポートされているアクセラレータ タイプの詳細については、TPU のバージョンをご覧ください。
version
- Cloud TPU ソフトウェアのバージョン。
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。SSH を使用して Compute Engine インスタンスに接続します。VM に接続すると、シェル プロンプトが
username@projectname
からusername@vm-name
に変わります。gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
Cloud TPU 名の変数を設定します。
(vm)$ export TPU_NAME=local
Cloud Storage バケットの変数を設定する
bucket-name を該当する Cloud Storage バケットの名前に置き換えます。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
TPU を作成するときに、
--version
パラメータを-pjrt
で終わるバージョンに設定した場合は、次の環境変数を設定して PJRT ランタイムを有効にします。(vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
TensorFlow の要件をインストールします。
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
EfficientNet トレーニング スクリプトには、追加のパッケージが必要です。 この時点で、これらのパッケージをインストールしておきます。
(vm)$ sudo pip3 install tensorflow-addons (vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
必要な環境変数を次のように設定します。
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
EfficientNet モデルは、Cloud TPU VM にプリインストールされています。
モデルが保存されているディレクトリに移動します。
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
モデルをトレーニングします。これは fake_imagenet データセットを使用し、EfficientNet を 1 エポック、トレーニングします。
(vm)$ python3 classifier_trainer.py \ --mode=train_and_eval \ --model_type=efficientnet \ --dataset=imagenet \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \ --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
コマンドフラグの説明
mode
train
、eval
、train_and_eval
のいずれか。model_type
- モデルのタイプ例:
efficientnet
dataset
- データセットの名前。例:
imagenet
tpu
- トレーニングまたは評価を実行するための Cloud TPU の名前。
data_dir
- トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
model_dir
- モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
config_file
- 事前トレーニング済みの EfficientNet モデルを含む JSON ファイルへのパス。このファイルにはモデル アーキテクチャが含まれています。
params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/legacy/detection/main.py
をご覧ください。
これにより、EfficientNet を 1 エポック トレーニングし、v3-8 Cloud TPU ノードでは約 40 分で完了します。トレーニング スクリプトが完了すると、次のような出力が表示されます。
Run stats: { 'accuracy_top_1': 0.0010172526817768812, 'eval_loss': 7.104171276092529, 'loss': 7.113735675811768, 'training_accuracy_top_1': 0.0009773431811481714, 'step_timestamp_log': [ 'BatchTimestamp<batch_index: 0, timestamp: 1604960724.2224622>', 'BatchTimestamp<batch_index: 1251, timestamp: 1604961281.3745298>' ], 'train_finish_time': 1604961342.6359076, 'avg_exp_per_second': 2071.493269569079 }
EfficientNet を ImageNet データセットで収束するようにトレーニングするには、次のスクリプトに示すように 90 エポックまで実行します。トレーニングと評価は一緒に行われます。 各エポックには、合計 112,590 トレーニング ステップに対して 1,251 ステップと、48 の評価ステップがあります。
(vm)$ python3 classifier_trainer.py \ --mode=train_and_eval \ --model_type=efficientnet \ --dataset=imagenet \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \ --params_override="train_dataset.builder=records, validation_dataset.builder=records"
コマンドフラグの説明
mode
train
、eval
、train_and_eval
のいずれかです。model_type
- モデルのタイプ例:
efficientnet
dataset
- データセットの名前。例:
imagenet
tpu
- トレーニングまたは評価を実行するための Cloud TPU の名前。
data_dir
- トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
model_dir
- モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
config_file
- 事前トレーニング済みの EfficientNet モデルを含む JSON ファイルへのパス。このファイルにはモデル アーキテクチャが含まれています。
params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/legacy/detection/main.py
をご覧ください。
トレーニングは fake_imagenet データセットに対して行われたため、出力結果には、実際のデータセットでトレーニングが実行された場合に表示される実際の出力は反映されません。
これで単一デバイスのトレーニングが完了しました。 現在の単一デバイスの TPU リソースを削除するには、次の手順を使用します。
Compute Engine インスタンスから接続を切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。TPU リソースを削除します。
$ gcloud compute tpus tpu-vm delete efficientnet-tutorial \ --zone=${ZONE}
コマンドフラグの説明
zone
- Cloud TPU が存在するゾーン。
この時点で、このチュートリアルを終了してクリーンアップすることも、Cloud TPU Pod でのモデルの実行を続行して調べることもできます。
Cloud TPU Pod でモデルのスケーリングする
Cloud TPU Pod でモデルをトレーニングするには、トレーニング スクリプトに変更を加える必要がある場合があります。詳細については、TPU Pod でのトレーニングをご覧ください。
Cloud TPU Pod でのトレーニング
このセクションでは、Pod のトレーニング用の Cloud Storage バケットと Cloud TPU リソースの設定について説明します。
Cloud Shell ウィンドウを開きます。
プロジェクト ID の変数を作成します。
export PROJECT_ID=project-id
Cloud TPU を作成するプロジェクトを使用するように Google Cloud CLI を構成します。
gcloud config set project ${PROJECT_ID}
このコマンドを新しい Cloud Shell VM で初めて実行すると、
Authorize Cloud Shell
ページが表示されます。ページの下部にある [Authorize
] をクリックして、gcloud
に認証情報を使用した Google Cloud API の呼び出しを許可します。Cloud TPU プロジェクトのサービス アカウントを作成します。
サービス アカウントにより、Cloud TPU サービスが他の Google Cloud サービスにアクセスできるようになります。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
次のコマンドを使用して Cloud Storage バケットを作成するか、以前にプロジェクト用に作成したバケットを使用します。
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
gcloud
コマンドは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、TPU VM と同じリージョンとなる必要があります。
TPU の設定変数をエクスポートする
モデルをトレーニングするゾーンを設定し、トレーニング関連のデータを保存します。
$ export ZONE=europe-west4-a
Prepare your dataset or use fake_imagenet
ImageNet is an image database. The images in the database are organized into a hierarchy, with each node of the hierarchy depicted by hundreds and thousands of images.
The default Pod training accesses a demonstration version of the full ImageNet dataset, referred to as fake_imagenet. This demonstration version allows you to test Pod training, while reducing the storage and time requirements typically associated with training a model against the full ImageNet database.
The fake_imagenet dataset is only useful for understanding how to use a Cloud TPU and validating end-to-end performance. The accuracy numbers and saved model will not be meaningful.
If you want to use the full ImageNet dataset, see Downloading, preprocessing, and uploading the ImageNet dataset.
Launch your Cloud TPU resources using the
gcloud
command.For more information on the
gcloud
command, see the gcloud Reference. This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.
$ gcloud compute tpus tpu-vm create efficientnet-tutorial \ --zone=${ZONE} \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.17.0-pod-pjrt
コマンドフラグの説明
zone
- Cloud TPU を作成するゾーン。
accelerator-type
- アクセラレータ タイプでは、作成する Cloud TPU のバージョンとサイズを指定します。TPU のバージョンごとにサポートされているアクセラレータ タイプの詳細については、TPU のバージョンをご覧ください。
version
- Cloud TPU ソフトウェアのバージョン。
SSH を使用して Compute Engine インスタンスに接続します。VM に接続すると、シェル プロンプトが
username@projectname
からusername@vm-name
に変わります。gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=europe-west4-a
TPU の設定変数をエクスポートします。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export TPU_NAME=efficientnet-tutorial (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x-pod
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
TensorFlow の要件をインストールします。
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
必要な環境変数を次のように設定します。
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}" (vm)$ export TPU_LOAD_LIBRARY=0
モデルが保存されているディレクトリに移動します。
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification/
モデルをトレーニングします。
(vm)$ python3 classifier_trainer.py \ --mode=train_and_eval \ --model_type=efficientnet \ --dataset=imagenet \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \ --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
コマンドフラグの説明
mode
train_and_eval
に設定すると、このスクリプトはモデルをトレーニングして評価します。export_only
に設定すると、このスクリプトは保存されたモデルをエクスポートします。model_type
- モデルのタイプ例:
efficientnet
dataset
- データセットの名前。例:
imagenet
tpu
- TPU_NAME 変数で指定された名前を使用します。
data_dir
- トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
model_dir
- モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
config_file
- 事前トレーニング済みの EfficientNet モデルを含む JSON ファイルへのパス。このファイルにはモデル アーキテクチャが含まれています。
params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/legacy/detection/main.py
をご覧ください。
この手順は、fake_imagenet データセットに対してモデルを 1 エポックまでトレーニング(合計 312 トレーニング ステップ、12 評価ステップ)します。このトレーニングには、v3-32 Cloud TPU 上で約 10 分かかります。トレーニングと評価が完了すると、次のようなメッセージが表示されます。
Run stats:
{
'accuracy_top_1': 0.0009969075908884406,
'eval_loss': 7.105168342590332,
'loss': 7.114983081817627,
'training_accuracy_top_1': 0.0010031675919890404,
'step_timestamp_log': [
'BatchTimestamp<batch_index: 0,
timestamp: 1605041621.4997303>',
'BatchTimestamp<batch_index: 312,
timestamp: 1605041970.8633356>'
],
'train_finish_time': 1605042032.2274444,
'avg_exp_per_second': 3111.5120716536226
}
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud TPU と Compute Engine リソースを削除します。
$ gcloud compute tpus tpu-vm delete efficientnet-tutorial \ --zone=${ZONE}
gcloud compute tpus execution-groups list
を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。次のコマンドの出力には、このチュートリアルで作成したリソースを含めないでください。$ gcloud compute tpus execution-groups list --zone=${ZONE}
次の例に示すように、gcloud CLI を使用して Cloud Storage バケットを削除します。bucket-name を Cloud Storage バケットの名前に置き換えます。
$ gcloud storage rm gs://bucket-name --recursive
次のステップ
TensorFlow Cloud TPU のチュートリアルでは通常、サンプル データセットを使用してモデルをトレーニングします。このトレーニングの結果は推論に使用できません。モデルを推論に使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされた TensorFlow モデルは通常、データセットを TFRecord 形式にする必要があります。
データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。
ハイパーパラメータ調整
データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要とハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。Cloud TPU 推論コンバータ ツールを使用して、Cloud TPU v5e での推論用に TensorFlow モデルを準備して最適化できます。Cloud TPU v5e での推論の詳細については、Cloud TPU v5e 推論の概要をご覧ください。
データセット変換チュートリアルに従って、fake_imagenet データセットまたは ImageNet データセットの代わりに独自のデータを使用してトレーニングと評価を行う方法を学習します。 このチュートリアルでは、画像分類データ変換プログラムのサンプル スクリプトを使用して、画像分類用の生のデータセットを Cloud TPU Tensorflow モデルで使用可能な TFRecord に変換する方法について説明します。
独自の画像データを使用して画像分類モデルを実行する方法を示す Cloud TPU colab を実行します。
他の Cloud TPU チュートリアルを確認する。
TensorBoard の TPU モニタリング ツールの使用方法を学習する。