Cloud TPU での MNIST の実行

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

モデルの説明

MNIST データセットには、0 から 9 までの手書きの数字の画像と、各画像の数字を識別するラベルが含まれています。

このチュートリアルでは、MNIST データセットに基づいて画像を分類する機械学習モデルをトレーニングします。トレーニング後、このモデルは MNIST データセットの手書き画像から学習した内容に基づいて、受信画像を 10 個のカテゴリ(0〜9)のいずれかに分類します。まだ学習していない画像をモデルに送信した場合、モデルはトレーニングで学習した内容に基づいて画像内の数字を識別します。

MNIST データセットは次の 3 つの部分から構成されます。

  • 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 などの他のテスト プラットフォームを簡単に切り替えることができるようにします。

目標

  • データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
  • トレーニング ジョブを実行します。
  • 出力結果を確認します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。

新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

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

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

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

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

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

  4. このチュートリアルでは、Google Cloud の課金対象となるコンポーネントを使用します。費用を見積もるには、Cloud TPU の料金ページを確認してください。不要な課金を回避するために、このチュートリアルを完了したら、作成したリソースを必ずクリーンアップしてください。

リソースを設定する

このセクションでは、チュートリアルで使用する Cloud Storage、VM、Cloud TPU の各リソースを設定する方法を説明します。

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

    Cloud Shell を開く

  2. プロジェクト ID の変数を作成します。

    export PROJECT_ID=project-id
    
  3. Cloud TPU を作成するプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

    gcloud config set project ${PROJECT_ID}
    
  4. 次のコマンドを使用して Cloud Storage バケットを作成します。

    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 ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。

  5. ctpu up コマンドを使用して、ここで必要となる Compute Engine リソースを起動します。

    ctpu up --zone=europe-west4-a \
    --machine-type=n1-standard-8 \
    --tf-version=1.15.3 \
    --name=mnist-tutorial
    

    CTPU ユーティリティの詳細については、CTPU リファレンスを参照してください。

  6. プロンプトが表示されたら、y キーを押して Cloud TPU リソースを作成します。

ctpu up コマンドの実行が終了したら、shell プロンプトが username@projectname から username@vm-name に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。Compute Engine インスタンスに接続していない場合は、次のコマンドを実行して接続できます。

  gcloud compute ssh mnist-tutorial --zone=europe-west4-a

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

  1. Storage バケットとモデル ディレクトリの環境変数を作成します。 bucket-name は、使用する Cloud Storage バケットの名前に置き換えます。
    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=mnist-tutorial
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnist
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    

データを取得する

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

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

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

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

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

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

Cloud Storage バケットにデータをアップロードして、TPU サーバーがデータにアクセスできるようにします。

(vm)$ gsutil cp -r ./data ${DATA_DIR}

MNIST TPU モデルを実行する

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

/usr/share/tpu/models/official/mnist/

MNIST TPU モデルのソースコードは GitHub でも入手できます。モデルは Cloud TPU 上で実行できます。また、ローカルマシンでモデルを実行する方法もあります。

Cloud TPU でモデルを実行する

次の手順で、先頭が (vm)$ で始まるコマンドは、Compute Engine VM で実行することを表しています。

  1. モデル ディレクトリに移動します。

      (vm)$ cd /usr/share/tpu/models/official/mnist/
    
  2. MNIST モデルを実行します。

    (vm)$ python3 mnist_tpu.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --use_tpu=True \
      --iterations=500 \
      --train_steps=2000
     
    パラメータ 説明
    tpu Cloud TPU の名前です。ctpu は、この名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。VM に接続できない場合や接続が切断された場合は、ctpu up を再度実行して接続できます。gcloud compute ssh を実行して VM に接続した場合、TPU_NAME は設定されません
    data_dir トレーニングに使用するファイルが含まれているディレクトリです。
    model_dir モデル ファイルが含まれているディレクトリです。このチュートリアルでは、Cloud Storage バケット内のフォルダを使用します。フォルダが存在しない場合は、スクリプトによってフォルダが自動作成されます。 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.

クリーンアップ

このトピックで使用したリソースについて GCP アカウントに課金されないようにする手順は次のとおりです。

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

    (vm)$ exit
    

    プロンプトが username@projectname に変わります。これは、現在、Cloud Shell 内にいることを示しています。

  2. Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して ctpu delete を実行し、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete --zone=europe-west4-a \
      --name=mnist-tutorial
    
  3. TPU の使用に対して不要な料金が発生しないように、ctpu status を実行してインスタンスが割り当てられていないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    $ ctpu status --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:             --
    
  4. 次に示すように gsutil を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。

    $ gsutil rm -r gs://bucket-name
    

次のステップ