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

このチュートリアルでは、単一の Cloud TPU デバイスまたは Cloud TPU Pod スライス(複数の TPU デバイス)を使用して Tensorflow MnasNet モデルをトレーニングする方法を説明します。TensorFlow と ImageNet データセットを使用する、TPU 用に最適化されたその他の画像分類モデルにも、同じパターンを適用できます。

免責

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

モデルの説明

このチュートリアルで使用するモデルは、MnasNet: Platform-Aware Neural Architecture Search for Mobile をベースとしています。これは、AutoML モバイル ニューラル ネットワーク(MnasNet)アーキテクチャを導入した初めてのモデルです。このチュートリアルでは、最先端のバリアント「mnasnet-a1」を使用して、TPUEstimator を使ったモデルのトレーニング方法を説明します。

Pod スライス(v2-32 または v3-32 以上)のトレーニングにあたり特に留意すべき事項

TPU Pod スライスのトレーニングを行う場合は、このドキュメントをお読みいただき、Pod スライスのトレーニングについて特に留意すべき事項をご確認ください。

プロジェクトを設定する

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

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

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

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

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

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

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

リソースを設定する

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

Cloud Storage バケットを作成する

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

バケットのロケーションは、仮想マシン(VM)および TPU ノードと同じリージョンにする必要があります。VM と TPU ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。

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

    Cloud Storage ページに移動

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

    • 任意の一意な名前
    • デフォルトのストレージ クラス: Standard
    • ロケーション: TPU ノードを作成する予定のリージョンと同じリージョンにバケットのロケーションを指定します。各種の TPU タイプをどこで使用できるかについては、TPU タイプとゾーンをご覧ください。

ctpu ツールを使用する

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

VM リソースと TPU リソースを設定するには、gcloud コマンドまたは Cloud Console を使用することもできます。詳細については、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

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

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_BUCKET 環境変数を設定し、YOUR-BUCKET-NAME を Cloud Storage バケットの名前に置き換えます。

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

トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。

(省略可)TensorBoard をセットアップする

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

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

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

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

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

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

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

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

TPU デバイス

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

単一の TPU デバイスを対象とした手順では、MnasNet モデル(「mnasnet-a1」バリアント)を 350 エポックまでトレーニングし、一定のステップ数ごとに評価します。このように指定したフラグを使用すると、モデルのトレーニングが約 23 時間行われます。この設定で実際の imagenet データを使用すると最先端の調査結果が再現されますが、ユーザーはトレーニング速度を調整できます。

TPU Pod

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

この手順では、MnasNet モデル(「mnasnet-a1」バリアント)を fake_imagent データセットに対して 350 エポックまでトレーニングします。このトレーニングは約 5 時間で完了します。

  1. まず、次の ctpu up コマンドを実行して、新しい Compute Engine VM と v2-8 Cloud TPU を割り当てて起動します。
        (vm)$  ctpu up --name=[YOUR-EVAL-TPU-NAME]
  2. モデルの評価に必要な環境変数を設定し、モデル ディレクトリに移動します。
        (vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
        (vm)$ export ACCELERATOR_TYPE=v2-8
        (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
        (vm)$ cd /usr/share/tpu/models/official/mnasnet/
  3. 以下のフラグを使用して、モデルの評価を実行します。
        (vm)$ python mnasnet_main.py \
          --tpu=${TPU_NAME} \
          --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
          --model_dir=${STORAGE_BUCKET}/mnasnet \
          --mode=eval \
          --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml

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

Eval results: {'loss': 7.044145, 'top_1_accuracy': 0.0009765625, 'global_step': 1000, 'top_5_accuracy': 0.005004883}. Elapsed seconds: 50

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

このチュートリアルでは、ImageNet の完全版のデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、ストレージ容量と所要時間を ImageNet の完全版のデータセットに対してモデルを実行する際に通常必要となるものより抑えながらチュートリアルを試すことができます。ImageNet の完全版のデータセットに対してモデルが実行される様子を確認するには、以下の手順に従ってください。

容量の要件を確認する

ImageNet の完全版のデータセットを使用するには、ローカルマシンまたは VM に約 300 GB の空き容量が必要です。

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=gs://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
    

次のステップ