Cloud TPU での Inception の実行

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

免責

このチュートリアルでは、サードパーティのデータセットを使用します。Google は、このデータセットの有効性またはその他の側面について、いかなる表明、保証もいたしません。

モデルの説明

Inception v3 は、広く使用されている画像認識モデルで、高い精度を達成できます。このモデルは、長年にわたって複数の研究者によって開発された多くのアイデアが結実したものです。これは、Szegedy 氏他の『Rethinking the Inception Architecture for Computer Vision』という論文をベースにしています。

このモデルには、次のような対称および非対称のさまざまな構成要素が含まれています。

  • 畳み込み
  • 平均プーリング
  • 最大プーリング
  • 連結
  • ドロップアウト
  • 全結合層

損失は Softmax によって計算されます。

次の図は、モデルの概要を示しています。

画像

このモデルの詳細については、GitHub をご覧ください。

このモデルは、高度な Estimator API を使用して作成されています。

この API は、低レベルの関数のほとんどをカプセル化することでモデル作成を大幅に簡素化します。これにより、ユーザーは、操作を実行する基礎となるハードウェアの内部構造ではなく、モデル開発に集中できます。

始める前に

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

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

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

    課金を有効にする方法について

  4. このチュートリアルでは、Google Cloud Platform の課金対象となるコンポーネントを使用します。Cloud TPU の料金ページを確認して費用を見積もり、終了したら手順に従ってリソースのクリーンアップを行います。

Cloud Storage バケットを作成する

機械学習モデルのトレーニングに使用するデータおよびトレーニングの結果を保存する Cloud Storage バケットが必要です。

  1. GCP Console の Cloud Storage ページに移動します。

    Cloud Storage ページに移動

  2. 次のオプションを指定して、新しいバケットを作成します。

    • 任意の一意の名前
    • デフォルトのストレージ クラス: Regional
    • ロケーション: us-central1

Cloud Shell を開いて ctpu ツールを使用する

このガイドでは、Cloud TPU Provisioning Utilityctpu)を使用します。これは Cloud TPU を設定および管理するためのシンプルなツールです。このガイドでは、Cloud Shell から ctpu を実行します。より高度な設定オプションについては、カスタム設定をご覧ください。

ctpu ツールは Cloud Shell にプリインストールされています。ctpu 構成を確認するには、次の手順に従います。

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

    Cloud Shell を開く

  2. Cloud Shell に次のように入力して、ctpu 構成を確認します。

    $ ctpu print-config
    

    次のようなメッセージが表示されます。

    2018/04/29 05:23:03 WARNING: Setting zone to "us-central1-b"
    ctpu configuration:
            name: [your TPU's name]
            project: [your-project-name]
            zone: us-central1-b
    If you would like to change the configuration for a single command invocation, please use the command line flags.
    

  3. ctpu コマンドを見てみます。

    $ ctpu

    サブコマンドとフラグのリストとそれぞれの簡単な説明を含む使用ガイドが表示されます。

Compute Engine VM と Cloud TPU を作成する

次のコマンドを実行して、Compute Engine 仮想マシン(VM)と関連するサービスを備えた Cloud TPU を設定します。このリソースとサービスの組み合わせは、Cloud TPU 群と呼ばれます。

$ ctpu up

ctpu up コマンドは、次のタスクを実行します。

  • Compute Engine および Cloud TPU サービスを有効にします。
  • 最新の安定した TensorFlow バージョンがプリインストールされた Compute Engine VM を作成します。デフォルト ゾーンは us-central1-b です。参考までに、Cloud TPU は次のゾーンで利用できます。

    • 米国(US)
    • ヨーロッパ(EU)
      • europe-west4-a
    • アジア太平洋(APAC)
      • asia-east1-c

  • 対応するバージョンの TensorFlow を使用して Cloud TPU を作成し、Cloud TPU の名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。

  • 特定の IAM の役割を Cloud TPU サービス アカウントに付与して、Cloud TPU が GCP プロジェクトから必要なリソースにアクセスできるようにします。
  • その他数多くのチェックを行います。
  • 新しい Compute Engine VM にユーザーをログインさせます。

ctpu up は必要に応じて何度でも実行できます。たとえば、Compute Engine VM との SSH 接続が失われた場合は、ctpu up を実行して復元します。

この時点から、(vm)$ 接頭辞は、Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。

Compute Engine VM を確認する

ctpu up コマンドの実行が終了したら、次の点を確認します。

  1. shell プロンプトが username@project から username@username に変更されていることを確認します。この変更により、現在 Compute Engine VM にログインしていることがわかります。

  2. 次のコマンドを実行して、TensorFlow のインストールを確認します。

    (vm)$ python -c "import tensorflow; print(tensorflow.VERSION)"
    

    警告メッセージが表示され、その後に TensorFlow のバージョン番号を示す行が表示されます。たとえば、1.8.0 となります。

データを取得する

YOUR-BUCKET-NAME を Cloud Storage バケットの名前に置き換えて、次の環境変数を設定します。

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME

トレーニング アプリケーションでは、Cloud Storage でトレーニング データにアクセスできる必要があります。また、トレーニング アプリケーションでは、Cloud Storage バケットを使用してトレーニング中にチェックポイントを保存します。

使用できるデータセットは、ランダムに生成された架空のデータセットまたは完全な ImageNet データセットの 2 つです。以下で説明する DATA_DIR 環境変数は、トレーニングするデータセットを指定するために使用されます。

架空のデータセットは、Cloud TPU の使用方法を理解し、エンドツーエンドのパフォーマンスを検証する場合にのみ役立ちます。精度の数値と保存されたモデルは意味がありません。

架空のデータセットは Cloud Storage の次の場所にあります。

gs://cloud-tpu-test-datasets/fake_imagenet

TensorBoard を設定する

モデルをトレーニングする前に、トレーニング プログラムの進捗状況を視覚化できるように、バックグラウンドで TensorBoard を開始します。

(vm)$ tensorboard --logdir=${STORAGE_BUCKET}/inception &

ctpu up を実行すると、TensorBoard を利用できるように、Cloud Shell 環境のポート転送が自動的に設定されます。

Cloud Shell の [ウェブでプレビュー] ボタンをクリックし、ポート 8080 を開きます。

モデルを実行する

これで、ImageNet データを使用して Inception v3 モデルをトレーニングおよび評価する準備ができました。

Inception v3 モデルは、Compute Engine VM の /usr/share/tpu/models/experimental/inception/ ディレクトリにプリインストールされています。

次の手順では、(vm)$ 接頭辞は、Compute Engine VM でコマンドを実行する必要があることを意味します。

  1. 次のいずれかの値を含む環境変数 DATA_DIR を設定します。

    • 架空のデータセットを使用している場合:

      (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
      

    • Cloud Storage バケットに一連のトレーニング データをアップロードした場合:

      (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
      

  2. Inception v3 モデルを実行します。

    (vm)$ python /usr/share/tpu/models/experimental/inception/inception_v3.py \
        --tpu=$TPU_NAME \
        --learning_rate=0.165 \
        --train_steps=250000 \
        --iterations=500 \
        --use_tpu=True \
        --use_data=real \
        --mode=train_and_eval \
        --train_steps_per_eval=2000 \
        --data_dir=${DATA_DIR} \
        --model_dir=${STORAGE_BUCKET}/inception

    • --tpu は Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    • --use_data は、トレーニング中に使用する必要があるデータのタイプ(架空または実際)を指定します。デフォルト値は架空です。
    • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。架空のデータを使用している場合、このパラメータは無視されます。
    • --model_dir は、モデルのトレーニング中にチェックポイントと概要が保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)である必要があります。既存のフォルダを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。

今後について

Inception v3 は 299x299 の画像で動作します。デフォルトのトレーニングのバッチサイズは 1,024 です。つまり、各反復はこれらの画像の 1,024 枚で行われます。

--mode フラグを使用して、3 つのオペレーション モード(train、eval、train_and_eval)のいずれかを選択できます。

  • --mode=train または --mode=eval は、トレーニングのみまたは評価のみのジョブを指定します。
  • --mode=train_and_eval は、トレーニングと評価の両方を行うハイブリッド ジョブを指定します。

トレーニングのみのジョブは、train_steps で定義された指定のステップ数に対して実行され、必要に応じてトレーニング セット全体を処理できます。

train_and_eval のジョブは、トレーニングと評価のセグメントを繰り返し処理します。各トレーニング サイクルは train_steps_per_eval に対して実行され、その後に評価ジョブ(そのポイントまでトレーニングされた重みを使用)が続きます。

トレーニング サイクル数は、floor 関数(train_stepstrain_steps_per_eval で除算)で定義されます。

floor(train_steps / train_steps_per_eval)

デフォルトでは、Estimator API ベースモデルは一定のステップ数ごとに損失値をレポートします。レポート形式は、次のようになります。

step = 15440, loss = 12.6237

説明: このモデルに対する TPU 固有の変更

TPU 用の Estimator API ベースモデルを取得するために必要な固有の変更は、ごくわずかです。次のライブラリが自動的にインポートされます。

from google.third_party.tensorflow.contrib.tpu.python.tpu import tpu_config
from google.third_party.tensorflow.contrib.tpu.python.tpu import tpu_estimator
from google.third_party.tensorflow.contrib.tpu.python.tpu import tpu_optimizer

CrossShardOptimizer 関数は、次のようにオプティマイザーをラップします。

if FLAGS.use_tpu:
  optimizer = tpu_optimizer.CrossShardOptimizer(optimizer)

モデルを定義する関数は、以下を使用して Estimator の仕様を返します。

return tpu_estimator.TPUEstimatorSpec(
    mode=mode, loss=loss, train_op=train_op, eval_metrics=eval_metrics)

main 関数は、以下を使用して Estimator と互換性のある構成を定義します。

run_config = tpu_config.RunConfig(
    master=tpu_grpc_url,
    evaluation_master=tpu_grpc_url,
    model_dir=FLAGS.model_dir,
    save_checkpoints_secs=FLAGS.save_checkpoints_secs,
    save_summary_steps=FLAGS.save_summary_steps,
    session_config=tf.ConfigProto(
        allow_soft_placement=True,
        log_device_placement=FLAGS.log_device_placement),
    tpu_config=tpu_config.TPUConfig(
        iterations_per_loop=iterations,
        num_shards=FLAGS.num_shards,
        per_host_input_for_training=per_host_input_for_training))

プログラムは、この定義された構成とモデル定義関数を使用して Estimator オブジェクトを作成します。

inception_classifier = tpu_estimator.TPUEstimator(
    model_fn=inception_model_fn,
    use_tpu=FLAGS.use_tpu,
    config=run_config,
    params=params,
    train_batch_size=FLAGS.train_batch_size,
    eval_batch_size=eval_batch_size,
    batch_axis=(batch_axis, 0))

トレーニングのみのジョブは、train 関数の呼び出しのみを行います。

inception_classifier.train(
    input_fn=imagenet_train.input_fn, steps=FLAGS.train_steps)

評価のみのジョブは、使用可能なチェックポイントからデータを取得して、新しいチェックポイントが使用可能になるまで待機します。

for checkpoint in get_next_checkpoint():
  eval_results = inception_classifier.evaluate(
      input_fn=imagenet_eval.input_fn,
      steps=eval_steps,
      hooks=eval_hooks,
      checkpoint_path=checkpoint)

train_and_eval のハイブリッド ジョブは、トレーニング ジョブと評価ジョブの両方を実行します。モデルは、チェックポイントからトレーニング可能な変数の現在のセットを使用して評価されます。トレーニングと評価のサイクルは、ユーザーが指定したとおりに繰り返されます。

for cycle in range(FLAGS.train_steps // FLAGS.train_steps_per_eval):
  inception_classifier.train(
      input_fn=imagenet_train.input_fn, steps=FLAGS.train_steps_per_eval)

  eval_results = inception_classifier.evaluate(
      input_fn=imagenet_eval.input_fn, steps=eval_steps, hooks=eval_hooks)

クリーンアップ

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

    (vm)$ exit
    

    プロンプトが user@projectname になり、Cloud Shell 内にいることが示されます。

  2. Cloud Shell で次のコマンドを実行して、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete
    

  3. ctpu status を実行すると、インスタンスが割り当てられていないことを確認できますが、削除には 1~2 分かかる場合があります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            GCE VM:     --
            Cloud TPU:  --
    

  4. このチュートリアルで作成した Cloud Storage バケットが不要になったら、gsutil コマンドを使用して削除します。YOUR-BUCKET-NAME は、Cloud Storage バケットの名前に置き換えます。

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    

    無料の保存容量の制限やその他の料金に関する情報については、Cloud Storage の料金ガイドをご覧ください。

完全な ImageNet データセットの使用

このセクションで使用するスクリプトを実行するには、ローカルマシンまたは VM に約 300 GB の空き容量が必要です。

Compute Engine VM でデータを処理する場合は、次の手順に従って VM にディスク容量を追加します。

  • Compute Engine ガイドに従って、VM にディスクを追加します。
  • ディスクサイズを 300 GB 以上に設定します。
  • VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。
  • 新しいディスクのパスをメモします。例: /mnt/disks/mnt-dir

完全な ImageNet データセットをダウンロードして変換し、Cloud Storage にアップロードするには:

  1. ImageNet アカウントに登録します。アカウントの作成に使用したユーザー名とパスワードを覚えておいてください。

  2. Cloud Storage バケットのパスを指す DATA_DIR 環境変数を設定します。

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    

  3. GitHub から imagenet_to_gcs.py スクリプトをダウンロードします。

    $ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    

  4. スクリプトの作業ファイルを含むように SCRATCH_DIR 変数を設定します。変数は、ローカルマシンまたは Compute Engine VM 上の場所を指定する必要があります。たとえば、ローカルマシンの場合は次のようにします。

    $ SCRATCH_DIR=./imagenet_tmp_files
    

    または、VM でデータを処理している場合は次のようにします。

    (vm)$ SCRATCH_DIR=/mnt/disks/mnt-dir/imagenet_tmp_files
    

  5. imagenet_to_gcs.py スクリプトを実行して ImageNet データをダウンロードし、フォーマットしてバケットにアップロードします。YOUR-USERNAMEYOUR-PASSWORD は、ImageNet アカウントの作成に使用したユーザー名とパスワードに置き換えます。

    $ pip install google-cloud-storage
    $ python imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$DATA_DIR \
      --local_scratch_dir=$SCRATCH_DIR \
      --imagenet_username=YOUR-USERNAME \
      --imagenet_access_key=YOUR-PASSWORD
    

: データをダウンロードして前処理するには、ネットワークとパソコンの速度に応じて、半日かかることがあります。スクリプトを中断しないでください。

スクリプトの処理が終了すると、次のようなメッセージが表示されます。

2018-02-17 14:30:17.287989: Finished writing all 1281167 images in data set.

このスクリプトにより、以下の形式の一連のディレクトリ(トレーニング用と検証用の両方)が生成されます。

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
 ...
${DATA_DIR}/train-01023-of-01024

および

${DATA_DIR}/validation-00000-of-00128
S{DATA_DIR}/validation-00001-of-00128
 ...
${DATA_DIR}/validation-00127-of-00128

Inception v4

Inception v4 モデルは、Inception v3 の構成要素を使用するディープ ニューラル ネットワーク モデルで、Inception v3 よりも高い精度を実現します。これは、Szegedy 氏他の論文『Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning』で説明されています。

Inception v4 モデルは、Compute Engine VM の /usr/share/tpu/models/experimental/inception/ ディレクトリにプリインストールされています。

次の手順では、(vm)$ 接頭辞は、Compute Engine VM でコマンドを実行する必要があることを意味します。

  1. [Cloud Shell] タブで TensorBoard を実行している場合は、作業する別のタブが必要です。Cloud Shell で別のタブを開き、新しい shell で ctpu を使用して Compute Engine VM に接続します。

    $ ctpu up

  2. 次のいずれかの値を含む環境変数 DATA_DIR を設定します。

    • 架空のデータセットを使用している場合:

      (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
      

    • Cloud Storage バケットに一連のトレーニング データをアップロードした場合:

      (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
      

  3. Inception v4 モデルを実行します。

    (vm)$ python /usr/share/tpu/models/experimental/inception/inception_v4.py \
        --tpu=$TPU_NAME \
        --learning_rate=0.36 \
        --train_steps=1000000 \
        --iterations=500 \
        --use_tpu=True \
        --use_data=real \
        --train_batch_size=256 \
        --mode=train_and_eval \
        --train_steps_per_eval=2000 \
        --data_dir=${DATA_DIR} \
        --model_dir=${STORAGE_BUCKET}/inception

    • --tpu は Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    • --use_data は、トレーニング中に使用する必要があるデータのタイプ(架空または実際)を指定します。デフォルト値は架空です。
    • --train_batch_size は、トレーニングのバッチサイズを 256 に指定します。Inception v4 モデルは Inception v3 よりも大きいため、TPU コアごとにより小さいバッチサイズで実行する必要があります。
    • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。架空のデータを使用している場合、このパラメータは無視されます。
    • --model_dir は、モデルのトレーニング中にチェックポイントと概要が保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)である必要があります。既存のフォルダを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。

次のステップ

  • Cloud TPU における Inception v3 の詳細を学習します。
  • ローカルマシンにインストールする方法など、ctpu についてさらに学習します。
  • TensorBoard の TPU ツールを確認します。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...