EfficientNet モデルは、優れた精度を実現すると同時に、他のモデルよりもサイズが小さく高速な、最先端の画像分類モデル ファミリーです。EfficientNet-EdgeTpu は、Google EdgeTPU デバイスで効率的に実行されるようにカスタマイズされたモデルです。
このチュートリアルで使用するモデルは、EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks に基づいています。研究者は、モデルのパフォーマンスを改善する新しい手法として、シンプルで非常に効果的な複合係数を使用して、ネットワークの深さ、幅、解像度のバランスを慎重に調整する手法を開発しました。
efficientnet-b0
から efficientnet-b7
までのモデル ファミリーにより、Google EdgeTPU デバイスに限定されるリソースに応じた、妥当な画像分類精度を実現できます。
このチュートリアルで使用するモデル efficientnet-b0
は、最小のベースモデルに対応していますが、efficientnet-b7
は最も強力で計算コストの高いモデルに対応しています。このチュートリアルでは、TPUEstimator を使ったモデルのトレーニング方法を説明します。
目標
- データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
- fake_imagenet データセットと呼ばれる ImageNet データセットのテスト版を準備します。
- トレーニング ジョブを実行します。
- 出力結果を確認します。
費用
このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。
- Compute Engine
- Cloud TPU
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
このチュートリアルを開始する前に、Google Cloud プロジェクトが正しく設定されていることを確認します。
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。
リソースを設定する
このセクションでは、チュートリアルで使用する Cloud Storage、VM、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
に認証情報を使用した 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 tpus execution-groups
コマンドを使用して、このチュートリアルのために必要な Compute Engine リソースと Cloud TPU リソースを起動します。gcloud compute tpus execution-groups create \ --vm-only \ --name=efficientnet-tutorial \ --zone=europe-west4-a \ --disk-size=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.5
コマンドフラグの説明
gcloud
コマンドの詳細については、gcloud リファレンスをご覧ください。プロンプトが表示されたら、y キーを押して Cloud TPU リソースを作成します。
gcloud compute tpus execution-groups
コマンドの実行が終了したら、shell プロンプトがusername@projectname
からusername@vm-name
に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。gcloud compute ssh efficientnet-tutorial --zone=europe-west4-a
これ以降、接頭辞
(vm)$
は Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。
データを準備する
次の環境変数を設定します。bucket-name を Cloud Storage バケットの名前に置き換えます。
バケット名の環境変数を作成します。bucket-name は、使用するバケット名に置き換えてください。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
追加の環境変数を作成します。
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export TPU_NAME=efficientnet-tutorial (vm)$ export PYTHONPATH=$PYTHONPATH:/usr/share/tpu/models
トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションでは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。
fake_imagenet を使用した EfficientNet モデルのトレーニングと評価
ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードを数百、数千もの画像で表しています。
このチュートリアルでは、ImageNet の完全版のデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、ストレージ容量と所要時間を ImageNet の完全版のデータセットに対してモデルを実行する際に通常必要となるものより抑えながらチュートリアルを試すことができます。
fake_imagenet データセットは Cloud Storage の次のロケーションにあります。
gs://cloud-tpu-test-datasets/fake_imagenet
fake_imagenet データセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルは意味がありません。
ImageNet データセット全体をダウンロードして処理する方法については、ImageNet データセットのダウンロード、前処理、アップロードをご覧ください。
Cloud TPU リソースを起動します。
(vm)$ gcloud compute tpus execution-groups create \ --tpu-only \ --name=efficientnet-tutorial \ --zone=europe-west4-a \ --disk-size=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.5
モデル ディレクトリに移動します。
(vm)$ cd /usr/share/tpu/models/official/efficientnet/
トレーニング スクリプトを実行します。
(vm)$ python3 main.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --model_name='efficientnet-b0' \ --skip_host_call=true \ --train_batch_size=2048 \ --train_steps=1000
コマンドフラグの説明
tpu
- TPU_NAME 変数で指定された名前を使用します。
data_dir
- トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
model_dir
- モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
model_name
- トレーニングするモデルの名前。例:
efficientnet
。 skip_host_call
true
に設定すると、各トレーニング ステップで実行されるhost_call
がスクリプトでスキップされます。これは通常、トレーニングの概要(トレーニング損失、学習率など)を生成するために使用されます。skip_host_call=false
の場合、host_call
関数が低速で TPU 側の計算に追いつけないと、パフォーマンスが低下する可能性があります。train_batch_size
- トレーニングのバッチサイズ。
train_steps
- トレーニングに使用するステップの数。 デフォルト値は 218,949 です。これは、バッチサイズが 2048 で約 350 エポックになります。このフラグは、
train_batch_size
フラグの値に応じて調整する必要があります。
これは、EfficientNet モデル(efficientnet-b0
バリアント)が架空の ImageNet データセットを使用しているため、1,000 ステップのみトレーニングします。完全な ImageNet データセットを使用してトレーニングする場合は、次のコマンドを使用して収束するようにトレーニングできます。
(vm)$ python3 main.py \
--tpu=${TPU_NAME} \
--data_dir=${DATA_DIR} \
--model_dir=${MODEL_DIR} \
--model_name='efficientnet-b0' \
--skip_host_call=true \
--train_batch_size=2048 \
--train_steps=218948
これにより、EfficientNet モデルが 350 エポックまでトレーニングされ、1 つのデータのバッチ処理後に評価されます。このように指定したフラグを使用すると、モデルのトレーニングが約 23 時間で行われます。これらの設定により、ImageNet の検証データセットに対する最大 76.5% のトップ 1 の精度を取得できるはずです。最も有効なモデル チェックポイントとその評価結果は、モデル ディレクトリ ${STORAGE_BUCKET}/efficientnet/archive
の archive
フォルダにあります。
Cloud TPU Pod を使用したモデルのスケーリング
Cloud TPU Pod を使用してモデルをスケーリングすると、より迅速に結果を得ることができます。完全にサポートされているモデルは、次の Pod スライスを使用できます。
- v2-32
- v3-32
Cloud TPU Pod を使用する場合は、まず Pod を使用してモデルをトレーニングし、その後、単一の Cloud TPU デバイスを使用してモデルを評価します。
Cloud TPU Pod を使用したトレーニング
単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ gcloud compute tpus execution-groups delete efficientnet-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 --tpu-only \ --name=efficientnet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v2-32 \ --tf-version=1.15.5
TPU 名の環境変数を作成します。
(vm)$ export TPU_NAME=efficientnet-tutorial
MODEL_DIR
ディレクトリを更新してトレーニング データを保存します。(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-tutorial
モデルをトレーニングします。
(vm)$ python3 main.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --model_name='efficientnet-b3' \ --skip_host_call=true \ --mode=train \ --train_steps=1000 \ --train_batch_size=4096 \ --iterations_per_loop=100
コマンドフラグの説明
tpu
- Cloud TPU の名前。
data_dir
- トレーニング入力用の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
model_dir
- モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
model_name
- トレーニングするモデルの名前。
skip_host_call
true
に設定すると、各トレーニング ステップで実行されるhost_call
がスクリプトでスキップされます。これは通常、トレーニングの概要(トレーニング損失、学習率など)を生成するために使用されます。skip_host_call=false
の場合、host_call
関数が低速で TPU 側の計算に追いつけないと、パフォーマンスが低下する可能性があります。mode
train_and_eval
、train
、eval
のいずれか。train_and_eval
は、モデルのトレーニングと評価を行います。train
は、モデルをトレーニングします。eval
は、モデルを評価します。train_steps
- トレーニング ステップの数を指定します。
train_batch_size
- トレーニングのバッチサイズ。
iterations_per_loop
- CPU に指標を送信する前に TPU で実行するトレーニング ステップの数。
このコマンドは、EfficientNet モデル(efficientnet-b0
バリアント)が架空の ImageNet データセットを使用しているため、1,000 ステップのみトレーニングします。完全な ImageNet データセットを使用してトレーニングする場合は、次のコマンドを使用して収束するようにトレーニングできます。
(vm)$ python3 main.py \
--tpu=${TPU_NAME} \
--data_dir=${DATA_DIR} \
--model_dir=${MODEL_DIR} \
--model_name='efficientnet-b3' \
--skip_host_call=true \
--mode=train \
--train_steps=109474 \
--train_batch_size=4096 \
--iterations_per_loop=100
このコマンドでは、EfficientNet モデル(efficientnet-b3
バリアント)を 350 エポックまでトレーニングします。このモデルは ImageNet データセットに対して 81.1% の精度を達成し、トレーニングは約 20 時間で完了します。最も有効なモデル チェックポイントとその評価結果は、モデル ディレクトリ ${STORAGE_BUCKET}/efficientnet/archive
の archive
フォルダにあります。
モデルの評価
この手順では、Cloud TPU を使用して、fake_imagenet 検証データに対して上記でトレーニングしたモデルを評価します。
Pod でモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ gcloud compute tpus execution-groups delete efficientnet-tutorial \ --tpu-only \ --zone=europe-west4-a
v2-8 Cloud TPU を起動して評価を実行します。Compute Engine VM に使用したものと同じ名前を使用します。これはまだ実行されています。
(vm)$ gcloud compute tpus execution-groups create --tpu-only \ --name=efficientnet-tutorial \ --accelerator-type=v2-8 \ --zone=europe-west4-a \ --tf-version=1.15.5
TPU 名の環境変数を作成します。
(vm)$ export TPU_NAME=efficientnet-tutorial
モデルの評価を実行します。今回は、
mode
フラグを指定し、eval
に設定します。(vm)$ python3 main.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --model_name='efficientnet-b3' \ --skip_host_call=true \ --mode=eval
コマンドフラグの説明
tpu
- TPU_NAME 変数で指定された名前を使用します。
data_dir
- トレーニング入力用の Cloud Storage のパスを指定します。この例では、fake_imagenet データセットに設定されています。
model_dir
- モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
model_name
- トレーニングするモデルの名前。(
efficientnet
など)。 skip_host_call
true
に設定すると、各トレーニング ステップで実行されるhost_call
がスクリプトでスキップされます。これは通常、トレーニングの概要(トレーニング損失、学習率など)を生成するために使用されます。skip_host_call=false
の場合、host_call
関数が低速で TPU 側の計算に追いつけないと、パフォーマンスが低下する可能性があります。mode
train_and_eval
に設定すると、このスクリプトはモデルをトレーニングして評価します。export_only
に設定すると、このスクリプトは保存されたモデルをエクスポートします。
これにより、次のような出力が生成されます。
Eval results: { 'loss': 7.532023, 'top_1_accuracy': 0.0010172526, 'global_step': 100, 'top_5_accuracy': 0.005065918 } Elapsed seconds: 88
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で次のコマンドを使用して、Compute Engine VM と Cloud TPU を削除します。
$ gcloud compute tpus execution-groups delete efficientnet-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 サービスを使用できるようになります。
- TensorBoard の TPU ツールを確認します。