このチュートリアルでは、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 プロジェクトが正しく設定されていることを確認します。
- 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 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
に認証情報を使用した GCP API の呼び出しを許可します。gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。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
TPU の設定変数をエクスポートする
モデルをトレーニングするゾーンを設定し、トレーニング関連のデータを保存します。
$ export ZONE=europe-west4-a
次のコマンドを使用して 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 ノードと同じリージョンにする必要があります。
データセットは、独自に用意するか、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 efficientnet-tutorial \ --zone=${ZONE} \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.8.0
TPU ノード
gcloud compute tpus execution-groups create \ --name=efficientnet-tutorial \ --zone=${ZONE} \ --disk-size=300 \ --machine-type=n1-standard-16 \ --tf-version=2.8.0 \ --accelerator-type=v3-8
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-name
に変わります。TPU VM
gcloud alpha compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
TPU ノード
gcloud compute ssh efficientnet-tutorial --zone=${ZONE}
Cloud TPU 名の変数を設定します。
TPU VM
(vm)$ export TPU_NAME=local
TPU ノード
(vm)$ export TPU_NAME=efficientnet-tutorial
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 バケットを使用してトレーニング中にチェックポイントを保存します。
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
EfficientNet トレーニング スクリプトには、追加のパッケージが必要です(TPU VM のみ)。この時点で、これらのパッケージをインストールしておきます。
TPU VM
(vm)$ sudo pip3 install tensorflow-addons (vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
必要な環境変数を次のように設定します。
TPU VM
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
TPU ノード
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
EfficientNet モデルは、Compute Engine VM にプリインストールされています。
モデルが保存されているディレクトリに移動します。
TPU VM
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
TPU ノード
(vm)$ cd /usr/share/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 リソースを削除します。
TPU VM
$ gcloud alpha compute tpus tpu-vm delete efficientnet-tutorial \ --zone=${ZONE}
コマンドフラグの説明
zone
- Cloud TPU が存在するゾーン。
TPU ノード
$ gcloud compute tpus execution-groups delete efficientnet-tutorial \ --tpu-only \ --zone=${ZONE}
コマンドフラグの説明
tpu-only
- Cloud TPU のみを削除します。VM は引き続き使用できます。
zone
- 削除する TPU を含むゾーン。
この時点で、このチュートリアルを終了してクリーンアップすることも、Cloud TPU Pod でのモデルの実行を続行して調べることもできます。
Cloud TPU Pod でモデルのスケーリングする
{ product_name_short }} 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
に認証情報を使用した 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 バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
gcloud
コマンドは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、TPU VM と同じリージョンとなる必要があります。
TPU の設定変数をエクスポートする
モデルをトレーニングするゾーンを設定し、トレーニング関連のデータを保存します。
$ export ZONE=europe-west4-a
データセットは、独自に用意するか、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 efficientnet-tutorial \ --zone=${ZONE} \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.8.0-pod
TPU ノード
(vm)$ gcloud compute tpus execution-groups create --name=efficientnet-tutorial \ --accelerator-type=v3-32 \ --zone=${ZONE} \ --tf-version=2.8.0
自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-name
に変わります。TPU VM
$ gcloud alpha compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
TPU ノード
$ gcloud compute ssh efficientnet-tutorial --zone=${ZONE}
これらの手順を続行する場合は、VM セッション ウィンドウで、
(vm)$
で始まる各コマンドを実行します。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 の要件をインストールします。
TPU VM
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU ノード
(vm)$ pip3 install -r /usr/share/models/official/requirements.txt
必要な環境変数を次のように設定します。
TPU VM
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}" (vm)$ export TPU_LOAD_LIBRARY=0
TPU ノード
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
EfficientNet モデルは、Compute Engine VM にプリインストールされています。
モデルが保存されているディレクトリに移動します。
TPU VM
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification/resnet
TPU ノード
(vm)$ cd /usr/share/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_imagnet データセットに対してモデルを 1 エポックまでトレーニング(合計 312 トレーニング ステップ、12 評価ステップ)します。このトレーニングは、v3-32 Cloud TPU 上で約 2 分かかります。トレーニングと評価が完了すると、次のようなメッセージが表示されます。
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 リソースを削除します。
TPU VM
$ gcloud alpha compute tpus tpu-vm delete efficientnet-tutorial \ --zone=${ZONE}
TPU ノード
$ gcloud compute tpus execution-groups delete efficientnet-tutorial \ --zone=${ZONE}
gcloud compute tpus execution-groups list
を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。次のコマンドの出力には、このチュートリアルで作成したリソースを含めないでください。$ gcloud compute tpus execution-groups list --zone=${ZONE}
次に示すように、
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 サービスを使用できるようになります。
データセット変換チュートリアルに従って、fake_imagenet データセットまたは ImageNet データセットの代わりに独自のデータを使用してトレーニングと評価を行う方法を学習します。 このチュートリアルでは、画像分類データ変換プログラムのサンプル スクリプトを使用して、画像分類用の生のデータセットを Cloud TPU Tensorflow モデルで使用される TFRecord に変換する方法について説明します。
独自の画像データを使用して画像分類モデルを実行する方法を示す Cloud TPU colab を実行します。
他の Cloud TPU チュートリアルを確認する。
TensorBoard の TPU モニタリング ツールの使用方法を学習する。