Halaman ini menunjukkan cara memaksimalkan bandwidth dan throughput jaringan untuk workload GPU berperforma tinggi di cluster Google Kubernetes Engine (GKE) Standard menggunakan GPUDirect-TCPXO, GPUDirect-TCPX, gVNIC, dan multi-jaringan. Jika Anda menggunakan cluster Autopilot, lihat Memaksimalkan bandwidth jaringan GPU di cluster mode Autopilot.
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 berdekatan secara fisik 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:
- Membuat Virtual Private Cloud (VPC) dan subnet
- Buat lingkungan GKE.
- Menginstal biner GPUDirect dan plugin NCCL
- Men-deploy plugin injector perangkat NRI
- 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.
- GPUDirect-TCPX didukung di GKE versi 1.27 atau yang lebih baru dan memerlukan:
- * Jenis mesin
a3-highgpu-8g
. - 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.
- * Jenis mesin
- GPUDirect-TCPXO didukung di GKE versi 1.28 atau yang lebih baru dan memerlukan:
- Jenis mesin
a3-megagpu-8g
. - Untuk GKE versi 1.28, gunakan patch GKE versi 1.28.9-gke.1250000 atau yang lebih baru.
- Untuk GKE versi 1.29, gunakan patch GKE versi 1.29.4-gke.1542000 atau yang lebih baru.
- Jenis mesin
- 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.
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
dana3-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.
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, tentukan192.168.$N.0/24
sehingga subnet pertama menggunakan192.168.1.0/24
, subnet kedua menggunakan192.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, tentukan192.168.$N.0/24
sehingga subnet pertama menggunakan192.168.1.0/24
, subnet kedua menggunakan192.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
.
Pastikan jaringan telah dibuat:
gcloud compute networks list
Membuat lingkungan GKE
Buat cluster GKE baru yang menggunakan multi-jaringan (Pratinjau) dan buat node pool GPU yang memiliki karakteristik berikut:- gVNIC diaktifkan
- Subnet multi-jaringan yang ditentukan untuk setiap NIC sekunder
- Seri mesin A3 dengan GPU H100 yang mendukung node
- Driver NVIDIA terbaru diinstal
Anda tidak dapat mengupdate cluster yang ada untuk menggunakan multi-jaringan.
GPUDirect-TCPXO
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.
Membuat cluster:
gcloud beta container clusters create CLUSTER_NAME \ --enable-dataplane-v2 --enable-ip-alias --zone=ZONE \ --enable-multi-networking --cluster-version=VERSION \ --no-enable-autoupgrade \ --project=PROJECT_ID
Ganti kode berikut:
CLUSTER_NAME
: nama cluster baru.VERSION
: versi GKE yang mendukung GPUDirect-TCPXO, seperti yang dijelaskan dalam Persyaratan.ZONE
: zona komputasi untuk cluster.
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
Membuat cluster:
gcloud beta container clusters create CLUSTER_NAME \ --enable-dataplane-v2 --enable-ip-alias --zone=ZONE \ --enable-multi-networking --cluster-version=VERSION \ --no-enable-autoupgrade \ --project=PROJECT_ID
Ganti kode berikut: *
CLUSTER_NAME
: nama cluster baru Anda. *VERSION
: versi GKE yang mendukung GPUDirect-TCPX, seperti yang dijelaskan di Persyaratan. *ZONE
: zona komputasi untuk cluster.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
GPUDirect-TCPXO
Buat node pool untuk GPU H100:
gcloud beta container node-pools create NODE_POOL_NAME \
--zone=ZONE \
--cluster=CLUSTER_NAME \
--project=PROJECT_ID \
--accelerator=type=nvidia-h100-mega-80gb,count=8,gpu-driver-version=LATEST \
--machine-type=a3-megagpu-8g \
--num-nodes=2 \
--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 \
--additional-node-network network=PREFIX-net-5,subnetwork=PREFIX-sub-5 \
--additional-node-network network=PREFIX-net-6,subnetwork=PREFIX-sub-6 \
--additional-node-network network=PREFIX-net-7,subnetwork=PREFIX-sub-7 \
--additional-node-network network=PREFIX-net-8,subnetwork=PREFIX-sub-8 \
--enable-gvnic \
--no-enable-autoupgrade \
--scopes "https://www.googleapis.com/auth/cloud-platform" \
[--placement-policy=POLICY_NAME \
--reservation-affinity=specific \
--reservation=RESERVATION_NAME \
--host-maintenance-interval=PERIODIC]
Ganti NODE_POOL_NAME
dengan nama node pool Anda.
Dalam contoh, argumen --scopes
"https://www.googleapis.com/auth/cloud-platform" menetapkan cakupan instance node menjadi cloud-platform
untuk memudahkan pengujian. Untuk produksi, Anda dapat membatasi cakupan untuk
mengonfigurasi kredensial yang lebih terperinci.
Gunakan flag --placement-policy
, --reservation-affinity
, dan --reservation
jika Anda menggunakan reservasi. Tentukan tanda ini untuk mengonfigurasi
nama kebijakan dan reservasi di node pool.
Jika perintah ini gagal, Anda mungkin tidak memiliki kuota GPU H100 yang cukup di project. Pastikan Anda memiliki kuota yang memadai, lalu coba lagi perintah tersebut.
GPUDirect-TCPX
Buat node pool 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=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
Ganti NODE_POOL_NAME
dengan nama node pool.
Jika perintah ini gagal, Anda mungkin tidak memiliki kuota GPU H100 yang memadai di project Anda. Pastikan Anda memiliki kuota, lalu coba lagi perintah tersebut.
Setelah membuat node pool, pastikan setiap node memiliki GPU yang terpasang:
Dapatkan daftar node di cluster:
kubectl get nodes
Pastikan setiap node GPU memiliki delapan GPU:
kubectl describe node NODE_NAME
Ganti
NODE_NAME
dengan nama node yang akan dijelaskan.Outputnya mirip dengan hal berikut ini:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
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:
- Prapenginstalan untuk menyiapkan konfigurasi terkait GPUDirect-TCPXO.
- Menginstal library NCCL dan biner GPUDirect-TCPXO di node.
- 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:
Tinjau manifes Daemonset
nccl-tcpxo-installer.yaml
di GitHub.Deploy DaemonSet:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-tcpxo-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-tcpxo-installer
Outputnya mirip dengan hal berikut ini:
# Output nccl-tcpxo-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpxo-installer-qgg82 1/1 Running 0 2m11s
GPUDirect-TCPX
DaemonSet ini melakukan hal berikut:
- Menginstal library NCCL dan biner GPUDirect-TCPX di node.
- 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-TCPX.
Untuk menginstal biner dan mengonfigurasi NCCL, lakukan hal berikut:
Tinjau manifes Daemonset
nccl-tcpx-installer.yaml
di GitHub.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 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:
- Mengaktifkan Node Resource Interface (NRI) di node yang memiliki GPU H100. NRI diaktifkan secara default di GKE versi 1.29 dan yang lebih baru.
- 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:
Tinjau manifes Deployment
nri-device-injector.yaml
di GitHub.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.
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
Men-deploy workload pengujian
Di bagian ini, Anda akan men-deploy contoh beban kerja untuk memverifikasi bahwa NCCL dan GPUDirect-TCPX atau GPUDirect-TCPXO berfungsi seperti yang diharapkan. Contoh workload ini melakukan hal berikut:
- Men-deploy dua Pod, yang masing-masing berjalan di node yang memiliki GPU H100.
- 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.
Deploy dua Pod dengan workload pengujian:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest.yaml
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.
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.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.yaml
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
Pasangan nilai kunci 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
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"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:
Tambahkan pasangan nilai kunci berikut sebagai variabel lingkungan dalam manifes penampung beban kerja Anda:
NCCL_LIB_DIR="/usr/local/nvidia/lib64"
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
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/tcpx/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
Bagian ini menunjukkan kolom wajib yang harus Anda tambahkan ke manifes Kubernetes agar Pod dapat menggunakan GPUDirect.
Bergantung pada jenis GPUDirect, lakukan tindakan berikut:
GPUDirect-TCPXO
Tambahkan anotasi berikut ke metadata Pod. Tanpa anotasi ini,
hostNetwork:true
akan diperlukan untuk Pod, danprivileged:true
akan diperlukan untuk penampungtcpxo-daemon
.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"} ]
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
Tambahkan penampung berikut ke manifes untuk menjalankan layanan
tcpxo-daemon
. Ganti (TCPXO_DAEMON_IMAGE
) dengan gambar terbaruus-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 env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Tambahkan variabel lingkungan berikut ke setiap penampung GPU:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY value: /dev/aperture_devices
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
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
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: main-application-container
...
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- 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
Tambahkan anotasi berikut ke metadata Pod. Tanpa anotasi ini,
hostNetwork:true
akan diperlukan untuk Pod, danprivileged:true
akan diperlukan untuk penampungtcpx-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"}, ]
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
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 env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Tambahkan pemasangan volume berikut ke container yang meminta GPU:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64
Tambahkan variabel lingkungan untuk mengonfigurasi opsi NCCL. Untuk mengetahui detailnya, lihat bagian Menggunakan setelan konfigurasi NCCL yang direkomendasikan untuk meningkatkan performa dalam dokumen ini.
Tambahkan variabel lingkungan berikut ke setiap penampung GPU:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
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
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- 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
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
...
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
- Pelajari praktik terbaik untuk jaringan GKE.
- Pelajari lebih lanjut keluarga teknologi Nvidia GPUDirect untuk pergerakan dan akses data di GPU Nvidia.
- Pelajari ketersediaan versi GPU saat ini dan meminta GPU di GKE.