GKE での Cloud TPU の設定

このページでは、Google Kubernetes Engine を使用した Cloud TPU の設定について簡単に説明します。詳細な手順については、チュートリアルをご覧ください。チュートリアルでは、Cloud TPU と GKE を使用して TensorFlow ResNet-50 モデルをトレーニングする方法を説明しています。

GKE を使用する理由

GKE は、Kubernetes クラスタをマネージド サービスとして提供します。

  • 設定と管理が簡単: Cloud TPU を使用するには、ワークロードを実行するための Compute Engine VM と、Cloud TPU の Classless Inter-Domain Routing(CIDR)ブロックが必要です。VM と CIDR ブロックは、GKE によって自動的に設定、管理されます。

  • コストを最適化: GKE は、VM と Cloud TPU ノードをワークロードとトラフィックに基づいて自動的にスケーリングします。料金が発生するのは、Cloud TPU と VM でワークロードを実行したときだけです。

  • 柔軟な使用: ポッド仕様で 1 行を変更するだけで、別のハードウェア アクセラレータ(CPU、GPU、TPU)をリクエストできます。

    kind: Pod
    spec:
      containers:
      - name: example-container
        resources:
          limits:
            cloud-tpus.google.com/v2: 8
            # See the line above for TPU, or below for CPU / GPU.
            # cpu: 2
            # nvidia.com/gpu: 1
    
  • スケーラビリティ: GKE では数百個のポッドや Cloud TPU ノードに容易にスケーリングできる API(ジョブおよびデプロイ)を提供しています。

  • フォールト トレランス: GKE のジョブ API と TensorFlow チェックポイント メカニズムにより、Run-to-Completion セマンティクスが提供されます。VM インスタンスまたは Cloud TPU ノードで障害が発生すると、トレーニング ジョブがチェックポイントから読み込まれた最新の状態で自動的に再実行されます。

要件と制限事項

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

  • GKE バージョン 1.10.4-gke.2 以降を使用する必要があります。クラスタを作成する際は、次の説明のように --cluster-version パラメータを gcloud container clusters create コマンドに追加して、バージョンを指定する必要があります。バージョンの詳細については、SDK のドキュメントをご覧ください。
  • TensorFlow 1.11 以降を使用する必要があります。下記の説明にあるように、Kubernetes ポッド仕様で、Cloud TPU で使用する TensorFlow バージョンを指定してください。
  • GKE クラスタおよびノードプールは、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 v3 Pod(ベータ版) europe-west4-a

    アジア太平洋

    Cloud TPU v2 およびプリエンプティブ v2 asia-east1-c
  • 各コンテナがリクエストできる Cloud TPU は 1 つまでですが、1 つのポッド内の複数のコンテナのそれぞれが Cloud TPU をリクエストできます。
  • Cluster Autoscaler は GKE 1.11.4-gke.12 以上で Cloud TPU をサポートします。

始める前に

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

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

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

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

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

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

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

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

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 で使用するサービス アカウントに必要なアクセス権を付与します。ガイドに沿ってストレージ バケットに対するアクセス権を付与してください。

Cloud TPU をサポートする GKE クラスタを作成する

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

Console

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

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

    GKE ページに移動

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

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

  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 v3 Pod(ベータ版) europe-west4-a

    アジア太平洋

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

  6. [ノードプール] で [More node pool options] をクリックします。

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

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

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

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

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

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

  13. クラスタに接続します。これを行うには、Console の [Kubernetes クラスタ] ページでクラスタを選択し、[接続] ボタンをクリックします。これにより gcloud コマンドが表示され、このコマンドを Cloud Shell で実行してクラスタに接続します。

gcloud

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

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

    $ gcloud components install
  2. GCP プロジェクトを指定します。

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

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

  3. 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 v3 Pod(ベータ版) europe-west4-a

    アジア太平洋

    Cloud TPU v2 およびプリエンプティブ v2 asia-east1-c
  4. gcloud container clusters create コマンドを使用して、GKE に Cloud TPU をサポートするクラスタを作成します。以下のコマンドの YOUR-CLUSTER の部分は、任意のクラスタ名で置き換えてください。

    $ gcloud container clusters create YOUR-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 をサポートしなければならないことを示します。
    • --tpu-ipv4-cidr(省略可。上記のコマンドでは指定されていません)は、Cloud TPU で使用する CIDR 範囲の場所を示します。IP_RANGEIP/20 の形式(10.100.0.0/20 など)にできます。このフラグを指定しなければ、/20 サイズの CIDR 範囲が自動的に割り当てられます。

Docker イメージ内にモデルをビルドしてコンテナ化する

Docker イメージ内にコンテナ化された公式の TPU モデルを使用できます。または独自のモデルをビルドしてコンテナ化することもできます。

  • 公式の TPU モデルを使用する場合

    最新の公式 TPU モデルは、Docker イメージ内にコンテナ化されています。これらの Docker イメージは Dockerfile でビルドされたものです。以下のセクションでは、公式 TPU モデルがコンテナ化されている Docker イメージを使用します。

  • 独自のモデルをビルドする場合

    GKE 上で Cloud TPU を実行する独自のモデルをビルドする場合は、TensorFlow 内で Cloud TPU を使用するために tf.contrib.cluster_resolver.TPUClusterResolvertf.contrib.tpu.TPUEstimator を次のように指定します。

    # The tpu_names, zone, and project must be omitted in TPUClusterResolver
    as GKE automatically uses the Cloud TPU created for your
    job when your runs.
    
    tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver()
    
    run_config = tpu_config.RunConfig(
      cluster=tpu_cluster_resolver,
      ...
    )
    estimator = tpu_estimator.TPUEstimator(
      use_tpu=True,
      config=run_config,
      ...
    )
    

詳細については、TensorFlow での Cloud TPU の使用方法に関する TensorFlow ドキュメントをご覧ください。

モデルを Docker イメージにコンテナ化し、Google Container Registry に push するには、コンテナ化されたウェブ アプリケーションのデプロイで説明している手順のステップ 1 と 2 に従います。

Cloud TPU を Kubernetes ポッド仕様でリクエストする

ポッド仕様を次のように設定します。

  • 次のポッド アノテーションを使用して、Cloud TPU ノードで使用する TensorFlow のバージョンを指定します。

    tf-version.cloud-tpus.google.com: "x.y"
    

    x.y は、Cloud TPU でサポートする TensorFlow のバージョンです。TensorFlow 1.11 以降を使用する必要があります。ポッド用に作成される Cloud TPU インスタンスは、いずれも同じ TensorFlow バージョンを使用します。コンテナ内のすべてのモデルは、同じ TensorFlow バージョンを使用して構築する必要があります。サポートされているバージョンをご覧ください。

  • コンテナ仕様内の resource フィールドの limits セクションで、Cloud TPU リソースを指定します。

    Cloud TPU リソースの単位は Cloud TPU コア数になります。次の表に、すべての有効なリソース リクエストを示します。

    リソース リクエスト Cloud TPU タイプ 必要な GKE バージョン
    cloud-tpus.google.com/v2: 8 Cloud TPU v2 デバイス(8 コア) 1.10.4-gke.2 以上
    cloud-tpus.google.com/v2: 32 A v2-32 Cloud TPU Pod(32 コア)(アルファ版) 1.10.7-gke.6 以上
    cloud-tpus.google.com/v2: 128 A v2-128 Cloud TPU Pod(128 コア)(アルファ版) 1.10.7-gke.6 以上
    cloud-tpus.google.com/v2: 256 A v2-256 Cloud TPU Pod(256 コア)(アルファ版) 1.10.7-gke.6 以上
    cloud-tpus.google.com/v2: 512 A v2-512 Cloud TPU Pod(512 コア)(アルファ版) 1.10.7-gke.6 以上
    cloud-tpus.google.com/preemptible-v2: 8 プリエンプティブ Cloud TPU v2 デバイス(8 コア) 1.10.6-gke.1 以上
    cloud-tpus.google.com/v3: 8 Cloud TPU v3 デバイス(8 コア) 1.10.7-gke.6 以上
    cloud-tpus.google.com/preemptible-v3: 8 プリエンプティブ Cloud TPU v3 デバイス(8 コア) 1.10.7-gke.6 以上

    ポッド仕様でのリソースと制限の指定について詳しくは、Kubernetes ドキュメントをご覧ください。

たとえば、次のジョブ仕様では TensorFlow 1.13 を使用したプリエンプティブ Cloud TPU v2 デバイスを 1 つリクエストしています。

apiVersion: batch/v1
kind: Job
metadata:
  name: resnet-tpu
spec:
  template:
    metadata:
      annotations:
        # The Cloud TPUs that will be created for this Job must support
        # TensorFlow 1.13. This version MUST match
        # the TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "1.13"
    spec:
      restartPolicy: Never
      containers:
      - name: resnet-tpu
        # The official TensorFlow 1.13 TPU model image built from
        # https://github.com/tensorflow/tpu/blob/r1.13/tools/docker/Dockerfile.
        image: gcr.io/tensorflow/tpu-models:r1.13
        command:
        - python
        - /tensorflow_tpu_models/models/official/resnet/resnet_main.py
        - --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet
        - --model_dir=gs://<my-model-bucket>/resnet
        env:
        # Point PYTHONPATH to the top level models folder
        - name: PYTHONPATH
          value: "/tensorflow_tpu_models/models"
        resources:
          limits:
            # Request a single v2-8 Preemptible Cloud TPU device to train the model.
            # A single v2-8 Preemptible Cloud TPU device consists of 4 chips, each of which
            # has 2 cores, so there are 8 cores in total.
            cloud-tpus.google.com/preemptible-v2: 8

ジョブを作成する

GKE クラスタ内にジョブを作成するには、次の手順に従います。

  1. ジョブ仕様 example-job.yaml を作成し、上記のジョブ仕様を含めます。

  2. ジョブを実行します。

    $ kubectl create -f example-job.yaml
    job "resnet-tpu" created

    このコマンドによって作成されるジョブが、ポッドを自動的にスケジュールします。

  3. ポッドがスケジュールされて、Cloud TPU ノードがプロビジョニングされたことを確認します。Cloud TPU ノードをリクエストするポッドは、実行までに 5 分ほど保留されることがあります。ポッドがスケジュールされるまでは、次のような出力が表示されます。

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

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

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    
    Cloud TPU ノードの存続期間は、それらのノードをリクエストするポッドにバインドされます。Cloud TPU は、ポッドがスケジュールされるとオンデマンドで作成され、ポッドが削除されるとリサイクルされます。

Cloud TPU ログを取得する

Kubernetes ポッドで使用される Cloud TPU インスタンスのログを取得するには、次の手順に従います。

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

    GKE ページに移動

  2. [ワークロード] をクリックします。

  3. デプロイ / ジョブを見つけてクリックします。

  4. [管理されたポッド] の下のポッドを見つけてクリックします。

  5. [コンテナ] からコンテナを見つけてクリックします。

  6. [Stackdriver のログ] をクリックすると、このコンテナで使用されている Cloud TPU のログが表示されます。

TensorBoard を使用してメトリックの可視化とパフォーマンス分析を行う

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

TPU Profiler は、TensorBoard で可視化できる個々の Cloud TPU のプロファイルをキャプチャするための TensorBoard プラグインです。Cloud TPU ツールセレクタは、TPU プロファイラを使用して実行中の TensorFlow モデルからトレース情報を収集した後でのみ、TensorBoard メニューバーの [プロファイル] タブで使用できるようになります。

GKE クラスタで Tensorboard を実行する

GKE クラスタで TensorBoard を実行するには、次の手順に従います。

  1. TensorBoard デプロイの YAML 構成をダウンロードします。

    wget https://raw.githubusercontent.com/tensorflow/tpu/r1.13/tools/kubernetes/tensorboard_k8s.yaml
  2. ファイル内の環境変数 MODEL_BUCKET を、モデルと TensorFlow イベントが存在する Cloud Storage の場所に変更します。

  3. GKE クラスタで TensorBoard を実行します。

    <pre>kubectl apply -f tensorboard_k8s.yaml</pre>
    
  4. TensorBoard の EXTERNAL_IP を取得します。リクエストを TensorBoard にルーティングするロードバランサが作成されるため、追加コストが発生します。

    <pre>kubectl get service tensorboard-service</pre>
    
  5. ブラウザで http://EXTERNAL_IP:6006 にアクセスします。

TPU プロファイラを実行してトレース情報を取得する

GKE クラスタで TPU プロファイラを実行するには、次の手順に従います。

  1. TPU プロファイラ ジョブの YAML 構成をダウンロードします。

    wget https://raw.githubusercontent.com/tensorflow/tpu/r1.13/tools/kubernetes/tpu_profiler_k8s.yaml
  2. ファイル内の環境変数 TPU_NAME を、プロファイルを作成する Cloud TPU の名前に変更します。Cloud Console の [Compute Engine] > [TPU] ページには、TPU 名が次の形式で表示されます。

    gke-[CLUSTER-NAME]-[CLUSTER-ID]-tpu-[TPU-ID]
    
    次に例を示します。
    gke-demo-cluster-25cee208-tpu-4b90f4c5

  3. ファイル内の環境変数 MODEL_BUCKET を、モデルと TensorFlow イベントが存在する Cloud Storage の場所に変更します。

  4. GKE クラスタで TPU プロファイラを実行します。

    kubectl create -f tpu_profiler_k8s.yaml
    
  5. ブラウザを更新して、TensorBoard の [プロファイル] タブでトレースデータを表示します。

クリーンアップ

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 クラスタを削除します。YOUR-CLUSTER はクラスタ名、YOUR-PROJECT は GCP プロジェクト名で置き換えてください。

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

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

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

次のステップ

  • チュートリアルに沿って、Cloud TPU と GKE 上で TensorFlow ResNet-50 モデルをトレーニングする。
  • 次のジョブ仕様のいずれかを使用して、他のモデルとデータセット取得ジョブを実行する。

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

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

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