このチュートリアルでは、tf.distribute.TPUStrategy
を使用して Cloud TPU で Keras ResNet-RS モデルをトレーニングする方法を説明します。ResNet-RS の詳細については、ResNets の再確認: トレーニングとスケーリング戦略の改善をご覧ください。
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 プロジェクトを選択または作成します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、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
に認証情報を使用した Google Cloud 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 compute tpus execution-groups
ツールは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、Compute Engine(VM)および Cloud TPU ノードと同じリージョンにする必要があります。
gcloud
コマンドを使用して、Compute Engine VM を起動します。$ gcloud compute tpus execution-groups create \ --vm-only \ --name=resnet-rs-tutorial \ --zone=europe-west4-a \ --disk-size=300 \ --machine-type=n1-standard-16 \ --tf-version=2.12.0
コマンドフラグの説明
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。プロンプトが表示されたら、y キーを押して Cloud TPU リソースを作成します。
gcloud compute tpus execution-groups
コマンドの実行が終了したら、shell プロンプトがusername@projectname
からusername@vm-name
に変更されたことを確認します。 変更されていれば、Compute Engine VM にログインしていることになります。gcloud compute ssh resnet-rs-tutorial --zone=europe-west4-a
これらの手順を続行する場合は、Compute Engine インスタンスで
(vm)$
で始まる各コマンドを実行します。必要なパッケージをインストールします。
$ pip3 install tensorflow-text==2.8.1 --no-deps
Cloud Storage バケットの変数を設定する
次の環境変数を設定します。bucket-name を Cloud Storage バケットの名前に置き換えます。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-rs-2x (vm)$ export IMAGENET_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export PYTHONPATH=/usr/share/models (vm)$ export TPU_NAME=resnet-rs-tutorial
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
Cloud TPU 単一デバイスのトレーニングと評価
ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードを数百、数千もの画像で表しています。
このチュートリアルでは、ImageNet の完全版のデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、ストレージ容量と所要時間を ImageNet の完全版のデータセットに対してモデルを実行する際に通常必要となるものより抑えながらチュートリアルを試すことができます。
fake_imagenet データセットは Cloud Storage の次のロケーションにあります。
gs://cloud-tpu-test-datasets/fake_imagenet
fake_imagenet データセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルは意味がありません。
ImageNet データセット全体をダウンロードして処理する方法については、ImageNet データセットのダウンロード、前処理、アップロードをご覧ください。
gcloud
コマンドを使用して Cloud TPU を作成します。$ gcloud compute tpus execution-groups create \ --tpu-only \ --accelerator-type=v3-8 \ --name=resnet-rs-tutorial \ --zone=europe-west4-a \ --tf-version=2.12.0
TPU_NAME
名前変数を設定します。(vm)$ export TPU_NAME=resnet-rs-tutorial
トレーニング スクリプトを実行します。
(vm)$ python3 /usr/share/models/official/vision/beta/train.py \ --experiment=resnet_rs_imagenet \ --mode=train_and_eval \ --model_dir=$MODEL_DIR \ --tpu=$TPU_NAME \ --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \ --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
コマンドフラグの説明
experiment
- 実行するテストの名前。
mode
- スクリプトを実行するモード。有効な値は、「train」、「eval」、または「train_and_eval」です。
model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
tpu
- 使用する TPU の名前。
config_file
- スクリプト構成ファイルへのパス。
params_override
- スクリプト構成ファイルの設定をオーバーライドします。
これにより、ResNet-RS を 100 トレーニング ステップでトレーニングし、v3-8 TPU ノードでは 5 分以内に完了します。トレーニング スクリプトの出力には、次のようなテキストが含まれます。
{ 'train_loss': 1.435225, 'train_accuracy': 0.00084427913 }
このトレーニング スクリプトも評価を実行します。評価出力には次のようなテキストが含まれます。
Run stats: { 'eval_loss': 0.861013, 'eval_acc': 0.001, 'train_loss': 1.435225, 'train_acc': 0.00084427913, 'step_timestamp_log': [ 'BatchTimestamp<batch_index: 0, timestamp: 1606330585.7613473>', 'BatchTimestamp<batch_index: 500, timestamp: 1606330883.8486104>', 'BatchTimestamp<batch_index: 1000, timestamp: 1606331119.515312>', 'BatchTimestamp<batch_index: 1251, timestamp: 1606331240.7516596>' ], 'train_finish_time': 1606331296.395158, 'avg_exp_per_second': 1951.6983246161021 }
ResNet-RS モデルを収束するようにトレーニングするには、次のスクリプトに示すように trainer.train_steps=100
引数を省略します。トレーニングと評価は一緒に行われます。
(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
--experiment=resnet_rs_imagenet \
--mode=train_and_eval \
--model_dir=$MODEL_DIR \
--tpu=$TPU_NAME \
--config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
--params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"
コマンドフラグの説明
experiment
- 実行するテストの名前。
mode
- スクリプトを実行するモード。有効な値は、「train」、「eval」、または「train_and_eval」です。
model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
tpu
- 使用する TPU の名前。
config_file
- スクリプト構成ファイルへのパス。
params_override
- スクリプト構成ファイルの設定をオーバーライドします。
トレーニングと評価は fake_imagenet データセットに対して行われているため、出力結果には、実際のデータセットでトレーニングと評価を行った場合の出力は反映されません。
この時点で、このチュートリアルを終了して、Google Cloud リソースをクリーンアップすることも、Cloud TPU Pod でのモデルの実行をさらに詳しく調べることもできます。
より大きなモデルを使用する
ResNet-RS は、さまざまなサイズのモデル ファミリーを提供し、モデルが大きいほど、通常は計算コストが高くなります。詳細については、ResNet の再確認: トレーニングとスケーリング戦略の改善をご覧ください。
このコマンドの config_file を変更することで、トレーニングするモデルのサイズを選択できます。
(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
--experiment=resnet_rs_imagenet \
--mode=train_and_eval \
--model_dir=$MODEL_DIR \
--tpu=$TPU_NAME \
--config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs200_i256.yaml \
--params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"
利用可能な構成は VM 上の /usr/share/models/official/vision/beta/configs/experiments/
にあります。
Cloud TPU Pod でモデルのスケーリングする
Cloud TPU Pod でモデルをトレーニングするには、トレーニング スクリプトに変更を加える必要がある場合があります。詳細については、TPU Pod でのトレーニングをご覧ください。
Cloud TPU Pod を使用してモデルをスケーリングすると、より迅速に結果を得ることができます。完全にサポートされている ResNet-RS-50 モデルは、次の Pod スライスに対応しています。
- v2-32
- v3-32
Cloud TPU Pod では、トレーニングと評価が同時に行われます。
Cloud TPU Pod を使用したトレーニング
単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \ --zone=europe-west4-a \ --tpu-only
accelerator-type
パラメータを使用して、使用する Pod スライスを指定し、Pod 用の新しい Cloud TPU リソースを作成します。たとえば、次のコマンドは v2-32 Pod スライスを使用します。(vm)$ gcloud compute tpus execution-groups create --name=resnet-rs-tutorial \ --accelerator-type=v3-32 \ --zone=europe-west4-a \ --tf-version=2.12.0 \ --tpu-only
トレーニング スクリプトを実行します。
(vm)$ python3 /usr/share/models/official/vision/beta/train.py \ --experiment=resnet_rs_imagenet \ --mode=train_and_eval \ --model_dir=$MODEL_DIR \ --tpu=$TPU_NAME \ --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \ --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
コマンドフラグの説明
experiment
- 実行するテストの名前。
mode
- スクリプトを実行するモード。有効な値は、「train」、「eval」、または「train_and_eval」です。
model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
tpu
- 使用する TPU の名前。
config_file
- スクリプト構成ファイルへのパス。
params_override
- スクリプト構成ファイルの設定をオーバーライドします。
これにより、ResNet-RS を 100 トレーニング ステップでトレーニングし、v3-8 TPU ノードでは 5 分以内に完了します。トレーニング スクリプトの出力には、次のようなテキストが含まれます。
{ 'train_loss': 1.435225, 'train_accuracy': 0.00084427913 }
このトレーニング スクリプトも評価を実行します。評価出力には次のようなテキストが含まれます。
Run stats: { 'eval_loss': 0.861013, 'eval_acc': 0.001, 'train_loss': 1.435225, 'train_acc': 0.00084427913, 'step_timestamp_log': [ 'BatchTimestamp<batch_index: 0, timestamp: 1606330585.7613473>', 'BatchTimestamp<batch_index: 500, timestamp: 1606330883.8486104>', 'BatchTimestamp<batch_index: 1000, timestamp: 1606331119.515312>', 'BatchTimestamp<batch_index: 1251, timestamp: 1606331240.7516596>' ], 'train_finish_time': 1606331296.395158, 'avg_exp_per_second': 1951.6983246161021 }
トレーニングと評価は一緒に行われます。合計 112,590 ステップ中、各エポックには、1,251 のトレーニング ステップと 48 の評価ステップがあります。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で次のコマンドを使用して、Compute Engine VM と Cloud TPU を削除します。
$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \ --zone=europe-west4-a
gcloud compute tpus execution-groups list
を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。以下のようなレスポンスは、インスタンスが正常に削除されたことを示します。$ gcloud compute tpus execution-groups list \ --zone=europe-west4-a
次のような空の TPU のリストが表示されます。
NAME STATUS
次に示すように、
gsutil
を使用して Cloud Storage バケットを削除します。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 サービスを使用できるようになります。