Cloud TPU での EfficientNet のトレーニング

このチュートリアルでは、単一の Cloud TPU デバイスまたは Cloud TPU Pod スライス(複数の TPU デバイス)を使用して Tensorflow EfficientNet モデルをトレーニングする方法を説明します。EfficientNet モデルは、優れた精度を実現すると同時に、他のモデルよりもサイズが小さく高速な、最先端の画像分類モデル ファミリーです。

モデルの説明

このチュートリアルで使用するモデルは、EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks に基づいています。特に、このチュートリアルでは efficientnet-b0efficientnet-b3 の 2 つのバリアントを使用して、TPUEstimator を使ったモデルのトレーニング方法を説明します。

プロジェクトを設定する

チュートリアルを始める前に、Google Cloud Platform プロジェクトが正しく設定されていることを確認するか、新しいプロジェクトを設定してください。

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Platform プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. TPU デバイスとポッドのいずれかの使用に十分な割り当て量があることを確認します。

リソースを設定する

このセクションでは、チュートリアルで使用する Cloud Storage のストレージ、VM、Cloud TPU の各リソースを設定する方法を説明します。

Cloud Storage バケットを作成する

モデルのトレーニングに使用するデータとトレーニング結果を格納するには、Cloud Storage バケットが必要です。このチュートリアルで使用する ctpu up ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。

作成するバケットは、使用する仮想マシン(VM)および Cloud TPU デバイスまたは Cloud TPU スライス(複数の TPU デバイス)と同じリージョン内に配置する必要があります。

  1. GCP Console の Cloud Storage ページに移動します。

    Cloud Storage ページに移動

  2. 次のオプションを指定して新しいバケットを作成します。

    • 任意の一意な名前
    • デフォルトのストレージ クラス: Regional
    • ロケーション: 単一の Cloud TPU デバイスを使用する場合は、表示されるデフォルト ロケーションを受け入れます。Cloud TPU Pod スライスを使用する場合、Cloud TPU Pod を利用できるリージョンを選択する必要があります。

ctpu ツールを使用する

このセクションでは、Cloud TPU プロビジョニング ツールctpu)を使用して Cloud TPU プロジェクトのリソースを作成、管理する方法を説明します。リソースは、同じ名前が付けられた仮想マシン(VM)と Cloud TPU リソースで構成されます。これらのリソースは、作成したバケットと同じリージョン / ゾーンに存在する必要があります。

VM リソースと TPU リソースを設定するには、gcloud コマンドまたは Cloud Console を使用することもできます。詳細については、VM と TPU のリソース管理をご覧ください。

ctpu up を実行してリソースを作成する

  1. Cloud Shell ウィンドウを開きます。

    Cloud Shell を開く

  2. gcloud config set project <Your-Project> を実行して、Cloud TPU の作成に使用するプロジェクトを設定します。

  3. Cloud TPU デバイスまたは Pod スライスのいずれかを示すフラグを指定して ctpu up を実行します。フラグのオプションと説明については、CTPU リファレンスをご覧ください。

  4. Cloud TPU デバイスか、Pod スライスのいずれかを設定します。

TPU デバイス

Cloud TPU デバイスを設定します。

$ ctpu up 

構成に関する次のメッセージが表示されます。

ctpu will use the following configuration:

Name: [your TPU's name]
Zone: [your project's zone]
GCP Project: [your project's name]
TensorFlow Version: 1.14
VM:
  Machine Type: [your machine type]
  Disk Size: [your disk size]
  Preemptible: [true or false]
Cloud TPU:
  Size: [your TPU size]
  Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

y キーを押して、Cloud TPU リソースを作成します。

TPU Pod

作業しているゾーン内の VM 上に、Cloud TPU スライスを設定します。

$ ctpu up  --zone=us-central1-a --tpu-size=v2-32 --disk-size-gb=500 --machine-type n1-standard-8 --preemptible

構成に関する次のメッセージが表示されます。

ctpu will use the following configuration:

Name: [your TPU's name]
Zone: [your project's zone]
GCP Project: [your project's name]
TensorFlow Version: 1.14
VM:
  Machine Type: [your machine type]
  Disk Size: [your disk size]
  Preemptible: [true or false]
Cloud TPU:
  Size: [your TPU size]
  Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

y キーを押して、Cloud TPU リソースを作成します。

ctpu up コマンドにより、仮想マシン(VM)と Cloud TPU サービスが作成されます。

これ以降、接頭辞 (vm)$ は Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。

Compute Engine VM を確認する

ctpu up コマンドの実行が終了したら、シェル プロンプトが username@tpuname になっていることを確認します。これは、Compute Engine VM にログインしていることを意味します。

Storage バケットをエクスポートする

トレーニング中のチェックポイントの保存とトレーニング ログの書き込みに使用する Storage バケットを指定するには、STORAGE_BUCKET 環境変数を設定します。次のコマンドの YOUR-BUCKET-NAME は、Cloud Storage バケットの名前に置き換えてください。

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME

トレーニング アプリケーションは、Cloud Storage 内でトレーニング データにアクセスできることを前提としています。

(オプション)TensorBoard をセットアップする

TensorBoard には、TensorFlow データを視覚的に表示するための一連のツールが用意されています。モニタリングに使用することで、処理のボトルネックを特定し、パフォーマンスの改善方法を探る際に役立ちます。

この時点でモデルの出力を監視する必要がない場合は、TensorBoard の設定手順をスキップできます。

モデルの出力とパフォーマンスをモニタリングする場合は、TensorBoard の設定に関するガイドをご覧ください。

fake_imagenet を使用して EfficientNet モデルを実行する

次の手順で、コマンドに接頭辞 (vm)$ が存在する場合、そのコマンドは Compute Engine VM で実行する必要があります。

  1. 次のコマンドを使用して、Python パスに最上位の /models フォルダを追加します。

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. ディレクトリに移動します。

    (vm)$ cd /usr/share/tpu/models/official/efficientnet/
    
  3. 次のようにして、単一の Compute Engine デバイスまたは Pod に対してトレーニング スクリプトを実行します。

TPU デバイス

efficientnet-b0 モデルを例として使用して、8 コアの TPU v2 インスタンスでトレーニングを実行します。

(vm)$ python main.py \
  --tpu=${TPU_NAME} \
  --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
  --model_dir=${STORAGE_BUCKET}/efficientnet-b0-v2-8 \
  --model_name='efficientnet-b0' \
  --skip_host_call=true \
  --train_batch_size=2048 \
  --train_steps=218948
  • --tpu は、Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
  • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。
  • --model_dir は、モデルのトレーニング中にチェックポイントと概要が保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)である必要があります。既存のフォルダを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。

単一の TPU デバイスを対象とした手順では、EfficientNet モデル(efficientnet-b0 バリアント)を 350 エポックまでトレーニングし、一定のステップ数ごとに評価します。このように指定したフラグを使用すると、モデルのトレーニングが約 23 時間で行われます。実際の ImageNet データを使用する場合、この設定により、ImageNet の検証データセットに対する最大 76.5% のトップ 1 の精度を取得できるはずです。最も有効なモデル チェックポイントとその評価結果は、モデル ディレクトリ ${STORAGE_BUCKET}/efficientnet-b0-v2-8/archivearchive フォルダにあります。

TPU Pod

efficientnet-b3 モデルを例として使用して、32 コアの TPU v3 Pod のスライスでトレーニングを実行します。

(vm)$ python main.py \
  --tpu=${TPU_NAME} \
  --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
  --model_dir=${STORAGE_BUCKET}/efficientnet-b3-v3-32 \
  --model_name='efficientnet-b3' \
  --skip_host_call=true \
  --mode=train \
  --train_steps=109474 \
  --train_batch_size=4096 \
  --iterations_per_loop=100
  • --tpu は、Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
  • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。
  • --model_dir は、モデルのトレーニング中にチェックポイントと概要が保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)である必要があります。既存のフォルダを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。

この手順では、EfficientNet モデル(efficientnet-b3 バリアント)を 350 エポックまでトレーニングします。このモデルは ImageNet データセットに対して 81.1% の精度を達成し、トレーニングは約 20 時間で完了します。最も有効なモデル チェックポイントとその評価結果は、モデル ディレクトリ ${STORAGE_BUCKET}/efficientnet-b3-v3-32/archivearchive フォルダにあります。

クリーンアップ

このトピックで使用したリソースについて GCP アカウントに課金されないようにする手順は次のとおりです。

  1. Compute Engine VM との接続を解除します。

    (vm)$ exit
    

    プロンプトが user@projectname と表示され、Cloud Shell 内にいることが示されます。

  2. Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して ctpu delete を実行し、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete [optional: --zone]
    
  3. TPU の使用に対する不要な料金が発生しないように、ctpu status を実行して、インスタンスの割り当てがないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 次に示すように gsutil を実行します。YOUR-BUCKET-NAME の部分は、このチュートリアルで作成した Cloud Storage バケットの名前に置き換えてください。

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...