Cloud TPU(TF 2.x)での Mask RCNN のトレーニング

概要

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

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

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

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

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

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

目標

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

費用

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

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}
    

    このコマンドを新しい 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 VM を起動します。

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

    コマンドフラグの説明

    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 のマシンタイプ
    name
    作成する Cloud TPU の名前。
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
  7. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

  8. 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)$ pip3 install --user -r /usr/share/models/official/requirements.txt

データを準備する

  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 --project=${PROJECT_ID} \
      --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=2.3.1

    コマンドフラグの説明

    project
    GCP プロジェクト ID
    tpu-only
    Cloud TPU のみを作成します。デフォルトでは、ctpu up コマンドは VM と Cloud TPU を作成します。
    tpu-size
    作成する Cloud TPU のタイプ
    zone
    Cloud TPU を作成するゾーン
    name
    作成する Cloud TPU の名前。
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
  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
    

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

次のスクリプトは、わずか 10 ステップのサンプルトレーニングを行い、v3-8 TPU で完了するまでに約 6 分かかります。収束するようにトレーニングするには、v3-8 TPU では約 22,500 ステップ、約 6 時間かかります。

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

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07
    (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
    
  2. 次のコマンドを実行して Mask-RCNN モデルをトレーニングします。

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=train \
       --model=mask_rcnn \
       --params_override="{train: { total_steps: 10, 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 事前テストされたチェックポイントを指定します。Mask-RCNN には、バックボーン ネットワークとして事前トレーニングされた画像分類モデル(ResNet など)が必要です。この例では、ResNet デモモデルで作成された、事前トレーニング済みのチェックポイントを使用しています。必要に応じて、独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリ内のチェックポイントを指定することもできます。
  3. 評価を実行します。

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --model=mask_rcnn \
       --params_override="{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 バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。

この時点で、このチュートリアルを終了して、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 インスタンスをすでに削除している場合は、リソースのセットアップの手順に沿って新しいインスタンスを作成します。

以下のサンプルトレーニングは、わずか 20 ステップで行われ、v3-32 TPU ノードで完了するまでに約 10 分かかります。収束するようにトレーニングするには、v3-32 TPU Pod では約 11,250 ステップ、約 2 時間かかります。

  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 --project=${PROJECT_ID} \
      --tpu-only \
      --tpu-size=v3-32  \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=2.3.1 
  3. TPU_NAME と MODEL_DIR 環境変数を更新します。

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

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=train \
       --model=mask_rcnn \
       --params_override="{train: { batch_size: 128, iterations_per_loop: 500, total_steps: 20, learning_rate: {'learning_rate_levels': [0.008, 0.0008], 'learning_rate_steps': [10000, 13000] }, 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}} }"
    
    パラメータ 説明
    tpu Cloud TPU の名前を指定します。環境変数(TPU_NAME)を指定することで設定されます。
    model_dir モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。
    RESNET_CHECKPOINT 事前テストされたチェックポイントを指定します。Mask-RCNN には、バックボーン ネットワークとして事前トレーニングされた画像分類モデル(ResNet など)が必要です。この例では、ResNet デモモデルで作成された、事前トレーニング済みのチェックポイントを使用しています。必要に応じて、独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリ内のチェックポイントを指定することもできます。

モデルの評価

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

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

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

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

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

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=mask-rcnn-tutorial \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --model=mask_rcnn \
       --params_override="{eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    

クリーンアップ

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

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

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

    (vm)$ exit
    

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

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

    $ ctpu delete --project=${PROJECT_ID} \
      --name=mask-rcnn-tutorial \
      --zone=europe-west4-a
    
  3. 次のコマンドを実行して、Compute Engine VM と Cloud TPU がシャットダウンされたことを確認します。

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

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

次のステップ

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

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

ハイパーパラメータ調整

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

推論

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