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

  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. コンソールの右上隅にある [Cloud Shell をアクティブにする] ボタンをクリックします。

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

ローカルシェル

gcloudkubectl をインストールするには、次の手順に従います。

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

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

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

    $ gcloud components install

要件と制限事項

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

  • GKE バージョン 1.13.4-gke.5 以降を使用する必要があります。バージョンを指定するには、下記の説明にあるように、gcloud container clusters create コマンドに --cluster-version パラメータを追加します。詳しくは、SDK のドキュメントをご覧ください。
  • TensorFlow 1.13 以降を使用する必要があります。resnet config のように、Kubernetes ポッド仕様で TensorFlow のバージョンを指定できます。
  • GKE クラスタおよびノードプールは、Cloud TPU を使用できるゾーン内に作成する必要があります。GKE クラスタと同じリージョン内に、トレーニング データとモデルを格納する Cloud Storage バケットを作成する必要もあります。以下のゾーンを選択できます。

    US

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    us-central1-f TFRC のみ
    v2-32(ベータ版) 32 256 GiB us-central1-a
    v2-128(ベータ版) 128 1 TiB us-central1-a
    v2-256(ベータ版) 256 2 TiB us-central1-a
    v2-512(ベータ版) 512 4 TiB us-central1-a
    TPU タイプ(v3) TPU v3 コア数 TPU メモリ合計 利用可能なゾーン
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    us-central1-f TFRC のみ

    ヨーロッパ

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB europe-west4-a
    v2-32(ベータ版) 32 256 GiB europe-west4-a
    v2-128(ベータ版) 128 1 TiB europe-west4-a
    v2-256(ベータ版) 256 2 TiB europe-west4-a
    v2-512(ベータ版) 512 4 TiB europe-west4-a
    TPU タイプ(v3) TPU v3 コア数 TPU メモリ合計 利用可能なゾーン
    v3-8 8 128 GiB europe-west4-a
    v3-32(ベータ版) 32 512 GiB europe-west4-a
    v3-64(ベータ版) 64 1 TiB europe-west4-a
    v3-128(ベータ版) 128 2 TiB europe-west4-a
    v3-256(ベータ版) 256 4 TiB europe-west4-a
    v3-512(ベータ版) 512 8 TiB europe-west4-a
    v3-1024(ベータ版) 1024 16 TiB europe-west4-a
    v3-2048(ベータ版) 2048 32 TiB europe-west4-a

    アジア太平洋

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB asia-east1-c
  • 各コンテナがリクエストできる Cloud TPU は 1 つまでですが、1 つのポッド内の複数のコンテナのそれぞれが Cloud TPU をリクエストできます。
  • クラスタ オートスケーラーは GKE 1.11.4-gke.12 以上で Cloud TPU をサポートします。

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

モデルをトレーニングするには、このチュートリアルに付属の架空のデータを使用することも、完全版の 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. 次のオプションを指定して新しいバケットを作成します。

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

    バケットのロケーションは、GKE クラスタ内でプロビジョニングされている TPU リソースと同じリージョン内にある必要があります。

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

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

GKE でクラスタを作成する

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

Console

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

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

    GKE ページに移動

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

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

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

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

    US

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    us-central1-f TFRC のみ
    v2-32(ベータ版) 32 256 GiB us-central1-a
    v2-128(ベータ版) 128 1 TiB us-central1-a
    v2-256(ベータ版) 256 2 TiB us-central1-a
    v2-512(ベータ版) 512 4 TiB us-central1-a
    TPU タイプ(v3) TPU v3 コア数 TPU メモリ合計 利用可能なゾーン
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    us-central1-f TFRC のみ

    ヨーロッパ

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB europe-west4-a
    v2-32(ベータ版) 32 256 GiB europe-west4-a
    v2-128(ベータ版) 128 1 TiB europe-west4-a
    v2-256(ベータ版) 256 2 TiB europe-west4-a
    v2-512(ベータ版) 512 4 TiB europe-west4-a
    TPU タイプ(v3) TPU v3 コア数 TPU メモリ合計 利用可能なゾーン
    v3-8 8 128 GiB europe-west4-a
    v3-32(ベータ版) 32 512 GiB europe-west4-a
    v3-64(ベータ版) 64 1 TiB europe-west4-a
    v3-128(ベータ版) 128 2 TiB europe-west4-a
    v3-256(ベータ版) 256 4 TiB europe-west4-a
    v3-512(ベータ版) 512 8 TiB europe-west4-a
    v3-1024(ベータ版) 1024 16 TiB europe-west4-a
    v3-2048(ベータ版) 2048 32 TiB europe-west4-a

    アジア太平洋

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB asia-east1-c
  5. 前の手順で指定したゾーン内の Cloud TPU ノードに十分な割り当て量があることを確認します。

  6. Cloud TPU をサポートできるよう、クラスタ バージョンが 1.13.4-gke.5 以降に設定されていることを確認します。

  7. ページの下部までスクロールして、[その他のオプション] をクリックします。

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

  9. ページの下までスクロールし、[可用性、ネットワーキング、セキュリティ、その他の機能] をクリックします。同じページにウィンドウが開きます。

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

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

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

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

  14. クラスタに接続します。それには、Console の [Kubernetes クラスタ] ページでクラスタを選択してから [接続] ボタンをクリックします。この新しいクラスタと kubectl を接続するために Cloud Shell で実行される gcloud コマンドが表示されます。

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 は次のゾーンで使用できます。

    US

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    us-central1-f TFRC のみ
    v2-32(ベータ版) 32 256 GiB us-central1-a
    v2-128(ベータ版) 128 1 TiB us-central1-a
    v2-256(ベータ版) 256 2 TiB us-central1-a
    v2-512(ベータ版) 512 4 TiB us-central1-a
    TPU タイプ(v3) TPU v3 コア数 TPU メモリ合計 利用可能なゾーン
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    us-central1-f TFRC のみ

    ヨーロッパ

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB europe-west4-a
    v2-32(ベータ版) 32 256 GiB europe-west4-a
    v2-128(ベータ版) 128 1 TiB europe-west4-a
    v2-256(ベータ版) 256 2 TiB europe-west4-a
    v2-512(ベータ版) 512 4 TiB europe-west4-a
    TPU タイプ(v3) TPU v3 コア数 TPU メモリ合計 利用可能なゾーン
    v3-8 8 128 GiB europe-west4-a
    v3-32(ベータ版) 32 512 GiB europe-west4-a
    v3-64(ベータ版) 64 1 TiB europe-west4-a
    v3-128(ベータ版) 128 2 TiB europe-west4-a
    v3-256(ベータ版) 256 4 TiB europe-west4-a
    v3-512(ベータ版) 512 8 TiB europe-west4-a
    v3-1024(ベータ版) 1024 16 TiB europe-west4-a
    v3-2048(ベータ版) 2048 32 TiB europe-west4-a

    アジア太平洋

    TPU タイプ(v2) TPU v2 コア数 TPU メモリ合計 利用可能なゾーン
    v2-8 8 64 GiB asia-east1-c
  3. Cloud TPU をサポートするクラスタを GKE 上に作成するには、gcloud container clusters コマンドを使用します。上記の環境変数に関するセクションで説明されているように、GKE クラスタとノードプールは、Cloud TPU を使用できるゾーン内に作成する必要があります。次のコマンドによって、tpu-models-cluster という名前のクラスタが作成されます。

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

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

    • --cluster-version=1.13 は、クラスタで最新の Kubernetes 1.13 リリースが使用されるように指定します。バージョン 1.13.4-gke.5 以降を使用する必要があります。
    • --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 からダウンロードまたはコピーします。
    • ジョブ仕様で、以前に作成した Cloud Storage バケットの名前に <my-model-bucket> を変更します。

    ジョブ仕様で参照されている 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. 次のコマンドを実行して、GKE クラスタ tpu-models-cluster を削除し、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 サンプルで試してみる。

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

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

ご不明な点がありましたら、Google のサポートページをご覧ください。