このドキュメントでは、RetinaNet オブジェクト検出モデルの実装について説明します。コードは、GitHub で入手できます。
以下の手順では、Cloud TPU でモデルを実行する方法をすでに理解していることを前提としています。Cloud TPU を初めて使用する場合は、クイックスタートで基本的な概要をご確認ください。
TPU Pod スライスでトレーニングする場合は、TPU Pod でのトレーニングを確認して、Pod スライスに必要なパラメータの変更を確認してください。
目標
- COCO データセットを準備する
- データセットとモデルの出力を格納する Cloud Storage バケットを作成する
- トレーニングと評価のための TPU リソースを設定する
- 単一の Cloud TPU または Cloud TPU Pod でトレーニングと評価を実行する
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Compute Engine
- Cloud TPU
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
このチュートリアルを開始する前に、Google Cloud プロジェクトが正しく設定されていることを確認します。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。
COCO データセットを準備する
このチュートリアルでは、COCO データセットを使用します。トレーニングに使用するデータセットは、Cloud Storage バケットの TFRecord 形式である必要があります。
モデルのトレーニングに使用するゾーンにある Cloud Storage バケットで、すでに COCO データセットを準備している場合、直接単一デバイスのトレーニングに移行することができます。それ以外の場合は、次の手順でデータセットを準備します。
Cloud Shell ウィンドウを開きます。
Cloud Shell で、
gcloud
をプロジェクト ID で構成します。export PROJECT_ID=project-id gcloud config set project ${PROJECT_ID}
Cloud Shell で、次のコマンドを使用して Cloud Storage バケットを作成します。
gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
Compute Engine VM インスタンスを起動します。
この VM インスタンスは、COCO データセットのダウンロードと前処理にのみ使用されます。instance-name に選択した名前を入力します。
$ gcloud compute tpus execution-groups create \ --vm-only \ --name=instance-name \ --zone=europe-west4-a \ --disk-size=300 \ --machine-type=n1-standard-16 \ --tf-version=2.12.0
コマンドフラグの説明
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 にインストールされます。
自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-name
に変わります。$ gcloud compute ssh instance-name --zone=europe-west4-a
2 つの変数を設定します。1 つは以前に作成したストレージ バケット用であり、もう 1 つはストレージ バケット上のトレーニング データ(DATA_DIR)を保持するディレクトリ用です。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
データの前処理に必要なパッケージをインストールします。
(vm)$ sudo apt-get install -y python3-tk && \ pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \ pip3 install --user "git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI"
download_and_preprocess_coco.sh
スクリプトを実行して、COCO データセットを、トレーニング アプリケーションで想定される一連の TFRecord(*.tfrecord
)に変換します。(vm)$ git clone https://github.com/tensorflow/tpu.git (vm)$ sudo bash tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
これにより、必要なライブラリがインストールされ、前処理スクリプトが実行されます。ローカルのデータ ディレクトリにいくつかの
*.tfrecord
ファイルが出力されます。COCO のダウンロードと変換スクリプトが完了するまでには約 1 時間かかります。データを 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}
VM リソースをクリーンアップする
COCO データセットが TFRecord に変換され、Cloud Storage バケットの DATA_DIR にコピーされたら、Compute Engine インスタンスを削除できます。
Compute Engine インスタンスから接続を切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Compute Engine インスタンスを削除します。
$ gcloud compute instances delete instance-name --zone=europe-west4-a
Cloud TPU 単一デバイスのトレーニング
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
に認証情報を使用した Google Cloud 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 gs://bucket-name
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する TPU を設定する
gcloud
コマンドは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。
Cloud TPU を設定して起動する
gcloud
コマンドを使用して Compute Engine VM と Cloud TPU を起動します。使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。2 つの VM アーキテクチャの詳細については、システム アーキテクチャをご覧ください。TPU VM
$ gcloud compute tpus tpu-vm create retinanet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.16.1-pjrt
コマンドフラグの説明
zone
- Cloud TPU を作成するゾーン。
accelerator-type
- アクセラレータ タイプでは、作成する Cloud TPU のバージョンとサイズを指定します。TPU のバージョンごとにサポートされているアクセラレータ タイプの詳細については、TPU のバージョンをご覧ください。
version
- Cloud TPU ソフトウェアのバージョン。
TPU ノード
$ gcloud compute tpus execution-groups create \ --zone=europe-west4-a \ --name=retinanet-tutorial \ --accelerator-type=v3-8 \ --machine-type=n1-standard-8 \ --disk-size=300 \ --tf-version=2.12.0
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-name
に変わります。TPU VM
gcloud compute tpus tpu-vm ssh retinanet-tutorial --zone=europe-west4-a
TPU ノード
gcloud compute ssh retinanet-tutorial --zone=europe-west4-a
これらの手順を続行する場合は、VM セッション ウィンドウで、
(vm)$
で始まる各コマンドを実行します。追加のパッケージをインストールする
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'
TensorFlow の要件をインストールします。
TPU VM
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU ノード
(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
Cloud TPU 名の変数を設定します。
TPU VM
(vm)$ export TPU_NAME=local
TPU ノード
(vm)$ export TPU_NAME=retinanet-tutorial
データ ディレクトリとモデル ディレクトリの環境変数を追加します。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-train
PYTHONPATH
環境変数を設定します。TPU VM
(vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
TPU ノード
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
TPU を作成するときに、
--version
パラメータを-pjrt
で終わるバージョンに設定した場合は、次の環境変数を設定して PJRT ランタイムを有効にします。(vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
モデルが保存されているディレクトリに移動します。
TPU VM
(vm)$ cd /usr/share/tpu/models/official/legacy/detection
TPU ノード
(vm)$ cd /usr/share/models/official/legacy/detection
単一の Cloud TPU デバイスのトレーニング
以下のトレーニング スクリプトは、Cloud TPU v3-8 で実行されたものです。 トレーニング時間は長くなりますが、Cloud TPU v2-8 でも実行できます。
以下のサンプルスクリプトは、わずか 10 ステップのトレーニングで、v3-8 TPU ノードでは 5 分未満で実行されます。収束するようにトレーニングするには、Cloud TPU v3-8 TPU では約 22,500 ステップ、約 1 時間半かかります。
次の環境変数を設定します。
(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 main.py \ --strategy_type=tpu \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --mode="train" \ --params_override="{ type: retinanet, 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 } }"
コマンドフラグの説明
strategy_type
- TPU で RetinaNet モデルをトレーニングするには、
distribution_strategy
をtpu
に設定する必要があります。 tpu
- Cloud TPU の名前。
TPU_NAME
環境変数を使用して設定します。 model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
mode
- モデルをトレーニングするには
train
、モデルを評価するにはeval
に設定します。 params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/legacy/detection/main.py
をご覧ください。
モデルは、v3-8 TPU で約 5 分、10 ステップのトレーニングを行います。 トレーニングが完了すると、次のような出力が表示されます。
Train Step: 10/10 / loss = { 'total_loss': 2.4581615924835205, 'cls_loss': 1.4098565578460693, 'box_loss': 0.012001709081232548, 'model_loss': 2.0099422931671143, 'l2_regularization_loss': 0.44821977615356445, 'learning_rate': 0.008165999 } / training metric = { 'total_loss': 2.4581615924835205, 'cls_loss': 1.4098565578460693, 'box_loss': 0.012001709081232548, 'model_loss': 2.0099422931671143, 'l2_regularization_loss': 0.44821977615356445, 'learning_rate': 0.008165999 }
単一の Cloud TPU デバイスの評価
次の手順では、COCO 評価データを使用します。v3-8 TPU で評価ステップの実行が完了するまでに約 10 分を要します。
次の環境変数を設定します。
(vm)$ export EVAL_SAMPLES=5000
評価スクリプトを実行します。
(vm)$ python3 main.py \ --strategy_type=tpu \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --checkpoint_path=${MODEL_DIR} \ --mode=eval_once \ --params_override="{ type: retinanet, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: ${EVAL_SAMPLES} } }"
コマンドフラグの説明
strategy_type
- 使用する配信戦略。
tpu
またはmulti_worker_gpu
のいずれかを指定します。 tpu
- Cloud TPU の名前。
TPU_NAME
環境変数を使用して設定します。 model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に生成されたチェックポイントを読み込むことができます。
mode
train
、eval
、train_and_eval
のいずれか。params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/legacy/detection/main.py
をご覧ください。
評価の最後に、コンソールに次のようなメッセージが表示されます。
Accumulating evaluation results... DONE (t=7.66s). Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.000 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
これで、単一デバイスのトレーニングと評価が完了しました。現在の単一デバイスの TPU リソースを削除するには、次の手順を使用します。
Compute Engine インスタンスから接続を切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。TPU リソースを削除します。
TPU VM
$ gcloud compute tpus tpu-vm delete retinanet-tutorial \ --zone=europe-west4-a
コマンドフラグの説明
zone
- Cloud TPU が存在するゾーン。
TPU ノード
$ gcloud compute tpus execution-groups delete retinanet-tutorial \ --tpu-only \ --zone=europe-west4-a
コマンドフラグの説明
tpu-only
- Cloud TPU のみを削除します。VM は引き続き使用できます。
zone
- 削除する TPU を含むゾーン。
この時点で、このチュートリアルを終了してクリーンアップすることも、Cloud TPU Pod でのモデルの実行を続行して調べることもできます。
Cloud TPU Pod でモデルのスケーリングする
Cloud TPU Pod でモデルをトレーニングするには、トレーニング スクリプトに変更を加える必要がある場合があります。詳細については、TPU Pod でのトレーニングをご覧ください。
TPU Pod での Retinanet のトレーニング
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
に認証情報を使用した Google Cloud API の呼び出しを許可します。Cloud TPU プロジェクトのサービス アカウントを作成します。
サービス アカウントにより、Cloud TPU サービスが他の Google Cloud サービスにアクセスできるようになります。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
次のコマンドを使用して Cloud Storage バケットを作成するか、以前にプロジェクト用に作成したバケットを使用します。
次のコマンドで、europe-west4 をトレーニングの実行に使用するリージョンの名前に置き換えます。bucket-name をバケットに割り当てる名前に置き換えます。
gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
gcloud
コマンドは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、TPU リソースと同じリージョンに存在する必要があります。
以前に COCO データセットを準備してストレージ バケットに移動した場合は、これを再び Pod トレーニングに使用できます。COCO データセットをまだ準備していない場合は、今すぐ準備し、ここに戻ってトレーニングを設定してください。
Cloud TPU Pod を設定して起動する
このチュートリアルでは、v3-32 Pod を指定します。他の Pod オプションについては、TPU のバージョンをご覧ください。
TPU VM
gcloud compute tpus tpu-vm
コマンドを使用して TPU VM Pod を起動します。このチュートリアルでは、v3-32 Pod を指定します。$ gcloud compute tpus tpu-vm create retinanet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.16.1-pod-pjrt
コマンドフラグの説明
zone
- Cloud TPU を作成するゾーン。
accelerator-type
- アクセラレータ タイプでは、作成する Cloud TPU のバージョンとサイズを指定します。TPU のバージョンごとにサポートされているアクセラレータ タイプの詳細については、TPU のバージョンをご覧ください。
version
- Cloud TPU ソフトウェアのバージョン。
TPU ノード
使用する Pod スライスを指定するための
accelerator-type
パラメータを使用して、gcloud compute tpus execution-groups
コマンドを実行します。たとえば、次のコマンドは v3-32 Pod スライスを使用します。$ gcloud compute tpus execution-groups create \ --zone=europe-west4-a \ --name=retinanet-tutorial \ --accelerator-type=v3-32 \ --machine-type=n1-standard-8 \ --disk-size=300 \ --tf-version=2.12.0
自動的に Compute Engine インスタンスにログインしない場合は、次の
ssh
コマンドを実行してログインします。VM にログインすると、シェル プロンプトがusername@projectname
からusername@vm-name
に変わります。TPU VM
gcloud compute tpus tpu-vm ssh retinanet-tutorial --zone=europe-west4-a
TPU ノード
gcloud compute ssh retinanet-tutorial --zone=europe-west4-a
Cloud TPU 名の変数を設定します。
(vm)$ export TPU_NAME=retinanet-tutorial
Cloud Storage バケットの変数を設定する
次の環境変数を設定します。bucket-name を Cloud Storage バケットの名前に置き換えます。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-train (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
追加のパッケージをインストールする
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'
TensorFlow の要件をインストールします。
TPU VM
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU ノード
(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
必要な環境変数を次のように設定します。
(vm)$ export RESNET_PRETRAIN_DIR=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
PYTHONPATH
環境変数を設定します。TPU VM
(vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}" (vm)$ export TPU_LOAD_LIBRARY=0
TPU ノード
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
モデルが保存されているディレクトリに移動します。
TPU VM
(vm)$ cd /usr/share/tpu/models/official/legacy/detection
TPU ノード
(vm)$ cd /usr/share/models/official/legacy/detection
モデルのトレーニング
TPU VM
(vm)$ python3 main.py \ --strategy_type=tpu \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --mode=train \ --model=retinanet \ --params_override="{architecture: {use_bfloat16: true}, eval: {batch_size: 40, eval_file_pattern: ${EVAL_FILE_PATTERN}, val_json_file: ${VAL_JSON_FILE}}, postprocess: {pre_nms_num_boxes: 1000}, predict: {batch_size: 40}, train: {batch_size: 256, checkpoint: {path: ${RESNET_PRETRAIN_DIR}, prefix: resnet50/}, iterations_per_loop: 5000, total_steps: 5625, train_file_pattern: ${TRAIN_FILE_PATTERN}, } }"
コマンドフラグの説明
tpu
- TPU の名前。
model_dir
- は、モデルのトレーニングの際にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合は、
model_dir
を Cloud Storage パスにする必要があります(gs://...
)。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。 params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/tpu/models/official/legacy/detection/main.py
をご覧ください。
この手順では、COCO データセットで 5,625 トレーニング ステップでモデルをトレーニングします。このトレーニングは、v3-32 Cloud TPU 上で約 20 分かかります。トレーニングが完了すると、次のようなメッセージが表示されます。
TPU ノード
次のサンプル トレーニング スクリプトは、Cloud TPU v3-32 Podで実行されたものです。トレーニングはわずか 10 ステップで、5 分未満で実行されます。収束するようにトレーニングするには、v3-32 TPU Pod では 2,109 ステップ、約 50 分を要します。
(vm)$ python3 main.py \ --strategy_type=tpu \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --mode="train" \ --params_override="{ type: retinanet, train: { total_steps: 10, batch_size: 256, 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 } }"
コマンドフラグの説明
strategy_type
- 使用する配信戦略。
tpu
またはmulti_worker_gpu
を指定します。 tpu
- Cloud TPU の名前を指定します。
TPU_NAME
環境変数を使用して設定します。 model_dir
- トレーニング中にチェックポイントとサマリーが保存される Cloud Storage バケット。既存のフォルダを使用して、同じサイズの TPU と TensorFlow バージョンで以前に作成されたチェックポイントを読み込むことができます。
mode
train
、eval
、train_and_eval
のいずれか。params_override
- デフォルトのスクリプト パラメータをオーバーライドする JSON 文字列。スクリプト パラメータの詳細については、
/usr/share/models/official/legacy/detection/main.py
をご覧ください。
トレーニングが完了すると、次のようなメッセージが表示されます。
TPU VM
Train Step: 5625/5625 / loss = {'total_loss': 0.730501651763916, 'cls_loss': 0.3229793608188629, 'box_loss': 0.003082591574639082, 'model_loss': 0.4771089553833008, 'l2_regularization_loss': 0.2533927261829376, 'learning_rate': 0.08} / training metric = {'total_loss': 0.730501651763916, 'cls_loss': 0.3229793608188629, 'box_loss': 0.003082591574639082, 'model_loss': 0.4771089553833008, 'l2_regularization_loss': 0.2533927261829376, 'learning_rate': 0.08}
TPU ノード
Train Step: 10/10 / loss = {'total_loss': 3.5455241203308105, 'cls_loss': 1.458828330039978, 'box_loss': 0.01220895815640688, 'model_loss': 2.0692763328552246, 'l2_regularization_loss': 1.4762479066848755, 'learning_rate': 0.008165999} / training metric = {'total_loss': 3.5455241203308105, 'cls_loss': 1.458828330039978, 'box_loss': 0.01220895815640688, 'model_loss': 2.0692763328552246, 'l2_regularization_loss': 1.4762479066848755, 'learning_rate': 0.008165999}
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine VM との接続を解除します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud TPU と Compute Engine リソースを削除します。リソースの削除に使用するコマンドは、TPU VM または TPU ノードのどちらを使用するかによって異なります。詳細については、システム アーキテクチャをご覧ください。
TPU VM
$ gcloud compute tpus tpu-vm delete retinanet-tutorial \ --zone=europe-west4-a
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
Listed 0 items.
次に示すように、
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 をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要とハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。Cloud TPU 推論コンバータ ツールを使用して、Cloud TPU v5e での推論用の TensorFlow モデルを準備して最適化できます。Cloud TPU v5e での推論の詳細については、Cloud TPU v5e 推論の概要をご覧ください。
さまざまなサイズの画像でトレーニングする
より規模の大きいバックボーン ネットワーク(たとえば ResNet-50 ではなく ResNet-101)を使用して検証できます。入力画像のサイズを大きくして、より強力なバックボーンを使用すると、処理時間は長くなりますが、モデルの精度が高くなります。
別のベースを使用する
また、独自のデータセットで ResNet モデルを事前トレーニングし、それを RetinaNet モデルのベースとして使用することもできます。いくつかの作業を行うことで、ResNet の代わりに代替のバックボーン ネットワークに切り替えることもできます。最後に、独自のオブジェクト検出モデルの実装をご希望の場合には、このネットワークを今後のテストに利用することをおすすめします。