Cloud TPU(TF 2.x)での RetinaNet のトレーニング


このドキュメントでは、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 ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

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

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

  4. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

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

  6. このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。

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

このチュートリアルでは、COCO データセットを使用します。トレーニングに使用するデータセットは、Cloud Storage バケットの TFRecord 形式である必要があります。

モデルのトレーニングに使用するゾーンにある Cloud Storage バケットで、すでに COCO データセットを準備している場合、直接単一デバイスのトレーニングに移行することができます。それ以外の場合は、次の手順でデータセットを準備します。

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

    Cloud Shell を開く

  2. Cloud Shell で、gcloud をプロジェクト ID で構成します。

    export PROJECT_ID=project-id
    gcloud config set project ${PROJECT_ID}
    
  3. Cloud Shell で、次のコマンドを使用して Cloud Storage バケットを作成します。

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
    
  4. 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 にインストールされます。
  5. 自動的に Compute Engine インスタンスにログインしない場合は、次の ssh コマンドを実行してログインします。VM にログインすると、シェル プロンプトが username@projectname から username@vm-name に変わります。

      $ gcloud compute ssh instance-name --zone=europe-west4-a
      

  6. 2 つの変数を設定します。1 つは以前に作成したストレージ バケット用であり、もう 1 つはストレージ バケット上のトレーニング データ(DATA_DIR)を保持するディレクトリ用です。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
  7. データの前処理に必要なパッケージをインストールします。

    (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"
    
  8. 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 時間かかります。

  9. データを 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}
    
  10. VM リソースをクリーンアップする

    COCO データセットが TFRecord に変換され、Cloud Storage バケットの DATA_DIR にコピーされたら、Compute Engine インスタンスを削除できます。

    Compute Engine インスタンスから接続を切断します。

    (vm)$ exit
    

    プロンプトが username@projectname に変わります。これは、現在、Cloud Shell 内にいることを示しています。

  11. Compute Engine インスタンスを削除します。

      $ gcloud compute instances delete instance-name
        --zone=europe-west4-a
      

Cloud TPU 単一デバイスのトレーニング

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

    Cloud Shell を開く

  2. プロジェクト ID の変数を作成します。

    export PROJECT_ID=project-id
    
  3. Cloud TPU を作成するプロジェクトを使用するように Google Cloud CLI を構成します。

    gcloud config set project ${PROJECT_ID}
    

    このコマンドを新しい Cloud Shell VM で初めて実行すると、Authorize Cloud Shell ページが表示されます。ページの下部にある [Authorize] をクリックして、gcloud に認証情報を使用した Google Cloud API の呼び出しを許可します。

  4. Cloud TPU プロジェクトのサービス アカウントを作成します。

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. 次のコマンドを使用して Cloud Storage バケットを作成します。

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
    

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

Cloud TPU を設定して起動する

  1. 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
    

    コマンドフラグの説明

    zone
    Cloud TPU を作成するゾーン
    accelerator-type
    作成する Cloud TPU のタイプ
    machine-type
    作成する Compute Engine VM のマシンタイプ
    disk-size
    Compute Engine VM のルート ボリューム サイズ(GB)。
    tf-version
    Tensorflow gcloud のバージョンが VM にインストールされます。

    gcloud コマンドの詳細については、gcloud リファレンスをご覧ください。

  2. 自動的に 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)$ で始まる各コマンドを実行します。

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

    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'
    
  4. 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
    
  5. Cloud TPU 名の変数を設定します。

    TPU VM

    (vm)$ export TPU_NAME=local
    

    TPU ノード

    (vm)$ export TPU_NAME=retinanet-tutorial
    
  6. データ ディレクトリとモデル ディレクトリの環境変数を追加します。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-train
    
  7. PYTHONPATH 環境変数を設定します。

    TPU VM

    (vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
    

    TPU ノード

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  8. TPU を作成するときに、--version パラメータを -pjrt で終わるバージョンに設定した場合は、次の環境変数を設定して PJRT ランタイムを有効にします。

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  9. モデルが保存されているディレクトリに移動します。

    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 時間半かかります。

  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
    
  2. トレーニング スクリプトを実行します。

    (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_strategytpu に設定する必要があります。
    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 分を要します。

  1. 次の環境変数を設定します。

    (vm)$ export EVAL_SAMPLES=5000
    
  2. 評価スクリプトを実行します。

    (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
    trainevaltrain_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 リソースを削除するには、次の手順を使用します。

  1. Compute Engine インスタンスから接続を切断します。

    (vm)$ exit
    

    プロンプトが username@projectname に変わります。これは、現在、Cloud Shell 内にいることを示しています。

  2. 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 のトレーニング

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

    Cloud Shell を開く

  2. プロジェクト ID の変数を作成します。

    export PROJECT_ID=project-id
    
  3. Cloud TPU を作成するプロジェクトを使用するように Google Cloud CLI を構成します。

    gcloud config set project ${PROJECT_ID}
    

    このコマンドを新しい Cloud Shell VM で初めて実行すると、Authorize Cloud Shell ページが表示されます。ページの下部にある [Authorize] をクリックして、gcloud に認証情報を使用した Google Cloud API の呼び出しを許可します。

  4. 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
    

  5. 次のコマンドを使用して 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 リソースと同じリージョンに存在する必要があります。

  6. 以前に COCO データセットを準備してストレージ バケットに移動した場合は、これを再び Pod トレーニングに使用できます。COCO データセットをまだ準備していない場合は、今すぐ準備し、ここに戻ってトレーニングを設定してください。

  7. 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 

    コマンドフラグの説明

    zone
    Cloud TPU を作成するゾーン
    name
    TPU 名。指定しない場合、デフォルトでユーザー名が使用されます。
    accelerator-type
    作成する Cloud TPU のタイプ
    machine-type
    作成する Compute Engine VM のマシンタイプ
    tf-version
    Tensorflow gcloud のバージョンが VM にインストールされます。
  8. 自動的に 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
    
  9. Cloud TPU 名の変数を設定します。

    (vm)$ export TPU_NAME=retinanet-tutorial
    
  10. 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 バケットを使用してトレーニング中にチェックポイントを保存します。

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

    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' 
  12. 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
    
  13. 必要な環境変数を次のように設定します。

    (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
    
  14. PYTHONPATH 環境変数を設定します。

    TPU VM

    (vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
    (vm)$ export TPU_LOAD_LIBRARY=0
    

    TPU ノード

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  15. モデルが保存されているディレクトリに移動します。

    TPU VM

    (vm)$ cd /usr/share/tpu/models/official/legacy/detection

    TPU ノード

    (vm)$ cd /usr/share/models/official/legacy/detection
  16. モデルのトレーニング

    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
    trainevaltrain_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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

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

    (vm)$ exit
    

    プロンプトが username@projectname に変わります。これは、現在、Cloud Shell 内にいることを示しています。

  2. 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
    
  3. gcloud compute tpus execution-groups list を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。以下のようなレスポンスは、インスタンスが正常に削除されたことを示します。

    $ gcloud compute tpus execution-groups list --zone=europe-west4-a
    
    Listed 0 items.
    
  4. 次に示すように、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 の代わりに代替のバックボーン ネットワークに切り替えることもできます。最後に、独自のオブジェクト検出モデルの実装をご希望の場合には、このネットワークを今後のテストに利用することをおすすめします。