Menjalankan aplikasi Cloud TPU di GKE

Panduan ini menjelaskan cara:

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

Manfaat menjalankan aplikasi Cloud TPU di GKE

Aplikasi pelatihan Cloud TPU dapat dikonfigurasi untuk dijalankan di container GKE di dalam Pod GKE. Jika tersedia, 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 membuat dan menghapus TPU secara otomatis sesuai dengan persyaratan resource Pod.

  • Penggunaan fleksibel: Perubahan kecil pada 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 (Job dan Deployment) yang dapat menskalakan hingga ratusan Pod GKE dan Node TPU.

  • Toleransi error: Job API GKE, beserta mekanisme checkpoint TensorFlow, menyediakan semantik run-to-completion. Tugas pelatihan Anda akan otomatis dijalankan kembali 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 berikut saat menentukan konfigurasi GKE Anda:

  • Cloud TPU tidak didukung di kumpulan node Windows Server.
  • Anda harus membuat cluster GKE dan node pool 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 Anda. Untuk mengetahui informasi selengkapnya, lihat Jaringan GKE.
  • Setiap container dapat meminta maksimal satu Cloud TPU, tetapi beberapa container dalam Pod dapat meminta masing-masing Cloud TPU.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Saat menggunakan Cloud TPU dengan GKE, project Anda menggunakan komponen Google Cloud yang dapat ditagih. Lihat harga Cloud TPU dan harga GKE untuk memperkirakan biaya Anda, lalu ikuti petunjuk untuk mengosongkan 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 Anda 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 ID project 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 Cloud TPU.

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

    Deskripsi flag perintah

    saluran-rilis
    Saluran rilis menyediakan cara untuk mengelola upgrade otomatis bagi 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 semua node dalam cluster memiliki akses ke bucket Cloud Storage Anda. Cluster dan bucket penyimpanan harus berada dalam project yang sama agar dapat berfungsi. Perlu diperhatikan bahwa Pod Kubernetes secara default mewarisi cakupan node tempat Pod Kubernetes di-deploy. Oleh karena itu, scopes=cloud-platform akan memberikan cakupan cloud-platform ke semua Pod Kubernetes yang berjalan di cluster. Jika Anda ingin membatasi akses per Pod, lihat panduan GKE untuk melakukan autentikasi dengan Akun Layanan.
    enable-ip-alias
    Menunjukkan bahwa cluster menggunakan rentang IP alias. Tindakan 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 dialokasikan dan ditetapkan secara otomatis.

Setelah cluster dibuat, Anda akan melihat pesan 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 di spesifikasi Pod Kubernetes

Dalam spesifikasi Pod Kubernetes Anda:

  • Anda harus mem-build model di container menggunakan versi TensorFlow yang sama. Lihat versi yang didukung.

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

    Perlu diperhatikan 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 Preemptible Cloud TPU v2 (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 dihentikan (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 mengenai cara menentukan resource dan batas dalam spesifikasi Pod, lihat dokumentasi Kubernetes.

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

Masa aktif node Cloud TPU terikat dengan Pod Kubernetes yang memintanya. Cloud TPU dibuat sesuai permintaan ketika 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 di 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 serupa 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 sesuatu 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 Pod GKE Anda, 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.

Membangun dan memasukkan model Anda ke dalam container di image Docker

Baca mem-build dan memasukkan model Anda ke dalam container 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. Update 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 workload 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-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 agar tidak menimbulkan biaya tambahan pada akun 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 gsutil untuk menghapus bucket Cloud Storage yang Anda buat. Ganti bucket-name dengan nama bucket Cloud Storage Anda:

    $ gsutil rm -r gs://bucket-name