Cloud TPU での RetinaNet のトレーニング

このドキュメントでは、RetinaNet オブジェクト検出モデルの実装について説明します。コードは、GitHub で入手できます。

以下の手順では、すでに Cloud TPU でのモデルの実行の知識があることを前提としています。Cloud TPU でモデルを実行していない場合は、Cloud TPU で ResNet モデルを実行する手順を確認してください。

免責

このチュートリアルでは、サードパーティのデータセットを使用します。Google は、このデータセットの有効性またはその他の側面について、いかなる表明、保証もいたしません。

始める前に

このチュートリアルを開始する前に、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.
    

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

    $ ctpu

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

Compute Engine VM と Cloud TPU を作成する

次のコマンドを実行して、Compute Engine 仮想マシン(VM)と関連するサービスを備えた Cloud TPU を設定します。このリソースとサービスの組み合わせは、Cloud TPU 群と呼ばれます。

$ ctpu up

ctpu up コマンドは、次のタスクを実行します。

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

    • 米国(US)
    • ヨーロッパ(EU)
      • europe-west4-a
    • アジア太平洋(APAC)
      • 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 を実行して復元します。

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

Compute Engine VM を確認する

ctpu up コマンドの実行が終了したら、次の点を確認します。

  1. shell プロンプトが username@project から username@username に変更されていることを確認します。この変更により、現在 Compute Engine VM にログインしていることがわかります。

  2. 次のコマンドを実行して、TensorFlow のインストールを確認します。

    (vm)$ python -c "import tensorflow; print(tensorflow.VERSION)"
    

    警告メッセージが表示され、その後に TensorFlow のバージョン番号を示す行が表示されます。たとえば、1.8.0 となります。

RetinaNet モデルを確認する

準備された Compute Engine VM で実行している場合、RetinaNet モデルファイルは次の場所にあります。

(vm)$ ls /usr/share/tpu/models/official/retinanet/

GitHub から最新バージョンを入手することもできます。

$ git clone https://github.com/tensorflow/tpu/
$ ls tpu/models/official/retinanet

COCO データセットを準備する

YOUR-BUCKET-NAME を Cloud Storage バケットの名前に置き換えて、次の環境変数を設定します。

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME

トレーニングする前に、トレーニング データを準備する必要があります。RetinaNet モデルは、COCO データセットでトレーニングするように構成されています。

tpu/tools/datasets/download_and_preprocess_coco.sh スクリプトは、COCO データセットを、トレーニング アプリケーションで必要な一連の TFRecords に変換します。

これには、ターゲット ディレクトリに少なくとも 100 GB のディスク容量が必要で、完了に約 1 時間かかります。VM にこの容量がない場合は、VM にデータドライブを接続する必要があります。

使用可能なデータ ディレクトリがある場合は、前処理スクリプトを実行できます。

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

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

これらのファイルを Cloud Storage にコピーして、トレーニングのためにアクセスできるようにする必要があります。gsutil を使用してファイルをコピーできます。アノテーション ファイルも保存する必要があります。アノテーション ファイルは、モデルのパフォーマンスを検証するために使用されます。

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

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

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

(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'

モデルを実行する

  1. 100 ステップのトレーニング アプリケーションを実行して、すべてが機能していることを確認したら、チェックポイントを正常に書き出すことができます。

    (vm)$ RESNET_CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603
    (vm)$ MODEL_DIR=${STORAGE_BUCKET}/retinanet-model

    (vm)$ python tpu/models/official/retinanet/retinanet_main.py \ --tpu=$TPU_NAME \ --train_batch_size=64 \ --training_file_pattern=${STORAGE_BUCKET}/coco/train-* \ --resnet_checkpoint=${RESNET_CHECKPOINT} \ --model_dir=${MODEL_DIR} \ --hparams=image_size=640 \ --num_examples_per_epoch=6400 \ --num_epochs=1

    • --tpu は Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    • --resnet_checkpoint は事前トレーニングされたチェックポイントを指定します。RetinaNet には、バックボーン ネットワークとして事前トレーニングされた画像分類モデル(ResNet など)が必要です。この例では、ResNet デモモデルで作成された、事前トレーニングされたチェックポイントを使用しています。必要に応じて独自の ResNet モデルをトレーニングし、ResNet モデル ディレクトリからチェックポイントを指定することもできます。

トレーニング中にモデルを評価する(オプション)

トレーニング中に検証セットでモデルの進捗状況を測定できます。RetinaNet の評価コードは、現在 Cloud TPU VM 上で実行されていないため、CPU または GPU マシンで実行する必要があります。すべての検証画像を実行するには時間がかかるため、検証を実行するためにトレーニングを停止したくない場合があります。この場合、別の VM で検証を並行して実行できます。検証実行者はモデル ディレクトリで新しいチェックポイントをスキャンし、見つかったら新しい評価指標を計算します。

評価スクリプトを実行するには、まず GPU を起動する必要があります。これには、次のセクションで説明する追加の設定が必要です。

GPU 評価 VM

VM を起動します。

$ gcloud compute instances create eval-vm  \
 --machine-type=n1-highcpu-16  \
 --image-project=ubuntu-os-cloud  \
 --image-family=ubuntu-1604-lts  \
 --scopes=cloud-platform \
 --accelerator type=nvidia-tesla-p100 \
 --maintenance-policy TERMINATE \
 --restart-on-failure

1 分後に接続できるはずです。

$ gcloud compute ssh eval-vm

Tensorflow が画像を使用できるように、CUDA(NVIDIA の並列コンピューティング プラットフォーム)を設定する必要があります。次のコマンドは、評価 VM で実行されます。CUDA と Tensorflow が GPU VM にインストールされます。インストールが完了したら、VM を再起動します。

(vm)$ cat > /tmp/setup.sh <(vm)$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb

(vm)$ dpkg -i ./cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
(vm)$ apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
(vm)$ apt-get update
(vm)$ apt-get install -y cuda-9-0
(vm)$ bash -c 'echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list'
(vm)$ apt-get update
(vm)$ apt-get install -y --no-install-recommends libcudnn7=7.0.5.15-1+cuda9.0
(vm)$ apt install -y python-pip python-tk
(vm)$ pip install tensorflow-gpu==1.8
(vm)$ HERE

(vm)$ sudo bash /tmp/setup.sh

評価には CPU VM を使用することもできます。必要な設定は少ないですが、著しく遅くなります。

$ gcloud compute instances create \
 retinanet-eval-vm \
  --machine-type=n1-highcpu-64 \
  --image-project=ml-images \
  --image-family=tf-1-8 \
  --scopes=cloud-platform

これで評価 VM に接続して評価ループを開始できるようになりました。

パッケージをインストールし、RetinaNet モデルをチェックする

いずれの VM タイプでも、以前のように、次のパッケージをインストールする必要があります。

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

次に RetinaNet モデルコードを取得して評価できるようにする必要があります。

(vm)$ git clone https://github.com/tensorflow/tpu

評価を実行する

これで評価スクリプトを実行できるようになりました。最初に、クイック評価を試行して、モデル ディレクトリと検証ファイルを読み取ることができることをテストします。

Cloud Storage バケットを含む変数を設定し、前処理中に作成されたアノテーション ファイルをコピーします。次に、モデルを実行します。

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
(vm)$ gsutil cp ${STORAGE_BUCKET}/coco/instances_val2017.json .

(vm)$ python tpu/models/official/retinanet/retinanet_main.py  \
 --use_tpu=False \
 --validation_file_pattern=${STORAGE_BUCKET}/coco/val-* \
 --val_json_file=./instances_val2017.json \
 --model_dir=${STORAGE_BUCKET}/retinanet-model/ \
 --hparams=image_size=640 \
 --mode=eval \
 --num_epochs=1 \
 --num_examples_per_epoch=100 \
 --eval_steps=10

パラメータ num_epochs=1 および eval_steps=10 を使用して、スクリプトが素早く終了するようにします。完全な評価データセットに対して実行するように、これらの値を増加します。

(vm)$ python tpu/models/official/retinanet/retinanet_main.py  \
 --use_tpu=False \
 --validation_file_pattern=${STORAGE_BUCKET}/coco/val-* \
 --val_json_file=./instances_val2017.json \
 --model_dir=${STORAGE_BUCKET}/retinanet-model/ \
 --hparams=image_size=640 \
 --num_epochs=15 \
 --mode=eval \
 --eval_steps=5000

5,000 の評価ステップを実行するのに約 10 分かかります。終了後、エバリュエータは引き続きトレーニング アプリケーションからの新しいチェックポイントを最長 1 時間待機します。ただし、ユーザーは評価が終わるのを待つ必要はありません。今すぐに完全なトレーニングを開始できます。

トレーニング アプリケーションを再度実行する

元の VM に戻って、前処理された COCO データでモデルを実行する準備ができいました。完全なトレーニングには約 6 時間かかります。

(vm)$ python tpu/models/official/retinanet/retinanet_main.py \
 --tpu=$TPU_NAME \
 --train_batch_size=64 \
 --training_file_pattern=${STORAGE_BUCKET}/coco/train-* \
 --resnet_checkpoint=${RESNET_CHECKPOINT} \
 --model_dir=${STORAGE_BUCKET}/retinanet-model/ \
 --hparams=image_size=640 \
 --num_epochs=15

トレーニングの状況を確認する

Tensorboard を使用して、トレーニングの進行状況を可視化します。

評価 VM を設定すると、新しいチェックポイントが継続的に読み取られ、評価イベントが model_dir ディレクトリに出力されます。Tensorboard でトレーニングの現在の状況と評価を表示できます。

(vm)$ tensorboard --logdir=${MODEL_DIR} &

ctpu up を実行すると、TensorBoard を利用できるように、Cloud Shell 環境のポート転送が自動的に設定されます。

Cloud Shell の [ウェブでプレビュー] ボタンをクリックし、ポート 8080 を開きます。

クリーンアップ

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

    (vm)$ exit
    

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

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

    $ ctpu delete
    

  3. ctpu status を実行すると、インスタンスが割り当てられていないことを確認できますが、削除には 1~2 分かかる場合があります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            GCE VM:     --
            Cloud TPU:  --
    

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

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

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

評価ステップで追加の Compute Engine VM を使用した場合は、これらのインスタンスも削除します。

$ gcloud compute instances delete YOUR-INSTANCE-NAME

次のステップ

  • このチュートリアルの説明は、640x640 ピクセルの画像でのトレーニングを想定しています。より小さな画像でトレーニングするには、image_size hparam を変更してみます。これにより、モデルはより速くなりますが、精度が低くなります。

  • あるいは、独自のデータセットの ResNet モデルを事前にトレーニングし、RetinaNet モデルの基礎として使用することもできます。さらに多くの作業を行うことで、ResNet の代わりに代替バックボーン ネットワークを使用することもできます。最後に、独自のオブジェクト検出モデルを実装する場合、このネットワークは今後の検証のための良い基盤となります。

  • ローカルマシンにインストールする方法など、ctpu についてさらに学習します。

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

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