このチュートリアルでは、tf.distribute.TPUStrategy
を使用して Cloud TPU で Keras ResNet モデルをトレーニングする方法を説明します。
Cloud TPU に慣れていない場合は、TPU と Compute Engine VM を作成する方法について、フレームワークのクイックスタートを参照することを強くおすすめいたします。
目標
- データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
- ImageNet データセットに類似したフェイク ImageNet データセットを準備します。
- トレーニング ジョブを実行します。
- 出力結果を確認します。
費用
このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。
- Compute Engine
- Cloud TPU
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
このチュートリアルを開始する前に、Google Cloud プロジェクトが正しく設定されていることを確認します。
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。
Cloud TPU 単一デバイスのトレーニング
このセクションでは、単一デバイスのトレーニング用に、Cloud Storage のバケット、VM、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
に認証情報を使用した GCP API の呼び出しを許可します。Cloud TPU プロジェクトのサービス アカウントを作成します。
サービス アカウントにより、Cloud TPU サービスが他の Google Cloud Platform サービスにアクセスできるようになります。
$ gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
次のコマンドを使用して Cloud Storage バケットを作成します。
$ gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する TPU を設定する
gcloud
コマンドは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。データセットは、独自に用意するか、fake_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 リソースを起動します。使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。2 つの VM アーキテクチャの詳細については、システム アーキテクチャをご覧ください。TPU VM
$ gcloud alpha compute tpus tpu-vm create resnet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.8.0
TPU ノード
gcloud compute tpus execution-groups create \ --project=${PROJECT_ID} \ --zone=europe-west4-a \ --name=resnet-tutorial \ --disk-size=300 \ --machine-type=n1-standard-16 \ --accelerator-type=v3-8 \ --tf-version=2.8.0
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-name
に変わります。TPU VM
$ gcloud alpha compute tpus tpu-vm ssh resnet-tutorial --zone=europe-west4-a
TPU ノード
$ gcloud compute ssh resnet-tutorial --zone=europe-west4-a
これらの手順を続行する場合は、VM セッション ウィンドウで、
(vm)$
で始まる各コマンドを実行します。Cloud TPU 名の変数を設定します。
TPU VM
(vm)$ export TPU_NAME=local
TPU ノード
(vm)$ export TPU_NAME=resnet-tutorial
Cloud Storage バケットの変数を設定する
次の環境変数を設定します。bucket-name を Cloud Storage バケットの名前に置き換えます。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-2x (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションでは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
TensorFlow の要件をインストールします。
使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。
TPU VM
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU ノード
(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
ResNet トレーニング スクリプトには、追加のパッケージが必要です。この時点でインストールしておきます。
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
PYTHONPATH
環境変数を設定します。TPU VM
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
TPU ノード
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
モデルが保存されているディレクトリに移動します。
TPU VM
(vm)$ cd /usr/share/tpu/models/official/vision/image_classification/resnet
TPU ノード
(vm)$ cd /usr/share/models/official/vision/image_classification/resnet
トレーニング スクリプトを実行します。これは、fake_imagenet データセットを使用し、ResNet を 1 エポック、トレーニングします。
(vm)$ python3 resnet_ctl_imagenet_main.py \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --data_dir=${DATA_DIR} \ --batch_size=1024 \ --steps_per_loop=500 \ --train_epochs=1 \ --use_synthetic_data=false \ --dtype=fp32 \ --enable_eager=true \ --enable_tensorboard=true \ --distribution_strategy=tpu \ --log_steps=50 \ --single_l2_loss_op=true \ --use_tf_function=true
コマンドフラグの説明
tpu
- TPU の名前。
model_dir
- モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、
model_dir
は Cloud Storage のパスである必要があります(gs://...
)。以前に作成されたチェックポイントの TPU のサイズと TensorFlow のバージョンが同じであれば、既存のフォルダを再利用して現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。 data_dir
- トレーニング入力の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
batch_size
- トレーニングのバッチサイズ。
steps_per_loop
- CPU に状態を保存する前に実行するトレーニング ステップの数。トレーニング ステップは、サンプルの 1 つのバッチの処理です。これには、フォワードパスと逆伝播の両方が含まれます。
train_epochs
- データセット全体を使用してモデルをトレーニングする回数。
use_synthetic_data
- トレーニングに合成データを使用するかどうか。
dtype
- トレーニングに使用するデータの種類。
enable_eager
- TensorFlow 積極的実行(Eager Execution)を有効にします。
enable_tensorboard
- TensorBoard を有効にします。
distribution_strategy
- TPU で ResNet モデルをトレーニングするには、
distribution_strategy
をtpu
に設定します。 log_steps
examples per second
などのタイミング情報をログに記録する前に実行するトレーニング ステップの数。single_l2_loss_op
- レイヤごとの L2 損失を使用する代わりに、連結された重みで L2_loss を計算します。
use_tf_function
- トレーニングとテストのステップを
tf.function
内にラップします。
これにより ResNet を 1 エポック トレーニングし、v3-8 TPU ノードでは約 10 分で完了します。トレーニングが終了すると、次のような出力が表示されます。
I1107 20:28:57.561836 140033625347520 resnet_ctl_imagenet_main.py:222] Training 1 epochs, each epoch has 1251 steps, total steps: 1251; Eval 48 steps I1107 20:34:09.638025 140033625347520 resnet_ctl_imagenet_main.py:358] Training loss: 0.6292637, accuracy: 0.99680257 at epoch 1 I1107 20:34:21.682796 140033625347520 resnet_ctl_imagenet_main.py:372] Test loss: 3.8977659, accuracy: 0.0% at epoch: 1 I1107 20:34:22.028973 140033625347520 resnet_ctl_imagenet_main.py:392] Run stats: {'train_loss': 0.6292637, 'train_acc': 0.99680257, 'eval_acc': 0.0, 'step_timestamp_log': ['BatchTimestamp <batch_index: 1, timestamp: 1573158554.11>'], 'train_finish_time': 1573158861.683073, 'eval_loss': 3.8977659>}
これで単一デバイスのトレーニング サンプルは完了しました。現在の単一デバイスの TPU リソースを削除するには、次の手順を使用します。
Compute Engine インスタンスから接続を切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。TPU リソースを削除します。
この時点で、このチュートリアルを終了してクリーンアップすることも、Cloud TPU Pod でのモデルの実行を続行して調べることもできます。
Cloud TPU Pod を使用したモデルのスケーリング
{ product_name_short }} Pod でモデルをトレーニングするには、トレーニング スクリプトに変更を加える必要がある場合があります。詳細については、TPU Pod でのトレーニングをご覧ください。
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
に認証情報を使用した GCP API の呼び出しを許可します。Cloud TPU プロジェクトのサービス アカウントを作成します。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
次のコマンドを使用して Cloud Storage バケットを作成するか、以前にプロジェクト用に作成したバケットを使用します。
gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
gcloud
コマンドは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、TPU VM と同じリージョンとなる必要があります。
データセットは、独自に用意するか、fake_imagenet を使用します。
ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードを数百、数千もの画像で表しています。
デフォルトの Pod トレーニングでは、ImageNet の完全版データセットの fnet_imagenet と呼ばれるデモバージョンにアクセスします。このデモバージョンを使用すると、ImageNet データベース全体に対してモデルをトレーニングするときに通常伴うストレージと時間の要件を削減すると同時に Pod のトレーニングをテストできます。
fake_imagenet データセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルは意味がありません。
完全な ImageNet データセットを使用する場合は、ImageNet データセットのダウンロード、前処理、アップロードをご覧ください。
gcloud
コマンドを使用して Cloud TPU リソースを起動します。使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。2 つの VM アーキテクチャの詳細については、システム アーキテクチャをご覧ください。
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。このチュートリアルでは、v3-32 Pod を指定します。他の Pod オプションについては、利用可能な TPU タイプのページをご覧ください。TPU VM
$ gcloud alpha compute tpus tpu-vm create resnet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.8.0-pod
TPU ノード
$ gcloud compute tpus execution-groups create \ --zone=europe-west4-a \ --name=resnet-tutorial \ --accelerator-type=v3-32 \ --tf-version=2.8.0
自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-instance-name
に変わります。TPU VM
$ gcloud alpha compute tpus tpu-vm ssh resnet-tutorial --zone=europe-west4-a
TPU ノード
$ gcloud compute ssh resnet-tutorial --zone=europe-west4-a
これらの手順を続行する場合は、VM セッション ウィンドウで、
(vm)$
で始まる各コマンドを実行します。Cloud TPU の設定変数をエクスポートします。
(vm)$ export ZONE=europe-west4-a (vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export TPU_NAME=resnet-tutorial (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-2x-pod
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
ResNet トレーニング スクリプトには、追加のパッケージが必要です。この時点でインストールしておきます。
TPU VM
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
TPU ノード
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
TensorFlow の要件をインストールします。
使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。
TPU VM
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU ノード
(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
PYTHONPATH
環境変数を設定します。TPU VM
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}" (vm)$ export TPU_LOAD_LIBRARY=0
TPU ノード
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
モデルが保存されているディレクトリに移動します。
TPU VM
(vm)$ cd /usr/share/tpu/models/official/vision/image_classification/resnet
TPU ノード
(vm)$ cd /usr/share/models/official/vision/image_classification/resnet
モデルをトレーニングします。
(vm)$ python3 resnet_ctl_imagenet_main.py \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --data_dir=${DATA_DIR} \ --batch_size=4096 \ --steps_per_loop=500 \ --train_epochs=1 \ --use_synthetic_data=false \ --dtype=fp32 \ --enable_eager=true \ --enable_tensorboard=true \ --distribution_strategy=tpu \ --log_steps=50 \ --single_l2_loss_op=true \ --use_tf_function=true
コマンドフラグの説明
tpu
- TPU の名前。
model_dir
- モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、
model_dir
を Cloud Storage パスにする必要があります(gs://...
)。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。 data_dir
- トレーニング入力の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
batch_size
- トレーニングのバッチサイズ。
steps_per_loop
- CPU に状態を保存する前に実行するトレーニング ステップの数。トレーニング ステップは、サンプルの 1 つのバッチの処理です。これには、フォワード パスと逆伝播の両方が含まれます。
train_epochs
- データセット全体を使用してモデルをトレーニングする回数。
use_synthetic_data
- トレーニングに合成データを使用するかどうか。
dtype
- トレーニングに使用するデータの種類。
enable_eager
- TensorFlow 積極的実行(Eager Execution)を有効にします。
enable_tensorboard
- TensorBoard を有効にします。
distribution_strategy
- TPU セットで ResNet モデルをトレーニングするには、
distribution_strategy
をtpu
に設定します。 log_steps
examples per second
などのタイミング情報をログに記録する前に実行するトレーニング ステップの数。single_l2_loss_op
- レイヤごとの L2 損失を使用する代わりに、連結された重みで L2_loss を計算します。
use_tf_function
- トレーニングとテストのステップを
tf.function
内にラップします。
この手順は、fake_imagnet データセットに対してモデルを 1 エポックまでトレーニング(合計 312 トレーニング ステップ、12 評価ステップ)します。このトレーニングは、v3-32 Cloud TPU 上で約 2 分かかります。トレーニングと評価が完了すると、次のようなメッセージが表示されます。
1107 22:45:19.821746 140317155378624 resnet_ctl_imagenet_main.py:358] Training loss: 0.22576721, accuracy: 0.838141 at epoch 1 I1107 22:45:33.892045 140317155378624 resnet_ctl_imagenet_main.py:372] Test loss: 0.26673648, accuracy: 0.0% at epoch: 1 I1107 22:45:34.851322 140317155378624 resnet_ctl_imagenet_main.py:392] Run stats: {'train_loss': 0.22576721, 'train_acc': 0.838141, 'eval_acc': 0.0, 'step_timestamp_log': ['BatchTimestamp<batch_index: 1, timestamp: 1573166574.67>'], 'train_finish_time': 1573166733.892282, 'eval_loss': 0.26673648}
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud TPU と Compute Engine リソースを削除します。リソースの削除に使用するコマンドは、TPU VM または TPU ノードのどちらを使用するかによって異なります。詳細については、システム アーキテクチャをご覧ください。
TPU VM
$ gcloud alpha compute tpus tpu-vm delete resnet-tutorial \ --zone=europe-west4-a
TPU ノード
$ gcloud compute tpus execution-groups delete resnet-tutorial \ --zone=europe-west4-a
gcloud compute tpus execution-groups list
を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。次のコマンドの出力には、このチュートリアルで作成したリソースを含めないでください。TPU VM
$ gcloud alpha compute tpus tpu-vm list --zone=europe-west4-a
TPU ノード
$ gcloud compute tpus execution-groups list --zone=europe-west4-a
次に示すように
gsutil
を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。$ gsutil rm -r gs://bucket-name
次のステップ
TensorFlow Cloud TPU のチュートリアルでは通常、サンプル データセットを使用してモデルをトレーニングします。このトレーニングの結果は推論に使用できません。モデルを推論に使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされた TensorFlow モデルは通常、データセットを TFRecord 形式にする必要があります。
データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。
ハイパーパラメータ調整
データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要、ハイパーパラメータ調整サービスの使用、ハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニング、デプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。
- データセット変換チュートリアルに従って、fake_imagenet データセットまたは ImageNet データセットの代わりに独自のデータを使用してトレーニングと評価を行う方法を学習します。 このチュートリアルでは、画像分類データ変換プログラムのサンプル スクリプトを使用して、画像分類用の生のデータセットを Cloud TPU Tensorflow モデルで使用される TFRecord に変換する方法について説明します。
- 独自の画像データを使用して画像分類モデルを実行する方法を示す Cloud TPU colab を実行します。
- 他の Cloud TPU チュートリアルを確認する。
- TensorBoard の TPU モニタリング ツールの使用方法を学習する。
- Cloud TPU と GKE を使用して ResNet をトレーニングする方法を確認します。