このチュートリアルでは、単一の Cloud TPU デバイスまたは Cloud TPU Pod スライス(複数の TPU デバイス)を使用して Tensorflow MnasNet モデルをトレーニングする方法を説明します。TensorFlow と ImageNet データセットを使用する、他の TPU 対応イメージ分類モデルにも、同じパターンを適用できます。
モデルの説明
このチュートリアルで使用するモデルは、MnasNet: Platform-Aware Neural Architecture Search for Mobile をベースとしています。これは、AutoML モバイル ニューラル ネットワーク(MnasNet)アーキテクチャを導入した初めてのモデルです。このチュートリアルでは、最先端のバリアント「mnasnet-a1」を使用して、TPUEstimator を使ったモデルのトレーニング方法を説明します。
Pod スライス(v2-32 または v3-32 以上)のトレーニングにあたり特に留意すべき事項
TPU Pod スライスのトレーニングを行う場合は、このドキュメントをお読みいただき、Pod スライスのトレーニングについて特に留意すべき事項をご確認ください。
目標
- データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
- トレーニング ジョブを実行します。
- 出力結果を確認します。
費用
このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。
- Compute Engine
- Cloud TPU
- Cloud Storage
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。
新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。
始める前に
このチュートリアルを開始する前に、Google Cloud プロジェクトが正しく設定されていることを確認します。
- Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
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 を作成するプロジェクトを使用するように
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 バケットを作成します。bucket-name をバケットの名前に置き換えます。
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 ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。
ctpu up
コマンドを使用して、このチュートリアルで必要となる Compute Engine リソースを起動します。ctpu up --project=${PROJECT_ID} \ --zone=europe-west4-a \ --vm-only \ --disk-size-gb=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.4 \ --name=mnasnet-tutorial
コマンドフラグの説明
CTPU ユーティリティの詳細については、CTPU リファレンスを参照してください。
プロンプトが表示されたら、y キーを押して Cloud TPU リソースを作成します。
ctpu up
コマンドの実行が終了したら、shell プロンプトがusername@projectname
からusername@vm-name
に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。Compute Engine インスタンスに接続していない場合は、次のコマンドを実行して接続できます。gcloud compute ssh mnasnet-tutorial --zone=europe-west4-a
これ以降、接頭辞
(vm)$
は Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。ストレージ バケットの環境変数を作成します。bucket-name は、使用する Cloud Storage バケットの名前に置き換えます。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
モデル ディレクトリの環境変数を作成します。
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnasnet
次のコマンドを使用して、Python パスに最上位の
/models
フォルダを追加します。(vm)$ export PYTHONPATH=${PYTHONPATH}:/usr/share/tpu/models:/usr/share/tpu/models/official/efficientnet
データを見つける
ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードには数百、数千の画像が含まれています。
このチュートリアルでは、ImageNet の完全版のデータセットの fake_imagenet と呼ばれるデモバージョンを使用しています。このデモバージョンを使用すると、ストレージ容量と所要時間を ImageNet の完全版のデータセットに対してモデルを実行する際に通常必要となるものより抑えながらチュートリアルを試すことができます。
fake_imagenet データセットは Cloud Storage の次のロケーションにあります。
gs://cloud-tpu-test-datasets/fake_imagenet
データ ディレクトリの環境変数を作成します。
(vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
fake_imagenet データセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルは意味がありません。
ImageNet データセット全体をダウンロードして処理する方法については、ImageNet データセットのダウンロード、前処理、アップロードをご覧ください。
fake_imagenet を使用して MnasNet モデルをトレーニングする
Mnasnet TPU モデルは、Compute Engine VM の次のディレクトリにプリインストールされています。
/usr/share/tpu/models/official/mnasnet/
ctpu
ユーティリティを使用して Cloud TPU リソースを起動し、後で使用するいくつかの環境変数を設定します。(vm)$ ctpu up --project=${PROJECT_ID}
--tpu-only
--tf-version=1.15.4
--name=mnasnet-tutorial(vm)$ export TPU_NAME=mnasnet-tutorial
モデル ディレクトリに移動します。
(vm)$ cd /usr/share/tpu/models/official/mnasnet/
トレーニング スクリプトを実行します。
(vm)$ python3 mnasnet_main.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --model_name="mnasnet-a1" \ --skip_host_call=true \ --train_steps=109474 \ --train_batch_size=4096
--tpu
は、Cloud TPU の名前を指定します。ctpu
は、この名前を環境変数(TPU_NAME
)として Compute Engine VM に渡します。--data_dir
は、トレーニング入力用の Cloud Storage のパスを指定します。--model_dir
は、モデルのトレーニングの際にチェックポイントとサマリーが保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir
は Cloud Storage のパスである必要があります(gs://...
)。以前に作成されたチェックポイントの TPU のサイズと TensorFlow のバージョンが同じであれば、既存のフォルダを再利用して現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。単一の TPU デバイスを対象とした手順では、MnasNet モデル(「mnasnet-a1」バリアント)を 350 エポックまでトレーニングし、一定のステップ数ごとに評価します。このように指定したフラグを使用すると、モデルのトレーニングが約 23 時間行われます。この設定で実際の imagenet データを使用すると最先端の調査結果が再現されますが、ユーザーはトレーニング速度を調整できます。
Cloud TPU Pod を使用したモデルのスケーリング
Cloud TPU Pod を使用してモデルをスケーリングすると、より迅速に結果を得ることができます。完全サポートの Mnasnet モデルは、次の Pod スライスを使用できます。
- v2-32
- v2-128
- v2-256
- v2-512
- v3-32
- v3-128
- v3-256
- v3-512
- v3-1024
- v3-2048
Cloud TPU Pod を使用する場合は、まず Pod を使用してモデルをトレーニングし、その後、単一の Cloud TPU デバイスを使用してモデルを評価します。
Cloud TPU Pod を使用したトレーニング
単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --name=mnasnet-tutorial
使用する Pod スライスを指定するための
tpu-size
パラメータを使用して、ctpu up
コマンドを実行します。たとえば、次のコマンドは v2-32 Pod スライスを使用します。(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tpu-size=v2-32 \ --tf-version=1.15.4 \ --name=Cloud TPU
TPU_NAME
環境変数を更新します。(vm)$ export TPU_NAME=Cloud TPU
MODEL_DIR
ディレクトリを更新してトレーニング データを保存します。(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/Cloud TPU
次のスクリプトを実行してモデルをトレーニングします。
このスクリプトは、fake_imagnet データセットに対してモデルを 35 エポックまでトレーニングします。このトレーニングは、v3-128 Cloud TPU 上で約 90 分かかります。
(vm)$ python3 mnasnet_main.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --model_name="mnasnet-a1" \ --skip_host_call=true \ --train_steps=109474 \ --train_batch_size=4096
--tpu
は、Cloud TPU の名前を指定します。ctpu
は、この名前を環境変数(TPU_NAME
)として Compute Engine VM に渡します。--data_dir
は、トレーニング入力用の Cloud Storage のパスを指定します。--model_dir
は、モデルのトレーニングの際にチェックポイントとサマリーが保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir
は Cloud Storage のパスである必要があります(gs://...
)。以前に作成されたチェックポイントの TPU のサイズと TensorFlow のバージョンが同じであれば、既存のフォルダを再利用して現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。
この手順では、MnasNet モデル(「mnasnet-a1」バリアント)を fake_imagent データセットに対して 350 エポックまでトレーニングします。このトレーニングは約 5 時間で完了します。
モデルの評価
この手順では、Cloud TPU を使用して、fake_imagenet 検証データに対して上記でトレーニングしたモデルを評価します。
Pod でモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --name=${TPU_NAME}
v2-8 Cloud TPU を起動します。 Compute Engine VM に使用したものと同じ名前を使用します。これはまだ実行されています。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.4 \ --name=mnasnet-eval
TPU 名の環境変数を作成します。
(vm)$ export TPU_NAME=mnasnet-eval
アクセラレータ タイプの環境変数を作成します。
(vm)$ export ACCELERATOR_TYPE=v3-8
モデルの評価を実行します。今回は、
mode
フラグを指定し、eval
に設定します。(vm)$ python3 mnasnet_main.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --mode=eval \ --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
これにより、次のような出力が生成されます。
Eval results: {'loss': 7.532023, 'top_1_accuracy': 0.0010172526, 'global_step': 100, 'top_5_accuracy': 0.005065918}. Elapsed seconds: 88
クリーンアップ
このトピックで使用したリソースについて GCP アカウントに課金されないようにする手順は次のとおりです。
Compute Engine VM との接続を解除します。
(vm)$ exit
プロンプトが
user@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して
ctpu delete
を実行し、Compute Engine VM と Cloud TPU を削除します。$ ctpu delete --project=${PROJECT_ID} \ --zone=europe-west4-a \ --name=mnasnet-tutorial
TPU の使用に対して不要な料金が発生しないように、
ctpu status
を実行してインスタンスが割り当てられていないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。$ ctpu status --project=${PROJECT_ID} \ --zone=europe-west4-a
2018/04/28 16:16:23 WARNING: Setting zone to "europe-west4-a" No instances currently exist. Compute Engine VM: -- Cloud TPU: --
次に示すように
gsutil
を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。$ gsutil rm -r gs://bucket-name
次のステップ
このチュートリアルでは、サンプル データセットを使用して MNASNET モデルをトレーニングしました。このトレーニングの結果は(ほとんどの場合)推論には使用できません。推論にモデルを使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされたモデルでは、データセットを TFRecord 形式にする必要があります。
データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。
ハイパーパラメータ調整
データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要、ハイパーパラメータ調整サービスの使用、ハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニング、デプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。
- ローカルマシンへのインストール方法など、
ctpu
の詳細を学習する。 - TensorBoard の TPU ツールを確認します。