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

EfficientNet モデルは、優れた精度を実現すると同時に、他のモデルよりもサイズが小さく高速な、最先端の画像分類モデル ファミリーです。EfficientNet-EdgeTpu は、Google EdgeTPU デバイスで効率的に実行されるようにカスタマイズされたモデルです。

このチュートリアルで使用するモデルは、EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks に基づいています。研究者は、モデルのパフォーマンスを改善する新しい手法として、シンプルで非常に効果的な複合係数を使用して、ネットワークの深さ、幅、解像度のバランスを慎重に調整する手法を開発しました。

efficientnet-b0 から efficientnet-b7 までのモデル ファミリーにより、Google EdgeTPU デバイスに限定されるリソースに応じた、妥当な画像分類精度を実現できます。

このチュートリアルで使用するモデル efficientnet-b0 は、最小のベースモデルに対応していますが、efficientnet-b7 は最も強力で計算コストの高いモデルに対応しています。このチュートリアルでは、TPUEstimator を使ったモデルのトレーニング方法を説明します。

目標

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

費用

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

  • Compute Engine
  • Cloud TPU
  • クラウド ストレージ

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

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

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

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

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

    [プロジェクトの選択] ページに移動

  3. 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}
    

    このコマンドを新しい Cloud Shell VM で初めて実行すると、Authorize Cloud Shell ページが表示されます。ページの下部にある [Authorize] をクリックして、gcloud に認証情報を使用した GCP API の呼び出しを許可します。

  4. Cloud TPU プロジェクトのサービス アカウントを作成します。

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. 次のコマンドを使用して Cloud Storage バケットを作成します。

    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 ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。

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

    ctpu up --project=${PROJECT_ID} \
    --zone=europe-west4-a \
    --vm-only \
    --disk-size-gb=300 \
    --machine-type=n1-standard-8 \
    --tf-version=1.15.4 \
    --name=efficientnet-tutorial
    

    コマンドフラグの説明

    project
    GCP プロジェクト ID
    zone
    Cloud TPU を作成するゾーン
    vm-only
    Cloud TPU を作成せずに VM を作成します。デフォルトでは、ctpu up コマンドは VM と Cloud TPU を作成します。
    disk-size-gb
    ctpu up コマンドで作成された VM のハードディスクのサイズ(GB)。
    machine-type
    作成する Compute Engine VM のマシンタイプ
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
    name
    作成する Cloud TPU の名前。

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

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

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

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

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

データを準備する

次の環境変数を設定します。bucket-name を Cloud Storage バケットの名前に置き換えます。

  1. バケット名の環境変数を作成します。bucket-name は、使用するバケット名に置き換えてください。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. その他の環境変数を作成します。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    (vm)$ export TPU_NAME=efficientnet-tutorial
    (vm)$ export PYTHONPATH=$PYTHONPATH:/usr/share/tpu/models
    

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

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

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

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

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

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

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

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

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

    (vm)$ ctpu up --project=${PROJECT_ID} \
     --tpu-only \
     --tf-version=1.15.4 \
     --name=${TPU_NAME}
    
  2. モデル ディレクトリに移動します。

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

    (vm)$ python3 main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --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 のパスを指定します。この例では、fake_imagenet データセットに設定されています。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir を Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。

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

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

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

  • v2-32
  • v3-32

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

Cloud TPU Pod を使用したトレーニング

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

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

    (vm)$ ctpu up --project=${PROJECT_ID} \
      --tpu-only \
      --tf-version=1.15.4 \
      --tpu-size=v2-32 \
      --name=efficientnet-tutorial-pod
    
  3. TPU 名の環境変数を作成します。

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

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-tutorial-pod
    
  5. モデルをトレーニングします。

    (vm)$ python3 main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --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 のパスを指定します。この例では、fake_imagenet データセットに設定されています。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage パスにする必要があります(gs://...)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。

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

モデルの評価

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

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

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

    (vm)$ ctpu up --project=${PROJECT_ID} \
     --tpu-only \
     --tf-version=1.15.4 \
     --name=efficientnet-tutorial-eval
    
  3. TPU 名の環境変数を作成します。

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

    (vm)$ python3 main.py \
       --tpu=${TPU_NAME} \
       --data_dir=${DATA_DIR} \
       --model_dir=${MODEL_DIR} \
       --model_name='efficientnet-b3' \
       --skip_host_call=true \
       --mode=eval
    

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

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

クリーンアップ

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

  1. Cloud TPU を削除します

    $ ctpu delete --project=${PROJECT_ID} \
      --tpu-only \
      --name=efficientnet-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 --project=${PROJECT_ID} \
      --name=efficientnet-tutorial \
      --zone=europe-west4-a
    
  4. TPU の使用に対して不要な料金が発生しないように、インスタンスが割り当てられていないことを確認します。

    $ ctpu status --project=${PROJECT_ID} \
      --name=efficientnet-tutorial \
      --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:             --
    
  5. 次に示すように gsutil を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。

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

次のステップ

このチュートリアルでは、サンプル データセットを使用して EfficientNet モデルをトレーニングしました。このトレーニングの結果は(ほとんどの場合)推論には使用できません。推論にモデルを使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされたモデルでは、データセットを TFRecord 形式にする必要があります。

データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。

ハイパーパラメータ調整

データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要ハイパーパラメータ調整サービスの使用ハイパーパラメータを調整するをご覧ください。

推論

モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニングデプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。