データ ストリーミング用の 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. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

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

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

    Cloud SDK をインストール

また、このチュートリアルでは、Cloud Bigtable に保存されているデータを使用します。Cloud Bigtable の使用方法については、Cloud Bigtable のドキュメントをご覧ください。

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.14
   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
    

データを準備する

Bigtable にデータをアップロードします。トレーニング アプリケーションでは、Cloud Bigtable でトレーニング データにアクセスできる必要があります。Bigtable にデータをアップロードする方法については、tensorflow_io/bigtable/README.md をご覧ください。

(省略可)TensorBoard をセットアップする

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

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

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

ResNet-50 モデルを実行する

データが Bigtable データベースに存在していれば、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
    

次のステップ

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

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