Membuat cluster GKE A3 Edge khusus yang dioptimalkan untuk AI

Halaman ini menunjukkan cara membuat cluster Google Kubernetes Engine (GKE) yang dioptimalkan untuk AI yang menggunakan virtual machine (VM) A3 Edge untuk mendukung workload kecerdasan buatan (AI) dan machine learning (ML) Anda. Mesin A3 Edge dirancang untuk memungkinkan Anda menjalankan cluster AI dan ML berskala besar dengan menggunakan fitur seperti penempatan workload yang ditargetkan, penempatan ringkas, kontrol pemeliharaan cluster lanjutan, dan TAS. Untuk mengetahui informasi selengkapnya, lihat Ringkasan pengelolaan cluster.

GKE menyediakan satu platform untuk menjalankan beragam workload bagi organisasi Anda, sehingga mengurangi beban operasional dalam mengelola beberapa platform. Anda dapat menjalankan workload seperti pra-pelatihan terdistribusi berperforma tinggi, penyesuaian model, inferensi model, penayangan aplikasi, dan layanan pendukung.

Di halaman ini, Anda akan mempelajari cara membuat cluster Google Kubernetes Engine (GKE) Standard dan Autopilot menggunakan GPUDirect-TCPX, gVNIC, dan multi-jaringan.

Halaman ini ditujukan bagi engineer machine learning (ML) dan administrator platform yang memfasilitasi workload ML. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.

Aplikasi kecerdasan buatan (AI), ML, dan komputasi berperforma tinggi (HPC) memerlukan akselerasi yang andal untuk mengoptimalkan performa dengan mengurangi waktu penyelesaian tugas. Misalnya, model ML yang berfokus pada AI percakapan dan pembuatan gambar memerlukan skalabilitas dan daya komputasi yang tinggi.

Halaman ini mengasumsikan bahwa Anda sudah memahami teknologi jaringan seperti kartu antarmuka jaringan (NIC) dan TCP, serta teknologi akselerator seperti NVIDIA Collective Communications Library (NCCL).

Tentang Google Cloud superkomputer GPU

Google Cloud memiliki superkomputer yang dioptimalkan untuk akselerator dan dibuat untuk model berskala besar. Jenis mesin GPU ini dapat memperoleh bandwidth jaringan hingga 3.600 Gbps.

Workload GKE Anda harus menggunakan semua GPU yang tersedia dan semua NIC sekunder yang tersedia pada satu node serta menggunakan sebagian besar bandwidth yang tersedia. Solusi yang dijelaskan dalam dokumen ini dirancang untuk workload yang memerlukan performa tinggi, throughput tinggi, dan latensi rendah.

Fitur dan kemampuan yang diperlukan untuk memaksimalkan bandwidth

Untuk memaksimalkan bandwidth jaringan di node superkomputer GPU, Anda harus menggunakan fitur berikut:

  • Stack jaringan GPUDirect: A3 Edge mendukung tiga stack jaringan untuk akses memori langsung jarak jauh (RDMA) kustom. Mesin A3 Edge menggunakan GPUDirect-TCPX untuk mengurangi overhead yang diperlukan untuk mentransfer payload paket ke dan dari GPU, yang secara signifikan meningkatkan throughput dalam skala besar dibandingkan dengan GPU yang tidak menggunakan GPUDirect.
  • gVNIC: Aktifkan kemampuan GPUDirect seperti pemisahan header paket, pengarahan alur, dan pengelolaan buffer. gVNIC diperlukan untuk menggunakan GPUDirect-TCPX. Untuk mengetahui detail tentang gVNIC, lihat Meningkatkan kecepatan traffic jaringan untuk node GPU.

Anda juga harus mengaktifkan dan mengonfigurasi kemampuan berikut:

  • Multi-networking: Tambahkan NIC sekunder ke mesin yang dioptimalkan untuk akselerator. Setiap NIC dikaitkan dengan subnet terpisah di VPC-nya sendiri untuk menghindari konflik. Untuk mengetahui detail tentang dukungan multi-jaringan, lihat Menyiapkan dukungan multi-jaringan untuk Pod.
  • Kebijakan penempatan: Gunakan kebijakan penempatan resource untuk menempatkan semua node GPU untuk workload tertentu di server yang berdekatan secara fisik guna meminimalkan latensi. Untuk mengetahui detailnya, lihat Menentukan penempatan rapat untuk node GKE.

Garis besar prosedur

Untuk menggunakan GPUDirect-TCPX, gVNIC, multi-jaringan, dan kebijakan penempatan ringkas secara bersamaan, Anda harus melakukan hal berikut:

  1. Membuat Virtual Private Cloud (VPC) dan subnet
  2. Buat lingkungan GKE
  3. Instal biner GPUDirect dan plugin NCCL
  4. Men-deploy plugin injektor perangkat NRI
  5. Men-deploy workload pengujian untuk memverifikasi penyiapan GPUDirect
  6. Menggunakan GPUDirect untuk workload Anda sendiri

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Untuk 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. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Pastikan Anda memiliki kapasitas untuk VM Edge A3. Untuk mendapatkan kapasitas ini, pertama, pilih dari opsi penggunaan. Untuk mengikuti petunjuk di halaman ini, Anda dapat menggunakan kapasitas sesuai permintaan, pemesanan sesuai permintaan, atau Pemesanan untuk masa mendatang hingga 90 hari (dalam mode kalender). Setelah memilih opsi pemakaian, ikuti petunjuk yang sesuai untuk mendapatkan kapasitas menggunakan opsi pemakaian yang telah Anda pilih.
  • Pastikan Anda memiliki kuota yang cukup untuk GPU H100. Untuk meminta kuota lainnya, lihat Kuota GPU.

Persyaratan

Persyaratan berikut berlaku untuk GPUDirect-TCPX:

Standar

  • GPUDirect-TCPX didukung dengan semua versi minor GKE yang tersedia menggunakan versi patch tertentu:
    • Untuk GKE versi 1.30 hingga 1.33, gunakan versi patch apa pun.
    • Untuk GKE versi 1.34, gunakan patch versi 1.34.5-gke.1153000 atau yang lebih baru.
    • Untuk GKE versi 1.35, gunakan versi patch 1.35.2-gke.1485000 atau yang lebih baru.
    • Untuk GKE versi 1.36 atau yang lebih baru, gunakan versi patch apa pun.
  • Node GKE harus menggunakan image node Container-Optimized OS (COS). Image node Ubuntu dan Windows tidak didukung.
  • Node GPU Anda harus menggunakan driver NVIDIA versi 535 atau yang lebih baru.
  • Anda harus menggunakan GKE Dataplane V2.
  • Pada GKE versi 1.34 dan yang lebih baru, Anda harus menggunakan penginstal GPUDirect-TCPX versi 3.1.9 atau yang lebih baru dan sidecar GPUDirect-TCPX versi 2.0.12 atau yang lebih baru. Versi penginstal dan sidecar memiliki pemetaan one-to-one dan harus sesuai. Misalnya, penginstal versi 3.1.12 sesuai dengan sidecar versi 2.0.15. Untuk mengetahui informasi selengkapnya tentang versi penginstal dan sidecar, lihat Catatan Rilis GPUDirect-TCPX.
  • Untuk workload GPUDirect-TCPX yang berjalan di beberapa node pool, semua node pool harus berada di zona Compute Engine yang sama dan harus menggunakan set jaringan yang sama, seperti VPC dan subnet.

Autopilot

  • Untuk menggunakan GPUDirect-TCPX, cluster Anda harus menjalankan versi patch GKE minimum berikut:
    • Untuk GKE versi 1.31, gunakan patch versi 1.31.1-gke.1621000 atau yang lebih baru.
    • Untuk GKE versi 1.32 hingga 1.33, gunakan versi patch apa pun.
    • Untuk GKE versi 1.34, gunakan patch versi 1.34.5-gke.1153000 atau yang lebih baru.
    • Untuk GKE versi 1.35, gunakan versi patch 1.35.2-gke.1485000 atau yang lebih baru.
    • Untuk GKE versi 1.36 atau yang lebih baru, gunakan versi patch apa pun.
  • Node GPU Anda harus menggunakan driver NVIDIA versi 535 atau yang lebih baru.
  • Anda harus menggunakan GKE Dataplane V2.
  • Pada GKE versi 1.34 dan yang lebih baru, Anda harus menggunakan penginstal GPUDirect-TCPX versi 3.1.9 atau yang lebih baru dan sidecar GPUDirect-TCPX versi 2.0.12 atau yang lebih baru. Versi penginstal dan sidecar memiliki pemetaan satu-ke-satu dan harus sesuai. Misalnya, penginstal versi 3.1.12 sesuai dengan sidecar versi 2.0.15. Untuk mengetahui informasi selengkapnya tentang versi penginstal dan sidecar, lihat Catatan Rilis GPUDirect-TCPX.
  • Untuk workload GPUDirect-TCPX yang berjalan di beberapa node pool, semua node pool harus berada di zona Compute Engine yang sama dan harus menggunakan set jaringan yang sama, seperti VPC dan subnet.

Batasan

Batasan berikut berlaku:

  • GPUDirect-TCPX tidak didukung dengan GPU multi-instance, GPU time-sharing, atau NVIDIA MPS.
  • Anda tidak dapat menggunakan NCCL FastSocket dengan GPUDirect-TCPX.
  • Workload GKE Anda harus menggunakan semua GPU yang tersedia dan semua NIC sekunder yang tersedia pada satu node. Beberapa Pod tidak dapat menggunakan GPUDirect-TCPX pada satu node.

Membuat VPC dan subnet

Buat jaringan VPC terpisah di project Anda untuk setiap NIC virtual yang akan Anda tambahkan ke node. Setiap jaringan VPC harus memiliki subnet dan aturan firewall yang mengizinkan traffic jaringan internal.

  1. Untuk memaksimalkan bandwidth, sebaiknya buat empat jaringan baru.

    for N in $(seq 1 4); do
    gcloud compute networks create PREFIX-net-$N \
        --subnet-mode=custom \
        --mtu=8244
    
    gcloud compute networks subnets create PREFIX-sub-$N \
        --network=PREFIX-net-$N \
        --region=REGION \
        --range=SUBNET_RANGE
    
    gcloud compute firewall-rules create PREFIX-internal-$N \
    --network=PREFIX-net-$N \
    --action=ALLOW \
    --rules=tcp:0-65535,udp:0-65535,icmp \
    --source-ranges=SOURCE_RANGE
    done
    

    Ganti kode berikut:

    • PROJECT_ID: Google Cloud Project ID Anda.
    • REGION: region Compute Engine untuk setiap subnet.
    • SUBNET_RANGE: rentang alamat IP setiap subnet dalam notasi CIDR. Contoh perintah ini melakukan iterasi untuk empat subnet, jadi Anda harus menggunakan variabel untuk mengubah alamat IP untuk setiap subnet. Misalnya, tentukan 192.168.$N.0/24 sehingga subnet pertama menggunakan 192.168.1.0/24, subnet kedua menggunakan 192.168.2.0/24, dll.
    • SOURCE_RANGE: Rentang alamat IP sumber untuk aturan firewall guna mengizinkan traffic masuk, dalam notasi CIDR. Contoh, 192.168.0.0/16.
  2. Pastikan jaringan telah dibuat:

    gcloud compute networks list
    

Buat lingkungan GKE

Buat cluster GKE baru yang menggunakan multi-networking (Pratinjau) dan buat node pool GPU yang memiliki karakteristik berikut:

  • gVNIC diaktifkan
  • Subnet multi-jaringan yang ditentukan untuk setiap NIC sekunder
  • Seri mesin A3 Edge dengan GPU H100 yang mendukung node
  • Driver NVIDIA terbaru terinstal

Anda tidak dapat mengupdate cluster yang ada untuk menggunakan multi-networking.

  1. Membuat cluster:

    Standar

    gcloud beta container clusters create CLUSTER_NAME \
      --enable-dataplane-v2 \
      --enable-ip-alias \
      --location=CONTROL_PLANE_LOCATION \
      --enable-multi-networking \
      --cluster-version=VERSION \
      --no-enable-autoupgrade \
      --project=PROJECT_ID
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster baru.
    • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona.
    • VERSION: versi GKE yang mendukung GPUDirect-TCPX, seperti yang dijelaskan dalam Persyaratan.

    Autopilot

    gcloud beta container clusters create-auto CLUSTER_NAME \
        --project=PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --cluster-version=VERSION \
        --enable-multi-networking \
        --workload-policies=allow-net-admin
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster baru.
    • CONTROL_PLANE_LOCATION: region Compute Engine dari bidang kontrol cluster Anda.
    • VERSION: versi GKE yang mendukung GPUDirect-TCPX, seperti yang dijelaskan dalam Persyaratan.
  2. Buat resource Jaringan dan GKENetworkParamSet di cluster yang sesuai dengan jaringan VPC dan subnetwork yang Anda buat:

    kubectl apply -f - <<EOF
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc1
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc1
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc2
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc2
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc3
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc3
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc4
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc4
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc1
    spec:
      vpc: PREFIX-net-1
      vpcSubnet: PREFIX-sub-1
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc2
    spec:
      vpc: PREFIX-net-2
      vpcSubnet: PREFIX-sub-2
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc3
    spec:
      vpc: PREFIX-net-3
      vpcSubnet: PREFIX-sub-3
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc4
    spec:
      vpc: PREFIX-net-4
      vpcSubnet: PREFIX-sub-4
      deviceMode: NetDevice
    EOF
    

    Resource ini memberi tahu GKE untuk mengonfigurasi NIC untuk traffic GPU dalam mode passthrough. GKE tidak menerapkan pemrograman jaringan bawaan menggunakan eBPF ke traffic ini.

Membuat node pool GPU (khusus Standar)

  1. Buat node pool untuk GPU H100:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type=a3-edgegpu-8g \
        --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \
        --additional-node-network=network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \
        --additional-node-network=network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \
        --additional-node-network=network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \
        --additional-node-network=network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \
        --enable-gvnic \
        --no-enable-autoupgrade \
        --placement-policy=POLICY_NAME \
        --reservation-affinity=specific \
        --reservation=projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
    

    Ganti NODE_POOL_NAME dengan nama node pool.

    Untuk menggunakan reservasi, gunakan flag --placement-policy, --reservation-affinity, dan --reservation. Tentukan flag ini untuk mengonfigurasi nama kebijakan dan reservasi di node pool. Jika reservasi tidak memerlukan kebijakan resource, hapus tanda --placement-policy.

    Flag --reservation-affinity dapat mengambil nilai specific atau any. Namun, untuk workload AI terdistribusi berperforma tinggi, sebaiknya gunakan reservasi tertentu. Anda dapat menemukan informasi tentang reservasi Anda, seperti nama reservasi atau nama blok tertentu dalam reservasi Anda. Untuk menemukan nilai ini untuk pemesanan on-demand, lihat daftar pemesanan Anda, atau, lihat permintaan pemesanan untuk masa mendatang.

    Ganti kode berikut untuk menggunakan reservasi:

    • PROJECT_ID: opsional, ID project Google Cloud Anda. Jika pemesanan berada di project saat ini (bukan shared reservation) Anda dapat menghilangkan projects/PROJECT_ID/reservations/ dari nilai pemesanan.
    • RESERVATION_NAME: nama pemesanan Anda.
    • BLOCK_NAME: opsional, nama blok tertentu dalam reservasi. Hilangkan /reservationBlocks/BLOCK_NAME jika Anda tidak ingin menggunakan blok tertentu.

    Jika perintah ini gagal, Anda mungkin tidak memiliki kuota GPU H100 yang cukup di project Anda. Pastikan Anda memiliki kuota, lalu coba lagi perintahnya.

  2. Setelah membuat node pool, pastikan setiap node memiliki GPU yang terpasang:

    1. Dapatkan daftar node di cluster:

      kubectl get nodes
      
    2. Pastikan setiap node GPU memiliki delapan GPU:

      kubectl describe node NODE_NAME
      

      Ganti NODE_NAME dengan nama node yang akan dideskripsikan.

      Outputnya mirip dengan hal berikut ini:

      Capacity:
        ...
        nvidia.com/gpu:             8
      Allocatable:
        ...
        nvidia.com/gpu:             8
      

Instal biner GPUDirect dan plugin NCCL

Bagian ini menunjukkan cara menginstal program biner GPUDirect-TCPX dan versi library NCCL tertentu menggunakan DaemonSet.

DaemonSet ini melakukan hal berikut:

  1. Menginstal library NCCL dan biner GPUDirect-TCPX di node.
  2. Menyimpan library dan biner di direktori /home/kubernetes/bin/nvidia/lib64 pada VM. Secara default, GKE memasang direktori ini ke jalur /usr/local/nvidia/lib64 di container GPU yang perlu menggunakan NCCL dan GPUDirect-TCPX.

Untuk menginstal biner dan mengonfigurasi NCCL, lakukan hal berikut:

Standar

  1. Tinjau manifest Daemonset nccl-tcpx-installer.yaml di GitHub.

  2. Deploy DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer.yaml
    

    Plugin NCCL memerlukan waktu sekitar dua menit untuk mulai berjalan.

  3. Verifikasi status Pod DaemonSet:

    kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer
    

    Outputnya mirip dengan hal berikut ini:

    nccl-tcpx-installer-6c2pv                    1/1     Running   0          2m11s
    nccl-tcpx-installer-qgg82                    1/1     Running   0          2m11s
    

Autopilot

  1. Tinjau manifes Daemonset nccl-tcpx-installer-autopilot.yaml di GitHub.

  2. Buat namespace khusus:

    kubectl create ns gpudirect-system
    
  3. Deploy DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer-autopilot.yaml
    

    Plugin NCCL memerlukan waktu sekitar dua menit untuk mulai berjalan.

Men-deploy plugin injector perangkat NRI

Bagian ini menunjukkan cara menginstal injektor perangkat NRI menggunakan DaemonSet. Plugin ini melakukan hal berikut:

  1. Mengaktifkan Node Resource Interface (NRI) di node yang memiliki GPU H100. NRI diaktifkan secara default di GKE versi 1.29 dan yang lebih baru.
  2. Men-deploy container plugin injector perangkat NRI yang menyuntikkan perangkat GPU ke dalam container yang ditentukan oleh anotasi Pod.

Untuk menginstal plugin, lakukan hal berikut:

Standar

  1. Tinjau manifes Deployment nri-device-injector.yaml di GitHub.

  2. Deploy DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector.yaml
    

    Plugin NCCL memerlukan waktu sekitar dua menit untuk mulai berjalan.

  3. Verifikasi status Pod DaemonSet:

    kubectl get pods -n=kube-system -l=name=device-injector
    

    Outputnya mirip dengan hal berikut ini:

    # Output
    device-injector-md6hb                         1/1     Running   0       4h54m
    device-injector-vh9bm                         1/1     Running   0       4h54m
    

Autopilot

  1. Tinjau manifes Deployment nri-device-injector-autopilot.yaml di GitHub.

  2. Deploy DaemonSet:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector-autopilot.yaml
    

    Plugin NCCL memerlukan waktu sekitar dua menit untuk mulai berjalan.

Men-deploy workload pengujian

Di bagian ini, Anda akan men-deploy contoh workload untuk memverifikasi bahwa NCCL dan GPUDirect-TCPX berfungsi seperti yang diharapkan. Contoh workload ini melakukan hal berikut:

  1. Men-deploy dua Pod, yang masing-masing berjalan di node yang memiliki GPU H100.
  2. Men-deploy container sidecar di setiap Pod agar Pod tersebut dapat menggunakan GPUDirect-TCPX.

Workload ini mencakup container sidecar bernama tcpx-daemon, yang menjalankan layanan yang memungkinkan Pod menggunakan GPUDirect-TCPX. Anda harus menambahkan container sidecar ini ke Pod apa pun di lingkungan Anda sendiri yang perlu menggunakan GPUDirect-TCPX. Untuk melihat cuplikan kolom yang diperlukan untuk ditambahkan ke manifes, lihat Menambahkan GPUDirect ke manifes Anda.

  1. Tinjau manifes ConfigMap nccl-config.yaml di GitHub. Manifes ini men-deploy skrip yang menginisialisasi uji pengumpulan semua NCCL dan menetapkan setelan konfigurasi khusus NCCL.

  2. Lakukan hal berikut berdasarkan mode cluster Anda:

    Standar

    Tinjau manifes Deployment nccl-test-latest.yaml di GitHub.

    Autopilot

    Tinjau manifes Deployment nccl-test-latest-autopilot.yaml di GitHub.

  3. Deploy ConfigMap dan workload pengujian:

    Standar

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest.yaml
    

    Autopilot

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest-autopilot.yaml
    
  4. Verifikasi bahwa Pod sedang berjalan dan siap. Perhatikan bahwa ukuran gambar besar (sekitar 5 GB) dan dapat memerlukan waktu beberapa menit untuk didownload.

    kubectl get pods -w
    

    Perintah ini akan memantau update dan mencetak baris baru saat status Pod berubah. Outputnya mirip dengan hal berikut ini:

    NAME               READY   STATUS              RESTARTS   AGE
    nccl-test-host-1   0/2     ContainerCreating   0          23s
    nccl-test-host-2   2/2     Running             0          23s
    nccl-test-host-1   2/2     Running             0          46s
    

    Tunggu hingga pesan STATUS untuk semua Pod adalah Running dan nilai READY adalah 2/2 sebelum melanjutkan ke langkah berikutnya.

  5. Jalankan perintah berikut untuk memicu pengujian pengumpulan semua NCCL untuk node:

    kubectl exec \
      --stdin --tty --container=nccl-test nccl-test-host-1 \
      -- /configs/allgather.sh nccl-host-1 nccl-host-2
    

    Outputnya mirip dengan hal berikut ini:

    Standar

      #                                                              out-of-place                       in-place
      #        size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
      #         (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
                  0             0     float    none      -1     0.24    0.00    0.00      0     0.18    0.00    0.00      0
                  0             0     float    none      -1     0.19    0.00    0.00      0     0.17    0.00    0.00      0
                  0             0     float    none      -1     0.17    0.00    0.00      0     0.17    0.00    0.00      0
                  0             0     float    none      -1     0.17    0.00    0.00      0     0.17    0.00    0.00      0
                  0             0     float    none      -1     0.17    0.00    0.00      0     0.17    0.00    0.00      0
                256             4     float    none      -1    235.2    0.00    0.00      0    235.1    0.00    0.00      0
                512             8     float    none      -1    241.0    0.00    0.00      0    236.1    0.00    0.00      0
               1024            16     float    none      -1    236.3    0.00    0.00      0    233.3    0.00    0.00      0
               2048            32     float    none      -1    234.1    0.01    0.01      0    233.4    0.01    0.01      0
               4096            64     float    none      -1    237.1    0.02    0.02      0    235.3    0.02    0.02      0
               8192           128     float    none      -1    236.2    0.03    0.03      0    235.2    0.03    0.03      0
              16384           256     float    none      -1    236.6    0.07    0.06      0    238.5    0.07    0.06      0
              32768           512     float    none      -1    237.9    0.14    0.13      0    238.8    0.14    0.13      0
              65536          1024     float    none      -1    242.3    0.27    0.25      0    239.4    0.27    0.26      0
             131072          2048     float    none      -1    263.0    0.50    0.47      0    275.1    0.48    0.45      0
             262144          4096     float    none      -1    279.2    0.94    0.88      0    269.9    0.97    0.91      0
             524288          8192     float    none      -1    273.5    1.92    1.80      0    273.5    1.92    1.80      0
            1048576         16384     float    none      -1    315.1    3.33    3.12      0    314.1    3.34    3.13      0
            2097152         32768     float    none      -1    319.2    6.57    6.16      0    311.5    6.73    6.31      0
            4194304         65536     float    none      -1    331.8   12.64   11.85      0    331.3   12.66   11.87      0
            8388608        131072     float    none      -1    356.3   23.54   22.07      0    353.8   23.71   22.23      0
           16777216        262144     float    none      -1    409.1   41.01   38.45      0    405.2   41.40   38.81      0
           33554432        524288     float    none      -1    451.4   74.34   69.69      0    447.7   74.94   70.26      0
           67108864       1048576     float    none      -1    713.4   94.07   88.19      0    713.8   94.01   88.13      0
          134217728       2097152     float    none      -1   1122.1  119.62  112.14      0   1116.3  120.23  112.72      0
          268435456       4194304     float    none      -1   1785.8  150.32  140.92      0   1769.2  151.72  142.24      0
          536870912       8388608     float    none      -1   2859.7  187.74  176.00      0   2852.6  188.20  176.44      0
         1073741824      16777216     float    none      -1   5494.1  195.44  183.22      0   5568.2  192.83  180.78      0
         2147483648      33554432     float    none      -1    10841  198.09  185.71      0    10798  198.88  186.45      0
         4294967296      67108864     float    none      -1    21453  200.21  187.70      0    21490  199.86  187.37      0
         8589934592     134217728     float    none      -1    42603  201.63  189.03      0    42670  201.31  188.73      0
      # Out of bounds values : 0 OK
      # Avg bus bandwidth    : 45.7587
      #
      ```
    

    Autopilot

    #                                                              out-of-place                       in-place
    #       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
    #        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
        1048576         16384     float    none      -1    696.8    1.50    1.41      0    729.0    1.44    1.35      0
        2097152         32768     float    none      -1    776.4    2.70    2.53      0    726.7    2.89    2.71      0
        4194304         65536     float    none      -1    774.3    5.42    5.08      0    805.1    5.21    4.88      0
        8388608        131072     float    none      -1    812.1   10.33    9.68      0    817.6   10.26    9.62      0
       16777216        262144     float    none      -1   1035.2   16.21   15.19      0   1067.8   15.71   14.73      0
       33554432        524288     float    none      -1   1183.3   28.36   26.59      0   1211.8   27.69   25.96      0
       67108864       1048576     float    none      -1   1593.4   42.12   39.49      0   1510.5   44.43   41.65      0
      134217728       2097152     float    none      -1   2127.8   63.08   59.13      0   2312.7   58.03   54.41      0
      268435456       4194304     float    none      -1   3603.0   74.50   69.85      0   3586.2   74.85   70.17      0
      536870912       8388608     float    none      -1   7101.7   75.60   70.87      0   7060.9   76.03   71.28      0
    # Out of bounds values : 0 OK
    # Avg bus bandwidth    : 29.8293
    

Menerapkan GPUDirect untuk workload Anda sendiri

Setelah Anda memverifikasi bahwa jaringan cluster Anda berfungsi dengan baik dengan workload pengujian sampel, langkah berikutnya adalah menerapkan GPUDirect untuk workload sebenarnya. Untuk mengadopsi GPUDirect, Anda harus memperbarui setelan NCCL dan manifes Pod Kubernetes.

Gunakan setelan konfigurasi NCCL yang diperlukan untuk meningkatkan performa

Pasangan nilai kunci berikut adalah setelan konfigurasi NCCL yang diperlukan untuk GPUDirect-TCPX. Saat men-deploy workload yang menggunakan NCCL, tetapkan sebagai variabel lingkungan untuk mengoptimalkan performa.

"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"

Menambahkan GPUDirect ke manifes Anda

Bagian ini menunjukkan kolom wajib diisi yang harus Anda tambahkan ke manifes Kubernetes agar Pod Anda dapat menggunakan GPUDirect.

Bergantung pada mode cluster Anda, lakukan hal berikut:

Standar

  1. Tambahkan anotasi berikut ke metadata Pod. Tanpa anotasi ini, hostNetwork:true akan diperlukan untuk Pod, dan privileged:true akan diperlukan untuk penampung tcpx-daemon.

    metadata:
      annotations:
        devices.gke.io/container.tcpx-daemon: |+
          - path: /dev/nvidia0
          - path: /dev/nvidia1
          - path: /dev/nvidia2
          - path: /dev/nvidia3
          - path: /dev/nvidia4
          - path: /dev/nvidia5
          - path: /dev/nvidia6
          - path: /dev/nvidia7
          - path: /dev/nvidiactl
          - path: /dev/nvidia-uvm
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"vpc1"},
            {"interfaceName":"eth2","network":"vpc2"},
            {"interfaceName":"eth3","network":"vpc3"},
            {"interfaceName":"eth4","network":"vpc4"},
          ]
    
  2. Tambahkan kolom berikut ke spesifikasi Pod:

    spec:
      volumes:
      - name: libraries
        hostPath:
          path: /home/kubernetes/bin/nvidia/lib64
      - name: sys
        hostPath:
          path: /sys
      - name: proc-sys
        hostPath:
          path: /proc/sys
    
  3. Tambahkan container berikut ke manifes untuk menjalankan layanan tcpx-daemon:

    - name: tcpx-daemon
      image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9
      command:
        - /tcpgpudmarxd/build/app/tcpgpudmarxd
        - --gpu_nic_preset
        - a3vm
        - --gpu_shmem_type
        - fd
        - --uds_path
        - /run/tcpx
        - --setup_param
        - \"--verbose 128 2 0 \"
      securityContext:
        capabilities:
            add:
              - NET_ADMIN
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia/lib64
        - name: tcpx-socket
          mountPath: /run/tcpx
        - name: sys
          mountPath: /hostsysfs
        - name: proc-sys
          mountPath: /hostprocsysfs
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
    
  4. Tambahkan pemasangan volume berikut ke container yang meminta GPU:

    volumeMounts:
    - name: tcpx-socket
      mountPath: /tmp
    - name: libraries
      mountPath: /usr/local/nvidia/lib64
    
  5. Tambahkan variabel lingkungan untuk mengonfigurasi opsi NCCL. Untuk mengetahui detailnya, lihat bagian Menggunakan setelan konfigurasi NCCL yang direkomendasikan untuk meningkatkan performa dalam dokumen ini.

  6. Tambahkan variabel lingkungan berikut ke setiap container GPU:

    env:
    - name: LD_LIBRARY_PATH
      value: /usr/local/nvidia/lib64
    

Untuk contoh spesifikasi Pod yang sudah selesai, lihat manifes nccl-test-latest.yaml di GitHub.

Autopilot

Untuk mode Autopilot, Anda juga harus memilih GPU yang sesuai dalam manifes Pod agar GKE menyediakan hardware.

Tambahkan pemilih node berikut ke Pod Anda:

nodeSelector:
  cloud.google.com/gke-accelerator: a3-edgegpu-8g
  cloud.google.com/gke-gpu-driver-version: latest

Selain itu, jika ingin menggunakan kapasitas yang dicadangkan, Anda dapat memberikan informasi tentang reservasi. Untuk mengetahui informasi selengkapnya, lihat subbagian tentang menggunakan reservasi di Menggunakan reservasi kapasitas di cluster Autopilot.

  1. Tambahkan anotasi berikut ke metadata Pod:

    metadata:
      annotations:
        devices.gke.io/container.tcpx-daemon: |+
          - path: /dev/nvidia0
          - path: /dev/nvidia1
          - path: /dev/nvidia2
          - path: /dev/nvidia3
          - path: /dev/nvidia4
          - path: /dev/nvidia5
          - path: /dev/nvidia6
          - path: /dev/nvidia7
          - path: /dev/nvidiactl
          - path: /dev/nvidia-uvm
        networking.gke.io/default-interface: 'eth0'
        networking.gke.io/interfaces: |
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName":"eth1","network":"vpc1"},
            {"interfaceName":"eth2","network":"vpc2"},
            {"interfaceName":"eth3","network":"vpc3"},
            {"interfaceName":"eth4","network":"vpc4"},
          ]
    
  2. Tambahkan kolom berikut ke spesifikasi Pod:

    spec:
      volumes:
      - name: libraries
        hostPath:
          path: /home/kubernetes/bin/nvidia/lib64
      - name: sys
        hostPath:
          path: /sys
      - name: proc-sys
        hostPath:
          path: /proc/sys
    
  3. Tambahkan container berikut ke manifes untuk menjalankan layanan tcpx-daemon:

    - name: tcpx-daemon
      image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9
      command:
        - /tcpgpudmarxd/build/app/tcpgpudmarxd
        - --gpu_nic_preset
        - a3vm
        - --gpu_shmem_type
        - fd
        - --uds_path
        - /run/tcpx
        - --setup_param
        - \"--verbose 128 2 0 \"
      securityContext:
        capabilities:
            add:
              - NET_ADMIN
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia/lib64
        - name: tcpx-socket
          mountPath: /run/tcpx
        - name: sys
          mountPath: /hostsysfs
        - name: proc-sys
          mountPath: /hostprocsysfs
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
    
  4. Tambahkan pemasangan volume berikut ke container yang meminta GPU:

    volumeMounts:
    - name: tcpx-socket
      mountPath: /tmp
    - name: libraries
      mountPath: /usr/local/nvidia/lib64
    
  5. Tambahkan variabel lingkungan untuk mengonfigurasi opsi NCCL. Untuk mengetahui detailnya, lihat bagian Menggunakan setelan konfigurasi NCCL yang direkomendasikan untuk meningkatkan performa dalam dokumen ini.

Untuk contoh spesifikasi Pod yang telah selesai, lihat manifes nccl-test-latest-autopilot.yaml di GitHub.

Mengumpulkan log proses debug NCCL

Untuk mencatat error NCCL, sebaiknya tambahkan konfigurasi NCCL berikut:

NCCL_DEBUG=INFO
NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH
NCCL_DEBUG_FILE=/DIRECTORY/FILE_NAME.%h.%p
  • NCCL_DEBUG=INFO: mencetak informasi proses debug.
    • Untuk workload berskala besar (64 node atau lebih), logging ekstensif dapat terjadi. Untuk menghindari skenario ini—dan kecuali Anda menentukan NCCL_DEBUG_FILE—sebaiknya setel NCCL_DEBUG=WARN untuk membatasi log hanya pada error.
  • NCCL_DEBUG_SUBSYS: memfilter subsistem yang informasinya dikumpulkan NCCL untuk informasi proses debug. Sebaiknya kumpulkan log untuk subsistem berikut:

    • INIT: fase inisialisasi NCCL.
    • NET: jaringan NCCL.
    • ENV: variabel lingkungan yang digunakan NCCL.
    • COLL: operasi kolektif.
    • GRAPH: deteksi topologi dan penelusuran grafik.

    Jika Anda ingin mengumpulkan log untuk subsistem yang berbeda, lihat NCCL_DEBUG_SUBSYS dalam dokumentasi NCCL untuk mengetahui daftar nilai yang diterima.

  • NCCL_DEBUG_FILE (Opsional): mengarahkan output logging debug NCCL ke file yang Anda tentukan. Variabel ini menulis log NCCL ke file standar, yang mencegah output log bercampur dengan output aplikasi. Variabel ini juga menulis log dari berbagai peringkat NCCL ke file yang berbeda, yang mencegah log tercampur.

    Gunakan format nama file berikut:

    /DIRECTORY/FILE_NAME.%h.%p
    

    Ganti kode berikut:

    • DIRECTORY: direktori tempat Anda ingin menyimpan file log.
    • FILE_NAME: nama file log.

    Placeholder %h di-resolve ke nama host node, sedangkan %p di-resolve ke ID proses (PID) dari proses yang menghasilkan log.

Untuk mengetahui informasi selengkapnya tentang cara men-debug log NCCL, lihat Memecahkan masalah GPU di GKE.

Langkah berikutnya