Halaman ini menunjukkan cara memaksimalkan bandwidth dan throughput jaringan untuk beban kerja GPU berperforma tinggi di cluster Google Kubernetes Engine (GKE) dalam mode Standar. Halaman ini ditujukan bagi engineer machine learning (ML) dan administrator platform yang memfasilitasi beban kerja ML. Anda seharusnya sudah terbiasa dengan 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 kuat 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 dibangun untuk model masif dan skalabel. Mesin ini memiliki manfaat berikut:
- Delapan GPU NVIDIA H100 per mesin.
- Bandwidth hingga 200 Gbps pada NIC utama.
- Hingga empat NIC sekunder, masing-masing mendukung bandwidth hingga 200 Gbps untuk transfer data GPU.
Untuk mengetahui daftar lengkap manfaat, baca Seri mesin A3 dalam dokumentasi Compute Engine.
Beban kerja 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 cocok untuk beban kerja yang memerlukan performa tinggi, throughput tinggi, dan latensi rendah.
Fitur dan kemampuan yang diperlukan untuk memaksimalkan bandwidth
Untuk memaksimalkan bandwidth jaringan Anda di node superkomputer GPU, gunakan semua fitur berikut:
- GPUDirect-TCPX: Mengurangi overhead yang diperlukan untuk mentransfer payload paket ke dan dari GPU, yang secara signifikan meningkatkan throughput dalam skala besar dibandingkan GPU yang tidak menggunakan GPUDirect-TCPX.
- gVNIC: Mengaktifkan kemampuan GPUDirect-TCPX 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.
- Multi-jaringan: Menambahkan NIC sekunder ke mesin yang dioptimalkan akselerator. Untuk komputer A3, tambahkan empat NIC tambahan. Setiap NIC dikaitkan dengan subnet terpisah di VPC-nya sendiri untuk menghindari konflik. Untuk mengetahui detail tentang dukungan multijaringan, lihat Menyiapkan dukungan multijaringan untuk Pod.
- Kebijakan penempatan: Gunakan kebijakan penempatan resource guna menempatkan semua node GPU untuk beban kerja tertentu pada server yang berdekatan secara fisik guna meminimalkan latensi. Untuk mengetahui detailnya, lihat Menentukan penempatan yang ringkas untuk node GKE.
Garis besar prosedur
Untuk menggunakan semua kemampuan ini secara bersamaan, Anda perlu melakukan hal berikut:
- Membuat Virtual Private Cloud (VPC) dan subnet
- Buat lingkungan GKE:
- Membuat cluster dengan multi-jaringan diaktifkan
- Buat kumpulan node dengan karakteristik berikut:
- gVNIC diaktifkan
- Subnet multi-jaringan ditentukan untuk setiap NIC sekunder
- Seri mesin A3 dengan GPU H100 (empat NIC sekunder dan delapan GPU) yang mendukung node
- Driver NVIDIA terbaru yang diinstal
- Menginstal biner GPUDirect-TCPX dan plugin NCCL
- Men-deploy beban kerja pengujian untuk memverifikasi penyiapan GPUDirect-TCPX
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
initialize
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
- GPUDirect-TCPX didukung di GKE versi 1.27 atau yang lebih baru dan memerlukan:
- Untuk GKE versi 1.27, gunakan patch GKE versi 1.27.7-gke.1121000 atau yang lebih baru.
- Untuk GKE versi 1.28, gunakan patch GKE versi 1.28.8-gke.1095000 atau yang lebih baru.
- Untuk GKE versi 1.29, gunakan patch GKE versi 1.29.3-gke.1093000 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:
- Anda tidak dapat menggunakan GPUDirect-TCPX di cluster Autopilot
- Anda hanya dapat menggunakan GPUDirect-TCPX di GKE versi 1.27 atau yang lebih baru dan menggunakan versi patch berikut:
- Untuk GKE versi 1.27, gunakan patch GKE versi 1.27.7-gke.1121000 atau yang lebih baru.
- Untuk GKE versi 1.28, gunakan patch GKE versi 1.28.8-gke.1095000 atau yang lebih baru.
- Untuk GKE versi 1.29, gunakan patch GKE versi 1.29.3-gke.1093000 atau yang lebih baru.
- Anda tidak dapat menggunakan GPUDirect-TCPX dengan GPU multi-instance atau berbagi waktu GPU
- Anda tidak dapat menggunakan FastSocket NCCL
- Lingkungan Anda harus mendukung setelan
hostNetwork: true
di spesifikasi Pod Agar dapat menggunakan SSD Lokal untuk penyimpanan Pod, Anda harus secara eksplisit menentukan jumlah tepat SSD Lokal yang akan dipasang ke VM A3 dasar menggunakan flag
--ephemeral-storage-local-ssd=count=SSD_COUNT
untuk penyimpanan sementara atau flag--local-nvme-ssd-block=count=SSD_COUNT
untuk blok akses. Jika flag ini dihapus, Anda tidak akan dapat menggunakan SSD Lokal di Pod Anda. Tanda ini hanya diperlukan jika Anda ingin menggunakan SSD Lokal untuk akses data.Ukuran mesin yang didukung di GKE adalah
a3-highgpu-8g
, dan jumlah SSD Lokal yang sesuai adalah16
.
Membuat VPC dan subnet
Buat jaringan VPC terpisah dalam project Anda untuk setiap NIC virtual yang akan ditambahkan ke node Anda. Setiap VPC harus memiliki subnet dan aturan firewall yang mengizinkan traffic jaringan internal. Untuk memaksimalkan bandwidth, sebaiknya buat empat jaringan baru.
Perbarui subnetwork VPC default di project Anda untuk menambahkan rentang alamat IP sekunder untuk Pod dan Service:
gcloud compute networks subnets update DEFAULT_NETWORK \ --region=REGION \ --add-secondary-ranges="CLUSTER_NAME-pods=POD_IP_ADDRESS_RANGE,CLUSTER_NAME-services=SERVICE_IP_ADDRESS_RANGE"
Ganti kode berikut:
DEFAULT_NETWORK
: nama subnet default di project Anda.REGION
: region subnet default.CLUSTER_NAME
: nama cluster GKE Anda.POD_IP_ADDRESS_RANGE
: rentang alamat IP untuk Pod di cluster yang akan digunakan, dalam notasi CIDR. Contoh,10.64.0.0/19
.SERVICE_IP_ADDRESS_RANGE
: rentang alamat IP untuk Layanan di cluster yang akan digunakan, dalam notasi CIDR. Harus berbeda dengan rentang Pod. Contoh,10.65.0.0/19
.
Buat jaringan VPC untuk GPUDirect-TCPX di project Anda, masing-masing dengan subnet dan aturan firewall:
for N in $(seq 1 4); do gcloud compute networks create PROJECT_ID-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PROJECT_ID-sub-$N \ --network=PROJECT_ID-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PROJECT_ID-internal-$N \ --network=PROJECT_ID-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, jadi gunakan variabel untuk mengubah alamat IP setiap subnet. Misalnya, tentukan192.168.$N.0/24
agar subnet pertama menggunakan192.168.1.0/24
, subnet kedua menggunakan192.168.2.0/24
, dst.SOURCE_RANGE
: Rentang alamat IP sumber bagi aturan firewall untuk mengizinkan traffic masuk, dalam notasi CIDR. Misalnya,192.168.0.0/16
.
Pastikan jaringan telah dibuat:
gcloud compute networks list
Membuat lingkungan GKE
Membuat cluster GKE baru yang menggunakan multijaringan (Pratinjau) dan membuat node pool GPU yang menggunakan mesin A3 dengan GPU H100 terpasang dan empat NIC tambahan. Anda tidak dapat mengupdate cluster yang ada untuk menggunakan multi-jaringan.
Membuat cluster:
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --cluster-version=VERSION \ --enable-dataplane-v2 --enable-ip-alias \ --enable-multi-networking \ --no-enable-autoupgrade \ --cluster-secondary-range-name=CLUSTER_NAME-pods \ --services-secondary-range-name=CLUSTER_NAME-services
Ganti kode berikut:
CLUSTER_NAME
: nama cluster baru AndaLOCATION
: region Compute Engine untuk clusterVERSION
: versi GKE untuk cluster. Harus versi yang didukung seperti yang dijelaskan di bagian Persyaratan.
Perintah ini juga secara eksplisit menentukan alamat IP sekunder untuk Pod dan Layanan untuk cluster yang Anda buat di bagian sebelumnya.
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: PROJECT_ID-net-1 vpcSubnet: PROJECT_ID-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PROJECT_ID-net-2 vpcSubnet: PROJECT_ID-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PROJECT_ID-net-3 vpcSubnet: PROJECT_ID-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PROJECT_ID-net-4 vpcSubnet: PROJECT_ID-sub-4 deviceMode: NetDevice EOF
Resource ini memberi tahu GKE agar mengonfigurasi NIC untuk traffic GPU dalam mode passthrough. GKE tidak menerapkan pemrograman jaringan bawaan menggunakan eBPF ke traffic ini.
Buat kumpulan node untuk GPU H100:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --machine-type=a3-highgpu-8g \ --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \ --additional-node-network=network=PROJECT_ID-net-1,subnetwork=PROJECT_ID-sub-1 \ --additional-node-network=network=PROJECT_ID-net-2,subnetwork=PROJECT_ID-sub-2 \ --additional-node-network=network=PROJECT_ID-net-3,subnetwork=PROJECT_ID-sub-3 \ --additional-node-network=network=PROJECT_ID-net-4,subnetwork=PROJECT_ID-sub-4 \ --enable-gvnic \ --no-enable-autoupgrade \ [--ephemeral-storage-local-ssd=count=16]
Ganti
NODE_POOL_NAME
dengan nama node pool.Jika perintah ini gagal, Anda mungkin tidak memiliki cukup kuota GPU H100 dalam project. Pastikan Anda memiliki kuota dan coba lagi perintah tersebut.
Dapatkan daftar node dalam cluster:
kubectl get nodes
Pastikan setiap node GPU memiliki delapan GPU:
kubectl describe node NODE_NAME
Outputnya mirip dengan hal berikut ini:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
Menginstal GPUDirect-TCPX dan mengonfigurasi NCCL
Bagian ini menunjukkan cara menginstal biner GPUDirect-TCPX dan NCCL tertentu menggunakan DaemonSet.
Tinjau manifes DaemonSet:
DaemonSet ini melakukan hal berikut:
- Menginstal library NCCL dan biner GPUDirect-TCPX pada node.
- 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
dalam container GPU yang perlu menggunakan NCCL dan GPUDirect-TCPX.
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.
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
Men-deploy workload pengujian
Di bagian ini, Anda akan men-deploy sampel beban kerja untuk memverifikasi bahwa NCCL dan GPUDirect-TCPX berfungsi seperti yang diharapkan. Workload ini mencakup container file bantuan bernama tcpx-daemon, yang menjalankan layanan yang memungkinkan Pod menggunakan GPUDirect-TCPX. Anda harus menambahkan container file bantuan ini ke Pod apa pun di lingkungan Anda sendiri yang perlu menggunakan GPUDirect-TCPX. Untuk cuplikan kolom wajib yang akan ditambahkan ke manifes, lihat Menambahkan GPUDirect-TCPX ke manifes dalam dokumen ini.
- Tinjau
nccl-config-default.yaml
manifes ConfigMap di GitHub. Manifes ini men-deploy scrip yang menginisialisasi pengujian allgather NCCL dan menetapkan variabel lingkungan khusus NCCL. Tinjau manifes
nccl-test.yaml
di GitHub. Manifes ini melakukan hal berikut:- Men-deploy dua Pod, yang masing-masing berjalan di node yang memiliki GPU H100.
- Men-deploy container file bantuan bernama
tcpx-daemon
di setiap Pod agar Pod tersebut dapat menggunakan GPUDirect-TCPX.
Deploy ConfigMap dan workload pengujian:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config-default.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test.yaml
Jalankan perintah berikut untuk memicu pengujian pengumpulan lengkap NCCL untuk node:
head_pod=$(kubectl get pods --output='custom-columns=POD:.metadata.name' --no-headers | head -n1) nodes=($(kubectl get pods --output='custom-columns=NODE:.spec.nodeName' --no-headers)) kubectl exec --stdin --tty --container=nccl-test ${head_pod} -- /configs/allgather.sh ${nodes[@]}
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 variabel lingkungan NCCL untuk meningkatkan performa
Anda dapat memilih untuk menetapkan variabel lingkungan tertentu guna meningkatkan performa workload yang menggunakan NCCL. ConfigMap nccl-config-default.yaml
yang Anda deploy di bagian Men-deploy workload pengujian menetapkan beberapa variabel NCCL secara default. Konfigurasi variabel disimpan dalam skrip run-nccl.sh
di ConfigMap.
Untuk mengubah variabel lingkungan NCCL, deploy manifes ConfigMap yang diupdate dengan variabel yang diubah. Manifes nccl-config-latest.yaml
di GitHub berisi setiap variabel yang direkomendasikan
dengan skrip run-nccl.sh
yang telah diupdate.
Perintah berikut mengupdate ConfigMap yang ada dan memiliki variabel default dengan ConfigMap nccl-config-latest.yaml
yang diupdate:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config-latest.yaml
Kubernetes memerlukan waktu sekitar dua menit untuk mengupdate ConfigMap.
Untuk memeriksa variabel lingkungan NCCL, jalankan perintah berikut:
head_pod=$(kubectl get pods --output='custom-columns=POD:.metadata.name' --no-headers | head -n1)
kubectl exec --stdin --tty --container=nccl-test ${head_pod} -- cat /configs/run-nccl.sh
Menambahkan GPUDirect-TCPX ke manifes Anda
Bagian ini menyediakan kolom wajib diisi yang harus Anda tambahkan ke manifes Kubernetes agar Pod dapat menggunakan GPUDirect-TCPX.
Tambahkan kolom berikut ke spesifikasi Pod:
spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: tcpx-socket hostPath: path: /run/tcpx
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: privileged: true volumeMounts: - name: libraries mountPath: /usr/local/nvidia/lib64 - name: tcpx-socket mountPath: /run/tcpx env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Tambahkan penyangga volume berikut ke container apa pun yang meminta GPU:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64
Tambahkan variabel lingkungan berikut ke setiap penampung GPU:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Secara opsional, tambahkan variabel lingkungan untuk mengonfigurasi opsi NCCL. Untuk mengetahui detailnya, lihat bagian Menggunakan variabel lingkungan NCCL untuk meningkatkan performa dalam dokumen ini.
Spesifikasi Pod yang telah selesai akan terlihat seperti berikut:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
labels:
name: example-pod
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- 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:
privileged: true
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia/lib64
- name: tcpx-socket
mountPath: /run/tcpx
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: nccl-test
image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx:v3.1.2
imagePullPolicy: Always
command:
- /bin/sh
- -c
- "while true; do echo hello; sleep 1; done"
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
volumeMounts:
- name: tcpx-socket
mountPath: /run/tcpx
- name: libraries
mountPath: /usr/local/nvidia/lib64
resources:
limits:
nvidia.com/gpu: 8
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia/lib64
- name: tcpx-socket
hostPath:
path: /run/tcpx