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

概要

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

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

Mask RCNN モデルは、画像内の個々のオブジェクトそれぞれのインスタンスに対し、境界ボックスとセグメンテーション マスクを生成します。このモデルは、フィーチャー ピラミッド ネットワーク(FPN)ResNet50ニューラル ネットワークに基づいています。

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

目標

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

費用

このチュートリアルでは、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 の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。

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

リソースを設定する

このセクションでは、このチュートリアルで使用する 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 バケットを作成します。

    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 VM を起動します。

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

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

    gcloud compute ssh mask-rcnn-tutorial --zone=europe-west4-a
    

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

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

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

(vm)$ sudo apt-get install -y python3-tk && \
  pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
  pip3 install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI' && \
  pip3 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

データを準備する

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

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. データ ディレクトリの環境変数を追加します。

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    
  3. モデル ディレクトリの環境変数を追加します。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn
    
  4. download_and_preprocess_coco.sh スクリプトを実行して、COCO データセットを、トレーニング アプリケーションで想定される一連の TFRecord(*.tfrecord)に変換します。

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

    これにより、必要なライブラリがインストールされ、前処理スクリプトが実行されます。ローカルのデータ ディレクトリにいくつかの *.tfrecord ファイルが出力されます。

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

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

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

Cloud TPU を設定して起動する

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

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=1.15.3
    
    パラメータ 説明
    tpu-size Cloud TPU のサイズを指定します。 このチュートリアルでは、単一のデバイスのトレーニングと評価に v3-8 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. Cloud TPU の名前の環境変数を追加します。

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    

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

  1. 必要となる環境変数を追加します。

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-10-14/model.ckpt-112602
    (vm)$ export TRAIN_FILE_PATTERN=${DATA_DIR}/train-*
    (vm)$ export EVAL_FILE_PATTERN=${DATA_DIR}/val-*
    (vm)$ export VAL_JSON_FILE=${DATA_DIR}/instances_val2017.json
    (vm)$ export ACCELERATOR_TYPE=v3-8
    
  2. /usr/share ディレクトリに移動します。

    (vm)$ cd /usr/share
    
  3. 次のコマンドを実行して、トレーニングと評価の両方を行います。

    (vm)$ python3 tpu/models/official/mask_rcnn/mask_rcnn_main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --model_dir=${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=${RESNET_CHECKPOINT}, training_file_pattern=${TRAIN_FILE_PATTERN}, validation_file_pattern=${EVAL_FILE_PATTERN}, val_json_file=${VAL_JSON_FILE}"
      

この時点で、このチュートリアルを終了して、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 を使用してトレーニングする

Compute Engine インスタンスをすでに削除している場合は、リソースのセットアップの手順に沿って新しいインスタンスを作成します。

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

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

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-32 \
      --zone=europe-west4-a \
      --name=mask-rcnn-pods \
      --tf-version=1.15.3
    
  3. TPU_NAME、MODEL_DIR、ACCELERATOR_TYPE 環境変数を更新します。

    (vm)$ export TPU_NAME=mask-rcnn-pods
    (vm)$ export ACCELERATOR_TYPE=v3-32
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pods
    
  4. トレーニング スクリプトを起動します。

    (vm)$ python3 tpu/models/official/mask_rcnn/mask_rcnn_main.py \
      --use_tpu=True \
      --tpu=${TPU_NAME} \
      --iterations_per_loop=500 \
      --model_dir=${MODEL_DIR} \
      --num_cores=32 \
      --mode="train" \
      --config_file="/usr/share/tpu/models/official/mask_rcnn/configs/cloud/${ACCELERATOR_TYPE}.yaml" \
      --params_override="checkpoint=${RESNET_CHECKPOINT}, training_file_pattern=${TRAIN_FILE_PATTERN}, validation_file_pattern=${EVAL_FILE_PATTERN}, val_json_file=${VAL_JSON_FILE}"
      

モデルの評価

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

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

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

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --name=mask-rcnn-eval \
      --tf-version=1.15.3
    
  3. TPU_NAME 環境変数を更新します。

    (vm)$ export TPU_NAME=mask-rcnn-eval
    
  4. 評価を開始します。

    (vm)$ python3 tpu/models/official/mask_rcnn/mask_rcnn_main.py \
      --use_tpu=True \
      --tpu=${TPU_NAME} \
      --iterations_per_loop=500 \
      --mode=eval \
      --model_dir=${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
    

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

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

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

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

次のステップ