Memaksimalkan bandwidth jaringan GPU di cluster mode Autopilot


Halaman ini menunjukkan cara memaksimalkan bandwidth dan throughput jaringan untuk workload GPU berperforma tinggi di cluster Autopilot Google Kubernetes Engine (GKE) menggunakan GPUDirect-TCPXO, GPUDirect-TCPX, gVNIC, dan multi-jaringan. Jika Anda menggunakan cluster Standard, lihat Memaksimalkan bandwidth jaringan GPU di cluster mode Standar.

Halaman ini ditujukan untuk engineer machine learning (ML) dan administrator platform yang memfasilitasi beban kerja ML. Sebelum membaca halaman ini, pastikan Anda sudah memahami teknologi jaringan, seperti kartu antarmuka jaringan (NIC) dan TCP, serta teknologi akselerator seperti NVIDIA Collective Communications Library (NCCL).

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.

Tentang superkomputer GPU Google Cloud

Google Cloud memiliki superkomputer yang dioptimalkan akselerator yang dibuat untuk model besar yang skalabel. Mesin ini memiliki manfaat berikut:

  • Delapan GPU NVIDIA H100 per mesin.
  • Bandwidth hingga 200 Gbps di NIC utama.
  • NIC sekunder (hingga delapan pada jenis mesin A3 Mega dan hingga empat pada jenis mesin A3 High), masing-masing mendukung bandwidth hingga 200 Gbps untuk transfer data GPU.

Untuk mengetahui daftar lengkap manfaatnya, lihat Seri mesin A3 dalam dokumentasi Compute Engine.

Workload GKE Anda harus menggunakan semua GPU yang tersedia dan semua NIC sekunder yang tersedia di satu node dan menggunakan sebagian besar bandwidth yang tersedia. Solusi yang dijelaskan dalam dokumen ini ideal 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, gunakan semua fitur berikut:

  • Stack jaringan GPUDirect: Seri mesin A3 mendukung dua stack jaringan untuk akses memori langsung (RDMA) kustom dan jarak jauh:
    • Pada jenis mesin A3 High dan GPU NVIDIA H100, gunakan 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.
    • Pada jenis mesin A3 Mega dan GPU Mega NVIDIA H100, gunakan GPUDirect-TCPXO yang lebih meningkatkan komunikasi GPU ke VM.
  • gVNIC: Mengaktifkan kemampuan GPUDirect seperti pemisahan header paket, pengarah aliran, dan pengelolaan buffering. gVNIC diperlukan untuk menggunakan GPUDirect-TCPX atau GPUDirect-TCPXO. Untuk mengetahui detail tentang gVNIC, lihat Meningkatkan kecepatan traffic jaringan untuk node GPU.
  • Multi-jaringan: Menambahkan NIC sekunder ke mesin yang dioptimalkan 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 beban kerja tertentu di server yang secara fisik berdekatan untuk meminimalkan latensi. Untuk mengetahui detailnya, lihat Menentukan penempatan rapat untuk node GKE.

Garis besar prosedur

Untuk menggunakan semua kemampuan ini secara bersamaan, Anda akan melakukan hal berikut:

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

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan 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 gcloud components update.
  • Pastikan Anda memiliki kuota yang cukup untuk GPU H100. Untuk meminta lebih banyak kuota, lihat Kuota GPU.

Persyaratan

Persyaratan berikut berlaku untuk GPUDirect-TCPX dan GPUDirect-TCPXO kecuali jika dinyatakan lain.

  • Cluster Anda harus menggunakan GKE versi 1.31.1-gke.1621000 atau yang lebih baru.
  • Node GPU Anda harus menggunakan driver NVIDIA versi 535 atau yang lebih baru.
  • Anda harus menggunakan GKE Dataplane V2.

Batasan

Batasan berikut berlaku:

  • GPUDirect-TCPX dan GPUDirect-TCPXO tidak didukung dengan GPU multi-instance, berbagi waktu GPU, atau NVIDIA MPS.
  • Anda tidak dapat menggunakan NCCL FastSocket.
  • Workload GKE Anda harus menggunakan semua GPU yang tersedia dan semua NIC sekunder yang tersedia di satu node. Beberapa pod tidak dapat menggunakan GPUDirect-TCPX atau GPUDirect-TCPXO di satu node.
  • Anda hanya dapat menggunakan jenis mesin a3-highgpu-8g dan a3-megagpu-8g. Jenis mesin A3 lainnya tidak didukung.

Membuat VPC dan subnet

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

  1. Buat jaringan VPC untuk GPUDirect di project Anda, masing-masing dengan subnet dan aturan firewall. Pilih tab GPUDirect-TCPX untuk jenis mesin A3 High, atau pilih tab GPUDirect-TCPXO untuk jenis mesin A3 Mega, lalu selesaikan petunjuk berikut:

    GPUDirect-TCPXO

    Untuk memaksimalkan bandwidth, sebaiknya buat delapan jaringan baru.

    for N in $(seq 1 8); 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: Project ID Google Cloud Anda.
    • REGION: region Compute Engine untuk setiap subnet.
    • SUBNET_RANGE: rentang alamat IP setiap subnet dalam notasi CIDR. Contoh perintah ini melakukan iterasi untuk delapan subnet, sehingga 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, dan seterusnya.
    • SOURCE_RANGE: Rentang alamat IP sumber untuk aturan firewall guna mengizinkan traffic masuk, dalam notasi CIDR. Contoh, 192.168.0.0/16.

    GPUDirect-TCPX

    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: Project ID Google Cloud 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, sehingga 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
    

Membuat lingkungan GKE

Buat cluster GKE baru yang menggunakan multi-jaringan (Pratinjau). Anda tidak dapat mengupdate cluster yang ada untuk menggunakan multi-jaringan.

GPUDirect-TCPXO

  1. Pilih versi GKE yang tersedia dan mendukung GPUDirect-TCPXO. Untuk menampilkan versi, jalankan perintah ini:

    gcloud container get-server-config \
        --format="yaml(validMasterVersions)" \
        --region=REGION \
        --project=PROJECT_ID
    

    Ganti kode berikut:

    • REGION: region komputasi untuk bidang kontrol cluster.
    • PROJECT_ID: Project ID Google Cloud Anda.
  2. Membuat cluster:

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster baru.
    • VERSION: versi GKE yang mendukung GPUDirect-TCPXO, seperti yang dijelaskan dalam Persyaratan.
    • LOCATION: lokasi Compute Engine untuk cluster.
  3. 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: Network
    metadata:
      name: vpc5
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc5
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc6
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc6
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc7
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc7
      type: Device
    ---
    apiVersion: networking.gke.io/v1
    kind: Network
    metadata:
      name: vpc8
    spec:
      parametersRef:
        group: networking.gke.io
        kind: GKENetworkParamSet
        name: vpc8
      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
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc5
    spec:
      vpc: PREFIX-net-5
      vpcSubnet: PREFIX-sub-5
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc6
    spec:
      vpc: PREFIX-net-6
      vpcSubnet: PREFIX-sub-6
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc7
    spec:
      vpc: PREFIX-net-7
      vpcSubnet: PREFIX-sub-7
      deviceMode: NetDevice
    ---
    apiVersion: networking.gke.io/v1
    kind: GKENetworkParamSet
    metadata:
      name: vpc8
    spec:
      vpc: PREFIX-net-8
      vpcSubnet: PREFIX-sub-8
      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.

GPUDirect-TCPX

  1. Membuat cluster:

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

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster baru.
    • VERSION: versi GKE yang mendukung GPUDirect-TCPX, seperti yang dijelaskan dalam Persyaratan.
    • LOCATION: lokasi Compute Engine untuk cluster.
  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.

Menginstal biner GPUDirect dan mengonfigurasi NCCL

Bagian ini menunjukkan cara menginstal biner GPUDirect, berdasarkan jenis mesin A3 (GPUDirect-TCPX untuk A3 High, GPUDirect-TCPXO untuk A3 Mega) dan versi library NCCL tertentu menggunakan DaemonSet.

GPUDirect-TCPXO

DaemonSet ini melakukan hal berikut:

  1. Prapenginstalan untuk menyiapkan konfigurasi terkait GPUDirect-TCPXO.
  2. Menginstal library NCCL dan biner GPUDirect-TCPXO di node.
  3. Menyimpan library dan biner di direktori /home/kubernetes/bin/nvidia/lib64 di VM. Secara default, GKE memasang direktori ini ke jalur /usr/local/nvidia/lib64 dalam penampung GPU yang perlu menggunakan NCCL dan GPUDirect-TCPXO.

Untuk menginstal biner dan mengonfigurasi NCCL, lakukan langkah-langkah berikut:

  1. Tinjau manifes Daemonset nccl-tcpxo-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-tcpxo/nccl-tcpxo-installer-autopilot.yaml
    

    Plugin NCCL memerlukan waktu sekitar dua menit untuk mulai berjalan.

GPUDirect-TCPX

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 di VM. Secara default, GKE memasang direktori ini ke dalam jalur /usr/local/nvidia/lib64 di penampung GPU yang perlu menggunakan NCCL dan GPUDirect-TCPX.

Untuk menginstal biner dan mengonfigurasi NCCL, lakukan hal berikut:

  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 injector perangkat NRI menggunakan DaemonSet. Kedua jenis mesin GPU H100 menginstal plugin penginjek perangkat NRI yang sama. 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 penampung plugin injector perangkat NRI yang memasukkan perangkat GPU ke dalam penampung yang ditentukan oleh anotasi Pod.

Untuk menginstal plugin, lakukan hal berikut:

  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 atau GPUDirect-TCPXO 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 penampung sidecar di setiap Pod untuk memungkinkan Pod tersebut menggunakan GPUDirect-TCPXO atau GPUDirect-TCPX.

Untuk men-deploy contoh workload ini, lakukan hal berikut:

GPUDirect-TCPXO

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

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

  2. Deploy dua Pod dengan workload pengujian:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest-autopilot.yaml
    
  3. Setelah Pod di-deploy, picu pengujian all-gather:

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

    Outputnya mirip dengan hal berikut ini:

    #                                                              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
    #
    

GPUDirect-TCPX

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

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

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

  3. Deploy ConfigMap dan workload pengujian:

    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. Jalankan perintah berikut untuk memicu pengujian all-gather 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:

    #                                                              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
    

Menggunakan setelan konfigurasi NCCL yang diperlukan untuk meningkatkan performa

Key-value pair berikut adalah setelan konfigurasi NCCL yang diperlukan untuk GPUDirect-TCPX dan GPUDirect-TCPXO. Saat men-deploy workload yang menggunakan NCCL, tetapkan sebagai variabel lingkungan untuk mengoptimalkan performa.

GPUDirect-TCPXO

## required

"NCCL_FASTRAK_CTRL_DEV=eth0",
"NCCL_FASTRAK_IFNAME=eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8",
"NCCL_SOCKET_IFNAME=eth0",
"NCCL_CROSS_NIC=0",
"NCCL_ALGO=Ring,Tree",
"NCCL_PROTO=Simple",
"NCCL_MIN_NCHANNELS=4",
"NCCL_TUNER_PLUGIN=libnccl-tuner.so",
"NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config.textproto",
"NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config.textproto",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_FASTRAK_NUM_FLOWS=2",
"NCCL_FASTRAK_USE_SNAP=1",
"NCCL_FASTRAK_PLUGIN_ACCEPT_TIMEOUT_MS=600000",
"NCCL_FASTRAK_ENABLE_CONTROL_CHANNEL=0",
"NCCL_BUFFSIZE=8388608",
"CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_FASTRAK_ENABLE_HOTPATH_LOGGING=0",
"NCCL_FASTRAK_USE_LLCM=1",
"NCCL_NVLS_ENABLE=0"
## recommended, to log NCCL errors
"NCCL_DEBUG=WARN",
"NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH"

Secara opsional, Anda dapat menetapkan semua konfigurasi sekaligus dengan mengikuti langkah-langkah berikut:

  1. Tambahkan pasangan nilai kunci berikut sebagai variabel lingkungan dalam manifes penampung beban kerja Anda:

    NCCL_LIB_DIR="/usr/local/nvidia/lib64"
    
  2. Pastikan skrip nccl-env-profile.sh dieksekusi saat penampung beban kerja Anda dimulai. Misalnya, Anda dapat melakukannya dalam spesifikasi Pod dengan mengganti perintah penampung untuk menyertakan hal berikut:

    source ${NCCL_LIB_DIR}/nccl-env-profile.sh
    

GPUDirect-TCPX


"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

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

Untuk mode Autopilot, Anda juga harus memilih GPU yang sesuai dalam manifes Pod agar GKE menyediakan hardware. Untuk GPU Mega H100, gunakan GPUDirect-TCPXO. Untuk GPU H100, gunakan GPUDirect-TCPX.

Tambahkan pemilih node berikut ke Pod Anda:

nodeSelector:
  cloud.google.com/gke-accelerator: GPU_NAME
  cloud.google.com/gke-gpu-driver-version: latest

Ganti GPU_NAME dengan nama GPU. Nilai yang didukung adalah sebagai berikut:

  • nvidia-h100-mega-80gb
  • nvidia-h100-80gb

Bergantung pada jenis GPUDirect, lakukan tindakan berikut:

GPUDirect-TCPXO

  1. Tambahkan anotasi berikut ke metadata Pod.

    metadata:
      annotations:
        devices.gke.io/container.tcpxo-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
          - path: /dev/dmabuf_import_helper
        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"},
            {"interfaceName":"eth5","network":"vpc5"},
            {"interfaceName":"eth6","network":"vpc6"},
            {"interfaceName":"eth7","network":"vpc7"},
            {"interfaceName":"eth8","network":"vpc8"}
          ]
    
  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
      - name: aperture-devices
        hostPath:
          path: /dev/aperture_devices
    
  3. Tambahkan penampung berikut ke manifes untuk menjalankan layanan tcpxo-daemon. Ganti (TCPXO_DAEMON_IMAGE) dengan gambar terbaru us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.12:

    - name: tcpxo-daemon
      image: TCPXO_DAEMON_IMAGE
      imagePullPolicy: Always
      command: ["/bin/sh", "-c"]
      args:
        - |
          set -ex
          chmod 755 /fts/entrypoint_rxdm_container.sh
          /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
      securityContext:
        capabilities:
          add:
            - NET_ADMIN
            - NET_BIND_SERVICE
      volumeMounts:
        - name: libraries
          mountPath: /usr/local/nvidia
        - name: sys
          mountPath: /hostsysfs
        - name: proc-sys
          mountPath: /hostprocsysfs
      
    
  4. Tambahkan variabel lingkungan berikut ke setiap penampung GPU:

    env:
    
    - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
      value: /dev/aperture_devices
    
  5. Tambahkan volumeMounts berikut ke setiap penampung GPU. Tanpa penyiapan aperture_devices, privileged:true diperlukan untuk penampung GPU:

    volumeMounts:
      - name: aperture-devices
        mountPath: /dev/aperture_devices
    
  6. Tambahkan variabel lingkungan untuk mengonfigurasi opsi NCCL. Untuk mengetahui detailnya, lihat Menggunakan setelan konfigurasi NCCL yang direkomendasikan untuk meningkatkan performa.

Spesifikasi Pod yang sudah selesai akan terlihat seperti berikut:

apiVersion: v1
kind: Pod
metadata:
name: a3plus-workloads
annotations:
  devices.gke.io/container.tcpxo-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
    - path: /dev/dmabuf_import_helper
  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"},
      {"interfaceName":"eth5","network":"vpc5"},
      {"interfaceName":"eth6","network":"vpc6"},
      {"interfaceName":"eth7","network":"vpc7"},
      {"interfaceName":"eth8","network":"vpc8"}
    ]
...
containers:
  - name: tcpxo-daemon
    image: TCPXO_DAEMON_IMAGE
    imagePullPolicy: Always
    command: ["/bin/sh", "-c"]
    args:
      - |
        set -ex
        chmod 755 /fts/entrypoint_rxdm_container.sh
        /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
    securityContext:
      capabilities:
        add:
          - NET_ADMIN
          - NET_BIND_SERVICE
    volumeMounts:
      - name: libraries
        mountPath: /usr/local/nvidia
      - name: sys
        mountPath: /hostsysfs
      - name: proc-sys
        mountPath: /hostprocsysfs
    
  - name: main-application-container
...
   
      - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
        value: /dev/aperture_devices
    securityContext:
    volumeMounts:
      - name: aperture-devices
        mountPath: /dev/aperture_devices
    resources:
      limits:
        nvidia.com/gpu: 8
volumes:
  - name: libraries
    hostPath:
      path: /home/kubernetes/bin/nvidia
  - name: sys
    hostPath:
      path: /sys
  - name: proc-sys
    hostPath:
      path: /proc/sys
  - name: aperture-devices
    hostPath:
      path: /dev/aperture_devices

GPUDirect-TCPX

  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 penampung 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
      
    
  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.

Spesifikasi Pod yang sudah selesai akan terlihat seperti berikut:

apiVersion: v1
kind: Pod
metadata:
name: a3-gpu-workloads-example
labels:
  name: a3-gpu-workloads-example
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"}
    ]
spec:
containers:
  - name: tcpx-daemon
    image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.11
    imagePullPolicy: Always
    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
        readOnly: true
      - name: tcpx-socket
        mountPath: /run/tcpx
      - name: sys
        mountPath: /hostsysfs
      - name: proc-sys
        mountPath: /hostprocsysfs
    
  - name: a3-gpu-workloads-example
    ...
    volumeMounts:
      - name: tcpx-socket
        mountPath: /tmp
      - name: libraries
        mountPath: /usr/local/nvidia/lib64
        readOnly: true
    resources:
      limits:
        nvidia.com/gpu: 8
    
...
volumes:
  - name: libraries
    hostPath:
      path: /home/kubernetes/bin/nvidia/lib64
  - name: tcpx-socket
    emptyDir:
  - name: sys
    hostPath:
      path: /sys
  - name: proc-sys
    hostPath:
      path: /proc/sys

Langkah selanjutnya