このドキュメントでは、RetinaNet オブジェクト検出モデルの実装について説明します。コードは、GitHub で入手できます。
以下の手順では、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
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
このセクションでは、Cloud Storage バケットと Compute Engine VM の設定について説明します。
Cloud Shell ウィンドウを開きます。
プロジェクト ID の変数を作成します。
export PROJECT_ID=project-id
Cloud TPU を作成するプロジェクトを使用するように Google Cloud CLI を構成します。
gcloud config set project ${PROJECT_ID}
このコマンドを新しい Cloud Shell VM で初めて実行すると、
Authorize Cloud Shell
ページが表示されます。ページの下部にある [Authorize
] をクリックして、gcloud
に認証情報を使用した GCP API の呼び出しを許可します。Cloud TPU プロジェクトのサービス アカウントを作成します。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
次のコマンドを使用して Cloud Storage バケットを作成します。
gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
gcloud compute tpus execution-groups
ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、仮想マシン(VM)および TPU ノードと同じリージョンにする必要があります。VM と TPU ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。
gcloud
コマンドを使用して Compute Engine VM と Cloud TPU を起動します。$ gcloud compute tpus execution-groups create \ --vm-only \ --name=retinanet-tutorial \ --zone=europe-west4-a \ --disk-size=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.5
コマンドフラグの説明
vm-only
- VM のみを作成します。デフォルトでは、
gcloud compute tpus execution-groups
コマンドは VM と Cloud TPU を作成します。 name
- 作成する Cloud TPU の名前。
zone
- Cloud TPU を作成するゾーン。
disk-size
gcloud compute tpus execution-groups
コマンドで作成された VM のハードディスクのサイズ(GB)。machine-type
- 作成する Compute Engine VM のマシンタイプ。
tf-version
- Tensorflow
gcloud compute tpus execution-groups
のバージョンが VM にインストールされます。
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。
gcloud compute tpus execution-groups
コマンドの実行が終了したら、shell プロンプトがusername@projectname
からusername@vm-name
に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。gcloud compute ssh retinanet-tutorial --zone=europe-west4-a
これらの手順を続行する場合は、Compute Engine インスタンスで
(vm)$
で始まる各コマンドを実行します。gcloud
コマンドは Compute Engine 仮想マシン(VM)を起動するときに、/usr/share/tpu/models/official/detection/
ディレクトリにあるTensorFlow ブランチから RetinaNet モデルファイルを自動的に取得して配置します。これらの環境変数を設定するには、
export
コマンドを使用します。(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export TPU_NAME=retinanet-tutorial (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
追加のパッケージをインストールする
RetinaNet トレーニング アプリケーションには、いくつかの追加パッケージが必要です。 この時点で、これらのパッケージをインストールしておきます。
(vm)$ sudo apt-get install -y python3-tk
(vm)$ pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow
(vm)$ pip3 install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
(vm)$ pip3 install --user -U gast==0.2.2
COCO データセットを準備する
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
ファイルが出力されます。データを 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 を作成します。
(vm)$ gcloud compute tpus execution-groups create \ --tpu-only \ --name=retinanet-tutorial \ --zone=europe-west4-a \ --tf-version=1.15.5
コマンドフラグの説明
tpu-only
- VM を作成せずに Cloud TPU を作成します。デフォルトでは、
gcloud compute tpus execution-groups
コマンドは VM と Cloud TPU を作成します。 name
- 作成する Cloud TPU の名前。
zone
- Cloud TPU を作成するゾーン。
tf-version
- Tensorflow
gcloud compute tpus execution-groups
のバージョンが VM にインストールされます。
指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。
Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag
というメッセージが表示されます。SSH 鍵の伝播は完了しているため、このメッセージは無視できます。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
これで、前処理した COCO データに対してモデルを実行する準備が整いました。 まず、次のコマンドを使用して、Python パスに最上位の
/models
フォルダを追加します。(vm)$ export PYTHONPATH=${PYTHONPATH}:/usr/share/tpu/models
トレーニングと評価には、TensorFlow 1.13 以降のバージョンが必要です。
単一の Cloud TPU デバイスのトレーニング
次の環境変数を設定します。
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-train (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
トレーニング スクリプトを実行します。
(vm)$ python3 /usr/share/tpu/models/official/detection/main.py \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=8 \ --model_dir=${MODEL_DIR} \ --mode="train" \ --eval_after_training=True \ --params_override="{ type: retinanet, train: { 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 } }"
コマンドフラグの説明
use_tpu
- 単一の Cloud TPU でモデルをトレーニングします。
tpu
- Cloud TPU の名前。
TPU_NAME
環境変数を使用して設定します。 num_cores
- トレーニング時に使用する Cloud TPU コアの数。
model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
mode
train
、eval
、train_and_eval
のいずれか。
単一の Cloud TPU デバイスの評価
次の手順では、COCO 評価データを使用します。評価ステップが完了するまでには約 10 分かかります。
次の環境変数を設定します。
(vm)$ export EVAL_SAMPLES=5000
評価スクリプトを実行します。
(vm)$ python3 /usr/share/tpu/models/official/detection/main.py \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=8 \ --model_dir=${MODEL_DIR} \ --mode="eval" \ --params_override="{ type: retinanet, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: ${EVAL_SAMPLES} } }"
コマンドフラグの説明
use_tpu
- Cloud TPU でトレーニングするには、
true
に設定します。 tpu
- トレーニングまたは評価を実行するための Cloud TPU の名前。
num_cores
- トレーニング時に使用する Cloud TPU コアの数。
model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
mode
train
、eval
、train_and_eval
のいずれか。params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/vision/detection/main.py
をご覧ください。
評価スクリプトにより、次のような出力が表示されます。
Eval result: { 'AP': 0.3371653, 'ARl': 0.6749888, 'ARmax100': 0.4848119, 'APl': 0.48918217, 'ARmax10': 0.45885247, 'APs': 0.14764188, 'ARm': 0.545395, 'ARs': 0.24094534, 'AP75': 0.3606217, 'AP50': 0.51819533, 'APm': 0.38223606, 'ARmax1': 0.29476196 }
この時点で、このチュートリアルを終了して、GCP リソースをクリーンアップすることも、Cloud TPU Pod でのモデルの実行をさらに詳しく調べることもできます。
Cloud TPU Pod を使用してモデルをスケーリングする
Cloud TPU Pod を使用してモデルをスケーリングすると、より迅速に結果を得ることができます。完全サポートの RetinaNet モデルは、次の Pod スライスを使用できます。
- v2-32
- v3-32
単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ gcloud compute tpus execution-groups delete retinanet-tutorial \ --zone=europe-west4-a \ --tpu-only
使用する Pod スライスを指定するための
accelerator-type
パラメータを使用して、gcloud compute tpus execution-groups
コマンドを実行します。たとえば、次のコマンドは v3-32 の Pod スライスを使用します。(vm)$ gcloud compute tpus execution-groups create --name=retinanet-tutorial \ --accelerator-type=v3-32 \ --zone=europe-west4-a \ --tf-version=1.15.5 \ --tpu-only
次の環境変数を設定します。
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-pod (vm)$ export TPU_NAME=retinanet-tutorial
v3-32 TPU ノードで Pod トレーニング スクリプトを実行します。
(vm)$ python3 /usr/share/tpu/models/official/detection/main.py \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=32 \ --model_dir=${MODEL_DIR} \ --mode="train" \ --eval_after_training=False \ --params_override="{ type: retinanet, train: { train_batch_size: 1024, total_steps: 2109, learning_rate: { warmup_steps: 820, init_learning_rate: 0.64, learning_rate_levels: [0.064, 0.0064], learning_rate_steps: [1641, 1992] }, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: { batch_norm: { batch_norm_momentum: 0.9 }}, fpn: { batch_norm: { batch_norm_momentum: 0.9 }}, retinanet_head: { batch_norm: { batch_norm_momentum: 0.9 }} }"
コマンドフラグの説明
use_tpu
- Cloud TPU でトレーニングするには、
true
に設定します。 tpu
- Cloud TPU の名前。Compute Engine VM と Cloud TPU の設定時に名前を指定しなかった場合は、デフォルトでユーザー名が指定されます。
num_cores
- トレーニング時に使用する Cloud TPU コアの数。
model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
mode
train
、eval
、train_and_eval
、predict
のいずれか。eval_after_training
- トレーニング後にモデルを評価するには、
true
に設定します。 params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/vision/detection/main.py
をご覧ください。
トレーニング スクリプトの出力には、次のようなテキストが含まれます。
INFO:tensorflow:Loss for final step: 0.96952075. I1125 21:47:10.729412 140023184553728 estimator.py:371] Loss for final step: 0.96952075. INFO:tensorflow:training_loop marked as finished I1125 21:47:10.730288 140023184553728 error_handling.py:101] training_loop marked as finished
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で次のコマンドを使用して、Compute Engine VM と Cloud TPU を削除します。
$ gcloud compute tpus execution-groups delete retinanet-tutorial \ --zone=europe-west4-a
gcloud compute tpus execution-groups list
を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。以下のようなレスポンスは、インスタンスが正常に削除されたことを示します。$ gcloud compute tpus execution-groups list \ --zone=europe-west4-a
次のような空の TPU のリストが表示されます。
NAME STATUS
次に示すように、
gsutil
を使用して Cloud Storage バケットを削除します。bucket-name を Cloud Storage バケットの名前に置き換えます。$ gsutil rm -r gs://bucket-name
次のステップ
TensorFlow Cloud TPU のチュートリアルでは通常、サンプル データセットを使用してモデルをトレーニングします。このトレーニングの結果は推論に使用できません。モデルを推論に使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされた TensorFlow モデルは通常、データセットを TFRecord 形式にする必要があります。
データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。
ハイパーパラメータ調整
データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要、ハイパーパラメータ調整サービスの使用、ハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニング、デプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。
さまざまなサイズの画像でトレーニングする
より規模の大きいニューラル ネットワーク(たとえば ResNet-50 ではなく ResNet-101)を使用して調査できます。入力画像のサイズを大きくして、より強力なニューラル ネットワークを使用すると、処理時間は長くなりますが、モデルの精度が高くなります。
別のベースを使用する
また、独自のデータセットで ResNet モデルを事前トレーニングし、それを RetinaNet モデルのベースとして使用することもできます。いくつかの作業を行うことで、ResNet の代わりに別のニューラル ネットワークに切り替えることもできます。最後に、独自のオブジェクト検出モデルの実装をご希望の場合には、このネットワークを今後のテストに利用することをおすすめします。