Memecahkan masalah GPU di GKE


Halaman ini menunjukkan cara menyelesaikan masalah terkait GPU di Google Kubernetes Engine (GKE).

Penginstalan driver GPU

Bagian ini memberikan informasi pemecahan masalah untuk penginstalan driver perangkat NVIDIA otomatis di GKE.

Penginstalan driver gagal di node Ubuntu

Jika Anda menggunakan node Ubuntu yang memiliki GPU L4, H100, atau H200 yang terpasang, driver GPU default yang diinstal GKE mungkin tidak sama dengan atau lebih baru dari versi yang diperlukan untuk GPU tersebut. Akibatnya, Pod plugin perangkat GPU tetap terjebak dalam status Tertunda dan workload GPU Anda di node tersebut mungkin mengalami masalah.

Untuk mengatasi masalah ini pada GPU L4 dan H100, sebaiknya upgrade ke versi GKE berikut yang menginstal driver GPU versi 535 sebagai driver default:

  • 1.26.15-gke.1483000 dan yang lebih baru
  • 1.27.15-gke.1039000 dan yang lebih baru
  • 1.28.11-gke.1044000 dan yang lebih baru
  • 1.29.6-gke.1073000 dan yang lebih baru
  • 1.30.2-gke.1124000 dan yang lebih baru

Atau, Anda dapat menginstal driver versi 535 atau yang lebih baru secara manual dengan menjalankan perintah berikut:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R535.yaml

Untuk mengatasi masalah ini pada GPU H200, Anda harus menginstal driver versi 550 atau yang lebih baru secara manual dengan menjalankan perintah berikut:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R550.yaml

Plugin perangkat GPU gagal dengan error CrashLoopBackOff

Masalah berikut terjadi jika Anda menggunakan metode penginstalan driver manual di node pool sebelum 25 Januari 2023 dan kemudian mengupgrade node pool ke versi GKE yang mendukung penginstalan driver otomatis. Kedua workload penginstalan ada secara bersamaan dan mencoba menginstal versi driver yang bertentangan di node Anda.

Penampung init plugin perangkat GPU gagal dengan status Init:CrashLoopBackOff Log untuk penampung mirip dengan berikut ini:

failed to verify installation: failed to verify GPU driver installation: exit status 18

Untuk mengatasi masalah ini, coba metode berikut:

  • Hapus DaemonSet penginstalan driver manual dari cluster Anda. Tindakan ini akan menghapus workload penginstalan yang bertentangan dan memungkinkan GKE menginstal driver secara otomatis ke node Anda.

    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
  • Terapkan ulang manifes DaemonSet penginstalan driver manual ke cluster Anda. Pada 25 Januari 2023, kami memperbarui manifes untuk mengabaikan node yang menggunakan penginstalan driver otomatis.

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
  • Nonaktifkan penginstalan driver otomatis untuk node pool Anda. DaemonSet penginstalan driver yang ada akan berfungsi seperti yang diharapkan setelah operasi update selesai.

    gcloud container node-pools update POOL_NAME \
        --accelerator=type=GPU_TYPE,count=GPU_COUNT,gpu-driver-version=disabled \
        --cluster=CLUSTER_NAME \
        --location=LOCATION
    

    Ganti kode berikut:

    • POOL_NAME: nama node pool.
    • GPU_TYPE: jenis GPU yang sudah digunakan node pool.
    • GPU_COUNT: jumlah GPU yang sudah terpasang ke node pool.
    • CLUSTER_NAME: nama cluster GKE yang berisi node pool.
    • LOCATION: lokasi Compute Engine cluster.

Error: "Image container cos-nvidia-installer:fixed tidak ada dengan kebijakan pull Never" atau "Image container ubuntu-nvidia-installer:fixed tidak ada dengan kebijakan pull Never".

Masalah ini terjadi saat Pod nvidia-driver-installer berada dalam status PodInitializing dan perangkat plugin GPU atau Pod penginstal driver GPU melaporkan error berikut. Pesan error tertentu bergantung pada sistem operasi yang berjalan di node Anda:

COS

Container image "cos-nvidia-installer:fixed" is not present with pull policy of Never.

Ubuntu

Container image "gke-nvidia-installer:fixed" is not present with pull policy of Never.

Masalah ini dapat terjadi saat pengumpul sampah menghapus image driver NVIDIA yang telah dimuat sebelumnya untuk mengosongkan ruang di node. Jika Pod driver dibuat ulang atau container-nya dimulai ulang, GKE tidak akan dapat menemukan image yang telah dimuat sebelumnya.

Untuk mengurangi masalah pengumpulan sampah saat Anda menjalankan COS, upgrade node GKE Anda ke salah satu versi berikut yang berisi perbaikan:

  • 1.25.15-gke.1040000 dan yang lebih baru
  • 1.26.10-gke.1030000 dan yang lebih baru
  • 1.27.6-gke.1513000 dan yang lebih baru
  • 1.28.3-gke.1061000 dan yang lebih baru

Jika node Anda menjalankan Ubuntu, belum ada perbaikan yang tersedia untuk masalah pengumpulan sampah ini. Untuk mengatasi masalah ini di Ubuntu, Anda dapat menjalankan penampung dengan hak istimewa yang berinteraksi dengan host untuk memastikan penyiapan yang benar driver GPU NVIDIA. Untuk melakukannya, jalankan sudo /usr/local/bin/nvidia-container-first-boot dari node Anda atau terapkan manifes berikut:

apiVersion: v1
kind: Pod
metadata:
  name: gke-nvidia-installer-fixup
spec:
  nodeSelector:
    cloud.google.com/gke-os-distribution: ubuntu
  hostPID: true
  containers:
  - name: installer
    image: ubuntu
    securityContext:
      privileged: true
    command:
      - nsenter
      - -at
      - '1'
      - --
      - sh
      - -c
      - "/usr/local/bin/nvidia-container-first-boot"
  restartPolicy: Never

Penyebab lain yang mungkin terjadi adalah saat image driver NVIDIA hilang setelah node di-reboot atau pemeliharaan host. Hal ini dapat terjadi pada node rahasia, atau node dengan GPU, yang menggunakan penyimpanan SSD lokal sementara. Dalam situasi ini, GKE memuat terlebih dahulu image container nvidia-installer-driver di node dan memindahkannya dari boot disk ke SSD lokal saat booting pertama.

Untuk mengonfirmasi bahwa ada peristiwa pemeliharaan host, gunakan filter log berikut:

resource.type="gce_instance"
protoPayload.serviceName="compute.googleapis.com"
log_id("cloudaudit.googleapis.com/system_event")

Untuk mengurangi masalah pemeliharaan host, upgrade versi GKE Anda ke salah satu versi berikut:

  • 1.27.13-gke.1166000 dan yang lebih baru
  • 1.29.3-gke.1227000 dan yang lebih baru
  • 1.28.8-gke.1171000 dan yang lebih baru

Error: gagal mengonfigurasi direktori penginstalan driver GPU: gagal membuat overlay lib64: gagal membuat direktori /usr/local/nvidia/lib64: mkdir /usr/local/nvidia/lib64: bukan direktori.

Anda mengalami error ini dari container penginstal driver GPU di dalam plugin perangkat GPU saat fastsocket NCCL diaktifkan:

failed to configure GPU driver installation dirs: failed to create lib64 overlay: failed to create dir /usr/local/nvidia/lib64: mkdir /usr/local/nvidia/lib64: not a directory.

Masalah ini hanya terjadi pada cluster dan node yang menjalankan GKE 1.28 dan 1.29.

Masalah ini disebabkan oleh kondisi persaingan fastsocket NCCL dengan penginstal driver GPU.

Untuk mengurangi masalah ini, upgrade versi GKE Anda ke salah satu versi berikut:

  • 1.28.8-gke.1206000 dan yang lebih baru
  • 1.29.3-gke.1344000 dan yang lebih baru

Untuk mengetahui informasi selengkapnya, baca Catatan Rilis GPUDirect-TCPXO.

Error: Gagal mendapatkan perangkat untuk nvidia0: perangkat nvidia0 tidak ditemukan.

Error berikut menunjukkan bahwa XID 62 dan RmInitAdapter gagal untuk GPU dengan minor 0:

Failed to get device for nvidia0: device nvidia0 not found.

Driver NVIDIA versi 525.105.17 memiliki bug yang dapat menyebabkan error komunikasi (XID) dan mencegah GPU diinisialisasi dengan benar, sehingga menyebabkan kegagalan menginisialisasi GPU.

Untuk memperbaiki masalah ini, upgrade driver NVIDIA ke versi driver 525.110.11 atau yang lebih baru.

Mereset GPU pada VM A3

Beberapa masalah mungkin mengharuskan Anda mereset GPU di VM A3.

Untuk mereset GPU, ikuti langkah-langkah berikut:

  1. Hapus Pod yang meminta resource GPU dari node tempat Anda perlu mereset GPU.

  2. Nonaktifkan plugin perangkat GPU di node:

    kubectl get nodes \
        --selector=kubernetes.io/hostname=NODE_NAME \
        --no-headers | awk '{print $1}' \
        | xargs -I{} kubectl label node {} gke-no-default-nvidia-gpu-device-plugin=true
    

    Ganti NODE_NAME dengan nama node.

  3. Hubungkan ke VM yang mendukung node.

  4. Di sesi SSH, reset GPU:

    /home/kubernetes/bin/nvidia/bin/nvidia-smi --gpu-reset
    
  5. Aktifkan kembali plugin perangkat GPU:

    kubectl get nodes --selector=kubernetes.io/hostname=NODE_NAME \
        --no-headers \| awk '{print $1}' \
        | xargs -I{} kubectl label node {} gke-no-default-nvidia-gpu-device-plugin=false \
        --overwrite
    

GPU di Confidential GKE Nodes

Bagian berikut menunjukkan cara mengidentifikasi dan memperbaiki masalah pada GPU yang berjalan di Confidential GKE Node.

Workload GPU tidak dijadwalkan di Confidential GKE Node

Node GKE Rahasia mengharuskan Anda menginstal driver GPU secara manual yang sesuai dengan jenis GPU yang Anda pilih dan versi GKE Anda. Jika Pod GPU Anda tidak dijadwalkan di Node GKE Rahasia dan tetap dalam status Pending, jelaskan DaemonSet penginstalan driver:

kubectl --namespace=kube-system get daemonset nvidia-driver-installer -o yaml

Jika output menampilkan error NotFound, instal driver.

Jika DaemonSet berjalan, output-nya akan mirip dengan berikut ini:

apiVersion: apps/v1
kind: DaemonSet
# lines omitted for clarity
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: nvidia-driver-installer
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: nvidia-driver-installer
        name: nvidia-driver-installer
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cloud.google.com/gke-accelerator
                operator: Exists
              - key: cloud.google.com/gke-gpu-driver-version
                operator: DoesNotExist
              - key: cloud.google.com/gke-confidential-nodes-instance-type
                operator: In
                values:
                - TDX

Di output ini, verifikasi bahwa kolom nodeAffinity berisi kunci cloud.google.com/gke-confidential-nodes-instance-type. Jika output tidak berisi kunci ini, DaemonSet penginstalan driver tidak mendukung Node GKE Rahasia.

Deploy DaemonSet yang mendukung GPU di Confidential GKE Node:

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/cos/daemonset-confidential.yaml

Setelah menginstal driver, periksa apakah workload GPU Anda dimulai dengan berhasil.

Error: Gagal mengalokasikan vektor perangkat

Pesan error berikut dalam log container GPU Anda menunjukkan bahwa GPU telah dilepas dari instance VM node:

Failed to allocate device vector A (error code unknown error)!

Pelepasan ini dapat terjadi karena error hardware atau karena masalah pada kunci enkripsi.

Untuk mengatasi masalah ini, mulai ulang instance node. Operasi ini mengganggu, dan memengaruhi semua beban kerja di node tersebut. Untuk memulai ulang instance, lakukan langkah-langkah berikut:

  1. Dapatkan nama node yang menjalankan Pod GPU:

    kubectl get pod POD_NAME -o yaml | grep "nodeName"
    

    Ganti POD_NAME dengan nama Pod yang gagal.

    Outputnya mirip dengan hal berikut ini:

    nodeName: gke-cluster-1-default-pool-b7asdfbt-fd3e
    
  2. Reset instance Compute Engine:

    gcloud compute instances reset NODE_NAME
    

    Ganti NODE_NAME dengan nama node dari output langkah sebelumnya.

    gcloud CLI akan mencari VM dengan nama tersebut di project aktif Anda. Jika Anda melihat perintah untuk memilih zona, tentukan Y.

  3. Periksa apakah beban kerja GPU Anda berjalan tanpa error.

Error: Dekripsi gagal dengan error -74

Pesan error berikut di log node Anda menunjukkan bahwa kunci enkripsi untuk GPU hilang:

Decryption failed with error -74

Error ini terjadi saat daemon persistensi NVIDIA, yang berjalan di instance VM node, gagal. Jika Anda melihat pesan error ini, reset instance:

gcloud compute instances reset NODE_NAME

Ganti NODE_NAME dengan nama node yang gagal.

gcloud CLI akan mencari VM dengan nama tersebut di project aktif Anda. Jika Anda melihat perintah untuk memilih zona, tentukan Y.

Jika mereset instance tidak menyelesaikan masalah ini, hubungi Cloud Customer Care atau kirimkan bug produk. Untuk mengetahui informasi selengkapnya, lihat Mendapatkan dukungan.

Menemukan error XID

Daemonset gpu-device-plugin berjalan dalam namespace kube-system dan bertanggung jawab atas hal berikut:

  • Penjadwalan workload GPU: mengalokasikan resource GPU ke Pod.
  • Pemeriksaan kondisi GPU: memantau kondisi GPU Anda.
  • Pengumpulan metrik GPU: mengumpulkan metrik terkait GPU, seperti siklus tugas dan penggunaan memori.

gpu-device-plugin menggunakan NVIDIA Management Library (NVML) untuk mendeteksi error XID. Jika terjadi error XID, Pod gpu-device-plugin yang berjalan di node yang terpengaruh akan mencatat error tersebut. Anda akan menemukan dua jenis log error XID:

  • Error XID non-kritis:
    • Format log: Skip error Xid=%d as it is not Xid Critical
    • Artinya: Error ini dianggap tidak kritis. Masalah ini dapat disebabkan oleh berbagai masalah software atau hardware.
    • Tindakan: GKE tidak melakukan tindakan otomatis untuk error XID non-kritis.
  • Error XID kritis:
    • Format log: XidCriticalError: Xid=%d, All devices will go unhealthy
    • Artinya: Error ini menunjukkan masalah hardware GPU.
    • Tindakan:
      • GKE menandai resource GPU node sebagai tidak responsif.
      • GKE mencegah workload GPU dijadwalkan di node.
      • Jika perbaikan otomatis node diaktifkan, GKE akan membuat ulang node.

Masalah GPUDirect-TCPX(O)

Bagian ini memberikan informasi pemecahan masalah untuk masalah GPUDirect-TCPX(O).

Catatan rilis dan petunjuk upgrade

Untuk pengguna baru, Memaksimalkan bandwidth jaringan GPU di cluster mode Standard memberikan panduan tentang cara menggunakan GPUDirect-TCPX(O). Untuk pengguna lama, baca Catatan Rilis GPUDirect-TCPXO untuk mengetahui informasi rilis dan petunjuk upgrade, karena versi baru dirilis secara berkelanjutan.

Men-debug dengan log NCCL

Jika Anda tidak dapat menyelesaikan masalah dengan NCCL, kumpulkan log NCCL dengan informasi debug. Log ini berisi informasi berharga tentang operasi NCCL dan dapat membantu Anda menemukan sumber masalah. Jika Anda tidak dapat menyelesaikan masalah, kumpulkan log ini sebelum Anda membuka kasus dengan Cloud Customer Care. Log ini dapat membantu Cloud Customer Care menyelesaikan masalah Anda dengan lebih cepat.

Untuk membuat dan mengumpulkan log, selesaikan langkah-langkah berikut:

  1. Tetapkan variabel lingkungan berikut di dalam manifes aplikasi atau Pod Anda:

    NCCL_DEBUG=INFO
    NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH
    NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
    

    Untuk mengetahui informasi selengkapnya tentang variabel lingkungan ini, baca mengumpulkan log debug NCCL.

  2. Untuk membuat data bagi log Anda, jalankan NCCL test. Cara menjalankan pengujian ini bergantung pada jenis cluster yang Anda gunakan. Untuk cluster GKE, Anda dapat men-deploy dan menjalankan pengujian NCCL dengan Penjadwalan yang Mendeteksi Topologi (TAS). Setelah Anda menjalankan pengujian NCCL, NCCL akan otomatis membuat log di semua node yang berpartisipasi.

  3. Kumpulkan log dari semua node. Verifikasi bahwa Anda telah mengumpulkan log NCCL dari semua node dengan memverifikasi bahwa log berisi informasi berikut:

    • Nama host semua VM yang terlibat dalam workload.
    • PID semua proses yang relevan di VM.
    • Peringkat semua GPU yang digunakan oleh beban kerja di setiap VM.

    Jika Anda tidak yakin di mana file log berada, contoh berikut menunjukkan tempat NCCL membuat file log saat variabel NCCL_DEBUG_FILE disetel ke /tmp/nccl_log.%h.%p. Anda memiliki dua VM bernama a3plus-vm-1 dan a3plus-vm-2, dan setiap VM menjalankan delapan proses dalam container workload. Dalam skenario ini, NCCL membuat file log berikut di direktori /tmp dalam container beban kerja di setiap VM:

    • Di a3plus-vm-1: delapan file log bernama nccl_log.a3plus-vm-1.PID, dengan PID adalah ID proses.
    • Di a3plus-vm-2: delapan file log bernama nccl_log.a3plus-vm-2.PID.
  4. Tinjau log. Entri log NCCL memiliki format berikut:

    HOSTNAME:PID:TID [RANK] NCCL_MESSAGE
    

    Entri log ini berisi nilai-nilai berikut:

    • HOSTNAME: nama host VM. Nilai ini mengidentifikasi VM mana yang digunakan saat NCCL membuat entri log.
    • PID: PID. Nilai ini mengidentifikasi proses mana yang menghasilkan entri log.
    • TID: ID thread. Nilai ini mengidentifikasi thread mana dalam proses yang digunakan saat NCCL membuat entri log.
    • RANK: ID peringkat lokal. Nilai ini mengidentifikasi GPU mana yang digunakan saat NCCL membuat entri log. Peringkat diberi nomor dari 0-N, dengan N adalah jumlah total GPU yang terlibat dalam proses. Misalnya, jika workload Anda berjalan dengan delapan GPU per VM, maka setiap VM harus memiliki delapan nilai peringkat yang berbeda (0-7).
    • NCCL_MESSAGE: pesan deskriptif yang memberikan informasi lebih lanjut tentang peristiwa dan menyertakan stempel waktu saat NCCL membuat log.

    Contoh:

    gke-a3plus-mega-np-2-aa33fe53-7wvq:1581:1634 [1] NCCL INFO 00:09:24.631392: NET/FasTrak plugin initialized.
    

    Contoh ini memiliki nilai berikut:

    • gke-a3plus-mega-np-2-aa33fe53-7wvq: nama host.
    • 1581: ID proses.
    • 1634: ID thread.
    • 1: ID peringkat lokal.
    • NCCL INFO 00:09:24.631392: NET/FasTrak plugin initialized.: pesan yang menjelaskan apa yang terjadi.
  5. Jika Anda membuka kasus dukungan, kemas log yang Anda kumpulkan, bersama dengan output pengujian NCCL, ke dalam file zip. Sertakan file zip saat Anda mengirimkan kasus dukungan ke Cloud Customer Care.

  6. Untuk berhenti mengumpulkan log debug NCCL, hapus variabel yang Anda tambahkan di langkah 1.

Langkah berikutnya