Cloud TPU と GKE を使用した ResNet のトレーニング

このチュートリアルでは、Cloud TPU と GKE で TensorFlow ResNet-50 モデルのトレーニングを行う方法について説明します。

チュートリアルの内容を要約すると、ここではテスト用に提供されている架空のデータセットを使用してモデルを実行する方法を、次の手順に沿って説明します。

  • モデル出力を格納する Cloud Storage バケットを作成します。
  • Cloud TPU リソースを管理する GKE クラスタを作成します。
  • Kubernetes ジョブ仕様をダウンロードします。このジョブ仕様には、Cloud TPU 上の TensorFlow で ResNet-50 をトレーニングするために必要なリソースが規定されています。
  • GKE クラスタでジョブを実行し、モデルのトレーニングを開始します。
  • ログとモデル出力を確認します。

始める前に

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

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

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

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

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

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

  4. GKE で Cloud TPU を使用する際に、プロジェクトは Google Cloud Platform の課金対象となるコンポーネントを使用します。Cloud TPU の料金および GKE の料金を確認して費用を見積もり、使い終わったら手順に沿ってリソースのクリーンアップを行います。

  5. GCP Console で、次の API を有効にします。

シェルを選択してコマンドライン ツールをインストールする(必要な場合)

このチュートルアルを行うには、Cloud Shell とローカルシェルのどちらを使用してもかまいません。Cloud Shell には gcloudkubectl の両方のコマンドライン ツールがプリインストールされています。gcloud は GCP 用のコマンドライン インターフェースです。kubectl には、Kubernetes クラスタに対してコマンドを実行するコマンドライン インターフェースが用意されています。

ローカルシェルを使用する場合は、ご使用の環境に gcloud および kubectl コマンドライン ツールをインストールする必要があります。

Cloud Shell

Cloud Shell を起動するには、次の手順に従います。

  1. Google Cloud Platform Console に移動します。

  2. Console の右上隅にある [Cloud Shell をアクティブにする] ボタンをクリックします。

Console の下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルを使用して、gcloud コマンドおよび kubectl コマンドを実行します。

ローカルシェル

gcloudkubectl をインストールする手順は以下のとおりです。

  1. Google Cloud SDK をインストールします。この SDK に gcloud コマンドライン ツールが含まれています。

  2. 次のコマンドを実行して kubectl コマンドライン ツールをインストールします。

    $ gcloud components install kubectl
  3. gcloud コンポーネントをインストールします。GKE を Cloud TPU で実行するには、このコンポーネントが必要です。

    $ gcloud components install

データとストレージ バケットを設定する

モデルをトレーニングするには、このチュートリアルに付属の架空のデータを使用することも、完全な ImageNet データを使用することもできます。いずれにしても、以降の説明に従って Cloud Storage バケットを設定する必要があります。

架空のデータセットまたは ImageNet データを使用する

次の手順では、ランダムに生成された架空のデータセットを使用してモデルをテストすることを想定しています。別の方法として、完全な ImageNet データセットを使用する手順に従うこともできます。

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

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

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

Cloud Storage バケットを作成する

機械学習モデルのトレーニング結果を保存するには Cloud Storage バケットが必要です。このチュートリアルに付属の架空のデータセットではなく、実際のトレーニング データを使用することにした場合は、同じバケットにデータを保管できます。

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

    Cloud Storage ページに移動

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

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

Cloud TPU に Cloud Storage バケットへのアクセスを許可する

Cloud TPU に Cloud Storage オブジェクトに対する読み取り / 書き込みアクセス権を付与する必要があります。そのためには、Cloud TPU で使用するサービス アカウントに必要なアクセス権を付与します。ガイドに沿ってストレージ バケットに対するアクセス権を付与してください。

GKE でクラスタを作成する

GCP Console または gcloud コマンドライン ツールを使用して、GKE クラスタを作成できます。以下のオプションを選択し、関連する手順をご覧ください。

Console

Cloud TPU をサポートする GKE クラスタの作成手順は以下のとおりです。

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

    GKE ページに移動

  2. [クラスタを作成] をクリックします。

  3. クラスタの [名前] を指定します。名前はプロジェクトとゾーン内で一意にする必要があります。たとえば、tpu-models-cluster とします。

  4. Cloud TPU リソースを使用する予定のゾーンを指定します。たとえば、us-central1-b ゾーンを選択します。

    Cloud TPU は次のゾーンで使用できます。

    米国

    Cloud TPU v2 およびプリエンプティブ v2 us-central1-b
    us-central1-c
    us-central1-fTFRC プログラムのみ)
    Cloud TPU v3 およびプリエンプティブ v3 us-central1-a
    us-central1-b
    us-central1-f
    TFRC プログラムのみ)
    Cloud TPU v2 Pod(アルファ版) us-central1-a

    ヨーロッパ

    Cloud TPU v2 およびプリエンプティブ v2 europe-west4-a
    Cloud TPU v3 およびプリエンプティブ v3 europe-west4-a
    Cloud TPU v2 Pod(アルファ版) europe-west4-a

    アジア太平洋

    Cloud TPU v2 およびプリエンプティブ v2 asia-east1-c
  5. Cloud TPU をサポートできるよう、[クラスタ バージョン] が 1.10.4-gke.2 以降に設定されていることを確認します。

  6. ページの一番下までスクロールし、[その他] をクリックします。

  7. [VPC ネイティブ(エイリアス IP を使用)] を有効にします。

  8. [Cloud TPU] を有効にします。

  9. [アクセス スコープ] を [すべての Cloud API に完全アクセス権を許可] に設定します。これにより、クラスタ内のすべてのノードに Cloud Storage バケットに対するアクセス権が付与されます。この設定を機能させるためには、クラスタとストレージ バケットが同じプロジェクト内に存在していなければなりません。デフォルトでは、ポッドはデプロイされているノードのスコープを継承します。ポッド単位でアクセスを制限したい場合は、GKE のサービス アカウントで認証するためのガイドを参照してください。

  10. クラスタの残りのオプションを、必要に応じて構成します。デフォルト値のままにしておくこともできます。

  11. [作成] をクリックします。

gcloud

gcloud コマンドライン ツールを使用して環境を設定し、Cloud TPU をサポートする GKE クラスタを作成する手順は以下のとおりです。

  1. GCP プロジェクトを指定します。

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

    YOUR-CLOUD-PROJECT は、GCP プロジェクトの名前です。

  2. Cloud TPU リソースを使用する予定のゾーンを指定します。この例では、us-central1-b ゾーンを使用します。

    $ gcloud config set compute/zone us-central1-b
    

    Cloud TPU は次のゾーンで使用できます。

    米国

    Cloud TPU v2 およびプリエンプティブ v2 us-central1-b
    us-central1-c
    us-central1-fTFRC プログラムのみ)
    Cloud TPU v3 およびプリエンプティブ v3 us-central1-a
    us-central1-b
    us-central1-f
    TFRC プログラムのみ)
    Cloud TPU v2 Pod(アルファ版) us-central1-a

    ヨーロッパ

    Cloud TPU v2 およびプリエンプティブ v2 europe-west4-a
    Cloud TPU v3 およびプリエンプティブ v3 europe-west4-a
    Cloud TPU v2 Pod(アルファ版) europe-west4-a

    アジア太平洋

    Cloud TPU v2 およびプリエンプティブ v2 asia-east1-c
  3. gcloud container clusters コマンドを使用して、Cloud TPU をサポートするクラスタを GKE 上に作成します。GKE クラスタとそのノードプールは、Cloud TPU を使用できるゾーン内に作成する必要があります。該当するゾーンは、上記の環境変数に関するセクションに記載されています。次のコマンドは、tpu-models-cluster という名前のクラスタを作成します。

    $ gcloud container clusters create tpu-models-cluster \
      --cluster-version=1.10 \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    上記のコマンドの各要素の意味は次のとおりです。

    • --cluster-version=1.10 は、クラスタが最新の Kubernetes 1.10 リリースを使用することを示します。使用するバージョンは 1.10.4-gke.2 以降でなければなりません。
    • --scopes=cloud-platform を設定することで、クラスタ内のすべてのノードに、上記の YOUR-CLOUD-PROJECT で定義された GCP 内の Cloud Storage バケットに対するアクセス権が付与されます。この設定を機能させるためには、クラスタとストレージ バケットが同じプロジェクト内に存在していなければなりません。デフォルトでは、ポッドはデプロイされているノードのスコープを継承します。したがって、--scopes=cloud-platform により、クラスタ内で実行しているすべてのポッドに cloud-platform スコープが設定されます。ポッド単位でアクセスを制限したい場合は、GKE のサービス アカウントで認証するためのガイドを参照してください。
    • --enable-ip-alias は、クラスタがエイリアス IP 範囲を使用することを示します。これは、GKE 上で Cloud TPU を使用する場合に必要です。
    • --enable-tpu は、クラスタが Cloud TPU をサポートしなければならないことを示します。

      コマンドの実行が完了すると、次のような確認メッセージが表示されます。

      kubeconfig entry generated for tpu-models-cluster. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-models-cluster us-central1-b 1.10.4-gke.2 35.232.204.86 n1-standard-2 1.10.4-gke.2 3 RUNNING

ResNet-50 モデルを実行する

Cloud TPU と GKE を使用して ResNet-50 モデルを実行するための準備がすべて整いました。

  1. resnet_k8s.yaml という名前のファイル内に、ジョブ仕様を作成します。

    • 作成済みのジョブ仕様を GitHub からダウンロードまたはコピーします。
    • ジョブ仕様に含まれる <my-model-bucket> を、前のステップで作成した Cloud Storage バケットの名前に変更します。

    ジョブ仕様で参照している TensorFlow TPU モデルが含まれる Docker コンテナは、gcr.io/tensorflow/tpu-models にあります(これは、Container Registry 上の場所です)。

  2. GKE クラスタ内にジョブを作成します。

    $ kubectl create -f resnet_k8s.yaml
    job "resnet-tpu" created
  3. ジョブがスケジュールされるまで待ちます。

    $ kubectl get pods -w
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

    Cloud TPU ノードの存続期間は、それらのノードをリクエストするポッドにバインドされます。Cloud TPU は、ポッドがスケジュールされるとオンデマンドで作成され、ポッドが削除されるとリサイクルされます。

    Pod のスケジュールが完了するまでに約 5 分かかります。

    5 分後に、次のような出力が表示されます。

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    
  4. ジョブの処理内容を調べるには、ポッドのログを確認します。

    $ kubectl logs resnet-tpu-cmvlf

    GCP Console の GKE ワークロード ダッシュボードで出力を確認することもできます。

    ログに最初のエントリが表示されるまでには時間がかかるのでご注意ください。次のような出力が表示されます。

    I0622 18:14:31.617954 140178400511808 tf_logging.py:116] Calling model_fn.
    I0622 18:14:40.449557 140178400511808 tf_logging.py:116] Create CheckpointSaverHook.
    I0622 18:14:40.697138 140178400511808 tf_logging.py:116] Done calling model_fn.
    I0622 18:14:44.004508 140178400511808 tf_logging.py:116] TPU job name worker
    I0622 18:14:45.254548 140178400511808 tf_logging.py:116] Graph was finalized.
    I0622 18:14:48.346483 140178400511808 tf_logging.py:116] Running local_init_op.
    I0622 18:14:48.506665 140178400511808 tf_logging.py:116] Done running local_init_op.
    I0622 18:14:49.135080 140178400511808 tf_logging.py:116] Init TPU system
    I0622 18:15:00.188153 140178400511808 tf_logging.py:116] Start infeed thread controller
    I0622 18:15:00.188635 140177578452736 tf_logging.py:116] Starting infeed thread controller.
    I0622 18:15:00.188838 140178400511808 tf_logging.py:116] Start outfeed thread controller
    I0622 18:15:00.189151 140177570060032 tf_logging.py:116] Starting outfeed thread controller.
    I0622 18:15:07.316534 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:15:07.316904 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:16:13.881397 140178400511808 tf_logging.py:116] Saving checkpoints for 100 into gs://<my-model-bucket>/resnet/model.ckpt.
    I0622 18:16:21.147114 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.148168 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.150870 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:16:21.151168 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:00.739207 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:17:00.739809 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:36.598773 140178400511808 tf_logging.py:116] global_step/sec: 2.65061
    I0622 18:17:37.040504 140178400511808 tf_logging.py:116] examples/sec: 2698.56
    I0622 18:17:37.041333 140178400511808 tf_logging.py:116] loss = 2.63023, step = 200 (75.893 sec)
    
  5. gs://<my-model-bucket>/resnet/model.ckpt でトレーニング後のモデルを表示します。バケットは、GCP Console の Cloud Storage ブラウザページで確認できます。

クリーンアップ

GKE 上で Cloud TPU を使い終わったら、リソースをクリーンアップして、Google Cloud Platform アカウントに余分に課金されないようにしてください。

Console

GKE クラスタを削除します。

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

    GKE ページに移動

  2. 削除するクラスタの横にあるチェックボックスをオンにします。

  3. [削除] をクリックします。

データの検証が終了したら、このチュートリアルで作成した Cloud Storage バケットを削除します。

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

    Cloud Storage ページに移動

  2. 削除するバケットの横にあるチェックボックスをオンにします。

  3. [削除] をクリックします。

無料の保存容量の制限やその他の料金に関する情報については、Cloud Storage の料金ガイドをご覧ください。

gcloud

このセッションでプロジェクトとゾーンを設定していない場合は、この時点で設定します。このガイドの上述の手順をご覧ください。続いて、次のクリーンアップ手順を実行します。

  1. tpu-models-cluster コマンドを実行して GKE クラスタを削除します。YOUR-PROJECT は、該当する GCP プロジェクト名で置き換えてください。

    $ gcloud container clusters delete tpu-models-cluster --project=YOUR-PROJECT
    
  2. データの検証が終了したら、gsutil コマンドを使用して、このチュートリアルで作成した Cloud Storage バケットを削除します。YOUR-BUCKET は、該当する Cloud Storage バケットの名前で置き換えてください。

    $ gsutil rm -r gs://YOUR-BUCKET
    

    無料の保存容量の制限やその他の料金に関する情報については、Cloud Storage の料金ガイドをご覧ください。

次のステップ

  • TensorBoard の TPU ツールを確認します。
  • 次のジョブ仕様のいずれかを使用して、他のモデルとデータセット取得ジョブを実行する。

    • GKE に COCO データセットをダウンロードして前処理します。
    • GKE に ImageNet をダウンロードして前処理します。
    • Cloud TPU と GKE を使用して AmoebaNet-D をトレーニングします。
    • Cloud TPU と GKE を使用して Inception v3 をトレーニングします。
    • Cloud TPU と GKE を使用して RetinaNet をトレーニングします。
  • 他の TPU サンプルで試してみる。

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

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