Menjalankan aplikasi Cloud TPU di GKE

Panduan ini menjelaskan cara:

Untuk informasi selengkapnya tentang arsitektur VM TPU, lihat Arsitektur Sistem. Panduan ini hanya dapat digunakan dengan arsitektur Node TPU.

Manfaat menjalankan aplikasi Cloud TPU di GKE

Aplikasi pelatihan Cloud TPU dapat dikonfigurasi untuk berjalan di penampung GKE dalam Pod GKE. Jika sudah, Anda akan melihat manfaat berikut:

  • Peningkatan penyiapan dan pengelolaan alur kerja: GKE mengelola siklus proses TPU. Setelah inisialisasi dan pelatihan Cloud TPU disiapkan dengan GKE, workload Anda dapat diulang dan dikelola oleh GKE, termasuk Pemulihan kegagalan tugas.

  • Biaya yang dioptimalkan: Anda hanya membayar TPU saat Tugas aktif. GKE secara otomatis membuat dan menghapus TPU sesuai dengan persyaratan resource Pod.

  • Penggunaan yang fleksibel: Ini adalah perubahan kecil dalam spesifikasi Pod Anda untuk meminta akselerator hardware yang berbeda (CPU, GPU, atau TPU):

    kind: Pod
    metadata:
      name: example-tpu
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.12.1. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.12.1"
    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
    
  • Skalabilitas: GKE menyediakan API (Tugas dan Deployment) yang dapat diskalakan ke ratusan Pod GKE dan Node TPU.

  • Toleransi error: Job API GKE, bersama dengan mekanisme checkpoint TensorFlow, menyediakan semantik run-to-completion. Tugas pelatihan Anda akan otomatis dijalankan ulang dengan status terbaru yang dibaca dari checkpoint jika terjadi kegagalan pada instance VM atau node Cloud TPU.

Persyaratan dan batasan konfigurasi Cloud TPU dan GKE

Perhatikan hal-hal berikut saat menentukan konfigurasi GKE:

  • Cloud TPU tidak didukung di node pool Windows Server.
  • Anda harus membuat cluster dan node pool GKE di zona tempat Cloud TPU tersedia. Anda juga harus membuat bucket Cloud Storage untuk menyimpan data dan model pelatihan di region yang sama dengan cluster GKE Anda. Lihat dokumen jenis dan zona untuk mengetahui daftar zona yang tersedia.
  • Anda harus menggunakan alamat IP yang sesuai dengan RFC 1918 untuk cluster GKE. Untuk mengetahui informasi selengkapnya, lihat Jaringan GKE.
  • Setiap penampung dapat meminta maksimal satu Cloud TPU, tetapi beberapa penampung dalam Pod dapat meminta Cloud TPU masing-masing.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Saat Anda menggunakan Cloud TPU dengan GKE, project Anda akan menggunakan komponen Google Cloud yang dapat ditagih. Periksa harga Cloud TPU dan harga GKE untuk memperkirakan biaya Anda, dan ikuti petunjuk untuk menghapus resource setelah selesai menggunakannya.

  7. Aktifkan API berikut di konsol Google Cloud:

Membuat cluster baru dengan dukungan Cloud TPU

Gunakan petunjuk berikut untuk menyiapkan lingkungan dan membuat cluster GKE dengan dukungan Cloud TPU, menggunakan gcloud CLI:

  1. Instal komponen gcloud, yang Anda perlukan untuk menjalankan GKE dengan Cloud TPU:

    $ gcloud components install kubectl 
  2. Konfigurasikan gcloud dengan project ID Google Cloud Anda:

    $ gcloud config set project project-name

    Ganti project-name dengan nama project Google Cloud Anda.

    Saat pertama kali menjalankan perintah ini di VM Cloud Shell baru, halaman Authorize Cloud Shell akan ditampilkan. Klik Authorize di bagian bawah halaman untuk mengizinkan gcloud melakukan panggilan Google Cloud API dengan kredensial Anda.

  3. Konfigurasikan gcloud dengan zona tempat Anda berencana menggunakan resource Cloud TPU. Contoh ini menggunakan us-central1-b, tetapi Anda dapat menggunakan TPU di zona apa pun yang didukung.

    $ gcloud config set compute/zone us-central1-b
  4. Gunakan perintah gcloud container clusters create untuk membuat cluster di GKE dengan dukungan untuk Cloud TPU.

    $ gcloud container clusters create cluster-name \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu

    Deskripsi flag perintah

    release-channel
    Saluran rilis menyediakan cara untuk mengelola upgrade otomatis untuk cluster Anda. Saat membuat cluster baru, Anda dapat memilih saluran rilisnya. Cluster Anda hanya akan diupgrade ke versi yang ditawarkan di saluran tersebut.
    cakupan
    Memastikan bahwa semua node di cluster memiliki akses ke bucket Cloud Storage Anda. Cluster dan bucket penyimpanan harus berada dalam project yang sama agar berfungsi. Perhatikan bahwa Pod Kubernetes secara default mewarisi cakupan node tempat Pod di-deploy. Oleh karena itu, scopes=cloud-platform memberi semua Pod Kubernetes yang berjalan di cluster cakupan cloud-platform. Jika Anda ingin membatasi akses berdasarkan Pod, lihat panduan GKE untuk melakukan autentikasi dengan Akun Layanan.
    enable-ip-alias
    Menunjukkan bahwa cluster menggunakan rentang IP alias. Hal ini diperlukan untuk menggunakan Cloud TPU di GKE.
    enable-tpu
    Menunjukkan bahwa cluster harus mendukung Cloud TPU.
    tpu-ipv4-cidr (opsional, tidak ditentukan di atas)
    Menunjukkan rentang CIDR yang akan digunakan untuk Cloud TPU. Tentukan IP_RANGE dalam bentuk IP/20, seperti 10.100.0.0/20. Jika Anda tidak menentukan flag ini, rentang CIDR ukuran /20 akan otomatis dialokasikan dan ditetapkan.

Setelah cluster dibuat, Anda akan melihat pesan yang mirip dengan berikut:

NAME             LOCATION       MASTER_VERSION    MASTER_IP     MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
cluster-name  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING

Meminta Cloud TPU dalam spesifikasi Pod Kubernetes

Dalam spesifikasi Pod Kubernetes Anda:

  • Anda harus mem-build model dalam penampung menggunakan versi TensorFlow yang sama. Lihat versi yang didukung.

  • Tentukan resource Cloud TPU di bagian limits pada kolom resource dalam spesifikasi penampung.

    Perhatikan bahwa unit resource Cloud TPU adalah jumlah core Cloud TPU. Tabel berikut mencantumkan contoh permintaan resource yang valid. Lihat Jenis dan zona TPU untuk mengetahui daftar lengkap resource TPU yang valid.

    Jika resource yang ingin digunakan adalah Pod Cloud TPU, minta kuota karena kuota default untuk Pod Cloud TPU adalah nol.

    Permintaan Resource Jenis Cloud TPU
    cloud-tpus.google.com/v2: 8 Perangkat Cloud TPU v2 (8 core)
    cloud-tpus.google.com/preemptible-v2: 8 Perangkat Cloud TPU v2 yang Dapat Diakhiri (8 core)
    cloud-tpus.google.com/v3: 8 Perangkat Cloud TPU v3 (8 core)
    cloud-tpus.google.com/preemptible-v3: 8 Perangkat Cloud TPU v3 yang Dapat Diakhiri (8 core)
    cloud-tpus.google.com/v2: 32 Pod Cloud TPU v2-32 (32 core)
    cloud-tpus.google.com/v3: 32 Pod Cloud TPU v3-32 (32 core)

    Untuk mengetahui informasi selengkapnya tentang cara menentukan resource dan batas dalam spesifikasi Pod, lihat dokumentasi Kubernetes.

Contoh spesifikasi Pod berikut meminta satu TPU Cloud TPU Preemptible v2-8 dengan TensorFlow 2.12.1.

Masa aktif node Cloud TPU terikat dengan Pod Kubernetes yang memintanya. Cloud TPU dibuat sesuai permintaan saat Pod Kubernetes dijadwalkan, dan didaur ulang saat Pod Kubernetes dihapus.

apiVersion: v1
kind: Pod
metadata:
  name: gke-tpu-pod
  annotations:
     # The Cloud TPUs that will be created for this Job will support
     # TensorFlow 2.12.1. This version MUST match the
     # TensorFlow version that your model is built on.
     tf-version.cloud-tpus.google.com: "2.12.1"
spec:
  restartPolicy: Never
  containers:
  - name: gke-tpu-container
    # The official TensorFlow 2.12.1 image.
    # https://hub.docker.com/r/tensorflow/tensorflow
    image: tensorflow/tensorflow:2.12.1
    command:
    - python
    - -c
    - |
      import tensorflow as tf
      print("Tensorflow version " + tf.__version__)

      tpu = tf.distribute.cluster_resolver.TPUClusterResolver('$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS)')
      print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])

      tf.config.experimental_connect_to_cluster(tpu)
      tf.tpu.experimental.initialize_tpu_system(tpu)
      strategy = tf.distribute.TPUStrategy(tpu)

      @tf.function
      def add_fn(x,y):
          z = x + y
          return z

      x = tf.constant(1.)
      y = tf.constant(1.)
      z = strategy.run(add_fn, args=(x,y))
      print(z)
    resources:
      limits:
        # Request a single Preemptible v2-8 Cloud TPU device to train the model.
        cloud-tpus.google.com/preemptible-v2: 8

Membuat Tugas

Ikuti langkah-langkah berikut untuk membuat Tugas di cluster GKE, dan untuk menginstal kubectl

  1. Dengan menggunakan editor teks, buat spesifikasi Pod, example-job.yaml, lalu salin dan tempel spesifikasi Pod yang ditampilkan sebelumnya.

  2. Jalankan Tugas:

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

    Perintah ini membuat tugas yang menjadwalkan Pod secara otomatis.

  3. Pastikan Pod GKE telah dijadwalkan dan node Cloud TPU telah disediakan. Pod GKE yang meminta node Cloud TPU dapat tertunda selama 5 menit sebelum berjalan. Anda akan melihat output yang mirip dengan berikut ini hingga Pod GKE dijadwalkan.

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

    Setelah sekitar 5 menit, Anda akan melihat tampilan seperti ini:

    NAME          READY     STATUS              RESTARTS   AGE
    gke-tpu-pod   0/1       Pending             0          21s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       ContainerCreating   0          2m18s
    gke-tpu-pod   1/1       Running             0          2m48s
    gke-tpu-pod   0/1       Completed           0          3m8s
    

    Anda harus menggunakan Ctrl-C untuk keluar dari perintah 'kubectl get'.

    Anda dapat mencetak informasi log dan mengambil informasi yang lebih mendetail tentang setiap Pod GKE menggunakan perintah kubectl berikut. Misalnya, untuk melihat output log untuk Pod GKE, gunakan:

    $ kubectl logs gke-tpu-pod

    Anda akan melihat output yang mirip dengan berikut ini:

    2021-09-24 18:55:25.400699: I tensorflow/core/platform/cpu_feature_guard.cc:142]
    This TensorFlow binary is optimized with oneAPI Deep Neural Network Library
    (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
    To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
    2021-09-24 18:55:25.405947: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:25.406058: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.091729: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:28.091896: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.092579: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:427]
    Started server with target: grpc://localhost:32769
    Tensorflow version 2.12.1
    Running on TPU  ['10.0.16.2:8470']
    PerReplica:{
      0: tf.Tensor(2.0, shape=(), dtype=float32),
      1: tf.Tensor(2.0, shape=(), dtype=float32),
      2: tf.Tensor(2.0, shape=(), dtype=float32),
      3: tf.Tensor(2.0, shape=(), dtype=float32),
      4: tf.Tensor(2.0, shape=(), dtype=float32),
      5: tf.Tensor(2.0, shape=(), dtype=float32),
      6: tf.Tensor(2.0, shape=(), dtype=float32),
      7: tf.Tensor(2.0, shape=(), dtype=float32)
    }
    

    Untuk melihat deskripsi lengkap Pod GKE, gunakan:

    $ kubectl describe pod gke-tpu-pod

    Lihat Introspeksi dan Proses Debug Aplikasi untuk detail selengkapnya.

Mem-build dan membuat container model Anda dalam image Docker

Lihat mem-build dan membuat container model Anda sendiri untuk mengetahui detail tentang proses ini.

Mengaktifkan dukungan Cloud TPU di cluster yang ada

Untuk mengaktifkan dukungan Cloud TPU di cluster GKE yang ada, lakukan langkah-langkah berikut di Google Cloud CLI:

  1. Aktifkan dukungan Cloud TPU:

    gcloud beta container clusters update cluster-name --enable-tpu
    

    Ganti cluster-name dengan nama cluster Anda.

  2. Perbarui entri kubeconfig:

    gcloud container clusters get-credentials cluster-name
    

Menetapkan rentang CIDR kustom

Secara default, GKE mengalokasikan blok CIDR dengan ukuran /20 untuk TPU yang disediakan oleh cluster. Anda dapat menentukan rentang CIDR kustom untuk Cloud TPU dengan menjalankan perintah berikut:

gcloud beta container clusters update cluster-name \
  --enable-tpu \
  --tpu-ipv4-cidr 10.100.0.0/20

Ganti kode berikut:

  • cluster-name: nama cluster yang ada.
  • 10.100.0.0/20: rentang CIDR kustom Anda.

Menggunakan rentang CIDR yang ada dengan VPC Bersama

Ikuti panduan tentang TPU di cluster GKE menggunakan VPC Bersama untuk memverifikasi konfigurasi yang benar untuk VPC Bersama Anda.

Menonaktifkan Cloud TPU di cluster

Untuk menonaktifkan dukungan Cloud TPU di cluster GKE yang ada, lakukan langkah-langkah berikut di Google Cloud CLI:

  1. Pastikan tidak ada beban kerja Anda yang menggunakan Cloud TPU:

    $ kubectl get tpu
  2. Nonaktifkan dukungan Cloud TPU di cluster Anda:

    $ gcloud beta container clusters update cluster-name --no-enable-tpu

    Ganti cluster-name dengan nama cluster Anda.

    Untuk cluster zona, operasi ini memerlukan waktu sekitar 5 menit, dan untuk cluster regional, operasi ini memerlukan waktu sekitar 15 menit, bergantung pada region cluster.

  3. Setelah operasi selesai tanpa error, Anda dapat memverifikasi bahwa TPU yang disediakan oleh cluster telah dihapus:

    $ gcloud compute tpus list

    Nama TPU yang dibuat oleh Cloud TPU memiliki format berikut:

    $ gke-cluster-name-cluster-id-tpu-tpu-id

    Ganti kode berikut:

    • cluster-name: nama cluster yang ada.
    • cluster-id: ID cluster yang ada.
    • tpu-id: ID Cloud TPU.

    Jika TPU muncul, Anda dapat menghapusnya secara manual dengan menjalankan:

    $ gcloud compute tpus delete gke-cluster-name-cluster-id-tpu-tpu-id

Pembersihan

Setelah selesai menggunakan Cloud TPU di GKE, bersihkan resource untuk menghindari tagihan tambahan pada akun Layanan Penagihan Cloud Anda.

  1. Jalankan perintah berikut untuk menghapus cluster GKE, dengan mengganti cluster-name dengan nama cluster, dan project-name dengan nama project Google Cloud Anda:

    $ gcloud container clusters delete cluster-name \
    --project=project-name --zone=us-central1-b
  2. Setelah selesai memeriksa data, gunakan perintah gcloud CLI untuk menghapus bucket Cloud Storage yang Anda buat. Ganti bucket-name dengan nama bucket Cloud Storage Anda:

    $ gcloud storage rm gs://bucket-name --recursive