Menjalankan workload batch kecil dengan TPU dan VM mulai fleksibel

Panduan ini menunjukkan cara mengoptimalkan penyediaan TPU untuk beban kerja pelatihan skala kecil dan menengah menggunakan VM Flex-start. VM mulai fleksibel dibuat menggunakan opsi pemakaian mulai fleksibel. Dalam panduan ini, Anda menggunakan VM mulai fleksibel untuk men-deploy workload yang terdiri dari node pool slice TPU.

Panduan ini ditujukan untuk engineer Machine Learning (ML), Admin dan operator platform, serta spesialis Data dan AI yang tertarik untuk menggunakan kemampuan orkestrasi container Kubernetes dalam menjalankan beban kerja batch. Untuk mengetahui informasi selengkapnya tentang peran umum dan contoh tugas yang kami rujuk dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

Harga mulai fleksibel

Mulai fleksibel direkomendasikan jika workload Anda memerlukan penyediaan sumber daya secara dinamis sesuai kebutuhan, hingga tujuh hari dengan reservasi jangka pendek, tanpa pengelolaan kuota yang rumit, dan akses yang hemat biaya. Mulai fleksibel didukung oleh Dynamic Workload Scheduler dan ditagih menggunakan harga Dynamic Workload Scheduler:

  • Diskon (hingga 53%) untuk vCPU, GPU, dan TPU.
  • Anda membayar sesuai penggunaan.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Verifikasi bahwa Anda memiliki cluster Autopilot atau cluster Standard yang menjalankan versi 1.33.0-gke.1712000 atau yang lebih baru.
  • Pastikan Anda memahami batasan mulai fleksibel.
  • Saat menggunakan cluster Standar, pastikan Anda mempertahankan setidaknya satu node pool tanpa mengaktifkan flex-start agar cluster berfungsi dengan benar.
  • Pastikan Anda memiliki kuota untuk TPU preemptible di lokasi node Anda.

Membuat node pool dengan flex-start

Jika Anda menggunakan cluster dalam mode Autopilot, lewati bagian ini dan buka bagian Menjalankan workload batch.

Untuk membuat node pool dengan flex-start yang diaktifkan pada cluster Standar yang ada, gunakan gcloud CLI.

Membuat node pool slice TPU host tunggal

Anda dapat membuat node pool slice TPU host tunggal dengan flex-start:

  1. Membuat node pool dengan flex-start:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --node-locations=NODE_ZONES \
        --machine-type=MACHINE_TYPE \
        --reservation-affinity=none \
        --enable-autoscaling \
        --flex-start \
        --num-nodes 0 \
        --min-nodes=0 \
        --max-nodes=1
    

    Ganti kode berikut:

    • NODE_POOL_NAME: nama yang Anda pilih untuk node pool.
    • CLUSTER_NAME: nama cluster.
    • CONTROL_PLANE_LOCATION: region komputasi untuk bidang kontrol cluster.
    • NODE_ZONES: daftar yang dipisahkan koma untuk satu atau beberapa zona tempat GKE membuat node pool.
    • MACHINE_TYPE: jenis mesin yang akan digunakan untuk node. Untuk mengetahui informasi selengkapnya tentang jenis mesin yang kompatibel dengan TPU, gunakan tabel di Memilih versi TPU.

      Misalnya, perintah pembuatan node pool Anda dapat menyertakan parameter berikut:

      ...
      --machine-type=ct6e-standard-4t \
      --tpu-topology=4x4 \
      --enable-autoscaling \
      --num-nodes=0 \
      --max-nodes=4 \
      

      Perintah ini menetapkan kolom --max-nodes ke 4 karena topologi 4x4 terdiri dari 16 chip dan setiap VM ct6e-standard-4t memiliki 4 chip.

      Penskala otomatis cluster melakukan penskalaan hingga jumlah node yang diperlukan beban kerja Anda. Setelah beban kerja Anda selesai, autoscaler cluster akan menurunkan skala ke nol node.

    • --reservation-affinity=none: flex-start tidak menggunakan atau memerlukan reservasi.

Membuat node pool slice TPU multi-host

Langkah-langkah untuk membuat node pool slice TPU multi-host berbeda-beda, bergantung pada apakah Anda menggunakan Ironwood (TPU7x) atau versi TPU yang lebih lama.

Ironwood (TPU7x)

Anda dapat membuat node pool slice TPU multi-host di versi Ironwood (TPU7x) menggunakan Google Cloud CLI atau Terraform:

gcloud

Untuk membuat node pool slice TPU multi-host dengan Ironwood (TPU7x), Anda harus membuat kebijakan workload terlebih dahulu.

  1. Buat kebijakan beban kerja:

    gcloud compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \
        --type=HIGH_THROUGHPUT \
        --accelerator-topology=TPU_TOPOLOGY \
        --project=PROJECT_ID \
        --region=REGION
    

    Ganti kode berikut:

    • WORKLOAD_POLICY_NAME: nama untuk kebijakan workload Anda.
    • TPU_TOPOLOGY: topologi TPU Ironwood (TPU7x). Contoh, 2x2x2. Untuk melihat semua topologi Ironwood (TPU7x) yang didukung, lihat bagian topologi.
    • PROJECT_ID: Google Cloud Project ID Anda.
    • REGION: region untuk kebijakan workload. Kebijakan workload adalah resource regional dan dapat digunakan kembali di seluruh node pool yang memiliki topologi yang sama.
  2. Buat node pool dengan kebijakan workload:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=us-central1 \
        --node-locations=us-central1-c \
        --machine-type=tpu7x-standard-4t \
        --reservation-affinity=none \
        --enable-autoscaling \
        --num-nodes=0 --min-nodes=0 --max-nodes=MAX_NODES \
        --flex-start \
        --placement-policy=WORKLOAD_POLICY
    

    Ganti kode berikut:

    • NODE_POOL_NAME: nama node pool baru.
    • WORKLOAD_POLICY: nama kebijakan workload yang Anda buat.
    • MAX_NODES: Ukuran maksimum node pool. Flag --max-nodes diperlukan jika --enable-autoscaling diberikan dan harus sama dengan hasil perkalian nilai yang ditentukan dalam TPU_TOPOLOGY ({A}x{B}x{C}) dibagi dengan jumlah chip di setiap VM. Misalnya, jika TPU_TOPOLOGY adalah 2x2x2, produknya adalah 8. Karena setiap VM di tpu7x-standard-4t memiliki 4 chip, jumlah node adalah 2.

    Perintah ini membuat node pool bernama NODE_POOL_NAME dengan karakteristik berikut:

    • --machine-type=tpu7x-standard-4t menentukan jenis mesin Ironwood (TPU7x).
    • --flex-start mengaktifkan flex-start.

Terraform

  1. Pastikan Anda menggunakan versi 4.84.0 atau yang lebih baru dari penyedia google.
  2. Buat kebijakan beban kerja:

    resource "google_compute_resource_policy" {
      name   = "WORKLOAD_POLICY_NAME"
      region = CLUSTER_LOCATION
      workload_policy {
        type = "HIGH_THROUGHPUT"
        accelerator_topology = "TPU_TOPOLOGY"
      }
    }
    

    Ganti kode berikut:

    • WORKLOAD_POLICY_NAME: nama untuk kebijakan workload Anda.
    • CLUSTER_LOCATION: Lokasi komputasi untuk cluster. Sebaiknya Anda memiliki cluster regional untuk keandalan panel kontrol Kubernetes yang lebih tinggi. Anda juga dapat menggunakan cluster zonal. Untuk mengetahui informasi selengkapnya, lihat Memilih topologi dan versi TPU.
    • TPU_TOPOLOGY: topologi TPU Ironwood (TPU7x). Contoh, 2x2x2. Untuk melihat semua topologi Ironwood (TPU7x) yang didukung, lihat Merencanakan TPU.

    Untuk mengetahui informasi selengkapnya tentang referensi google_compute_resource_policy, lihat Penyedia Terraform.

  3. Dalam konfigurasi Terraform, tambahkan blok berikut:

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        flex_start = true
      }
    
      placement_policy {
        policy_name = WORKLOAD_POLICY_NAME
      }
    }
    

    Ganti kode berikut:

    • NODE_POOL_RESOURCE_NAME: nama resource node pool di template Terraform.
    • PROJECT_ID: Project ID Anda.
    • CLUSTER_NAME: nama cluster yang ada tempat node pool akan ditambahkan.
    • POOL_NAME: nama node pool yang akan dibuat.
    • NODE_ZONES: daftar yang dipisahkan koma untuk satu atau beberapa zona tempat GKE membuat node pool.
    • NUM_NODES: jumlah node dalam node pool. Nilainya harus nol atau hasil kali jumlah TPU chip yang dibagi empat, karena dalam slice TPU multi-host, setiap node slice TPU memiliki empat chip. Misalnya, jika TPU_TOPOLOGY adalah 4x8, maka ada 32 chip, yang berarti NUM_NODES harus 8. Untuk mempelajari topologi TPU lebih lanjut, gunakan tabel di Memilih versi TPU.
    • TPU_TOPOLOGY: ini menunjukkan topologi fisik yang dipilih untuk slice TPU. Format topologi bergantung pada versi TPU yang Anda gunakan. Untuk mempelajari lebih lanjut topologi TPU, gunakan tabel di Memilih topologi.

    Secara opsional, Anda juga dapat menggunakan variabel berikut:

    • RESERVATION_NAME: jika Anda menggunakan pemesanan TPU, berikan daftar label resource pemesanan yang akan digunakan saat membuat node pool. Untuk mempelajari cara mengisi RESERVATION_LABEL_VALUES di kolom reservation_affinity lebih lanjut, silakan melihat Penyedia Terraform.
    • autoscaling: membuat node pool dengan penskalaan otomatis yang diaktifkan. Saat GKE menskalakan node pool slice TPU multi-host, GKE secara atomik akan meningkatkan skala node pool dari nol hingga ukuran maksimum.
      • MAX_NODES: ukuran maksimum node pool. Nilai harus sama dengan hasil perkalian nilai yang ditentukan dalam TPU_TOPOLOGY ({A}x{B}x{C}) dibagi dengan jumlah chip di setiap VM. Misalnya, jika TPU_TOPOLOGY adalah 2x2x2, produknya adalah 8. Karena setiap VM di tpu7x-standard-4t memiliki 4 chip, jumlah node adalah 2.
    • spot: node pool yang akan menggunakan Spot VM untuk node slice TPU. Setelan ini tidak dapat diubah setelah node pool dibuat. Untuk mengetahui informasi selengkapnya, silakan melihat Spot VM.
    • flex_start: node pool yang akan menggunakan opsi konsumsi flex-start. Setelan ini tidak dapat disetel ke true jika spot diaktifkan.

Versi TPU lainnya

Anda dapat membuat node pool slice TPU multi-host di versi v3, v4, v5p, v5e, dan Trillium (v6e) menggunakan Google Cloud CLI, Terraform, atau konsol Google Cloud .

gcloud

  gcloud container node-pools create NODE_POOL_NAME \
      --cluster=CLUSTER_NAME \
      --location=CONTROL_PLANE_LOCATION \
      --node-locations=NODE_ZONES \
      --machine-type=MACHINE_TYPE \
      --tpu-topology=TPU_TOPOLOGY \
      --reservation-affinity=none \
      --enable-autoscaling \
      --num-nodes=0 --min-nodes=0 --max-nodes=MAX_NODES \
      --flex-start

Ganti kode berikut:

  • NODE_POOL_NAME: nama node pool baru.
  • CLUSTER_NAME: nama cluster.
  • CONTROL_PLANE_LOCATION: nama zona berdasarkan versi TPU yang ingin Anda gunakan. Untuk mengidentifikasi lokasi yang tersedia, lihat Ketersediaan TPU di GKE.
  • NODE_ZONES: daftar yang dipisahkan koma untuk satu atau beberapa zona tempat GKE membuat node pool.
  • MACHINE_TYPE: jenis mesin yang akan digunakan untuk node. Untuk mengetahui informasi selengkapnya tentang jenis mesin yang kompatibel dengan TPU, gunakan tabel di Memilih versi TPU.
  • TPU_TOPOLOGY: topologi TPU. Contoh, 2x2x2. Untuk melihat semua topologi TPU yang didukung, lihat bagian topologi.
  • MAX_NODES: ukuran maksimum node pool. Flag --max-nodes diperlukan jika --enable-autoscaling diberikan dan harus sama dengan hasil perkalian nilai yang ditentukan dalam TPU_TOPOLOGY ({A}x{B}x{C}) dibagi dengan jumlah chip di setiap VM.

    Perintah ini membuat node pool bernama NODE_POOL_NAME dengan flex-start yang diaktifkan.

Terraform

  1. Pastikan Anda menggunakan versi 4.84.0 atau yang lebih baru dari penyedia google.
  2. Tambahkan blok berikut ke konfigurasi Terraform Anda:

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        flex_start = true
      }
    
      placement_policy {
        type = "COMPACT"
        tpu_topology = TPU_TOPOLOGY
      }
    }
    

    Ganti kode berikut:

    • NODE_POOL_RESOURCE_NAME: nama resource node pool di template Terraform.
    • PROJECT_ID: Project ID Anda.
    • CLUSTER_NAME: nama cluster yang ada tempat node pool akan ditambahkan.
    • POOL_NAME: nama node pool yang akan dibuat.
    • CLUSTER_LOCATION: lokasi komputasi untuk cluster. Sebaiknya Anda memiliki cluster regional untuk keandalan panel kontrol Kubernetes yang lebih tinggi. Anda juga dapat menggunakan cluster zonal. Untuk mempelajari lebih lanjut, silakan membaca Memilih topologi dan versi TPU.
    • NODE_ZONES: daftar yang dipisahkan koma untuk satu atau beberapa zona tempat GKE membuat node pool.
    • NUM_NODES: jumlah node dalam node pool. Nilainya harus nol atau hasil kali jumlah TPU chip yang dibagi empat, karena dalam slice TPU multi-host, setiap node slice TPU memiliki 4 chip. Misalnya, jika TPU_TOPOLOGY adalah 4x8, maka ada 32 chip, yang berarti harus ada 8 NUM_NODES. Untuk mempelajari topologi TPU lebih lanjut, gunakan tabel di Memilih versi TPU.
    • TPU_TOPOLOGY: ini menunjukkan topologi fisik untuk slice TPU. Format topologi bergantung pada versi TPU yang Anda gunakan. Untuk mempelajari lebih lanjut topologi TPU, gunakan tabel di Memilih topologi.

    Secara opsional, Anda juga dapat menggunakan variabel berikut:

    • RESERVATION_NAME: jika Anda menggunakan pemesanan TPU, ini adalah daftar label resource pemesanan yang akan digunakan saat membuat node pool. Untuk mempelajari cara mengisi RESERVATION_LABEL_VALUES di kolom reservation_affinity lebih lanjut, silakan melihat Penyedia Terraform.
    • autoscaling: Membuat node pool dengan penskalaan otomatis yang diaktifkan. Saat GKE menskalakan node pool slice TPU multi-host, GKE secara atomik akan meningkatkan skala node pool dari nol hingga ukuran maksimum.
      • MAX_NODES: ini adalah ukuran maksimum node pool. Nilainya harus sama dengan hasil kali nilai yang ditentukan dalam TPU_TOPOLOGY ({A}x{B}x{C}) dibagi dengan jumlah chip di setiap VM).
    • spot: memungkinkan node pool menggunakan Spot VM untuk node slice TPU. Nama ini tidak dapat diubah setelah pembuatan node pool. Untuk mengetahui informasi selengkapnya, silakan melihat Spot VM.
    • flex_start: Menetapkan node pool agar menggunakan opsi konsumsi flex-start. Tidak dapat disetel ke true jika spot diaktifkan.

Konsol

Untuk membuat node pool dengan TPU:

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud .

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diubah.

  3. Klik Add node pool.

  4. Di bagian Node pool details, centang kotak Specify node locations.

  5. Pilih nama zona berdasarkan versi TPU yang ingin Anda gunakan. Untuk mengidentifikasi lokasi yang tersedia, lihat Ketersediaan TPU di GKE.

  6. Dari panel navigasi, klik Node.

  7. Di bagian Konfigurasi Mesin, pilih TPU.

  8. Di menu drop-down Seri, pilih salah satu opsi berikut:

    • CT3: Perangkat TPU v3, host tunggal
    • CT3P: Slice pod multi-host TPU v3
    • CT4P: TPU v4
    • CT5LP: TPU v5e
    • CT5P: TPU v5p
    • CT6E: TPU Trillium (v6e)
  9. Di menu drop-down Jenis mesin, pilih nama mesin yang akan digunakan untuk node. Gunakan tabel Pilih versi TPU untuk mempelajari cara menentukan jenis mesin dan topologi TPU yang membuat TPU slice node pool multi-host.

  10. Di menu drop-down Topologi TPU, pilih topologi fisik untuk slice TPU.

  11. Dalam dialog Perubahan yang diperlukan, klik Buat perubahan.

  12. Pastikan Jenis boot disk adalah Persistent disk standar atau Persistent disk SSD.

  13. Secara opsional, pilih kotak centang Aktifkan node di Spot VM agar dapat menggunakan Spot VM untuk node di node pool.

  14. Klik Buat.

Memverifikasi status mulai fleksibel di node pool

Jalankan perintah berikut:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location CONTROL_PLANE_LOCATION \
    --format="get(config.flexStart)"

Jika flex-start diaktifkan di node pool, kolom flexStart akan disetel ke True.

Menjalankan workload batch

Di bagian ini, Anda akan membuat Job yang menjadwalkan node TPU dengan VM Flex-start. Pengontrol Tugas di Kubernetes membuat satu atau beberapa Pod dan memastikan bahwa Pod tersebut berhasil menjalankan tugas tertentu.

  1. Di Google Cloud konsol, luncurkan sesi Cloud Shell dengan mengklik Ikon aktivasi Cloud Shell Activate Cloud Shell. Sesi akan terbuka di panel bawah konsol Google Cloud .

  2. Buat file bernama dws-flex-start.yaml:

    Host tunggal

    Gunakan manifes berikut untuk file dws-flex-start.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE
            cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["3600s"] # Sleep for 1 hour
            resources:
              requests:
                  google.com/tpu: NUM_CHIPS
              limits:
                  google.com/tpu: NUM_CHIPS
          restartPolicy: OnFailure
    

    Multi-host

    Gunakan manifes berikut untuk file dws-flex-start.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        job-name: job-1
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      backoffLimit: 0
      completions: 2
      parallelism: 2
      completionMode: Indexed
      template:
        spec:
          subdomain: headless-svc
          restartPolicy: Never
          nodeSelector:
              cloud.google.com/gke-flex-start: "true"
              cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE
              cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
          containers:
          - name: tpu-job
            image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
            ports:
            - containerPort: 8471 # Default port using which TPU VMs communicate
            - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
            securityContext:
              privileged: true
            command:
            - bash
            - -c
            - |
              python -c 'import jax; print("TPU cores:", jax.device_count())'
            resources:
              requests:
                google.com/tpu: NUM_CHIPS
              limits:
                google.com/tpu: NUM_CHIPS
    

    Ganti kode berikut:

    • ACCELERATOR_TYPE: jenis akselerator TPU yang Anda gunakan saat membuat node pool. Misalnya, tpu-v4-podslice atau tpu-v5-lite-podslice.
    • TPU_TOPOLOGY: topologi fisik untuk slice TPU. Misalnya, nilainya mungkin 4x4x4 atau 2x2, bergantung pada versi TPU.
    • NUM_CHIPS: jumlah chip TPU di setiap VM adalah satu, empat, atau delapan. Untuk mempelajari lebih lanjut, lihat Versi TPU.
  3. Terapkan manifes dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    
  4. Pastikan bahwa Job berjalan di node yang sama:

    kubectl get pods
    

    Outputnya mirip dengan hal berikut ini:

    NAME    READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang Anda gunakan di halaman ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus resource satu per satu

  1. Hapus Tugas:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. Hapus node pool:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location CONTROL_PLANE_LOCATION
    
  3. Hapus cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Langkah berikutnya