Cloud TPU での Mask RCNN のトレーニング

概要

このチュートリアルでは、COCO データセットで Cloud TPU を使用して Mask RCNN モデルを実行する方法を示します。

Mask RCNN は、コンピュータ ビジョンの難しい課題の 1 つであるオブジェクト検出と画像セグメンテーションに対応するように設計されたディープ ニューラル ネットワークです。

Mask RCNN モデルは、画像内の個々のオブジェクトそれぞれのインスタンスに対し、境界ボックスとセグメンテーション マスクを生成します。このモデルは、Feature Pyramid Network(FPN)および ResNet50 バックボーンに基づいています。

このチュートリアルでは tf.contrib.tpu.TPUEstimator を使用してモデルをトレーニングします。TPUEstimator API は上位の TensorFlow API となり、Cloud TPU で機械学習モデルを作成して実行する場合に推奨される方法です。この API を使用すると、低レベルの実装の大部分が隠されることで、モデル開発プロセスが簡素化され、TPU と他のプラットフォーム(GPU や CPU など)の切り替えが簡単になります。

始める前に

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

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

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

目標

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

料金

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

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

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

始める前に

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

  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 バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。

    Compute Engine VM、Cloud TPU ノード、Cloud Storage バケットはすべて同じリージョンに配置する必要があります。

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

    $ ctpu up --vm-only --machine-type=n1-standard-8 --zone=europe-west4-a
    

    ctpu up を実行したら、提案した構成を示すメッセージが表示されて、構成を確認するよう求められます。

    OK to create your Cloud TPU resources with the above configuration? [Yn]:
  6. y キーを押して、Compute Engine VM を作成します。

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

    Compute Engine インスタンスに接続していない場合は、次のコマンドを実行して接続できます。

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

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

データを準備する

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

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

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

  2. データを Cloud Storage バケットにコピーする

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

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

Cloud TPU を設定して起動する

トレーニングは 22,500 ステップで行われ、v2-8 TPU ノードでは約 5 時間、v3-8 TPU ノードでは約 3 時間半かかります。

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

    (vm)$ ctpu up --tpu-only --tpu-size=v3-8 --zone=europe-west4-a
    
    パラメータ 説明
    tpu-size Cloud TPU のサイズを指定します。このチュートリアルでは、単一のデバイスのトレーニングと評価に v3-8 TPU サイズを使用します。
    zone Cloud TPU を作成するゾーン。このゾーンは、Compute Engine VM で使用したのと同じゾーンである必要があります。例: europe-west4-a

    ctpu up を実行して Cloud TPU を起動すると、Compute Engine VM を含む提案した構成を示すメッセージが表示されます。構成を確認するよう求められます。

    OK to create your Cloud TPU resources with the above configuration? [Yn]:
  2. y キーを押して、Cloud TPU を作成します。Cloud TPU の作成には数分かかります。

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

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

    (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

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

パラメータ値を定義する

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

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

パラメータ 説明
STORAGE_BUCKET 始める前にのセクションで作成した Cloud Storage バケットの名前です。
TPU_NAME Compute Engine VM と Cloud TPU の名前です。Compute Engine VM と Cloud TPU の名前は同じである必要があります。Compute Engine VM がデフォルト値のユーザー名に設定されているので、Cloud TPU を同じ値に設定します。
ACCELERATOR_TYPE 使用するアクセラレータ バージョンとコア数です。たとえば、v2-128(128 コア)とします。このチュートリアルでは、単一の TPU デバイスでのトレーニングに v3-8 TPU タイプを使用します。
GCS_MODEL_DIR モデルファイルが含まれるディレクトリです。このチュートリアルでは、Cloud Storage バケット内のフォルダを使用します。このフォルダを事前に作成する必要はありません。フォルダが存在しない場合は、スクリプトによってフォルダが自動作成されます。
CHECKPOINT この変数は、事前トレーニングされたチェックポイントを指定します。Mask RCNN モデルには、バックボーン ネットワークとして使用するために事前トレーニングされた画像分類モデル(ReNset など)が必要です。このチュートリアルでは、ResNet デモモデルを使用して作成した事前トレーニング済みチェックポイントを使用します。独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリ内のチェックポイントを指定することもできます。
PATH_GCS_MASKRCNN モデル トレーニングのアーティファクトを保存する Cloud Storage バケットのアドレスです。このチュートリアルでは、GCS_MODEL_DIR 変数と同様に、Cloud Storage バケット内のフォルダを使用します。
これらの変数を設定するには、export コマンドを使用します。

(vm)$ export STORAGE_BUCKET=gs://your-bucket-name
(vm)$ export TPU_NAME=username
(vm)$ export ACCELERATOR_TYPE=v3-8
(vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-model \
      export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603 \
      export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco

トレーニングと評価を行う

これで、前処理した COCO データに対してモデルを実行する準備が整いました。モデルを実行するには、mask_rcnn_main.py スクリプトを使用します。

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

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. 次のコマンドを実行して、トレーニングと評価の両方を行います。

    (vm)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
        --use_tpu=True \
        --tpu=${TPU_NAME:?} \
        --model_dir=${GCS_MODEL_DIR:?} \
        --num_cores=8 \
        --mode="train_and_eval" \
        --config_file="/usr/share/tpu/models/official/mask_rcnn/configs/cloud/${ACCELERATOR_TYPE}.yaml" \
        --params_override="checkpoint=${CHECKPOINT},training_file_pattern=${PATH_GCS_MASKRCNN:?}/train-*,validation_file_pattern=${PATH_GCS_MASKRCNN:?}/val-*,val_json_file=${PATH_GCS_MASKRCNN:?}/instances_val2017.json"
    

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

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

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

  • v2-32
  • v3-32

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

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

トレーニングは 11,250 ステップで行われ、v3-32 TPU ノードでは約 2 時間かかります。

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

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

    (vm)$ ctpu up --tpu-only --tpu-size=v3-32 --zone=europe-west4-a
    
  3. Mask RCNN に必要な追加パッケージをインストールします。

    (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. トレーニングに必要な変数をポッドに定義します。複数の bash 変数を作成し、構成文字列で使用するには、export コマンドを使用します。

    (vm)$ export STORAGE_BUCKET=gs://your-bucket-name
    (vm)$ export TPU_NAME=username
    (vm)$ export ACCELERATOR_TYPE=v3-32
    
    (vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pod \
          export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603 \
          export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
    
  6. Python パスに最上位の /models フォルダを追加します。

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  7. トレーニング スクリプトを起動します。

    (vm)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
          --use_tpu=True \
          --tpu=${TPU_NAME:?} \
          --iterations_per_loop=500 \
          --model_dir=${GCS_MODEL_DIR} \
          --num_cores=32 \
          --mode=train \
          --config_file="/usr/share/tpu/models/official/mask_rcnn/configs/cloud/${ACCELERATOR_TYPE}.yaml" \
          --params_override="checkpoint=${CHECKPOINT},training_file_pattern=${PATH_GCS_MASKRCNN:?}/train-*,validation_file_pattern=${PATH_GCS_MASKRCNN:?}/val-*,val_json_file=${PATH_GCS_MASKRCNN:?}/instances_val2017.json"
    

モデルの評価

このステップでは、単一の Cloud TPU ノードを使用して、COCO データセットに対して上記でトレーニングしたモデルを評価します。評価には約 10 分かかります。

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

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a
  2. 評価を実行するために、新しい TPU デバイスを起動します。

    (vm)$ ctpu up --tpu-only --tpu-size=v3-8 --zone=europe-west4-a
    
  3. 評価の実行に必要なパッケージをインストールします。

    (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)$ export STORAGE_BUCKET=gs://your-bucket-name
      (vm)$ export TPU_NAME=username
      (vm)$ export ACCELERATOR_TYPE=v3-8
      
      (vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pod \
            export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603 \
            export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
       
  1. Python パスに最上位の /models フォルダを追加します。

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. 評価を開始します。

    (vm)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
          --use_tpu=True \
          --tpu=${TPU_NAME:?} \
          --iterations_per_loop=500 \
          --mode=eval \
          --model_dir=${GCS_MODEL_DIR} \
          --config_file="/usr/share/tpu/models/official/mask_rcnn/configs/cloud/${ACCELERATOR_TYPE}.yaml" \
          --params_override="checkpoint=${CHECKPOINT},training_file_pattern=${PATH_GCS_MASKRCNN}/train-*,val_json_file=${PATH_GCS_MASKRCNN}/instances_val2017.json,validation_file_pattern=${PATH_GCS_MASKRCNN}/val-*,init_learning_rate=0.28,learning_rate_levels=[0.028, 0.0028, 0.00028],learning_rate_steps=[6000, 8000, 10000],momentum=0.95,num_batch_norm_group=1,num_steps_per_eval=500,global_gradient_clip_ratio=0.02,total_steps=11250,train_batch_size=512,warmup_steps=1864"
    

クリーンアップ

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

Compute Engine VM インスタンスと Cloud TPU リソースをクリーンアップします。

  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
    

次のステップ

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

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

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