データ ストリーミング用の Cloud Bigtable

は、

Cloud Bigtable は、レイテンシが小さく、スケーラブルで、行のサイズが大きい構造のストレージ システムで、機械学習モデルのトレーニング データを保存して提供できます。Cloud Bigtable を使用すると、トレーニング データを超高速でストリーミングして、Cloud TPU を効率的に使用できます。

このチュートリアルでは、トレーニング データをホストする Cloud Bigtable を使用して、Cloud TPU の TensorFlow ResNet-50 モデルをトレーニングする方法を説明します。このプロセスでは、TensorFlow と Cloud Bigtable の統合が使用されます。

免責

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

要件と制限事項

構成を定義する際は、以下の点に注意してください。

  • Cloud Bigtable のサポートには、TensorFlow 1.11 以降を使用する必要があります。
  • Cloud Bigtable は、数百ギガバイト(GB)から数百万テラバイト(TB)を 1 秒あたり数十から数百ギガビット(Gbps)で処理する膨大な量のデータを持つ高パフォーマンス(ポッドスケール)のトレーニング ジョブを行う場合に推奨されます。このようなワークロードでない場合は、Cloud Storage を使用することをおすすめします。注: トレーニング データがオンザフライで生成される強化学習(RL)ワークロードについても Cloud Bigtable をおすすめします。

モデルとデータについて

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

トレーニング データセットは ImageNet であり、これは画像認識システムのトレーニングによく使用されます。

このチュートリアルでは、TPUEstimator を使用してモデルをトレーニングします。TPUEstimator は、上位の TensorFlow API である tf.estimator に基づいており、Cloud TPU で機械学習モデルを作成して実行する場合に推奨される方法です。この API は、詳細レベルの実装の大部分を隠蔽して、Cloud TPU と、GPU や CPU などの他のプラットフォームとの切り替えを簡単にすることで、モデル開発プロセスを簡素化します。

始める前に

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

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

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

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

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

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

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

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

  5. gcloud コマンドライン ツールを含む Cloud SDK をインストールします。

    Cloud SDK をインストール

Cloud Storage バケットの作成

モデルのトレーニングからチェックポイントおよび学習したウェイトを保存するには Cloud Storage バケットが必要です。

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

    Cloud Storage ページに移動

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

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

Cloud Bigtable インスタンスを作成する

トレーニング データをストリーミングする Cloud Bigtable インスタンスを作成します。

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

    Cloud Bigtable ページに移動

  2. 次のオプションを指定して、インスタンスを作成します。

    • インスタンス名: インスタンスの識別に役立つ名前。
    • インスタンス ID: インスタンスの永続的な識別子。
    • インスタンスのタイプ: 最適なパフォーマンスを得るには、[本番] を選択します。
    • ストレージの種類: [HDD] を選択します。
    • クラスタ ID: クラスタの永続的な識別子。
    • リージョン: リージョンを選択します。たとえば、us-central1 などです。Cloud TPU の使用可能なリージョンとゾーンに関するガイドをご覧ください。
    • ゾーン: ゾーンを選択します。たとえば、us-central1-b などです。Cloud TPU の使用可能なリージョンとゾーンに関するガイドをご覧ください。

    他の値はデフォルト設定のままでかまいません。詳細については、Cloud Bigtable インスタンスの作成に関するガイドをご覧ください。

ctpu ツールをダウンロードして設定する

このガイドでは、Cloud TPU プロビジョニング ユーティリティctpu)を使用します。これは Cloud TPU の設定と管理のためのシンプルなツールです。さらにこのガイドでは、Cloud Shell を使用するのではなく、ctpu と Cloud SDK をローカルで実行することを想定しています。Cloud Shell は一定期間使用しないとタイムアウトするため、Cloud Shell 環境は ImageNet データのダウンロードなどの時間がかかる手順には適していません。

  1. ctpu ガイドに従って、ctpu のダウンロード、インストール、構成を行います。

  2. gcloud ツールの環境とするプロジェクト、ゾーン、リージョンを設定します。YOUR-PROJECT-ID の部分は、使用する GCP プロジェクト ID に置き換えてください。

    $ gcloud config set project YOUR-PROJECT-ID
    $ gcloud config set compute/region us-central1
    $ gcloud config set compute/zone us-central1-b
    
  3. 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-id]
            zone: us-central1-b
    If you would like to change the configuration for a single command invocation, please use the command line flags.
    If you would like to change the configuration generally, see `gcloud config configurations`.
    

    出力メッセージでは、name が Cloud TPU の名前(デフォルトはユーザー名)で、zone が Compute Engine リソースのデフォルトの地域ゾーン(デフォルトは us-central1-b)になります。Cloud TPU の利用可能なリージョンとゾーンのリストをご覧ください。後続部分で説明するように、名前やゾーンなどのプロパティは、ctpu up を実行する際に変更できます。

Cloud TPU のアクセス権を設定する

Cloud TPU サービス アカウントに次のアクセス権を設定します。

  1. Cloud TPU に GCP プロジェクトの Cloud Bigtable へのアクセス権を与えます(ctpu はデフォルトでいくつかのアクセス権を適用しますが、このアクセス権は適用しません)。

    $ ctpu auth add-bigtable
    

    次のコマンドを実行すると、Cloud TPU のアクセス権を確認できます。

    $ ctpu auth list
    
  2. (オプション)Cloud Storage のアクセス権を更新します。ctpu up コマンドは、Cloud Storage のデフォルトのアクセス権を設定します。権限を細かく設定する必要がある場合は、アクセスレベル権限を確認して更新してください。

Compute Engine VM と Cloud TPU を作成する

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

$ ctpu up [optional: --name --zone]

次のパターンに従うメッセージが表示されます。

ctpu will use the following configuration:

   Name: [your TPU's name]
   Zone: [your project's zone]
   GCP Project: [your project's name]
   TensorFlow Version: 1.13
   VM:
     Machine Type: [your machine type]
     Disk Size: [your disk size]
     Preemptible: [true or false]
   Cloud TPU:
     Size: [your TPU size]
     Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

y を入力して Enter キーを押し、Cloud TPU リソースを作成します。

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

  • Compute Engine と Cloud TPU サービスを有効にします。
  • 最新の安定した TensorFlow バージョンがプリインストールされた Compute Engine VM インスタンスを作成します。
  • 対応するバージョンの TensorFlow を使用して Cloud TPU を作成し、Compute Engine VM インスタンスに Cloud TPU の名前を環境変数(TPU_NAME)として渡します。
  • 特定の IAM の役割を Cloud TPU サービス アカウントに付与して、Cloud TPU が GCP プロジェクトから必要なリソースにアクセスできるようにします。
  • その他数多くのチェックを行います。
  • 新しい Compute Engine VM インスタンスにユーザーをログインさせます。

ctpu up は必要に応じて何度でも実行できます。たとえば、Compute Engine VM との SSH 接続が失われた場合は、ctpu up を実行して接続を復元します。(--name--zone のデフォルト値を変更した場合、ctpu up を実行するたびにこれらを指定する必要があります。)詳細については、ctpu のドキュメントをご覧ください。

VM インスタンスにログインしていることを確認する

ctpu up コマンドの実行が終了したら、シェル プロンプトが username@project から username@tpuname に変更されたことを確認します。この変更により、現在 Compute Engine VM インスタンスにログインしていることがわかります。

いくつかの便利な変数を設定する

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

このチュートリアルのコマンドを簡略化するために、いくつかの環境変数を設定します。

  1. PROJECT 変数を設定します。YOUR-PROJECT-ID の部分は、使用する GCP プロジェクト ID で置き換えます。

    (vm)$ export PROJECT=YOUR-PROJECT-ID
    
  2. STORAGE_BUCKET 変数を設定し、YOUR-BUCKET-NAME を Cloud Storage バケットの名前に置き換えます。

    (vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
    
  3. BIGTABLE_INSTANCE 変数を設定し、YOUR-INSTANCE-ID を先ほど作成した Cloud Bigtable インスタンスの ID に置き換えます。

    (vm)$ export BIGTABLE_INSTANCE=YOUR-INSTANCE-ID
    

データを準備する

トレーニング アプリケーションでは、Cloud Bigtable でトレーニング データにアクセスできる必要があります。このセクションでは、ImageNet データをダウンロードしてこれを TFRecord ファイルに変換し、このデータを Cloud Bigtable にアップロードする方法を説明します。

ImageNet データセットをダウンロードして処理するには、数時間かかることがあります。

また、架空のデータセットを使用して、モデル トレーニング プロセスの迅速なテストを行うこともできます。

(オプション)テスト用に架空のデータセットを使用する

迅速なテストを行うために、完全な ImageNet データセットではなく、ランダムに生成された架空のデータセットを使用できます。架空のデータセットは、Cloud TPU の使用方法を理解し、エンドツーエンドの手順を検証する場合にのみ役立ちます。結果の精度の数値と保存されたモデルには意味がなく、トレーニング プロセスでは Cloud Bigtable からのデータのストリーミングが効果的にテストされません。

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

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

架空のデータセットを使用するには、次の操作を行います。

  1. 次の環境変数を設定します。

    (vm)$ export TRAINING_DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    
  2. データを Cloud Bigtable にコピーするのセクションに直接移動します。

ディスク容量を確認する

以下のセクションは、完全な ImageNet データセットを使用することを前提としています。

ImageNet データをダウンロードして変換するスクリプトを実行するには、ローカルマシンまたは VM インスタンスに約 500 GB の空き容量が必要です。

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

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

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

以下の手順は、Compute Engine VM インスタンス上でデータを処理することを前提としています。

ImageNet データをダウンロードし、TFRecord 形式に変換します。

  1. ImageNet アカウントに登録します。アカウントの作成に使用するユーザー名とパスワードを記録します。

  2. データ ダウンロード スクリプトによって作成されたデータファイルを格納するための TRAINING_DATA_DIR 変数を設定します。変数は、ローカルマシン上または Compute Engine VM インスタンス上の場所を指定する必要があります。たとえば、次の場所の指定は、Compute Engine VM インスタンスに追加のディスク容量をマウントしたことを想定しています。

    (vm)$ export TRAINING_DATA_DIR=/mnt/disks/mnt-dir/imagenet-data
    

    あるいは、$HOME ディレクトリ内の場所を設定します。

    (vm)$ export TRAINING_DATA_DIR=$HOME/imagenet-data
    
  3. GitHub から imagenet_to_gcs.py スクリプトをダウンロードします。

    (vm)$ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    
  4. Cloud Storage コマンドライン ツールをインストールします。

    (vm)$ pip install gcloud google-cloud-storage
    
  5. 以下に示すように imagenet_to_gcs.py スクリプトを実行します。--nogcs_upload オプションを使用して、ダウンロードしてから Cloud Storage にアップロードするのではなく、ファイルのダウンロードのみ行います。

    (vm)$ python imagenet_to_gcs.py \
      --local_scratch_dir=${TRAINING_DATA_DIR} \
      --nogcs_upload \
      --imagenet_username=YOUR-IMAGENET-USERNAME \
      --imagenet_access_key=YOUR-IMAGENET-PASSWORD
    

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

    このスクリプトにより、トレーニング データと検証データ用のイメージを含むディレクトリが以下のパターンで生成されます。

    • トレーニング データ: ${TRAINING_DATA_DIR}/train/n03062245/n03062245_4620.JPEG
    • 検証データ: ${TRAINING_DATA_DIR}/validation/ILSVRC2012_val_00000001.JPEG
    • 検証ラベル: ${TRAINING_DATA_DIR}/synset_labels.txt

データを Cloud Bigtable にコピーする

次のスクリプトは、トレーニング データをローカル ドライブまたは VM インスタンスから Cloud Bigtable にコピーして、トレーニング アプリケーションにストリーミングできるようにします。架空のデータセットの使用を選択した場合、TRAINING_DATA_DIR 環境変数の設定に従って、スクリプトは Cloud Storage から Cloud Bigtable にデータを直接コピーします。

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

    (vm)$ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/tfrecords_to_bigtable.py
    
  2. Cloud Bigtable のコマンドライン インターフェースである cbt ツールをインストールします。

    (vm)$ sudo apt install google-cloud-sdk-cbt
    
  3. Cloud Bigtable のデフォルト プロジェクト設定を保存するための .cbtrc ファイルをホーム ディレクトリに作成します。

    (vm)$ echo -e "project = $PROJECT\ninstance = $BIGTABLE_INSTANCE" > ~/.cbtrc
    
  4. トレーニング データ用の Cloud Bigtable テーブルと列ファミリーを作成します。以下の例は、いくつかの環境変数を設定し、imagenet-data という名前の Cloud Bigtable テーブルと tfexample という名前の列ファミリーを作成します。

    (vm)$ export TABLE_NAME=imagenet-data
    (vm)$ export FAMILY_NAME=tfexample
    (vm)$ export COLUMN_QUALIFIER=example
    (vm)$ export ROW_PREFIX_TRAIN=train_
    (vm)$ export ROW_PREFIX_EVAL=validation_
    (vm)$ cbt createtable $TABLE_NAME
    (vm)$ cbt createfamily $TABLE_NAME $FAMILY_NAME
    
  5. tfrecords_to_bigtable.py スクリプトを実行してトレーニング データを Cloud Bigtable にコピーします。

    (vm)$ pip install --upgrade google-cloud-bigtable
    (vm)$ python tfrecords_to_bigtable.py \
      --source_glob=$TRAINING_DATA_DIR/train* \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --column_family=$FAMILY_NAME \
      --column=$COLUMN_QUALIFIER \
      --row_prefix=$ROW_PREFIX_TRAIN
    

    スクリプトの実行には数分かかることがあります。終了すると、次のような出力が表示されます。

    Found 1024 files (from "gs://cloud-tpu-test-datasets/fake_imagenet/train-00000-of-01024" to "gs://cloud-tpu-test-datasets/fake_imagenet/train-01023-of-01024")
    --project was not set on the command line, attempting to infer it from the metadata service...
    Dataset ops created; about to create the session.
    2018-10-12 21:07:12.585287: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Starting transfer...
    Complete!
    
  6. tfrecords_to_bigtable.py スクリプトをもう一度実行します。今回は、評価データを Cloud Bigtable にコピーします。

    (vm)$ python tfrecords_to_bigtable.py \
      --source_glob=$TRAINING_DATA_DIR/validation* \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --column_family=$FAMILY_NAME \
      --column=$COLUMN_QUALIFIER \
      --row_prefix=$ROW_PREFIX_EVAL
    

    出力例:

    Found 128 files (from "gs://cloud-tpu-test-datasets/fake_imagenet/validation-00000-of-00128" to "gs://cloud-tpu-test-datasets/fake_imagenet/validation-00127-of-00128")
    --project was not set on the command line, attempting to infer it from the metadata service...
    Dataset ops created; about to create the session.
    2018-10-12 22:21:56.891413: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Starting transfer...
    Complete!
    

(オプション)TensorBoard をセットアップする

TensorBoard には、TensorFlow データを視覚的に表示するための一連のツールが用意されています。モニタリングに使用することで、処理のボトルネックを特定し、パフォーマンスの改善方法を探る際に役立ちます。

この時点でモデルの出力を監視する必要がない場合は、TensorBoard の設定手順をスキップできます。

モデルの出力とパフォーマンスを監視する場合は、TensorBoard の設定に関するガイドをご覧ください。

ResNet-50 モデルを実行する

これで、Cloud Bigtable からトレーニング データをストリーミングし、Cloud TPU で ResNet-50 モデルをトレーニングして評価する準備が整いました。トレーニング アプリケーションは、トレーニング済みのモデルと中間チェックポイントを Cloud Storage に書き出します。

Compute Engine VM インスタンスで次のコマンドを実行します。

  1. Python パスにトップレベルの /models フォルダを追加します。

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. ResNet-50 モデルがあらかじめインストールされている Compute Engine VM インスタンスのディレクトリに移動します。

    (vm)$ cd /usr/share/tpu/models/official/resnet/
    
  3. トレーニング スクリプトを実行します。

    (vm)$ python resnet_main.py \
      --tpu=$TPU_NAME \
      --model_dir=${STORAGE_BUCKET}/resnet \
      --bigtable_project=$PROJECT \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --bigtable_column_family=$FAMILY_NAME \
      --bigtable_column_qualifier=$COLUMN_QUALIFIER \
      --bigtable_train_prefix=$ROW_PREFIX_TRAIN \
      --bigtable_eval_prefix=$ROW_PREFIX_EVAL
    
    • --tpu は Cloud TPU の名前を指定します。ctpu はこの名前を環境変数(TPU_NAME)として Compute Engine VM インスタンスに渡します。
    • --model_dir は、モデルのトレーニング中にチェックポイントと概要が保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage のパス(gs://...)である必要があります。既存のディレクトリを再利用して、現在のチェックポイント データを読み込み、追加のチェックポイントを保存できます。
    • --bigtable_project は、トレーニング データを保持する Cloud Bigtable インスタンスの GCP プロジェクトの識別子を指定します。この値を指定しないと、プログラムは Cloud TPU と Cloud Bigtable インスタンスが同じ GCP プロジェクトにあるとみなします。
    • --bigtable_instance は、トレーニング データを保持する Cloud Bigtable インスタンスの ID を指定します。
    • --bigtable_table は、トレーニング データを保持する Cloud Bigtable テーブルの名前を指定します。
    • --bigtable_column_family は、Cloud Bigtable ファミリーの名前を指定します。
    • --bigtable_column_qualifier は、Cloud Bigtable 列修飾子の名前を指定します。ストレージ モデルの説明については、Cloud Bigtable の概要をご覧ください。

今後について

上記の手順では、ResNet-50 モデルを 90 エポックでトレーニングし、1,251 ステップごとにモデルを評価します。モデルが使用するデフォルト値と、デフォルトを変更するために使用できるフラグについては、TensorFlow ResNet-50 モデルのコードと README をご覧ください。デフォルトのフラグを使用すると、モデルは 76% を超える精度までトレーニングされます。

Google でのテストでは、Cloud Bigtable は ImageNet トレーニングなどのワークロードに対して非常に高いスループットのパフォーマンスを示し、ノードあたり毎秒数百メガバイトのスキャン スループットがサポートされました。

クリーンアップ

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

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

    (vm)$ exit
    

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

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

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

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 次に示す gsutil を実行します。YOUR-BUCKET-NAME の部分は、このチュートリアルで作成した Cloud Storage バケットの名前に置き換えてください。

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    
  1. Cloud Bigtable でトレーニング データが不要になったら、Cloud Shell で次のコマンドを実行して、Cloud Bigtable インスタンスを削除します(BIGTABLE_INSTANCE 変数は、以前使用した Cloud Bigtable インスタンス ID にする必要があります)。

    $ cbt deleteinstance $BIGTABLE_INSTANCE
    

次のステップ

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

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