Cloud TPU での ResNet のトレーニング

このチュートリアルでは、Cloud TPU で Tensorflow ResNet-50 モデルをトレーニングする方法を示します。TensorFlow および ImageNet データセットを使用する、TPU に対応するその他の画像分類モデルにも同じパターンを適用できます。

免責

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

モデルの説明

このチュートリアルのモデルは、残余ネットワーク(ResNet)アーキテクチャを最初に導入する画像認識のためのディープ残余ラーニングに基づいています。このチュートリアルでは、ResNet-50 という 50 レイヤのバリアントを使用します。

このチュートリアルでは、tf.estimator を使用してモデルをトレーニングします。tf.estimator は上位の TensorFlow API であり、Cloud TPU で機械学習モデルをビルドして実行する場合に推奨される方法です。API は、低レベルの実装のほとんどを非表示にしてモデル開発プロセスを簡素化し、TPU と GPU や CPU などの他のプラットフォームを簡単に切り替えることができるようにします。

始める前に

このチュートリアルを開始する前に、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 データセットを使用することもできます。

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

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

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

TensorBoard を設定する

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

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

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

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

ResNet-50 モデルを実行する

これで Cloud TPU で ResNet-50 モデルをトレーニングし、評価する準備が整いました。次の手順では、(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. ResNet-50 モデルは、Compute Engine VM にプリインストールされています。次のディレクトリに移動します。

    (vm)$ cd /usr/share/tpu/models/official/resnet/
    

  3. トレーニング スクリプトを実行します。

    (vm)$ python resnet_main.py \
      --tpu=$TPU_NAME \
      --data_dir=$DATA_DIR \
      --model_dir=${STORAGE_BUCKET}/resnet
    

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

今後について

上記の手順では、ResNet-50 モデルを 90 エポックでトレーニングし、一定のステップ数ごとに評価します。デフォルトのフラグを使用すると、モデルは 76% を超える精度までトレーニングする必要があります。

ResNet-50 モデルへの TPU 固有の変更

このチュートリアルの ResNet コードは、高レベルの Estimator API に基づいた TPUEstimator を使用しています。Estimator ベースのモデルをトレーニング用の TPUEstimator ベースのモデルに変換するために、コードをいくつか変更する必要があります。

次のライブラリをインポートします。

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

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

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

model_fn を定義し、次を使用して TPUEstimator 仕様を返します。

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

Cloud TPU でモデルを実行するには、tf.contrib.cluster_resolver.python.training.TPUClusterResolver を使用して取得できる TPU gRPC アドレスが必要です。次を使用して Estimator と互換性のある構成を定義します。

config = tpu_config.RunConfig(
    master=tpu_grpc_addr,
    model_dir=FLAGS.model_dir,
    tpu_config=tpu_config.TPUConfig(
        iterations_per_loop=FLAGS.iterations_per_loop,
        num_shards=FLAGS.num_cores))

構成およびモデルデータを使用して Estimator オブジェクトを作成します。

estimator = tpu_estimator.TPUEstimator(
    use_tpu=FLAGS.use_tpu,
    model_fn=model_fn,
    config=config,
    train_batch_size=FLAGS.batch_size)

Python プログラムは、構成で定義された反復回数に対して estimator.train 関数を実行します。

estimator.train(input_fn=input_fn, max_steps=FLAGS.train_steps)

クリーンアップ

  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 データをダウンロードして変換します。

  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

次のステップ

  • ローカルマシンにインストールする方法など、ctpu についてさらに学習します。
  • TensorBoard の TPU ツールを確認します。
  • RetinaNet オブジェクト検出モデルのチュートリアルを確認します。
  • 上記の手順を出発点として、Cloud TPU で TensorFlow SqueezeNet モデルを実行します。SqueezeNet と ResNet-50 のモデル アーキテクチャは類似しています。同じデータとコマンドライン フラグを使用して、モデルをトレーニングできます。
このページは役立ちましたか?評価をお願いいたします。

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