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. GCP プロジェクトを選択または作成します。

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

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

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

  4. このチュートリアルでは、Google Cloud Platform の課金対象となるコンポーネントを使用します。Cloud TPU の料金ページを確認して費用を見積もり、終了したら手順に従ってリソースのクリーンアップを行います。

Cloud Storage バケットを作成する

機械学習モデルのトレーニングに使用するデータおよびトレーニングの結果を保存する Cloud Storage バケットが必要です。

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

    Cloud Storage ページに移動

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

    • 任意の一意な名前
    • デフォルトのストレージ クラス: Regional
    • ロケーション: us-central1

Cloud Shell を開いて ctpu ツールを使用する

このガイドでは Cloud TPU Provisioning Utilityctpu)を使用します。これは、Cloud TPU を設定および管理するためのシンプルなツールです。このガイドでは、Cloud Shell から ctpu を実行します。より高度な設定オプションについては、カスタム設定をご覧ください。

ctpu ツールは Cloud Shell にプリインストールされています。ctpu 構成を確認するには、次の手順に従います。

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

    Cloud Shell を開く

  2. Cloud Shell に次のように入力して、ctpu 構成を確認します。

    $ ctpu print-config
    

    次のようなメッセージが表示されます。

    2018/04/29 05:23:03 WARNING: Setting zone to "us-central1-b"
    ctpu configuration:
            name: [your TPU's name]
            project: [your-project-name]
            zone: us-central1-b
    If you would like to change the configuration for a single command invocation, please use the command line flags.
    

    出力メッセージでは、name が TPU リソースの名前(デフォルトはユーザー名)で、zone が Compute Engine のデフォルトの地域ゾーンになります。ctpu up を実行して Compute Engine VM および Cloud TPU を作成する際に、これらを変更することができます。

  3. ctpu コマンドを見てみます。

    $ ctpu

    サブコマンドとフラグのリストとそれぞれの簡単な説明を含む使用ガイドが表示されます。

Compute Engine VM と Cloud TPU を作成する

次のコマンドを実行して、Compute Engine 仮想マシン(VM)と関連するサービスを備えた Cloud TPU を設定します。このリソースとサービスの組み合わせは、Cloud TPU 群と呼ばれます。--tpu-size パラメータはオプションであり、Cloud TPU 構成のサイズを単一の Cloud TPU デバイスとして、または Cloud TPU Pod(アルファ版)のスライスとして指定するために使用します。

$ ctpu up [optional: --name --zone --tpu-size] --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.12
   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 コマンドは、次のタスクを実行します。

  • Compute Engine および Cloud TPU サービスを有効にします。
  • TensorFlow の最新の安定したバージョンがプリインストールされた Compute Engine VM を作成します。デフォルト ゾーンは us-central1-b です。参考までに、Cloud TPU は次のゾーンで利用できます。

    米国

    Cloud TPU v2 およびプリエンプティブ v2 us-central1-b
    us-central1-c
    us-central1-fTFRC プログラムのみ)
    Cloud TPU v3(ベータ版)およびプリエンプティブ v3(ベータ版) us-central1-b
    us-central1-f
    TFRC プログラムのみ)
    Cloud TPU v2 Pod(アルファ版) us-central1-a

    ヨーロッパ

    Cloud TPU v2 およびプリエンプティブ v2 europe-west4-a
    Cloud TPU v3(ベータ版)およびプリエンプティブ v3(ベータ版) europe-west4-a
    Cloud TPU v2 Pod(アルファ版) europe-west4-a

    アジア太平洋

    Cloud TPU v2 およびプリエンプティブ v2 asia-east1-c
  • 対応するバージョンの TensorFlow を使用して Cloud TPU を作成し、Cloud TPU の名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。

  • 特定の IAM の役割を Cloud TPU サービス アカウントに付与して、Cloud TPU が GCP プロジェクトから必要なリソースにアクセスできるようにします。

  • その他数多くのチェックを行います。

  • 新しい Compute Engine VM にユーザーをログインします。

ctpu up は必要に応じて何度でも実行できます。たとえば、Compute Engine VM への SSH 接続が失われた場合は、ctpu up を実行して接続を復元します。また、デフォルト値を変更したい場合は --name--zone を指定して実行します。詳細については、ctpu のドキュメントをご覧ください。

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

Compute Engine VM を確認する

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

Cloud Storage のデフォルトのアクセス権限を使用もしくは変更する

ctpu up コマンドで、Cloud TPU サービス アカウントのデフォルトのアクセス権限を設定します。権限を細かく設定する必要がある場合は、アクセスレベル権限を確認して更新してください。

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

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

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

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

Mask RCNN モデルファイルを確認する

最新の Mask RCNN ファイルを取得するには、次のコマンドを実行します。

(vm)$ git clone https://github.com/tensorflow/tpu/
(vm)$ ls tpu/models/experimental/mask_rcnn

環境変数を構成する

次に、いくつかの環境変数を設定する必要があります。これらの変数には、このチュートリアルの後半で、コマンドとスクリプトの実行を容易にする役割があります。

設定の必要な変数は次のとおりです。

  • STORAGE_BUCKET: 「始める前に」で作成した Cloud Storage の名前です。
  • GCS_MODEL_DIR: モデルファイルが含まれるディレクトリです。このチュートリアルでは、Cloud Storage バケット内のフォルダを使用します。このフォルダを事前に作成する必要はありません。フォルダが存在しない場合は、スクリプトによってフォルダが自動作成されます。
  • RESNET_CHECKPOINT: この変数は、事前トレーニング済みのチェックポイントを指定します。Mask RCNN モデルには、バックボーン ネットワークとして使用するために事前トレーニングされた画像分類モデル(Resnet など)が必要です。このチュートリアルでは、ResNet デモモデルを使用して作成した事前トレーニング済みチェックポイントを使用します。独自の ResNet モデルをトレーニングし、この ResNet モデル ディレクトリからチェックポイントを指定することもできます。
  • RESNET_DEPTH: データが変換されるレイヤの数を表します。このチュートリアルでは、深さを 50 に設定します。
  • PATH_GCS_MASKRCNN: モデル トレーニングのアーティファクトを保存する Cloud Storage バケットのアドレスです。GCS_MODEL_DIR 変数と同様に、このチュートリアルでは Cloud Storage バケット内のフォルダを使用します。
(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME \
      export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-model \
      export RESNET_CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-10-14/model.ckpt-112602 \
      export RESNET_DEPTH=50 \
      export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco

データの準備

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

(vm)$ cd tpu/tools/datasets
(vm)$ 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
(vm)$ gsutil cp ./data/dir/coco/raw-data/annotations/*.json ${STORAGE_BUCKET}/coco

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

トレーニングおよび評価アプリケーションを実行する

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

(vm)$ cd ../.. # Return to the main tpu directory if you're not there already
(vm)$ cd models/experimental/mask_rcnn
(vm)$ python mask_rcnn_main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME:?} \
    --model_dir=${GCS_MODEL_DIR:?} \
    --resnet_checkpoint=${RESNET_CHECKPOINT} \
    --hparams="resnet_depth=${RESNET_DEPTH},use_bfloat16=true" \
    --num_cores=8 \
    --train_batch_size=64 \
    --training_file_pattern="${PATH_GCS_MASKRCNN:?}/train-*" \
    --validation_file_pattern="${PATH_GCS_MASKRCNN:?}/val-*" \
    --val_json_file="${PATH_GCS_MASKRCNN:?}/instances_val2017.json" \
    --mode="train_and_eval" \
    --eval_batch_size=8 \
    --num_epochs=12

クリーンアップ

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

    (vm)$ exit
    

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

  2. Cloud Shell で次のコマンドを実行して、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete
    
  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. このチュートリアルで作成した Cloud Storage バケットが不要になったら、gsutil コマンドを使用して削除します。YOUR-BUCKET-NAME は、Cloud Storage バケットの名前に置き換えます。

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

    無料の保存容量の制限やその他の料金に関する情報については、Cloud Storage の料金ガイドをご覧ください。

次のステップ

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

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

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