Dokumen ini menunjukkan cara mengonfigurasi ketersediaan tinggi lintas region yang elastis untuk workload inferensi AI menggunakan Multi-Cluster Inference Gateway Google Kubernetes Engine (GKE) dan fitur Penskalaan Otomatis GKE. Penyiapan ini memungkinkan Anda melakukan load balancing workload secara cerdas di beberapa cluster GKE di region yang berbeda.
Untuk mengetahui informasi selengkapnya tentang GKE Multi-Cluster Inference Gateway, lihat Tentang GKE Multi-Cluster Inference Gateway.
Sebelum memulai
Aktifkan Google Kubernetes Engine API.
Instal dan lakukan inisialisasi Google Cloud CLI jika Anda berencana menggunakannya untuk tugas ini.
Pastikan project Anda memiliki kuota yang cukup untuk GPU H100. Untuk mengetahui informasi selengkapnya, lihat kuota GPU dan alokasi resource.
Gunakan GKE versi 1.34.1-gke.1127000 atau yang lebih baru.
Gunakan gcloud CLI versi 480.0.0 atau yang lebih baru.
Pastikan akun layanan yang digunakan oleh node Anda memiliki izin
roles/monitoring.metricWriterdanroles/stackdriver.resourceMetadata.writer.Pastikan Anda memiliki peran Identity and Access Management (IAM)
roles/container.admindanroles/iam.serviceAccountAdmindi project.Selesaikan prasyarat Hugging Face berikut:
- Buat akun Hugging Face.
- Minta dan dapatkan persetujuan untuk akses ke model Llama 3.1 di Hugging Face.
- Tandatangani perjanjian izin lisensi di halaman model di Hugging Face.
- Buat token akses Hugging Face dengan minimal izin Baca.
Membuat cluster dan node pool
Untuk membuat dua cluster GKE di region yang berbeda dan mengonfigurasi kumpulan node-nya, ikuti langkah-langkah berikut:
Buat cluster pertama:
gcloud container clusters create gke-west --zone \ CLUSTER_1_ZONE \ --project=PROJECT_ID \ --gateway-api=standard \ --cluster-version=GKE_VERSION \ --machine-type="MACHINE_TYPE" \ --disk-type="DISK_TYPE" \ --enable-managed-prometheus --monitoring=SYSTEM,DCGM \ --hpa-profile=performance \ --workload-pool=PROJECT_ID.s3ns.svc.id.goog \ --asyncGanti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_1_ZONE: zona untuk cluster pertama, misalnyaeurope-west3-cGKE_VERSION: versi GKE yang akan digunakan, misalnya1.34.1-gke.1127000MACHINE_TYPE: jenis mesin untuk node cluster, misalnyac2-standard-16DISK_TYPE: jenis disk untuk node cluster, misalnyapd-standard
Buat node pool H100 di cluster pertama:
gcloud container node-pools create h100 \ --accelerator "type=nvidia-h100-80gb,count=2,gpu-driver-version=latest" \ --project=PROJECT_ID \ --location=CLUSTER_1_ZONE \ --node-locations=CLUSTER_1_ZONE \ --cluster=CLUSTER_1_NAME \ --machine-type=NODE_POOL_MACHINE_TYPE \ --num-nodes=NUM_NODES \ --spot \ --min-nodes=MIN_NUM_NODES \ --max-nodes=MAX_NUM_NODES \ --enable-autoscaling \ --asyncGanti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_1_ZONE: zona untuk cluster pertama, misalnyaeurope-west3-cCLUSTER_1_NAME: nama cluster pertama, misalnyagke-westNODE_POOL_MACHINE_TYPE: jenis mesin untuk node pool, misalnyaa3-highgpu-2gNUM_NODES: jumlah node dalam node pool, misalnya3MIN_NUM_NODES: jumlah minimum node untuk penskalaan otomatis di node pool, misalnya1MAX_NUM_NODES: jumlah node maksimum untuk penskalaan otomatis di node pool, misalnya10
Dapatkan kredensial dan buat rahasia token Hugging Face di cluster pertama:
gcloud container clusters get-credentials CLUSTER_1_NAME \ --location CLUSTER_1_ZONE \ --project=PROJECT_ID kubectl create secret generic hf-token \ --from-literal=token=HF_TOKENGanti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_1_NAME: nama cluster pertama, misalnyagke-westCLUSTER_1_ZONE: zona untuk cluster pertama, misalnyaeurope-west3-cHF_TOKEN: token akses Hugging Face Anda
Buat cluster kedua di region yang berbeda dari cluster pertama:
gcloud container clusters create gke-east --zone CLUSTER_2_ZONE \ --project=PROJECT_ID \ --gateway-api=standard \ --cluster-version=GKE_VERSION \ --machine-type="MACHINE_TYPE" \ --disk-type="DISK_TYPE" \ --enable-managed-prometheus \ --monitoring=SYSTEM,DCGM \ --hpa-profile=performance \ --workload-pool=PROJECT_ID.s3ns.svc.id.goog \ --asyncGanti
CLUSTER_2_ZONEdengan zona untuk cluster kedua, misalnyaus-east4-a.Buat node pool H100 untuk cluster kedua:
gcloud container node-pools create h100 \ --accelerator "type=nvidia-h100-80gb,count=2,gpu-driver-version=latest" \ --project=PROJECT_ID \ --location=CLUSTER_2_ZONE \ --node-locations=CLUSTER_2_ZONE \ --cluster=CLUSTER_2_NAME \ --machine-type=NODE_POOL_MACHINE_TYPE \ --num-nodes=NUM_NODES \ --spot \ --min-nodes=MIN_NUM_NODES \ --max-nodes=MAX_NUM_NODES \ --enable-autoscaling \ --asyncGanti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_2_ZONE: zona untuk cluster kedua, misalnyaus-east4-aCLUSTER_2_NAME: nama cluster kedua, misalnyagke-eastNODE_POOL_MACHINE_TYPE: jenis mesin untuk node pool, misalnyaa3-highgpu-2gNUM_NODES: jumlah node dalam node pool, misalnya3MIN_NUM_NODES: jumlah minimum node untuk penskalaan otomatis di node pool, misalnya1MAX_NUM_NODES: jumlah node maksimum untuk penskalaan otomatis di node pool, misalnya10
Dapatkan kredensial dan buat secret untuk token Hugging Face di cluster kedua:
gcloud container clusters get-credentials CLUSTER_2_NAME \ --location CLUSTER_2_ZONE \ --project=PROJECT_ID kubectl create secret generic hf-token --from-literal=token=HF_TOKENGanti kode berikut. Untuk definisi variabel lainnya, lihat langkah-langkah sebelumnya:
HF_TOKEN: token akses Hugging Face Anda
Mendaftarkan cluster ke fleet
Daftarkan cluster Anda ke fleet project Anda:
gcloud container fleet memberships register CLUSTER_1_NAME \ --gke-cluster CLUSTER_1_ZONE/CLUSTER_1_NAME \ --location=global \ --project=PROJECT_ID gcloud container fleet memberships register CLUSTER_2_NAME \ --gke-cluster CLUSTER_2_ZONE/CLUSTER_2_NAME \ --location=global \ --project=PROJECT_IDGanti yang berikut, dan lihat langkah-langkah sebelumnya untuk mengetahui definisi variabel lainnya:
CLUSTER_1_NAME: nama cluster pertama, misalnyagke-westCLUSTER_2_NAME: nama cluster kedua, misalnyagke-east
Aktifkan fitur Multi-Cluster Ingress dan tetapkan cluster konfigurasi:
gcloud container fleet ingress enable \ --config-membership=projects/PROJECT_ID/locations/global/memberships/CLUSTER_1_NAMEGanti kode berikut. Untuk definisi variabel lainnya, lihat langkah-langkah sebelumnya:
PROJECT_ID: project ID AndaCLUSTER_1_NAME: nama cluster pertama, misalnyagke-west
Membuat subnet khusus proxy
Peringatan: Cloud de Confiance by S3NS memungkinkan setiap jaringan VPC hanya memiliki satu
subnet khusus proxy per region. Jika region target sudah berisi subnet khusus proxy dengan setelan purpose=REGIONAL_MANAGED_PROXY, pembuatan subnet GLOBAL_MANAGED_PROXY akan gagal. Anda harus menghapus subnet khusus proxy regional yang ada terlebih dahulu. Menghapus subnet khusus proxy regional akan memengaruhi semua
load balancer berbasis Envoy regional di region tersebut yang menggunakannya, jadi rencanakan
perubahan dengan tepat.
Buat subnet di region cluster pertama:
gcloud compute networks subnets create CLUSTER_1_REGION-subnet \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=CLUSTER_1_REGION \ --network=default \ --range=SUBNET_RANGE_1 \ --project=PROJECT_IDGanti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_1_REGION: region untuk cluster pertama, misalnyaeurope-west3SUBNET_RANGE_1: rentang IP subnet untuk subnet khusus proxy di region cluster pertama, misalnya10.0.0.0/23
Buat subnet di region cluster kedua:
gcloud compute networks subnets create CLUSTER_2_REGION-subnet \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=CLUSTER_2_REGION \ --network=default \ --range=SUBNET_RANGE_2 \ --project=PROJECT_IDGanti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_2_REGION: region untuk cluster kedua, misalnyaus-east4SUBNET_RANGE_2: rentang IP subnet untuk subnet khusus proxy di region cluster kedua, misalnya10.5.0.0/23
Menginstal resource kustom yang diperlukan
Tentukan variabel konteks untuk cluster Anda:
CLUSTER1_CONTEXT="gke_PROJECT_ID_CLUSTER_1_ZONE_CLUSTER_1_NAME" CLUSTER2_CONTEXT="gke_PROJECT_ID_CLUSTER_2_ZONE_CLUSTER_2_NAME"Ganti kode berikut:
PROJECT_ID: project ID AndaCLUSTER_1_ZONE: zona untuk cluster pertama, misalnyaeurope-west3-cCLUSTER_1_NAME: nama cluster pertama, misalnyagke-westCLUSTER_2_ZONE: zona untuk cluster kedua, misalnyaus-east4-aCLUSTER_2_NAME: nama cluster kedua, misalnyagke-east
Instal resource kustom InferencePool dan InferenceObjective di kedua cluster:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.0.1/manifests.yaml --context=$CLUSTER1_CONTEXT kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.0.1/manifests.yaml --context=$CLUSTER2_CONTEXT
Men-deploy resource ke cluster target
Deploy server model ke kedua cluster:
kubectl apply -f \ https://raw.githubusercontent.com/kubernetes-sigs/gateway-api-inference-extension/release-1.0/config/manifests/vllm/gpu-deployment.yaml \ --context=$CLUSTER1_CONTEXT kubectl apply -f \ https://raw.githubusercontent.com/kubernetes-sigs/gateway-api-inference-extension/release-1.0/config/manifests/vllm/gpu-deployment.yaml \ --context=$CLUSTER2_CONTEXTSimpan manifes berikut ke file bernama
inference-objective.yaml:apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceObjective metadata: name: food-review spec: priority: 10 poolRef: name: llama3-8b-instruct group: "inference.networking.k8s.io"Terapkan manifes ke kedua cluster:
kubectl apply -f inference-objective.yaml --context=$CLUSTER1_CONTEXT kubectl apply -f inference-objective.yaml --context=$CLUSTER2_CONTEXTDeploy resource InferencePool ke kedua cluster menggunakan Helm:
helm install vllm-llama3-8b-instruct \ --kube-context $CLUSTER1_CONTEXT \ --set inferencePool.modelServers.matchLabels.app=vllm-llama3-8b-instruct \ --set provider.name=gke \ --set inferenceExtension.monitoring.gke.enabled=true \ --version v1.0.1 \ oci://registry.k8s.io/gateway-api-inference-extension/charts/inferencepool helm install vllm-llama3-8b-instruct \ --kube-context $CLUSTER2_CONTEXT \ --set inferencePool.modelServers.matchLabels.app=vllm-llama3-8b-instruct \ --set provider.name=gke \ --set inferenceExtension.monitoring.gke.enabled=true \ --version v1.0.1 \ oci://registry.k8s.io/gateway-api-inference-extension/charts/inferencepoolDi kedua cluster, tandai resource
InferencePoolsebagai diekspor di kedua cluster:kubectl annotate inferencepool vllm-llama3-8b-instruct networking.gke.io/export="True" \ --context=$CLUSTER1_CONTEXT kubectl annotate inferencepool vllm-llama3-8b-instruct networking.gke.io/export="True" \ --context=$CLUSTER2_CONTEXT
Men-deploy Inference Gateway lintas region
Simpan manifes berikut sebagai
mygateway.yaml:--- kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: cross-region-gateway namespace: default spec: gatewayClassName: gke-l7-cross-regional-internal-managed-mc addresses: - type: networking.gke.io/ephemeral-ipv4-address/europe-west3 value: "europe-west3" - type: networking.gke.io/ephemeral-ipv4-address/us-east4 value: "us-east4" listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRoute namespaces: from: All --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: vllm-llama3-8b-instruct-default spec: parentRefs: - name: cross-region-gateway kind: Gateway rules: - backendRefs: - group: networking.gke.io kind: GCPInferencePoolImport name: vllm-llama3-8b-instruct --- kind: HealthCheckPolicy apiVersion: networking.gke.io/v1 metadata: name: health-check-policy namespace: default spec: targetRef: group: "networking.gke.io" kind: GCPInferencePoolImport name: vllm-llama3-8b-instruct default: config: type: HTTP httpHealthCheck: requestPath: /health port: 8000Terapkan manifes ke cluster konfigurasi:
kubectl apply -f mygateway.yaml --context=CLUSTER1_CONTEXTGanti kode berikut:
CLUSTER1_CONTEXT: konteks untuk cluster pertama, misalnyagke_my-project_europe-west3-c_gke-west
Mengaktifkan pelaporan metrik kustom
Buat file bernama
metrics.yamldengan konten berikut:apiVersion: autoscaling.gke.io/v1beta1 kind: AutoscalingMetric metadata: name: gpu-cache namespace: default spec: selector: matchLabels: app: vllm-llama3-8b-instruct endpoints: - port: 8000 path: /metrics metrics: - name: vllm:kv_cache_usage_perc exportName: kv-cache - name: vllm:gpu_cache_usage_perc exportName: kv-cache-oldUntuk setiap cluster, terapkan konfigurasi metrik:
kubectl apply -f metrics.yaml --context=CLUSTER1_CONTEXT kubectl apply -f metrics.yaml --context=CLUSTER2_CONTEXTUntuk mengetahui definisi
CLUSTER1_CONTEXTdanCLUSTER2_CONTEXT, lihat Menginstal resource kustom yang diperlukan.
Mengonfigurasi kebijakan load balancing
Bagian ini menjelaskan cara mengonfigurasi kebijakan load balancing. Kebijakan ini menentukan cara traffic didistribusikan di seluruh kumpulan inferensi Anda berdasarkan metrik kustom dan preferensi regional. Konfigurasi berikut menetapkan us-east4 sebagai
region pilihan. Traffic meluas ke region lain hanya jika Metrik kustom gke.named_metrics.kv-cache di region us-east4 mencapai penggunaan 80%.
- Untuk vLLM versi v0.10.2 dan yang lebih baru, gunakan metrik
gke.named_metrics.kv-cache. - Untuk versi sebelumnya, gunakan metrik
gke.named_metrics.kv-cache-old.
Buat file bernama
backend-policy.yamldengan konten berikut:kind: GCPBackendPolicy apiVersion: networking.gke.io/v1 metadata: name: my-backend-policy spec: targetRef: group: "networking.gke.io" kind: GCPInferencePoolImport name: vllm-llama3-8b-instruct default: timeoutSec: 600 balancingMode: CUSTOM_METRICS trafficDuration: LONG customMetrics: - name: gke.named_metrics.kv-cache maxUtilizationPercent: 80 dryRun: false scopes: - selector: gke.io/region: "us-east4" backendPreference: PREFERREDTerapkan kebijakan baru:
kubectl apply -f backend-policy.yaml --context=CLUSTER1_CONTEXTGanti
CLUSTER1_CONTEXTdengan konteks untuk cluster pertama, misalnyagke_my-project_europe-west3-c_gke-west
Konfigurasi penskalaan otomatis
Untuk membantu memastikan bahwa setiap cluster dapat menangani peningkatan beban sebelum traffic meluas ke region lain, Anda perlu mengonfigurasi Horizontal-Pod-Autoscaler (HPA) untuk deployment server model Anda.
Prinsip konfigurasi utama
Gunakan metrik kustom yang sama: HPA harus dikonfigurasi untuk melakukan penskalaan berdasarkan metrik kustom yang sama dengan yang Anda gunakan di
GCPBackendPolicyuntuk Multi-Cluster Inference Gateway (misalnya,vllm:kv_cache_usage_perc). Pendekatan ini membantu memastikan bahwa keputusan load balancing dan penskalaan didorong oleh sinyal yang sama dari server inferensi Anda. Metrik yang Anda pilih harus memiliki nilai antara 0 dan 1 untuk menunjukkan pemanfaatan. Jika nilai metrik lebih besar dari 1, nilai tersebut ditafsirkan sebagai pemanfaatan 100% oleh load balancer, yang dapat menyebabkan perilaku perutean yang tidak terduga.Tetapkan target HPA yang lebih rendah: nilai target untuk metrik dalam konfigurasi HPA harus ditetapkan lebih rendah daripada setelan
maxUtilizationPercentyang ditentukan dalamGCPBackendPolicy. Dengan menetapkan target penggunaan HPA yang lebih rendah (misalnya, HPA melakukan penskalaan pada penggunaan rata-rata 50%), Anda memungkinkan cluster menambahkan lebih banyak replika sebelum batas load balancer (misalnya, penggunaan 80%) tercapai. Pendekatan ini membantu memaksimalkan kapasitas dalam Region pilihan. Target pemanfaatan yang lebih rendah juga membantu mencegah peluapan traffic prematur dengan mencadangkan ketersediaan tinggi lintas region yang elastis untuk saat region saat ini benar-benar mendekati batasnya.
Beri pengguna kemampuan untuk membuat peran otorisasi yang diperlukan:
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole cluster-admin --user "$(gcloud config get-value account)" --context=CLUSTER1_CONTEXT kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole cluster-admin --user "$(gcloud config get-value account)" --context=CLUSTER2_CONTEXTVariabel
CLUSTER1_CONTEXTdanCLUSTER2_CONTEXTditentukan di bagian Instal resource kustom yang diperlukan.Untuk setiap cluster, terapkan manifes:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml --context=CLUSTER1_CONTEXT kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml --context=CLUSTER2_CONTEXTIzinkan akun layanan
custom-metrics-stackdriver-adapteruntuk membaca metrik Cloud Monitoring:PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding projects/PROJECT_ID \ --role roles/monitoring.viewer \ --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapterGanti
PROJECT_IDdengan project ID AndaSimpan manifes berikut ke file bernama
pod-monitoring.yaml:apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: inference-server-podmon spec: selector: matchLabels: app: vllm-llama3-8b-instruct endpoints: - port: 8000 path: /metrics interval: 5sTerapkan manifes ke kedua cluster:
kubectl apply -f pod-monitoring.yaml --context=CLUSTER1_CONTEXT kubectl apply -f pod-monitoring.yaml --context=CLUSTER2_CONTEXTSimpan manifes berikut ke file bernama
hpa.yaml:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: inference-server-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: vllm-llama3-8b-instruct minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: prometheus.googleapis.com|vllm:gpu_cache_usage_perc|gauge target: type: AverageValue averageValue: "0.5"Terapkan manifes ke kedua cluster:
kubectl apply -f hpa.yaml --context=CLUSTER1_CONTEXT kubectl apply -f hpa.yaml --context=CLUSTER2_CONTEXT
Memverifikasi deployment
Dapatkan alamat IP Gateway:
export GW_IP=$(kubectl get gateway/cross-region-gateway -n default --context=CLUSTER1_CONTEXT -o jsonpath='{.status.addresses[0].value}') echo ${GW_IP}Variabel
CLUSTER1_CONTEXTditentukan di bagian Instal resource kustom yang diperlukan.Mulai sesi
shinteraktif di Pod sementara:kubectl run -it --rm --image=curlimages/curl curly --context=CLUSTER1_CONTEXT -- /bin/shVariabel
CLUSTER1_CONTEXTditentukan di bagian Instal resource kustom yang diperlukan.Dari dalam Pod
curly, kirim permintaan pengujian:curl -i -X POST <var>GW_IP</var>:80/v1/completions \ -H 'Content-Type: application/json' \ -d '{ "model": "food-review-1", "prompt": "What is the best pizza in the world?", "max_tokens": 100, "temperature": 0 }'Ganti
GW_IPdengan alamat IP gateway dari langkah sebelumnya.
Menguji beban gateway
Terapkan beban berkelanjutan ke alamat IP Gateway menggunakan generator beban dalam jaringan VPC yang sama.
Mulai dengan beban sedang yang Anda harapkan dapat ditangani oleh wilayah pilihan (
us-east4).Tingkatkan rasio permintaan atau konkurensi pengujian beban Anda secara bertahap.
Saat uji beban berjalan, pantau sistem di konsol Cloud de Confiance atau menggunakan
kubectl:- Penskalaan Pod (HPA): periksa jumlah Pod di Deployment
vllm-llama3-8b-instructdi kedua cluster. - Penskalaan node (autoscaler cluster): pantau jumlah node di
node pool
h100di kedua cluster. - Metrik kustom: amati metrik
vllm:kv_cache_usage_perc(untuk vllm versi v0.10.2 dan yang lebih tinggi) atau metrikvllm:gpu_cache_usage_perc(untuk vllm versi yang lebih rendah dari v.0.10.2) di Monitoring untuk deployment server model di kedua cluster. - Metrik Load Balancer: periksa metrik untuk Load Balancer yang terkait dengan
cross-region-gatewaydi Monitoring.
- Penskalaan Pod (HPA): periksa jumlah Pod di Deployment
Saat Anda meningkatkan beban, pemanfaatan di us-east4 akan meningkat. Saat HPA di cluster gke-east melakukan penskalaan horizontal dan penggunaan rata-rata mendekati nilai maxUtilization (80%) yang ditentukan dalam GCPBackendPolicy, load balancer akan mulai merutekan permintaan ke cluster gke-west di europe-west3.
Langkah berikutnya
- Pelajari lebih lanjut GKE Gateway API.
- Pelajari lebih lanjut GKE Multi-Cluster Inference Gateway.
- Pelajari lebih lanjut Multi-Cluster Ingress.