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

このチュートリアルでは、Cloud TPU で Mask RCNN モデルをトレーニングする方法について説明します。

概要

このチュートリアルでは、Cloud TPU を使用して Mask RCNN モデルを実際に実行してみます。Mask RCNN モデルはディープ ニューラル ネットワークです。この目的は、ビジョンに関するより困難な課題の 1 つ、インスタンスのセグメンテーションに対処することです。インスタンス セグメンテーションは、単一の画像から複数のオブジェクトを検出して区別するタスクです。

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

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

始める前に

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

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

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

  2. Google Cloud Platform プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. TPU デバイスとポッドのいずれかの使用に十分な割り当て量があることを確認します。

リソースを設定する

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

Cloud Storage バケットを作成する

モデルのトレーニングに使用するデータとトレーニング結果を格納するには、Cloud Storage バケットが必要です。このチュートリアルで使用する ctpu up ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。

作成するバケットは、使用する仮想マシン(VM)および Cloud TPU デバイスまたは Cloud TPU スライス(複数の TPU デバイス)と同じリージョン内に配置する必要があります。

  1. GCP Console の Cloud Storage ページに移動します。

    Cloud Storage ページに移動

  2. 次のオプションを指定して新しいバケットを作成します。

    • 任意の一意な名前
    • デフォルトのストレージ クラス: Regional
    • ロケーション: 単一の Cloud TPU デバイスを使用する場合は、表示されるデフォルト ロケーションを受け入れます。Cloud TPU Pod スライスを使用する場合、Cloud TPU Pod を利用できるリージョンを選択する必要があります。

ctpu ツールを使用する

このセクションでは、Cloud TPU プロビジョニング ツールctpu)を使用して Cloud TPU プロジェクトのリソースを作成、管理する方法を説明します。リソースは、同じ名前が付けられた仮想マシン(VM)と Cloud TPU リソースで構成されます。これらのリソースは、作成したバケットと同じリージョン / ゾーンに存在する必要があります。

VM リソースと TPU リソースを設定するには、gcloud コマンドまたは Cloud Console を使用することもできます。詳細については、VM と TPU のリソース管理をご覧ください。

ctpu up を実行してリソースを作成する

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

    Cloud Shell を開く

  2. gcloud config set project <Your-Project> を実行して、Cloud TPU の作成に使用するプロジェクトを設定します。

  3. Cloud TPU デバイスまたは Pod スライスのいずれかを示すフラグを指定して ctpu up を実行します。フラグのオプションと説明については、CTPU リファレンスをご覧ください。

  4. Cloud TPU デバイスか、Pod スライスのいずれかを設定します。

TPU デバイス

Cloud TPU デバイスを設定します。

$ ctpu up --machine-type n1-standard-8 --tpu-size v3-8

構成に関する次のメッセージが表示されます。

ctpu will use the following configuration:

Name: [your TPU's name]
Zone: [your project's zone]
GCP Project: [your project's name]
TensorFlow Version: 1.14
VM:
  Machine Type: [your machine type]
  Disk Size: [your disk size]
  Preemptible: [true or false]
Cloud TPU:
  Size: [your TPU size]
  Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

y キーを押して、Cloud TPU リソースを作成します。

TPU Pod

作業しているゾーン内の VM 上に、Cloud TPU スライスを設定します。

$ ctpu up --zone=us-central1-a --tpu-size=v2-128 --machine-type n1-standard-8

構成に関する次のメッセージが表示されます。

ctpu will use the following configuration:

Name: [your TPU's name]
Zone: [your project's zone]
GCP Project: [your project's name]
TensorFlow Version: 1.14
VM:
  Machine Type: [your machine type]
  Disk Size: [your disk size]
  Preemptible: [true or false]
Cloud TPU:
  Size: [your TPU size]
  Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

y キーを押して、Cloud TPU リソースを作成します。

ctpu up コマンドにより、仮想マシン(VM)と Cloud TPU サービスが作成されます。

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

Compute Engine VM を確認する

ctpu up コマンドの実行が終了したら、shell プロンプトが username@tpuname になっていることを確認します。これは、Compute Engine VM にログインしていることを意味します。

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

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

(vm)$ sudo apt-get install -y python-tk && \
pip install Cython matplotlib opencv-python-headless pyyaml Pillow && \
pip install 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'

VM 接続に対するキープアライブ値を更新する

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

(vm)$ sudo /sbin/sysctl \
       -w net.ipv4.tcp_keepalive_time=60 \
       net.ipv4.tcp_keepalive_intvl=60 \
       net.ipv4.tcp_keepalive_probes=5

パラメータ値を定義する

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

設定する必要がある変数は次のとおりです。

  • STORAGE_BUCKET: 始める前にのセクションで作成した Cloud Storage バケットの名前です。
  • ACCELERATOR_TYPE: 使用するアクセラレータ バージョンとコア数です。たとえば、v2-128(128 コア)とします。サポートされている TPU のサイズについては、サポートされている TPU バージョンをご覧ください。
  • GCS_MODEL_DIR: モデルファイルが含まれるディレクトリです。このチュートリアルでは、Cloud Storage バケット内のフォルダを使用します。このフォルダを事前に作成する必要はありません。フォルダが存在しない場合は、スクリプトによってフォルダが自動作成されます。
  • CHECKPOINT: この変数は、事前トレーニングされたチェックポイントを指定します。Mask RCNN モデルには、バックボーン ネットワークとして使用するために事前トレーニングされた画像分類モデル(Resnet など)が必要です。このチュートリアルでは、ResNet デモモデルを使用して作成した事前トレーニング済みチェックポイントを使用します。独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリ内のチェックポイントを指定することもできます。
  • PATH_GCS_MASKRCNN: モデル トレーニングのアーティファクトを保存する Cloud Storage バケットのアドレスです。GCS_MODEL_DIR 変数と同様に、このチュートリアルでは Cloud Storage バケット内のフォルダを使用します。

以上の変数を定義するには、export コマンドを使用して複数の bash 変数を作成し、それらの bash 変数を構成文字列で使用します。

TPU デバイス

(vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]; \
export ACCELERATOR_TYPE=[YOUR_ACCELERATOR_TYPE]
    
(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
    

TPU Pod

(vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]; \
export ACCELERATOR_TYPE=[YOUR_ACCELERATOR_TYPE]
    
(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
    

データの準備

Mask RCNN モデルのトレーニングには COCO を使用します。COCO は、オブジェクト検出、セグメンテーション、およびキャプション生成のための大規模なデータセットです。このステップでは、このデータセットを、トレーニング アプリケーションで使用可能な TFRecord(*.tfrecord)のセットに変換します。データセットを変換するには、/usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh スクリプトを使用します。

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

データを 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

アノテーション ファイルもコピーする必要があることに注意してください。アノテーション ファイルは、モデルのパフォーマンスの検証に利用できます。

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

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

TPU デバイス

TPU デバイスを使用して、トレーニングと評価を同時に行うことができます。

(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/cloud/config/${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"

TPU Pod

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

  1. トレーニング スクリプトを起動します。

    (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=128 \
    --mode=train \
    --config_file="/usr/share/tpu/models/official/mask_rcnn/cloud/config/${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"
    
  2. トレーニングが完了したら、TPU Pod を終了します。

    (vm)$ exit
  3. 新しい TPU デバイス mask-rcnn-eval を起動します。

    $ ctpu up --tpu-size=v3-8 --name=mask-rcnn-eval --zone=us-central1-a
  4. 環境変数を作成します。

    (vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]
    $ 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
  5. 評価の実行に必要なパッケージをインストールします。

    (vm)$ sudo apt-get install -y python-tk && \
    pip install Cython matplotlib opencv-python-headless pyyaml && \
    (vm)$ pip install 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
    
  6. 評価を開始します。

    (vm)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
    --use_tpu=True \
    --tpu=mask-rcnn-eval \
    --iterations_per_loop=500 \
    --mode=eval \
    --model_dir=${GCS_MODEL_DIR} \
    --config_file="/usr/share/tpu/models/official/mask_rcnn/cloud/config/v3-8.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"
    

クリーンアップ

このトピックで使用したリソースについて GCP アカウントに課金されないようにする手順は次のとおりです。

  1. Compute Engine VM との接続を解除します。

    (vm)$ exit
    

    プロンプトが user@projectname と表示され、Cloud Shell 内にいることが示されます。

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

    $ ctpu delete [optional: --zone]
    
  3. TPU の使用に対する不要な料金が発生しないように、ctpu status を実行して、インスタンスの割り当てがないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 次に示すように gsutil を実行します。YOUR-BUCKET-NAME の部分は、このチュートリアルで作成した Cloud Storage バケットの名前に置き換えてください。

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    

次のステップ

Tensorboard を実行して、プログラムのパフォーマンスを可視化および分析する方法を学習します。詳細については、Tensorboard の設定をご覧ください。

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

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