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

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 など)の切り替えが簡単になります。

目標

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

費用

このチュートリアルでは、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 の各リソースを設定する方法を説明します。

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

    Cloud Shell を開く

  • プロジェクト名の変数を作成します。

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

    gcloud config set project ${PROJECT_NAME}
    
  • 次のコマンドを使用して Cloud Storage バケットを作成します。

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

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

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

  • ctpu up コマンドを使用して、このために必要な Compute Engine リソースと Cloud TPU リソースを起動します。

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

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

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

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

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

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

    データを準備する

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

    fake_imagenet を使用した AmoebaNet-D モデルのトレーニングと評価

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

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

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

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

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

  • ctpu ユーティリティを使用して Cloud TPU リソースを起動します。

    (vm)$ ctpu up --tpu-only \
     --name=amoebanet-tutorial \
     --tf-version=1.15.2
    
  • 次の環境変数を作成します。bucket-name の部分は、Cloud Storage バケットの名前に置き換えてください。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/amoebanet
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    
    (vm)$ export TPU_NAME=amoebanet-tutorial
    
  • ディレクトリに移動します。

    (vm)$ cd /usr/share/tpu/models/official/amoeba_net/
    
  • トレーニング スクリプトを実行します。

    (vm)$ python3 amoeba_net.py \
       --tpu=${TPU_NAME} \
       --data_dir=${DATA_DIR} \
       --model_dir=${MODEL_DIR} \
       --num_epochs=1
    
    パラメータ 説明
    tpu Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    data_dir トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir を Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。
  • 単一の Cloud TPU デバイスの場合、この手順では、AmoebaNet-D モデルを 1 エポックまでトレーニングし、一定のステップ数ごとに評価します。このように指定したフラグを使用すると、モデルのトレーニングは v3-8 Cloud TPU で約 30 分間行う必要があります。収束までのトレーニング時間は約 90 エポックで、およそ 10 時間です。

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

    この時点で、このチュートリアルを終了して、GCP リソースをクリーンアップすることも、Cloud TPU Pod でのモデルの実行をさらに詳しく調べることもできます。

    Cloud TPU Pod を使用してモデルをスケーリングする

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

    • v2-32
    • v3-32

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

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

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

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

    (vm)$ ctpu up --tpu-only \
    --tf-version=1.15.2 \
    --tpu-size=v2-32 \
    --name=amoebanet-tutorial-pod \
    --zone=europe-west4-a
    
  • MODEL_BUCKET ディレクトリを更新して、ポッドのトレーニング データを保存します。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/amoebanet-tutorial-pod
    (vm)$ export TPU_NAME=amoebanet-tutorial-pod
    
  • 次のフラグを使用して、Compute Engine VM のモデルをトレーニングします。

    (vm)$ python3 amoeba_net.py \
       --tpu=${TPU_NAME} \
       --data_dir=${DATA_DIR} \
       --model_dir=${MODEL_DIR} \
       --num_cells=6 \
       --image_size=224 \
       --num_epochs=1 \
       --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://...」)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。
  • この手順は、fake_imagnet データセットに対して AmoebaNet-D モデルを 1 エポックでトレーニングします。トレーニングには、v2-32 Cloud TPU 上で約 10 分かかります。収束までのトレーニングは、約 35 エポックです。

    モデルの評価

    評価は、単一の Cloud TPU デバイスで実行する必要があります。このため、Pod TPU を削除して新しい単一の Cloud TPU デバイスを作成する必要があります。次に、この Cloud TPU を使用して、fake_imagenet 検証データに対して上記でトレーニングしたモデルを評価します。

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

      (vm)$ ctpu delete --tpu-only \
       --name=amoebanet-tutorial-pod \
       --zone=europe-west4-a
    2. tpu-size パラメータを使用して ctpu up コマンドを実行し、使用する Cloud TPU を指定します。たとえば、次のコマンドでは v3-8 TPU タイプを使用しています。

      (vm)$ ctpu up --tpu-only \
      --tf-version=1.15.2 \
      --tpu-size=v3-8 \
      --name=amoebanet-tutorial-eval \
      --zone=europe-west4-a
      
    3. ポッド トレーニング データを定するため MODEL_BUCKET ディレクトリを更新します。

      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/amoebanet-tutorial-pod
      (vm)$ export TPU_NAME=amoebanet-tutorial-eval
      
    4. 以下のフラグを使用して、モデルの評価を実行します。

      (vm)$ python3 amoeba_net.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --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_imagenet データセットに対して行われているため、出力結果には、実際のデータセットでトレーニングと評価を行った場合の出力は反映されません。

    より大規模な Cloud TPU Pod スライスの使用

    より大規模な Cloud TPU Pod スライスを使用してモデルを試すこともできます。次の表に、これらのスライスの推奨値を示します。

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

    クリーンアップ

    このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

    1. Cloud TPU を削除します。

      $ ctpu delete --tpu-only \
        --name=amoebanet-tutorial-eval \
        --zone=europe-west4-a
      
    2. Compute Engine インスタンスとの接続を切断していない場合は切断します。

      (vm)$ exit
      

      プロンプトが username@projectname に変わります。これは、現在、Cloud Shell 内にいることを示しています。

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

      $ ctpu delete --vm-only --name=amoebanet-tutorial --zone=europe-west4-a
      
    4. TPU の使用に対して不要な料金が発生しないように、ctpu status を実行してインスタンスが割り当てられていないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

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

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

    次のステップ