Membuat VM A3 dengan GPUDirect-TCPX diaktifkan


Kelompok mesin yang dioptimalkan akselerator dirancang oleh Google Cloud untuk memberikan performa dan efisiensi yang dibutuhkan untuk workload yang dipercepat GPU seperti kecerdasan buatan (AI), machine learning (ML), dan komputasi berperforma tinggi (HPC).

Seri mesin yang dioptimalkan untuk akselerator A3 memiliki 208 vCPU, dan memori hingga 1.872 GB. Setiap jenis mesin A3 memiliki delapan GPU NVIDIA H100 yang terpasang, yang menawarkan memori GPU 80 GB per GPU. VM ini dapat memperoleh bandwidth jaringan hingga 1.000 Gbps, sehingga ideal untuk model bahasa berbasis transformer besar, database, dan komputasi berperforma tinggi (HPC).

Saat bekerja dengan VM a3-highgpu-8g atau a3-edgegpu-8g, Anda dapat menggunakan GPUDirect-TCPX untuk mencapai latensi terendah antara aplikasi dan jaringan. GPUDirect-TCPX adalah stack jaringan akses memori langsung (RDMA) jarak jauh kustom yang meningkatkan performa jaringan VM A3 Anda dengan memungkinkan payload paket data ditransfer langsung dari memori GPU ke antarmuka jaringan tanpa harus melalui CPU dan memori sistem. VM A3 dapat menggunakan GPUDirect-TCPX yang dikombinasikan dengan Google Virtual NIC (gVNIC) untuk memberikan throughput tertinggi antar-VM dalam cluster jika dibandingkan dengan jenis mesin yang dioptimalkan akselerator A2 atau G2.

Dokumen ini menunjukkan cara membuat VM a3-highgpu-8g atau a3-edgegpu-8g yang berjalan di sistem operasi Container-Optimized OS. Artikel ini juga menunjukkan cara mengaktifkan GPUDirect-TCPX di VM serta menyiapkan dan menguji peningkatan performa jaringan GPU.

Ringkasan

Untuk menguji performa jaringan dengan GPUDirect-TCPX, selesaikan langkah-langkah berikut:

  1. Siapkan satu atau beberapa jaringan Virtual Private Cloud (VPC) yang telah dikonfigurasi dengan MTU besar.
  2. Buat VM GPU Anda menggunakan image Container-Optimized OS cos-105-lts atau yang lebih baru.
  3. Di setiap VM, instal driver GPU.
  4. Di setiap VM, berikan akses kartu antarmuka jaringan (NIC) ke GPU.
  5. Jalankan pengujian NCCL.

Menyiapkan jaringan VPC

Untuk jaringan VPC ini, sebaiknya tetapkan unit transmisi maksimum (MTU) ke nilai yang lebih besar. Nilai MTU yang lebih tinggi akan menambah ukuran paket dan mengurangi overhead header paket, sehingga meningkatkan throughput data payload.

Untuk memaksimalkan bandwidth jaringan untuk jenis mesin A3 High, setel MTU ke 8244 byte. Untuk meninjau setelan MTU yang direkomendasikan untuk jenis mesin GPU lainnya, lihat Setelan MTU untuk jenis mesin GPU.

Membuat jaringan, subnet, dan aturan firewall pengelolaan

Selesaikan langkah-langkah berikut untuk menyiapkan jaringan pengelolaan:

  1. Buat jaringan pengelolaan menggunakan perintah networks create:

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244
    
  2. Buat subnet pengelolaan menggunakan perintah networks subnets create:

    gcloud compute networks subnets create NETWORK_NAME_PREFIX-mgmt-sub \
      --project=PROJECT_ID \
      --network=NETWORK_NAME_PREFIX-mgmt-net \
      --region=REGION \
      --range=192.168.0.0/24
    
  3. Buat aturan firewall menggunakan perintah firewall-rules create.

    1. Buat aturan firewall untuk jaringan pengelolaan.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-internal \
       --project=PROJECT_ID \
       --network=NETWORK_NAME_PREFIX-mgmt-net \
       --action=ALLOW \
       --rules=tcp:0-65535,udp:0-65535,icmp \
       --source-ranges=192.168.0.0/16
      
    2. Buat aturan firewall tcp:22 untuk membatasi alamat IP sumber yang dapat terhubung ke VM Anda menggunakan SSH.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ssh \
       --project=PROJECT_ID \
       --network=NETWORK_NAME_PREFIX-mgmt-net \
       --action=ALLOW \
       --rules=tcp:22 \
       --source-ranges=SSH_SOURCE_IP_RANGE
      
    3. Buat aturan firewall icmp yang dapat digunakan untuk memeriksa masalah transmisi data di jaringan.

      gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ping \
       --project=PROJECT_ID \
       --network=NETWORK_NAME_PREFIX-mgmt-net \
       --action=ALLOW \
       --rules=icmp \
       --source-ranges=0.0.0.0/0
      

Ganti kode berikut:

  • NETWORK_NAME_PREFIX: awalan nama yang akan digunakan untuk jaringan dan subnet Virtual Private Cloud.
  • PROJECT_ID: Project ID Anda.
  • REGION: region tempat Anda ingin membuat jaringan.
  • SSH_SOURCE_IP_RANGE: Rentang IP dalam format CIDR. Tindakan ini menentukan alamat IP sumber mana yang dapat terhubung ke VM Anda menggunakan SSH.

Membuat jaringan data, subnet, dan aturan firewall

Gunakan perintah berikut untuk membuat empat jaringan data, masing-masing dengan subnet dan aturan firewall.

for N in $(seq 1 4); do
  gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244

  gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \
      --project=PROJECT_ID \
      --network=NETWORK_NAME_PREFIX-data-net-$N \
      --region=REGION \
      --range=192.168.$N.0/24

  gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \
      --project=PROJECT_ID \
      --network=NETWORK_NAME_PREFIX-data-net-$N \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=192.168.0.0/16
done

Untuk mengetahui informasi selengkapnya tentang cara membuat jaringan Virtual Private Cloud, lihat Membuat dan memverifikasi jaringan MTU frame jumbo.

Buat VM GPU Anda

Untuk menguji performa jaringan dengan GPUDirect-TCPX, Anda harus membuat minimal dua VM A3.

  1. Buat setiap VM menggunakan image Container-Optimized OS cos-105-lts atau yang lebih baru dan tentukan jaringan MTU virtual yang dibuat pada langkah sebelumnya.

    VM juga harus menggunakan antarmuka jaringan Google Virtual NIC (gVNIC). Untuk VM A3, gVNIC versi 1.4.0rc3 atau yang lebih baru diperlukan. Versi driver ini tersedia di Container-Optimized OS.

    NIC virtual pertama digunakan sebagai NIC utama untuk jaringan dan penyimpanan umum, empat NIC virtual lainnya selaras dengan NUMA dua dari delapan GPU pada switch PCIe yang sama.

    gcloud compute instances create VM_NAME \
      --project=PROJECT_ID \
      --zone=ZONE \
      --machine-type=MACHINE_TYPE \
      --maintenance-policy=TERMINATE --restart-on-failure \
      --image-family=cos-105-lts \
      --image-project=cos-cloud \
      --boot-disk-size=${BOOT_DISK_SZ:-50} \
      --metadata=cos-update-strategy=update_disabled \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \
      --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address
    

    Ganti kode berikut:

    • VM_NAME: nama VM Anda.
    • PROJECT_ID: Project ID Anda.
    • ZONE: zona yang mendukung jenis mesin Anda.
    • MACHINE_TYPE: jenis mesin untuk VM. Tentukan a3-highgpu-8g atau a3-edgegpu-8g.
    • NETWORK_NAME_PREFIX: awalan nama yang akan digunakan untuk jaringan dan subnet Virtual Private Cloud.

Menginstal driver GPU

Di setiap VM A3, selesaikan langkah-langkah berikut.

  1. Instal driver GPU NVIDIA dengan menjalankan perintah berikut:

    sudo cos-extensions install gpu -- --version=latest
    
  2. Pasang kembali jalur dengan menjalankan perintah berikut:

    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    

Memberi akses NIC ke GPU

Di setiap VM A3, berikan akses NIC ke GPU dengan menyelesaikan langkah-langkah berikut:

  1. Konfigurasi registri.

    • Jika Anda menggunakan Container Registry, jalankan perintah berikut:

      docker-credential-gcr configure-docker
      
    • Jika Anda menggunakan Artifact Registry, jalankan perintah berikut:

      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
      
  2. Konfigurasi pengelola jalur data penerimaan. Layanan pengelolaan, GPUDirect-TCPX Receive Data Path Manager, harus berjalan bersama aplikasi yang menggunakan GPUDirect-TCPX. Untuk memulai layanan di setiap VM Container-Optimized OS, jalankan perintah berikut:

    docker run --pull=always --rm \
      --name receive-datapath-manager \
      --detach \
      --privileged \
      --cap-add=NET_ADMIN --network=host \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --device /dev/nvidia0:/dev/nvidia0 \
      --device /dev/nvidia1:/dev/nvidia1 \
      --device /dev/nvidia2:/dev/nvidia2 \
      --device /dev/nvidia3:/dev/nvidia3 \
      --device /dev/nvidia4:/dev/nvidia4 \
      --device /dev/nvidia5:/dev/nvidia5 \
      --device /dev/nvidia6:/dev/nvidia6 \
      --device /dev/nvidia7:/dev/nvidia7 \
      --device /dev/nvidia-uvm:/dev/nvidia-uvm \
      --device /dev/nvidiactl:/dev/nvidiactl \
      --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
      --volume /run/tcpx:/run/tcpx \
      --entrypoint /tcpgpudmarxd/build/app/tcpgpudmarxd \
    us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd \
      --gpu_nic_preset a3vm --gpu_shmem_type fd --uds_path "/run/tcpx" --setup_param "--verbose 128 2 0"
    
  3. Verifikasi bahwa container receive-datapath-manager telah dimulai.

    docker container logs --follow receive-datapath-manager
    

    Output akan terlihat seperti berikut:

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
    
  4. Untuk berhenti melihat log, tekan ctrl-c.

  5. Instal aturan tabel IP.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. Konfigurasi NVIDIA Collective Communications Library (NCCL) dan plugin GPUDirect-TCPX.

    Kombinasi biner plugin GPUDirect-TCPX dan versi library NCCL tertentu diperlukan untuk menggunakan NCCL dengan dukungan GPUDirect-TCPX. Google Cloud telah menyediakan paket yang memenuhi persyaratan ini.

    Untuk menginstal paket Google Cloud , jalankan perintah berikut:

    docker run --rm -v /var/lib:/var/lib us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx install --install-nccl
    sudo mount --bind /var/lib/tcpx /var/lib/tcpx
    sudo mount -o remount,exec /var/lib/tcpx
    

    Jika perintah ini berhasil, file libnccl-net.so dan libnccl.so akan ditempatkan di direktori /var/lib/tcpx/lib64.

Menjalankan pengujian

Di setiap VM A3, jalankan pengujian NCCL dengan menyelesaikan langkah-langkah berikut:

  1. Mulai penampung.

    #!/bin/bash
    
    function run_tcpx_container() {
    docker run \
      -u 0 --network=host \
      --cap-add=IPC_LOCK \
      --userns=host \
      --volume /run/tcpx:/tmp \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/tcpx/lib64:/usr/local/tcpx/lib64 \
      --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
      --device /dev/nvidia0:/dev/nvidia0 \
      --device /dev/nvidia1:/dev/nvidia1 \
      --device /dev/nvidia2:/dev/nvidia2 \
      --device /dev/nvidia3:/dev/nvidia3 \
      --device /dev/nvidia4:/dev/nvidia4 \
      --device /dev/nvidia5:/dev/nvidia5 \
      --device /dev/nvidia6:/dev/nvidia6 \
      --device /dev/nvidia7:/dev/nvidia7 \
      --device /dev/nvidia-uvm:/dev/nvidia-uvm \
      --device /dev/nvidiactl:/dev/nvidiactl \
      --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/local/tcpx/lib64 \
      "$@"
    }
    

    Perintah sebelumnya menyelesaikan hal berikut:

    • Memasang perangkat NVIDIA dari /dev ke dalam container
    • Menetapkan namespace jaringan container ke host
    • Menetapkan namespace pengguna container ke host
    • Menambahkan CAP_IPC_LOCK ke kemampuan penampung
    • Memasang /tmp host ke /tmp container
    • Memasang jalur penginstalan plugin NCCL dan GPUDirect-TCPX NCCL ke dalam penampung dan menambahkan jalur yang dipasang ke LD_LIBRARY_PATH
  2. Setelah Anda memulai container, aplikasi yang menggunakan NCCL dapat berjalan dari dalam container. Misalnya, untuk menjalankan pengujian run-allgather, selesaikan langkah-langkah berikut:

    1. Di setiap VM A3, jalankan perintah berikut:

      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
      
    2. Di satu VM, jalankan perintah berikut:

      1. Siapkan koneksi antar-VM. Ganti VM-0 dan VM-1 dengan nama setiap VM.

        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
        

        Tindakan ini akan membuat direktori /scripts/hostfiles2 di setiap VM.

      2. Jalankan skrip.

        /scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2
        

        Skrip run-allgather memerlukan waktu sekitar dua menit untuk dijalankan. Di akhir log, Anda akan melihat hasil all-gather.

        Jika Anda melihat baris berikut dalam log NCCL, ini memverifikasi bahwa GPUDirect-TCPX berhasil diinisialisasi.

        NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.