Cloud TPU での AmoebaNet-D のトレーニング

このチュートリアルでは、Cloud TPU で AmoebaNet-D をトレーニングする方法について説明します。TensorFlow および ImageNet データセットを使用する、TPU に対応するその他の画像分類モデルにも同じパターンを適用できます。

免責

このチュートリアルでは、サードパーティのデータセットを使用します。Google は、このデータセットの有効性またはその他の側面について、いかなる表明、保証もいたしません。

モデルの説明

AmoebaNet-D モデルは、Evolutionary AutoML を使用して発見された画像分類子アーキテクチャの 1 つです。このモデルは、AmoebaNet の論文(Real, E.、Aggarwal, A.、Huang, Y. および Le, Q.V.、2018、Regularized Evolution for Image Classifier Architecture Search、arXiv プレプリント arXiv:1802.01548)の成果に基づいています。

このモデルでは、TPUEstimator(高度な TensorFlow API)を使用します。これは、Cloud TPU で機械学習モデルを作成して実行する場合に推奨される方法です。

この API は、低レベルの実装のほとんどを非表示にしてモデル開発プロセスを簡素化し、TPU と他のプラットフォーム(GPU や CPU など)を簡単に切り替えることができるようにします。

始める前に

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

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

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

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

    プロジェクト セレクタのページに移動

  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=300 --preemptible --machine-type n1-standard-8 

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

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 コマンドの実行が終了したら、shell プロンプトが username@tpuname になっていることを確認します。これは、Compute Engine VM にログインしていることを意味します。

データを準備する

次の環境変数を作成します。YOUR-BUCKET-NAME の部分は、Cloud Storage バケットの名前に置き換えてください。

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
(vm)$ export MODEL_BUCKET=${STORAGE_BUCKET}/amoebanet

トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションでは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。

トレーニング データセット

ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードを数百、数千もの画像で表しています。

このチュートリアルでは、ImageNet の完全なデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、完全な ImageNet データベースに対してモデルを実行する際に一般的に伴うストレージと時間の所要量を少なくして、チュートリアルを試すことができます。

ランダムに生成された架空のデータセットを使用してモデルをテストする手順は、次のとおりです。または、ImageNet の完全なデータセットを使用することもできます。

トレーニング対象のデータセットを指定するには、以下で説明する DATA_DIR 環境変数を使用します。

架空のデータセットは Cloud Storage の次の場所にあります。

gs://cloud-tpu-test-datasets/fake_imagenet

架空のデータセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルには意味はありません。

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

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

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

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

fake_imagenet を使用して AmoebaNet-D モデルを実行する

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

  1. 次のコマンドを使用して、Python パスに最上位の /models フォルダを追加します。
    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
    AmoebaNet-D モデルは Compute Engine VM にプリインストールされています。
  2. ディレクトリに移動します。
    (vm)$ cd /usr/share/tpu/models/official/amoeba_net/
    
  3. 次のようにして、単一の Cloud TPU デバイス用または Pod 用のトレーニング スクリプトを実行します。

TPU デバイス

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

単一の Cloud TPU デバイスを対象とした手順では、AmoebaNet-D モデルを 90 エポックまでトレーニングし、一定のステップ数ごとに評価します。このように指定したフラグを使用すると、モデルのトレーニングが約 10 時間で行われます。

トレーニングと評価は fake_dataset に対して行われているため、出力結果には、実際のデータセットでトレーニングと評価を行った場合の出力は反映されません。

fake_dataset を使用してモデルをトレーニングした場合は、クリーンアップに進みます。

TPU Pod

  1. 以下のフラグを指定して、モデルを実行します。
    (vm)$ python amoeba_net.py \
        --tpu=$TPU_NAME \
        --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
        --model_dir=$MODEL_BUCKET \
        --num_cells=6 \
        --image_size=224 \
        --num_epochs=35 \
        --train_batch_size=4096 \
        --eval_batch_size=1000 \
        --lr=10.24 \
        --lr_decay_value=0.88 \
        --num_shards=32 \
        --lr_warmup_epochs=0.35 \
        --mode=train \
        --iterations_per_loop=1000
    
    • --tpu は、Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
    • --model_dir は、モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)にする必要があります。既存のフォルダを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。

この手順では、fake_imagent データセットに対して AmoebaNet-D モデルを 35 エポックまでトレーニングします。このトレーニングは約 4 時間で完了します。

次の表に、AmoebaNet のトレーニングで使用するフラグの推奨値をスライスサイズ別に記載します。

v2-32

--num_cells=6 - セルの合計数
--image_size=224 - 画像の高さと幅を前提とした画像のサイズ
--num_epochs=35 - トレーニングに使用するステップ数
--train_batch_size=4096 - トレーニングで(シャードあたりではなく)グローバルに使用するバッチサイズ
---lr=10.24 - 学習率
--lr_decay_value=0.88 - 学習率を調整する際に使用される指数関数的減衰率
--num_shards=32 - シャード数(TPU コア数)

v2-128

--num_cells=6 - セルの合計数
--image_size=224 - 画像の高さと幅を前提とした画像のサイズ
--num_epochs=60 - トレーニングに使用するステップ数
--train_batch_size=8192 - トレーニングで(シャードあたりではなく)グローバルに使用するバッチサイズ
---lr=20.48 - 学習率
--lr_decay_value=0.91 - 学習率を調整する際に使用される指数関数的減衰率
--num_shards=128 - シャード数(TPU コア数)

v2-256

--num_cells=6 - セルの合計数
--image_size=224 - 画像の高さと幅を前提とした画像のサイズ
--num_epochs=90 - トレーニングに使用するステップ数
--train_batch_size=16384 - トレーニングで(シャードあたりではなく)グローバルに使用するバッチサイズ
---lr=40.96 - 学習率
--lr_decay_value=0.94 - 学習率を調整する際に使用される指数関数的減衰率
--num_shards=256 - シャード数(TPU コア数)

トレーニング済み AmoebaNet-D モデルを評価する

上記でトレーニングしたモデルの評価にも、fake_dataset の検証データを使用できます。

注: TPUEstimator ではまだ Cloud TPU Pod スライスでの精度の評価をサポートしていないため、評価に使用する Cloud TPU v2-8 ノードを作成する必要があります。それには、次の「ctpu up」コマンドを使用します。このコマンドにより、デフォルト ゾーン(us-central1-b)内の Compute Engine VM と Cloud TPU が初期化されます。

  1. まず、次の ctpu up コマンドを実行して、新しい Compute Engine VM と v2-8 Cloud TPU を割り当てて起動します。
        (vm)$  ctpu up
        
  2. モデルの再実行に必要な変数を設定し、モデル ディレクトリに移動します。
        (vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
        (vm)$ export MODEL_BUCKET=${STORAGE_BUCKET}/amoebanet
        (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
        (vm)$ cd /usr/share/tpu/models/official/amoeba_net/
        
  3. 以下のフラグを使用して、モデルの評価を実行します。
        (vm)$ python amoeba_net.py \
        --tpu_name=$TPU_NAME \
        --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
        --model_dir=$MODEL_BUCKET \
        --num_cells=6 \
        --image_size=224 \
        --train_batch_size=4096 \
        --eval_batch_size=1000 \
        --mode=eval \
        --iterations_per_loop=1000
        

このコマンドにより、次のような出力が生成されます。

Evaluation results: {'loss': 6.908725, 'top_1_accuracy': 0.001, 'global_step': 10955, 'top_5_accuracy': 0.005}

トレーニングと評価は fake_dataset に対して行われているため、出力結果には、実際のデータセットでトレーニングと評価を行った場合の出力は反映されません。

fake_dataset を使用してモデルをトレーニングした場合は、クリーンアップに進みます。

完全な ImageNet データセットの使用

このチュートリアルでは、ImageNet の完全なデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、ImageNet の完全なデータセットに対してモデルを実行する際に一般的に伴うストレージと時間の所要量を少なくして、チュートリアルを試すことができます。ImageNet の完全なデータセットに対してモデルを実行する場合は、以下の手順に従ってください。

ImageNet の完全なデータセットを使用するには、ローカルマシンまたは VM に約 300 GB の空き容量が必要です。VM の設定に ctpu up を使用すると、デフォルトで 250 GB が割り当てられます。次の 2 つのうちのいずれかの方法で VM ディスクサイズを増やすことが可能です。

  • ctpu up コマンドラインで、割り当てるサイズ(GB 単位)とともに --disk-size-gb フラグを指定します。
  • Compute Engine ガイドに従って、VM にディスクを追加します。
    • VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。
    • 新しいディスクのパスをメモします。例: /mnt/disks/mnt-dir

ImageNet データをダウンロードして変換します。

  1. ImageNet アカウントに登録します。アカウントの作成に使用したユーザー名とパスワードを覚えておいてください。

  2. Cloud Storage バケットのパスを指す DATA_DIR 環境変数を設定します。

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}
    
  3. GitHub から imagenet_to_gcs.py スクリプトをダウンロードします。

    $ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    
  4. スクリプトの作業ファイルを含むように SCRATCH_DIR 変数を設定します。変数は、ローカルマシンまたは Compute Engine VM 上の場所を指定する必要があります。たとえば、ローカルマシンの場合は次のようにします。

    $ SCRATCH_DIR=./imagenet_tmp_files
    

    または、VM でデータを処理している場合は次のようにします。

    (vm)$ SCRATCH_DIR=/mnt/disks/mnt-dir/imagenet_tmp_files
    
  5. imagenet_to_gcs.py スクリプトを実行して ImageNet データをダウンロードし、フォーマットしてバケットにアップロードします。[USERNAME][PASSWORD] は、ImageNet アカウントの作成に使用したユーザー名とパスワードに置き換えます。

    $ pip install google-cloud-storage
    $ python imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$DATA_DIR \
      --local_scratch_dir=$SCRATCH_DIR \
      --imagenet_username=[USERNAME] \
      --imagenet_access_key=[PASSWORD]
    

JPEG 形式の生データがすでにダウンロードされている場合は、直接 raw_data_directory パスを指定できます。トレーニング用または検証データ用の元データのディレクトリが提供されている場合は、次の形式になります。

トレーニング サブディレクトリ名(例: n03062245)は「WordNet ID」(wnid)です。ImageNet API は、synset_labels.txt ファイル内の WordNet ID とそれに関連する検証ラベルとのマッピングを示します。このコンテキストの synset は、視覚的に類似した画像のグループです。

: ネットワークとパソコンの速度によっては、データのダウンロードと前処理に 10 時間以上かかることがあります。スクリプトを中断しないでください。

スクリプトの処理が終了すると、次のようなメッセージが表示されます。

2018-02-17 14:30:17.287989: Finished writing all 1281167 images in data set.

このスクリプトにより、以下の形式の一連のディレクトリ(トレーニング用と検証用の両方)が生成されます。

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
 ...
${DATA_DIR}/train-01023-of-01024

および

${DATA_DIR}/validation-00000-of-00128
S{DATA_DIR}/validation-00001-of-00128
 ...
${DATA_DIR}/validation-00127-of-00128

データが Cloud バケットにアップロードされたら、モデルを実行し、--data_dir=${DATA_DIR} を設定します。

ImageNet の完全なデータセットを使用してモデルをトレーニングした場合は、クリーンアップに進みます。

クリーンアップ

このトピックで使用したリソースについて 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
    

次のステップ

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

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