このドキュメントでは、COCO データセットで Cloud TPU を使用して ShapeMask モデルを実行する方法を示します。
以下の手順では、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
- クラウド ストレージ
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。
始める前に
このチュートリアルを開始する前に、Google Cloud プロジェクトが正しく設定されていることを確認します。
- Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する。
このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。
TPU Pod スライスでトレーニングする場合は、TPU Pod でのトレーニングを確認して、ポッドスライスに必要なパラメータの変更を確認してください。
リソースを設定する
このセクションでは、このチュートリアルで使用する Cloud Storage、VM、Cloud TPU の各リソースを設定する方法を説明します。
Cloud Shell ウィンドウを開きます。
プロジェクト ID の変数を作成します。
export PROJECT_ID=project-id
Cloud TPU を作成するプロジェクトを使用するように
gcloud
コマンドライン ツールを構成します。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 バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
ctpu up
ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、仮想マシン(VM)および TPU ノードと同じリージョンにする必要があります。VM と TPU ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。
Compute Engine VM インスタンスを起動します。
$ ctpu up --project=${PROJECT_ID} \ --zone=us-central1-a \ --vm-only \ --disk-size-gb=300 \ --machine-type=n1-standard-16 \ --tf-version=1.15.5 \ --name=shapemask-tutorial
指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。
ctpu up
コマンドの実行が終了したら、shell プロンプトがusername@projectname
からusername@vm-name
に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。gcloud compute ssh shapemask-tutorial --zone=us-central1-a
これらの手順を続行する場合は、VM セッション ウィンドウで、
(vm)$
で始まる各コマンドを実行します。Cloud Storage バケットのロケーションを保存する環境変数を作成します。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
データ ディレクトリの環境変数を作成します。
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
tpu
リポジトリのクローンを作成します。(vm)$ git clone -b shapemask https://github.com/tensorflow/tpu/
データの前処理に必要なパッケージをインストールします。
(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"
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 を設定して起動する
Cloud TPU リソースを起動します。
次のコマンドを実行して Cloud TPU を作成します。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.5 \ --tpu-size=v3-8 \ --name=shapemask-tutorial
指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。
Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag
というメッセージが表示されます。SSH 鍵の伝播は完了しているため、このメッセージは無視できます。Cloud TPU の名前の環境変数を追加します。
(vm)$ export TPU_NAME=shapemask-tutorial
トレーニングと評価のスクリプトを実行する
次の環境変数を作成します。
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/shapemask_exp (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/shapemask/retinanet/resnet101-checkpoint-2018-02-24 (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)$ export SHAPE_PRIOR_PATH=gs://cloud-tpu-checkpoints/shapemask/kmeans_class_priors_91x20x32x32.npy (vm)$ export PYTHONPATH=${PYTHONPATH}:$HOME/tpu/models
次のスクリプトを実行してトレーニングを行います。
(vm)$ python3 ~/tpu/models/official/detection/main.py \ --model shapemask \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=8 \ --model_dir=${MODEL_DIR} \ --mode="train" \ --eval_after_training=False \ --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 64, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [30000, 40000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }"
スクリプトを実行して評価を行います。
(vm)$ python3 ~/tpu/models/official/detection/main.py \ --model shapemask \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=8 \ --model_dir=${MODEL_DIR} \ --mode="eval" \ --eval_after_training=False \ --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 64, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [30000, 40000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: {eval_batch_size: 40, val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }""
この時点で、このチュートリアルを終了して、GCP リソースをクリーンアップすることも、Cloud TPU Pod でのモデルの実行をさらに詳しく調べることもできます。
Cloud TPU Pod を使用したモデルのスケーリング
Cloud TPU Pod を使用してモデルをスケーリングすると、より迅速に結果を得ることができます。完全にサポートされている Mask RCNN モデルは、次の Pod スライスを使用できます。
- v2-32
- v3-32
Cloud TPU Pod を使用する場合は、まず Pod を使用してモデルをトレーニングし、その後、単一の Cloud TPU デバイスを使用してモデルを評価します。
Cloud TPU Pod を使用したトレーニング
Compute Engine インスタンスをすでに削除している場合は、リソースのセットアップの手順に沿って新しいインスタンスを作成します。
モデルを単一の Cloud TPU デバイスでトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --zone=us-central1-a \ --name=shapemask-tutorial
Cloud Storage バケットに移動して、
checkpoint
ファイルを削除します。使用する Pod スライスを指定するための
tpu-size
パラメータを使用して、ctpu up
コマンドを実行します。たとえば、次のコマンドは v2-32 Pod スライスを使用します。(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tpu-size=v2-32 \ --zone=us-central1-a \ --tf-version=1.15.5 \ --name=shapemask-tutorial
次のスクリプトを実行して、Pod でモデルをトレーニングします。
指定されたコマンドラインでは、トレーニング スクリプトの実行に約 45 分かかります。収束まで実行するには、
total_steps
を 22000 に設定します。(vm)$ python3 ~/tpu/models/official/detection/main.py \ --model shapemask \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=32 \ --model_dir=${MODEL_DIR} \ --mode="train" \ --eval_after_training=False \ --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 256, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [15000, 20000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }"
モデルは単一の Cloud TPU デバイス上で評価する必要があります。Cloud TPU Pod デバイスを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --zone=us-central1-a \ --tpu-only \ --name=shapemask-tutorial
単一の Cloud TPU リソースを作成します。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tpu-size=v3-8 \ --zone us-central1-a \ --tf-version=1.15.5 \ --name=shapemask-tutorial
スクリプトを実行して評価を行います。
(vm)$ python3 ~/tpu/models/official/detection/main.py \ --model shapemask \ --use_tpu=True \ --tpu=${TPU_NAME} \ --num_cores=8 \ --model_dir="${MODEL_DIR} \ --mode="eval" \ --eval_after_training=False \ --params_override="{train: {iterations_per_loop: 1000, train_batch_size: 256, total_steps: 1000, learning_rate: {total_steps: 1000, warmup_learning_rate: 0.0067, warmup_steps: 500, init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [15000,20000]}, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet101/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: {resnet_depth: 101}, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [1024, 1024]}, }"
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを保存して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して
ctpu delete
を実行し、Compute Engine VM と Cloud TPU を削除します。$ ctpu delete --project=${PROJECT_ID} \ --zone=us-central1-a \ --name=shapemask-tutorial
次のコマンドを実行して、Compute Engine VM と Cloud TPU がシャットダウンされたことを確認します。
$ ctpu status --project=${PROJECT_ID} \ --zone=us-central1-a \ --name=shapemask-tutorial
削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。
2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-a" No instances currently exist. Compute Engine VM: -- Cloud TPU: --
次に示すように
gsutil
を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。$ gsutil rm -r gs://bucket-name
次のステップ
このチュートリアルでは、サンプル データセットを使用して ShapeMask モデルをトレーニングしました。このトレーニングの結果は(ほとんどの場合)推論には使用できません。推論にモデルを使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされたモデルでは、データセットを TFRecord 形式にする必要があります。
データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。
ハイパーパラメータ調整
データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要、ハイパーパラメータ調整サービスの使用、ハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニング、デプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。
さまざまなサイズの画像でトレーニングする
より規模の大きいニューラル ネットワーク(たとえば ResNet-50 ではなく ResNet-101)の使用を試すことが可能です。入力画像のサイズを大きくして、より強力なニューラル ネットワークを使用すると、処理時間は長くなりますが、モデルの精度が高くなります。
別のベースを使用する
また、独自のデータセットで ResNet モデルを事前トレーニングし、それを ShapeMask モデルのベースとして使用することもできます。いくつかの作業を行うことで、ResNet の代わりに別のニューラル ネットワークに切り替えることもできます。最後に、独自のオブジェクト検出モデルの実装を検討されている場合は、このネットワークを今後のテストに利用することをおすすめします。