Cloud TPU で Deeplab-v3 を実行する

このチュートリアルでは、Cloud TPU で Deeplab-v3 モデルをトレーニングする方法について説明します。

以下の手順では、Cloud TPU でモデルを実行する方法をすでに理解していることを前提としています。Cloud TPU を初めて使用する場合は、クイックスタートで基本的な概要をご確認ください。

TPU Pod スライスでトレーニングする場合は、TPU Pod でのトレーニングを確認して、Pod スライスに必要なパラメータの変更を確認してください。

このモデルは、画像セマンティック セグメンテーション モデルです。画像セマンティック セグメンテーション モデルは、1 つの画像内の複数オブジェクトを識別し、ローカライズすることに重点を置いています。このタイプのモデルは、自律走行、地理空間画像処理、医用画像処理などの機械学習アプリケーションでよく使用されます。

このチュートリアルでは、PASCAL VOC 2012 データセットに対してトレーニング モデルを実行します。このデータセットの詳細については、The PASCAL Visual Object Classes Homepage をご覧ください。

目標

  • データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
  • 必要なパッケージをインストールします。
  • PASCAL VOC 2012 データセットをダウンロードして変換します。
  • Deeplab モデルをトレーニングします。
  • Deeplab モデルを評価します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • Cloud TPU
  • クラウド ストレージ

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

このセクションでは、Cloud Storage バケットと Compute Engine VM の設定について説明します。

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

    Cloud Shell を開く

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

    export PROJECT_ID=project-id
    
  3. Cloud TPU を作成するプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

    gcloud config set project ${PROJECT_ID}
    

    このコマンドを新しい Cloud Shell VM で初めて実行すると、Authorize Cloud Shell ページが表示されます。ページの下部にある [Authorize] をクリックして、gcloud に認証情報を使用した GCP 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 us-central1 -b on gs://bucket-name
    

    この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。

    Cloud TPU でストレージ バケットの読み取りと書き込みを行うには、プロジェクトのサービス アカウントに読み取り / 書き込み権限または管理者権限が必要です。これらの権限を表示、設定する方法については、ストレージ バケットのセクションをご覧ください。

  6. ctpu up コマンドを使用して、Compute Engine VM を起動します。

    $ ctpu up --project=${PROJECT_ID} \
     --zone=us-central1-b \
     --machine-type=n1-standard-8 \
     --vm-only \
     --tf-version=1.15.4 \
     --name=deeplab-tutorial
    

    コマンドフラグの説明

    project
    GCP プロジェクト ID
    zone
    Cloud TPU を作成するゾーン
    machine-type
    作成する Compute Engine VM のマシンタイプ
    vm-only
    VM のみを作成します。デフォルトでは、ctpu up コマンドは VM と Cloud TPU を作成します。
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
    name
    作成する Cloud TPU の名前。
  7. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

  8. ctpu up コマンドの実行が終了したら、shell プロンプトが username@projectname から username@vm-name に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。

    gcloud compute ssh deeplab-tutorial --zone=us-central1-b
    

これらの手順を続行する場合は、VM セッション ウィンドウで、(vm)$ で始まる各コマンドを実行します。

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

このモデルでは、次のパッケージを Compute Engine インスタンスにインストールする必要があります。

  • jupyter
  • matplotlib
  • PrettyTable
  • tf_slim
  (vm)$ pip3 install --user jupyter
  (vm)$ pip3 install --user matplotlib
  (vm)$ pip3 install --user PrettyTable
  (vm)$ pip3 install --user tf_slim
  1. ストレージ バケットと TPU 名の環境変数を作成します。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=deeplab-tutorial
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/deeplab_data
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/deeplab_model
    (vm)$ export PYTHONPATH=${PYTHONPATH}:/usr/share/models/research:/usr/share/models/research/slim
    

データセットを準備する

  1. PASCAL VOC 2012 データセットをダウンロードして変換する

    このモデルは、トレーニングと評価に PASCAL VOC 2012 データセットを使用しています。次のスクリプトを実行して、データセットをダウンロードし、TensorFlow の TFRecord 形式に変換します。

     (vm)$ bash /usr/share/models/research/deeplab/datasets/download_and_convert_voc2012.sh
    
  2. トレーニング済みのチェックポイントをダウンロードする

    このステップでは、変更された ResNet 101 トレーニング済みチェックポイントをダウンロードします。まず、チェックポイントをダウンロードします。

     (vm)$ wget http://download.tensorflow.org/models/resnet_v1_101_2018_05_04.tar.gz
    

    次に、tar ファイルの内容を抽出します。

     (vm)$ tar -vxf resnet_v1_101_2018_05_04.tar.gz
    
  3. Cloud Storage バケットにデータをアップロードする

    この時点で、先ほど作成した Cloud Storage バケットにデータをアップロードできます。

    (vm)$ gsutil -m cp -r pascal_voc_seg/tfrecord ${DATA_DIR}/tfrecord
    
    (vm)$ gsutil -m cp -r resnet_v1_101 ${DATA_DIR}
    

Cloud TPU リソースを作成する

次のコマンドを実行して Cloud TPU を作成します。

  (vm)$ ctpu up --project=${PROJECT_ID} \
  --tpu-only \
  --tf-version=1.15.4 \
  --tpu-size=v3-8 \
  --name=deeplab-tutorial

モデルのトレーニング

2,000 トレーニング ステップのトレーニング スクリプトを実行します。これには約 20 分かかります。実行して収束するには、トレーニング スクリプトのコマンドラインから --train_steps=2000 フラグを削除します。実行して収束するには約 10 時間かかります。

(vm)$ python3 /usr/share/tpu/models/experimental/deeplab/main.py \
--mode='train' \
--num_shards=8 \
--alsologtostderr=true \
--model_dir=${MODEL_DIR} \
--dataset_dir=${DATA_DIR}/tfrecord \
--init_checkpoint=${DATA_DIR}/resnet_v1_101/model.ckpt \
--model_variant=resnet_v1_101_beta \
--image_pyramid=1. \
--aspp_with_separable_conv=false \
--multi_grid=1 \
--multi_grid=2 \
--multi_grid=4 \
--decoder_use_separable_conv=false \
--train_split='train' \
--train_steps=2000 \
--tpu=${TPU_NAME}

Cloud TPU デバイスでのモデルの評価。

トレーニングが完了すると、モデルを評価できます。これを行うには、--mode フラグを train から eval に変更します。

(vm)$ python3 /usr/share/tpu/models/experimental/deeplab/main.py \
--mode='eval' \
--num_shards=8 \
--alsologtostderr=true \
--model_dir=${MODEL_DIR} \
--dataset_dir=${DATA_DIR}/tfrecord \
--init_checkpoint=${DATA_DIR}/resnet_v1_101/model.ckpt \
--model_variant=resnet_v1_101_beta \
--image_pyramid=1. \
--aspp_with_separable_conv=false \
--multi_grid=1 \
--multi_grid=2 \
--multi_grid=4 \
--decoder_use_separable_conv=false \
--train_split='train' \
--tpu=${TPU_NAME}

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

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

    (vm)$ exit
    

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

  2. Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して ctpu delete を実行し、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete --project=${PROJECT_ID} \
      --zone=us-central1-b \
      --name=deeplab-tutorial
    
  3. TPU の使用に対して不要な料金が発生しないように、ctpu status を実行してインスタンスが割り当てられていないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    $ ctpu status --project=${PROJECT_ID} \
      --name=deeplab-tutorial \
      --zone=us-central1-b
    
    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 次に示すように gsutil を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。

    $ gsutil rm -r gs://bucket-name
    

次のステップ

このチュートリアルでは、サンプル データセットを使用して DeepLab-v3 モデルをトレーニングしました。このトレーニングの結果は(ほとんどの場合)推論には使用できません。推論にモデルを使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされたモデルでは、データセットを TFRecord 形式にする必要があります。

データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。

ハイパーパラメータ調整

データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要ハイパーパラメータ調整サービスの使用ハイパーパラメータを調整するをご覧ください。

推論

モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニングデプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。