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

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

モデルの説明

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

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

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

目標

  • データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
  • トレーニング ジョブを実行します。
  • 出力結果を確認します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

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

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

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

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

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

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

  4. このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。

リソースを設定する

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

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

    Cloud Shell を開く

  2. プロジェクト ID の変数を作成します。

    export PROJECT_ID=project-id
    
  3. Cloud TPU を作成するプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

    gcloud config set project ${PROJECT_ID}
    
  4. 次のコマンドを使用して Cloud Storage バケットを作成します。bucket-nameは、バケットの名前に置き換えます。

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
    

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

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

  5. ctpu up コマンドを使用して、このチュートリアルで必要となる Compute Engine リソースを起動します。

    ctpu up --zone=europe-west4-a \
    --vm-only \
    --disk-size-gb=300 \
    --machine-type=n1-standard-8 \
    --tf-version=1.15.3 \
    --name=mnasnet-tutorial
    

    CTPU ユーティリティの詳細については、CTPU リファレンスを参照してください。

  6. プロンプトが表示されたら、y キーを押して Cloud TPU リソースを作成します。

    ctpu up コマンドの実行が終了したら、shell プロンプトが username@projectname から username@vm-name に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。Compute Engine インスタンスに接続していない場合は、次のコマンドを実行して接続できます。

    gcloud compute ssh mnasnet-tutorial --zone=europe-west4-a
    

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

  7. ストレージ バケットの環境変数を作成します。bucket-name は、使用する Cloud Storage バケットの名前に置き換えます。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  8. モデル ディレクトリの環境変数を作成します。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnasnet
    
  9. 次のコマンドを使用して、Python パスに最上位の /models フォルダを追加します。

    (vm)$ export PYTHONPATH=${PYTHONPATH}:/usr/share/tpu/models:/usr/share/tpu/models/official/efficientnet
    

データを見つける

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

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

fake_imagenet データセットは Cloud Storage の次のロケーションにあります。

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

  1. データ ディレクトリの環境変数を作成します。

    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    

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

ImageNet データセット全体をダウンロードして処理する方法については、ImageNet データセットのダウンロード、前処理、アップロードをご覧ください。

fake_imagenet を使用して MnasNet モデルをトレーニングする

Mnasnet TPU モデルは、Compute Engine VM の次のディレクトリにプリインストールされています。

/usr/share/tpu/models/official/mnasnet/

  1. ctpu ユーティリティを使用して Cloud TPU リソースを起動し、後で使用するいくつかの環境変数を設定します。

    (vm)$ ctpu up --tpu-only 
    --tf-version=1.15.3
    --name=mnasnet-tutorial

    (vm)$ export TPU_NAME=mnasnet-tutorial
    
  2. モデル ディレクトリに移動します。

    (vm)$ cd /usr/share/tpu/models/official/mnasnet/
    

  3. トレーニング スクリプトを実行します。

    (vm)$ python3 mnasnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --model_name="mnasnet-a1" \
      --skip_host_call=true \
      --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 のバージョンが同じであれば、既存のフォルダを再利用して現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。

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

Cloud TPU Pod を使用したモデルのスケーリング

Cloud TPU Pod を使用してモデルをスケーリングすると、より迅速に結果を得ることができます。完全サポートの Mnasnet モデルは、次の Pod スライスを使用できます。

  • v2-32
  • v2-128
  • v2-256
  • v2-512
  • v3-32
  • v3-128
  • v3-256
  • v3-512
  • v3-1024
  • v3-2048

Cloud TPU Pod を使用する場合は、まず Pod を使用してモデルをトレーニングし、その後、単一の Cloud TPU デバイスを使用してモデルを評価します。

Cloud TPU Pod を使用してトレーニングする

  1. 単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。

     (vm)$ ctpu delete --tpu-only --name=mnasnet-tutorial
    
  2. 使用する Pod スライスを指定するための tpu-size パラメータを使用して、ctpu up コマンドを実行します。たとえば、次のコマンドは v2-32 Pod スライスを使用します。

      (vm)$ ctpu up --tpu-only --tpu-size=v2-32 --tf-version=1.15.3 --name=Cloud TPU
    
  3. TPU_NAME 環境変数を更新します。

    (vm)$ export TPU_NAME=Cloud TPU
    
  4. MODEL_DIR ディレクトリを更新してトレーニング データを保存します。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/Cloud TPU
    
  5. 次のスクリプトを実行してモデルをトレーニングします。

    このスクリプトは、fake_imagnet データセットに対してモデルを 35 エポックまでトレーニングします。このトレーニングは、v3-128 Cloud TPU 上で約 90 分かかります。

    (vm)$ python3 mnasnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --model_name="mnasnet-a1" \
      --skip_host_call=true \
      --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 時間で完了します。

モデルの評価

この手順では、Cloud TPU を使用して、fake_imagenet 検証データに対して上記でトレーニングしたモデルを評価します。

  1. Pod でモデルをトレーニングするために作成した Cloud TPU リソースを削除します。

    (vm)$ ctpu delete --tpu-only --name=${TPU_NAME}
  2. v2-8 Cloud TPU を起動します。 Compute Engine VM に使用したものと同じ名前を使用します。これはまだ実行されています。

    (vm)$ ctpu up --tpu-only --tf-version=1.15.3 --name=mnasnet-eval
    
  3. TPU 名の環境変数を作成します。

    (vm)$ export TPU_NAME=mnasnet-eval
    
  4. アクセラレータ タイプの環境変数を作成します。

    (vm)$ export ACCELERATOR_TYPE=v3-8
    
  5. モデルの評価を実行します。今回は、mode フラグを指定し、eval に設定します。

    (vm)$ python3 mnasnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --mode=eval \
      --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

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

       Eval results: {'loss': 7.532023,
       'top_1_accuracy': 0.0010172526,
       'global_step': 100,
       'top_5_accuracy': 0.005065918}.
       Elapsed seconds: 88
    

クリーンアップ

このトピックで使用したリソースについて 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 --zone=europe-west4-a --name=mnasnet-tutorial
    
  3. TPU の使用に対して不要な料金が発生しないように、ctpu status を実行してインスタンスが割り当てられていないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

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

    $ gsutil rm -r gs://bucket-name
    

次のステップ