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

このドキュメントでは、RetinaNet オブジェクト検出モデルの実装について説明します。コードは、GitHub で入手できます。

以下の手順では、Cloud TPU でモデルを実行する方法をすでに理解していることを前提としています。Cloud TPU を初めて使用する場合は、クイックスタートで基本的な概要をご確認ください。

TPU Pod スライスでトレーニングする場合は、TPU Pod でのトレーニングを確認して、Pod スライスに必要なパラメータの変更を確認してください。

目標

  • データセットとモデルの出力を格納する Cloud Storage バケットを作成する
  • COCO データセットを準備する
  • トレーニングと評価のための Compute Engine VM と Cloud TPU ノードを設定する
  • 単一の Cloud TPU または Cloud TPU Pod でトレーニングと評価を実行する

費用

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

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

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

始める前に

このセクションでは、Cloud Storage ストレージと Compute Engine VM の設定について説明します。

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

    Cloud Shell を開く

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

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

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

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

    この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。

  5. ctpu up コマンドを使用して、Compute Engine VM を起動します。

    $ ctpu up  --vm-only --disk-size-gb=300 --machine-type=n1-standard-8 --zone=europe-west4-a
    
  6. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

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

    Compute Engine VM にログインしてない場合は、次のコマンドを実行してログインできます。

        gcloud compute ssh username --zone=europe-west4-a
    

これらの手順を続行する場合は、VM セッション ウィンドウで、(vm)$ で始まる各コマンドを実行します。

ctpu コマンドは Compute Engine 仮想マシン(VM)を起動するときに、次のロケーションにある TensorFlow ブランチから RetinaNet モデルファイルを自動的に取得して配置します。

(vm)$ ls /usr/share/tpu/models/official/detection/

COCO データセットを準備する

  1. download_and_preprocess_coco.sh スクリプトを実行して、COCO データセットを、トレーニング アプリケーションで使用可能な一連の TFRecord(*.tfrecord)に変換します。

    (vm)$ bash /usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
    

    これにより、必要なライブラリがインストールされ、前処理スクリプトが実行されます。ローカルのデータ ディレクトリにいくつかの *.tfrecord ファイルが出力されます。COCO のダウンロードと変換スクリプトが完了するまでには約 1 時間かかります。

  2. データを TFRecord に変換した後、gsutil コマンドを使用して、ローカル ストレージから Cloud Storage バケットに変換後のデータをコピーします。アノテーション ファイルもコピーする必要があります。アノテーション ファイルは、モデルのパフォーマンスの検証に利用できます。

    (vm)$ gsutil -m cp ./data/dir/coco/*.tfrecord ${STORAGE_BUCKET}/coco
    (vm)$ gsutil cp ./data/dir/coco/raw-data/annotations/*.json ${STORAGE_BUCKET}/coco
    

トレーニング環境を設定する

  1. 次のコマンドを実行して Cloud TPU を作成します。

    (vm)$ ctpu up --tpu-only --tpu-size=v3-8 --zone=europe-west4-a
    
    パラメータ 説明
    tpu-size Cloud TPU のタイプを指定します。Cloud TPU の作成に使用しているゾーンで使用できるタイプを指定します。
    zone Cloud TPU を作成するゾーン。このゾーンは、Compute Engine VM で使用したのと同じゾーンである必要があります。例: europe-west4-a

  2. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

    Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag というメッセージが表示されます。SSH 鍵の伝播は完了しているため、このメッセージは無視できます。

  3. 追加のパッケージをインストールする

    RetinaNet トレーニング アプリケーションには、いくつかの追加パッケージが必要です。 この時点で、これらのパッケージをインストールしておきます。

    (vm)$ sudo apt-get install -y python-tk && \
          pip install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
          pip install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI' && \
          pip install --user -U gast==0.2.2
    
  4. VM 接続に対するキープアライブ値を更新する

    このチュートリアルでは、Compute Engine インスタンスに長時間接続する必要があります。インスタンスへの接続が切断されないようにするには、次のコマンドを実行します。

    (vm)$ sudo /sbin/sysctl \
           -w net.ipv4.tcp_keepalive_time=120 \
           net.ipv4.tcp_keepalive_intvl=120 \
           net.ipv4.tcp_keepalive_probes=5
    
  5. パラメータ値を定義する

    次に、いくつかのパラメータ値を定義する必要があります。これらのパラメータを使用してモデルのトレーニングと評価を行います。

    設定する必要のある変数については、次の表を参照してください。

    パラメータ 説明
    STORAGE_BUCKET 始める前にのセクションで作成した Cloud Storage バケットの名前です。
    TPU_NAME Compute Engine VM と Cloud TPU の名前です。Compute Engine VM と Cloud TPU の名前は同じである必要があります。Compute Engine VM がデフォルト値であるユーザー名に設定されているので、Cloud TPU を同じ値に設定します。

  6. これらの変数を設定するには、export コマンドを使用します。

      (vm)$ export STORAGE_BUCKET=gs://your-bucket-name
      (vm)$ export TPU_NAME=username
      

  7. これで、前処理した COCO データに対してモデルを実行する準備が整いました。 まず、次のコマンドを使用して、Python パスに最上位の /models フォルダを追加します。

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    

トレーニングと評価には、TensorFlow 1.13 以降のバージョンが必要です。

単一の Cloud TPU デバイスのトレーニング

以下のトレーニング スクリプトは、Cloud TPU v3-8 で実行されたものです。 トレーニング時間は長くなりますが、Cloud TPU v2-8 でも実行できます。

このスクリプトでは、22,500 ステップのトレーニングが実行されます。トレーニングには、Cloud TPU v2-8 上で実行する場合は約 3 時間、Cloud TPU v3-8 上で実行する場合は約 1 時間半かかります。

  1. 次の環境変数を設定します。

    (vm)$ TPU_NAME=$TPU_NAME  \
      export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-train; \
      export RESNET_CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-10-14/model.ckpt-112602; \
      export TRAIN_FILE_PATTERN=${STORAGE_BUCKET}/coco/train-*; \
      export EVAL_FILE_PATTERN=${STORAGE_BUCKET}/coco/val-*; \
      export VAL_JSON_FILE=${STORAGE_BUCKET}/coco/instances_val2017.json
    
  2. トレーニング スクリプトを実行します。

    (vm)$ python /usr/share/tpu/models/official/detection/main.py \
         --use_tpu=True \
         --tpu=${TPU_NAME:?} \
         --num_cores=8 \
         --model_dir="${MODEL_DIR?}" \
         --mode="train" \
         --eval_after_training=True \
         --params_override="{ type: retinanet, train: { checkpoint: { path: ${RESNET_CHECKPOINT?}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN?} }, eval: { val_json_file: ${VAL_JSON_FILE?}, eval_file_pattern: ${EVAL_FILE_PATTERN?}, eval_samples: 5000 } }"
    
    パラメータ 説明
    tpu Cloud TPU の名前を指定します。環境変数(TPU_NAME)を指定することで設定されます。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。
    RESNET_CHECKPOINT 事前テストされたチェックポイントを指定します。RetinaNet には、バックボーン ネットワークとして事前トレーニングされた画像分類モデル(ResNet など)が必要です。この例では、ResNet デモモデルで作成された、事前トレーニング済みのチェックポイントを使用しています。必要に応じて、独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリ内のチェックポイントを指定することもできます。

単一の Cloud TPU デバイスの評価

次の手順では、COCO 評価データを使用します。評価ステップが完了するまでには約 10 分かかります。

  1. 次の環境変数を設定します。

    (vm)$ TPU_NAME=$TPU_NAME  \
      export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-train; \
      export EVAL_FILE_PATTERN=${STORAGE_BUCKET}/coco/val-*; \
      export VAL_JSON_FILE=${STORAGE_BUCKET}/coco/instances_val2017.json \
      export EVAL_SAMPLES=5000
    
  2. 評価スクリプトを実行します。

    (vm)$ python /usr/share/tpu/models/official/detection/main.py \
          --use_tpu=True \
          --tpu=${TPU_NAME:?} \
          --num_cores=8 \
          --model_dir="${MODEL_DIR?}" \
          --mode="eval" \
          --params_override="{ type: retinanet, eval: { val_json_file: ${VAL_JSON_FILE?}, eval_file_pattern: ${EVAL_FILE_PATTERN?}, eval_samples: ${EVAL_SAMPLES?} } }"
    
    パラメータ 説明
    tpu Cloud TPU の名前を指定します。環境変数(TPU_NAME)を指定することで設定されます。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。

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

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

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

  • v2-32
  • v3-32

このスクリプトでは 2,109 ステップのトレーニングを行います。トレーニングの完了にかかる時間は、v3-32 TPU タイプでは約 30 分、v3-128 TPU タイプでは約 10 分です。

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

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

    (vm)$ ctpu up --tpu-only --tpu-size=v3-32 --zone=europe-west4-a 
  3. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

    Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag というメッセージが表示されます。SSH 鍵の伝播は完了しているため、このメッセージは無視できます。

  4. RetinaNet に必要な追加パッケージをインストールします。

    (vm)$ sudo apt-get install -y python-tk && \
          pip install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
          pip install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI' && \
          pip install --user -U gast==0.2.2
    
  5. VM 接続に対するキープアライブ値を更新する

    このチュートリアルでは、Compute Engine インスタンスに長時間接続する必要があります。 インスタンスへの接続が切断されないようにするには、次のコマンドを実行します。

    (vm)$ sudo /sbin/sysctl \
       -w net.ipv4.tcp_keepalive_time=120 \
       net.ipv4.tcp_keepalive_intvl=120 \
       net.ipv4.tcp_keepalive_probes=5
    
  6. Pod でのトレーニングに必要な変数を定義します。複数の bash 変数を作成し、構成文字列で使用するには、export コマンドを使用します。

    (vm)$ export STORAGE_BUCKET=gs://your-bucket-name
    (vm)$ export TPU_NAME=username
    
  7. Python パスに最上位の /models フォルダを追加します。

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  8. 次の環境変数を設定します。

    (vm)$ TPU_NAME=$TPU_NAME  \
      export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-pod; \
      export RESNET_CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-10-14/model.ckpt-112602; \
      export TRAIN_FILE_PATTERN=${STORAGE_BUCKET}/coco/train-*;
    
  9. v3-32 TPU ノードで Pod トレーニング スクリプトを実行します。

    (vm)$ python /usr/share/tpu/models/official/detection/main.py \
          --use_tpu=True \
          --tpu=${TPU_NAME:?} \
          --num_cores=32 \
          --model_dir="${MODEL_DIR?}" \
          --mode="train" \
          --eval_after_training=False \
          --params_override="{ type: retinanet, train: { train_batch_size: 1024, total_steps: 2109, learning_rate: { warmup_steps: 820, init_learning_rate: 0.64, learning_rate_levels: [0.064, 0.0064], learning_rate_steps: [1641, 1992] }, checkpoint: { path: ${RESNET_CHECKPOINT?}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN?} }, resnet: { batch_norm: { batch_norm_momentum: 0.9 }}, fpn: { batch_norm: { batch_norm_momentum: 0.9 }}, retinanet_head: { batch_norm: { batch_norm_momentum: 0.9 }} }"
    
    パラメータ 説明
    tpu Cloud TPU の名前を指定します。環境変数(TPU_NAME)を指定することで設定されます。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。
    RESNET_CHECKPOINT 事前テストされたチェックポイントを指定します。RetinaNet には、バックボーン ネットワークとして事前トレーニングされた画像分類モデル(ResNet など)が必要です。この例では、ResNet デモモデルで作成された、事前トレーニング済みのチェックポイントを使用しています。必要に応じて、独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリ内のチェックポイントを指定することもできます。

クリーンアップ

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

  1. Compute Engine インスタンスとの接続を切断していない場合は切断します。

    (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
    
  3. 次のコマンドを実行して、Compute Engine VM と Cloud TPU がシャットダウンされたことを確認します。

    $ 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 を実行します。your-bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。

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

次のステップ

さまざまなサイズの画像でトレーニングする

より規模の大きいバックボーン ネットワーク(たとえば ResNet-50 ではなく ResNet-101)を使用して検証できます。入力画像のサイズを大きくして、より強力なバックボーンを使用すると、処理時間は長くなりますが、モデルの精度が高くなります。

別のベースを使用する

また、独自のデータセットで ResNet モデルを事前トレーニングし、それを RetinaNet モデルのベースとして使用することもできます。少々手間をかければ、ResNet を別のバックボーン ネットワークで置き換えることもできます。最終的に独自のオブジェクト検出モデルを実装しようと考えている場合は、このネットワークが今後の実験の基盤として役立ちます。

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

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

ご不明な点がありましたら、Google のサポートページをご覧ください。