Cloud TPU での MNIST の実行

このチュートリアルでは、MNIST モデルの概要、MNIST TensorFlow TPU コードサンプルのダウンロード方法、Cloud TPU でコードを実行する方法について説明します。

免責

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

モデルの説明

このモデルは、3 つの部分に分割された MNIST データセットの正しいラベル(数字)を予測します。

  • 55,000 例のトレーニング データ
  • 10,000 例のテストデータ
  • 5,000 例の検証データ

データセットの詳細については、MNIST データベース サイトをご覧ください。

モデルには 7 つの層が混在しています。

  • 2 つの畳み込み層
  • 2 つの最大プーリング増
  • 2 つの高密度(全結合)層
  • 1 つのドロップアウト層

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

このバージョンの MNIST モデルでは、tf.estimator(上位の TensorFlow API)を使用します。これは、Cloud TPU で機械学習モデルをビルドして実行する場合に推奨される方法です。

Tensorflow Estimator 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 となります。

データを取得する

MNIST データセットは MNIST データベース サイトでホストされています。次の手順に従って、データをダウンロードして必要な形式に変換し、変換したデータを Cloud Storage にアップロードします。

MNIST データをダウンロードして変換する

convert_to_records.py スクリプトは、データをダウンロードし、例の MNIST モデルで想定される TFRecord 形式に変換します。

次のコマンドを使用して、スクリプトを実行し、ファイルを解凍します。

(vm)$ python /usr/share/tensorflow/tensorflow/examples/how_tos/reading_data/convert_to_records.py --directory=./data
(vm)$ gunzip ./data/*.gz

Cloud Storage にデータをアップロードする

TPU サーバーがデータにアクセスできるように、Cloud Storage バケットにデータをアップロードします。次のコマンドで変数を設定する場合は、YOUR-BUCKET-NAME を Cloud Storage バケットの名前に置き換えます。

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
(vm)$ gsutil cp -r ./data ${STORAGE_BUCKET}

TensorBoard を設定する

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

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

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

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

MNIST TPU モデルを実行する

MNIST TPU モデルは、Compute Engine VM の次のディレクトリにプリインストールされています。

/usr/share/models/official/mnist/

MNIST TPU モデルのソースコードは GitHub でも利用できます。Cloud TPU でモデルを実行できます。あるいはローカルマシン上でモデルを実行する方法をご覧ください。

Cloud TPU でモデルを実行する

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

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

    $ ctpu up

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

    (vm)$ python /usr/share/models/official/mnist/mnist_tpu.py \
      --tpu=$TPU_NAME \
      --data_dir=${STORAGE_BUCKET}/data \
      --model_dir=${STORAGE_BUCKET}/output \
      --use_tpu=True \
      --iterations=500 \
      --train_steps=2000
    

    • --tpu は Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。
    • --model_dir は、モデルのトレーニング中にチェックポイントと概要が保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)である必要があります。既存のフォルダを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。
    • --iterations は、制御を python に返す前に各呼び出しで TPU で実行するトレーニング ステップの数を指定します。この数値が小さすぎる(100 未満など)場合、通信オーバーヘッドが過剰になりパフォーマンスが低下する可能性があります。
    • --train_steps は、トレーニングを実行するためのステップ(バッチ)の合計数を指定します。

ローカル(TPU 以外の)マシンでモデルを実行する

TPU 以外のマシンでモデルを実行するには、--tpu を省略し、次のフラグを設定します。

--use_tpu=False

これにより、GPU が存在する場合は計算が GPU に届きます。GPU が存在しない場合、計算は CPU にフォールバックします。

今後について

デフォルトでは、tf.estimator モデルは損失値とステップ時間を次の形式で報告します。

    INFO:tensorflow:Calling model_fn.
    INFO:tensorflow:Create CheckpointSaverHook.
    INFO:tensorflow:Done calling model_fn.
    INFO:tensorflow:TPU job name tpu_worker
    INFO:tensorflow:Graph was finalized.
    INFO:tensorflow:Running local_init_op.
    INFO:tensorflow:Done running local_init_op.
    INFO:tensorflow:Init TPU system
    INFO:tensorflow:Start infeed thread controller
    INFO:tensorflow:Starting infeed thread controller.
    INFO:tensorflow:Start outfeed thread controller
    INFO:tensorflow:Starting outfeed thread controller.
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Saving checkpoints for 500 into gs://ctpu-mnist-test/output/model.ckpt.
    INFO:tensorflow:loss = 0.08896458, step = 0
    INFO:tensorflow:loss = 0.08896458, step = 0
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:global_step/sec: 242.829
    INFO:tensorflow:examples/sec: 248715
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Saving checkpoints for 2000 into gs://ctpu-mnist-test/output/model.ckpt.
    INFO:tensorflow:Stop infeed thread controller
    INFO:tensorflow:Shutting down InfeedController thread.
    INFO:tensorflow:InfeedController received shutdown signal, stopping.
    INFO:tensorflow:Infeed thread finished, shutting down.
    INFO:tensorflow:Stop output thread controller
    INFO:tensorflow:Shutting down OutfeedController thread.
    INFO:tensorflow:OutfeedController received shutdown signal, stopping.
    INFO:tensorflow:Outfeed thread finished, shutting down.
    INFO:tensorflow:Shutdown TPU system.
    INFO:tensorflow:Loss for final step: 0.044236258.

クリーンアップ

  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 の料金ガイドをご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

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