Menyajikan LLM dengan GKE Inference Gateway

Tutorial ini menjelaskan cara men-deploy model bahasa besar (LLM) di Google Kubernetes Engine (GKE) dengan GKE Inference Gateway. Tutorial ini mencakup langkah-langkah untuk penyiapan cluster, deployment model, konfigurasi GKE Inference Gateway, dan penanganan permintaan LLM.

Tutorial ini ditujukan bagi Engineer machine learning (ML), Admin dan operator platform, serta Spesialis Data dan AI yang ingin men-deploy dan mengelola aplikasi LLM di GKE dengan GKE Inference Gateway.

Sebelum membaca halaman ini, pastikan Anda memahami hal-hal berikut:

GKE Inference Gateway meningkatkan kualitas Gateway Google Kubernetes Engine (GKE) untuk mengoptimalkan penayangan aplikasi dan workload AI generatif di GKE. Layanan ini menyediakan pengelolaan dan penskalaan workload AI yang efisien, memungkinkan tujuan performa khusus workload seperti latensi, dan meningkatkan pemanfaatan resource, kemampuan observasi, dan keamanan AI.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan 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 perintah gcloud components update. Versi gcloud CLI yang lebih lama mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Aktifkan Compute Engine API, Network Services API, dan Model Armor API jika diperlukan.

    Buka Aktifkan akses ke API dan ikuti petunjuknya.

  • Pastikan Anda memiliki peran berikut di project: roles/container.admin, roles/iam.serviceAccountAdmin.

  • Pastikan project Anda memiliki kuota yang cukup untuk GPU H100. Untuk mempelajari lebih lanjut, lihat Merencanakan kuota GPU dan Kuota alokasi.

  • Buat akun Hugging Face jika Anda belum memilikinya. Anda akan memerlukannya untuk mengakses resource model untuk tutorial ini.

  • Minta akses ke model Llama 3.1 dan buat token akses. Akses ke model ini memerlukan permintaan yang disetujui di Hugging Face, dan deployment akan gagal jika akses belum diberikan.

    • Menandatangani perjanjian izin lisensi: Anda harus menandatangani perjanjian izin untuk menggunakan model Llama 3.1. Buka halaman model di Hugging Face, verifikasi akun Anda, dan setujui persyaratan.
    • Buat token akses: Untuk mengakses model, Anda memerlukan token Hugging Face. Di akun Hugging Face Anda, buka Your Profile > Settings > Access Tokens, buat token baru dengan izin Baca setidaknya, lalu salin ke papan klip Anda.

Persyaratan GKE Gateway Controller

  • GKE versi 1.32.3 atau yang lebih baru.
  • Google Cloud CLI versi 407.0.0 atau yang lebih baru.
  • Gateway API hanya didukung di cluster native VPC.
  • Anda harus mengaktifkan subnet khusus proxy.
  • Cluster Anda harus mengaktifkan add-on HttpLoadBalancing.
  • Jika menggunakan Istio, Anda harus mengupgrade Istio ke salah satu versi berikut:
    • 1.15.2 atau yang lebih baru
    • 1.14.5 atau yang lebih baru
    • 1.13.9 atau yang lebih baru
  • Jika Anda menggunakan VPC Bersama, di project host, Anda harus menetapkan peran Compute Network User ke Akun Layanan GKE untuk project layanan.

Batas dan pembatasan

Batasan dan batasan berikut berlaku:

  • Gateway multi-cluster tidak didukung.
  • GKE Inference Gateway hanya didukung di resource GatewayClass gke-l7-regional-external-managed dan gke-l7-rilb.
  • Load Balancer Aplikasi internal lintas region tidak didukung.

Mengonfigurasi GKE Inference Gateway

Untuk mengonfigurasi GKE Inference Gateway, lihat contoh ini. Tim menjalankan model vLLM dan Llama3 serta bereksperimen secara aktif dengan dua adaptor yang di-fine-tune LoRA yang berbeda: "food-review" dan "cad-fabricator".

Alur kerja tingkat tinggi untuk mengonfigurasi GKE Inference Gateway adalah sebagai berikut:

  1. Siapkan lingkungan Anda: siapkan infrastruktur dan komponen yang diperlukan.
  2. Buat kumpulan inferensi: tentukan kumpulan server model menggunakan Resource Kustom InferencePool.
  3. Tentukan tujuan inferensi: tentukan tujuan inferensi menggunakan InferenceObjective Resource Kustom
  4. Buat Gateway: ekspos layanan inferensi menggunakan Gateway API.
  5. Buat HTTPRoute: tentukan cara traffic HTTP dirutekan ke layanan inferensi.
  6. Mengirim permintaan inferensi: membuat permintaan ke model yang di-deploy.

Menyiapkan lingkungan Anda

  1. Instal Helm.

  2. Buat cluster GKE:

    • Buat cluster GKE Autopilot atau Standard dengan versi 1.32.3 atau yang lebih baru. Untuk penyiapan referensi deployment sekali klik, lihat contoh cluster-toolkit gke-a3-highgpu.
    • Konfigurasi node dengan akselerator dan kelompok komputasi pilihan Anda.
    • Gunakan Panduan Memulai Inferensi GKE untuk manifes deployment yang telah dikonfigurasi dan diuji, berdasarkan akselerator, model, dan kebutuhan performa yang Anda pilih.
  3. Instal Definisi Resource Kustom (CRD) yang diperlukan di cluster GKE Anda:

    • Untuk GKE versi 1.34.0-gke.1626000 atau yang lebih baru, instal hanya CRD InferenceObjective alfa:

      kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/raw/v1.0.0/config/crd/bases/inference.networking.x-k8s.io_inferenceobjectives.yaml
      
    • Untuk versi GKE yang lebih lama dari 1.34.0-gke.1626000, instal CRD v1 InferencePool dan alfa InferenceObjective:

      kubectl apply -f  https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.0.0/manifests.yaml
      

      Untuk mengetahui informasi selengkapnya, lihat matriks kompatibilitas.

  4. Jika Anda menggunakan versi GKE yang lebih lama dari v1.32.2-gke.1182001 dan ingin menggunakan Model Armor dengan GKE Inference Gateway, Anda harus menginstal CRD ekstensi perutean dan traffic:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/refs/heads/main/config/crd/networking.gke.io_gcptrafficextensions.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-gateway-api/refs/heads/main/config/crd/networking.gke.io_gcproutingextensions.yaml
    

Membuat server model dan deployment model

Bagian ini menunjukkan cara men-deploy server model dan model. Contoh ini menggunakan server model vLLM dengan model Llama3. Deployment diberi label sebagai app:vllm-llama3-8b-instruct. Deployment ini juga menggunakan dua adaptor LoRA bernama food-review dan cad-fabricator dari Hugging Face.

Anda dapat menyesuaikan contoh ini dengan container server model dan model Anda sendiri, port penyaluran, dan nama deployment. Anda juga dapat mengonfigurasi adaptor LoRA dalam deployment, atau men-deploy model dasar. Langkah-langkah berikut menjelaskan cara membuat resource Kubernetes yang diperlukan.

  1. Buat Secret Kubernetes untuk menyimpan token Hugging Face Anda. Token ini digunakan untuk mengakses model dasar dan adaptor LoRA:

    kubectl create secret generic hf-token --from-literal=token=HF_TOKEN
    

    Ganti HF_TOKEN dengan token Hugging Face Anda.

  2. Men-deploy server model dan model. Perintah berikut menerapkan manifes yang menentukan Deployment Kubernetes untuk server model vLLM dengan model Llama3:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api-inference-extension/release-1.0/config/manifests/vllm/gpu-deployment.yaml
    

Membuat kumpulan inferensi

Resource kustom Kubernetes InferencePool menentukan grup Pod dengan konfigurasi komputasi dan model bahasa besar (LLM) dasar yang sama. Kolom selector menentukan Pod mana yang termasuk dalam kumpulan ini. Label dalam pemilih ini harus sama persis dengan label yang diterapkan ke Pod server model Anda. Kolom targetPort menentukan port yang digunakan server model dalam Pod. Kolom extensionRef mereferensikan layanan ekstensi yang menyediakan kemampuan tambahan untuk kumpulan inferensi. InferencePool memungkinkan GKE Inference Gateway merutekan traffic ke Pod server model Anda.

Sebelum membuat InferencePool, pastikan Pod yang dipilih oleh InferencePool sudah berjalan.

Untuk membuat InferencePool menggunakan Helm, lakukan langkah-langkah berikut:

helm install vllm-llama3-8b-instruct \
  --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

Ubah kolom berikut agar sesuai dengan Deployment Anda:

  • inferencePool.modelServers.matchLabels.app: kunci label yang digunakan untuk memilih Pod server model Anda.

Untuk pemantauan, pengambilan metrik untuk Google Cloud Managed Service for Prometheus diaktifkan secara default.

  • Untuk menonaktifkan fitur ini, tambahkan tanda --set inferenceExtension.monitoring.gke.enabled=false ke perintah.
  • Jika Anda menggunakan pemantauan default di cluster GKE Autopilot, Anda juga harus menambahkan tanda --set provider.gke.autopilot=true.

Penginstalan Helm akan otomatis menginstal kebijakan waktu tunggu yang diperlukan, endpoint-picker, dan Pod yang diperlukan untuk kemampuan pengamatan.

Tindakan ini akan membuat objek InferencePool: vllm-llama3-8b-instruct yang mereferensikan layanan endpoint model dalam Pod. Tindakan ini juga membuat deployment Pemilih Endpoint bernama app:vllm-llama3-8b-instruct-epp untuk InferencePool yang dibuat ini.

Tentukan tujuan inferensi

Resource kustom InferenceObjective memungkinkan Anda menentukan prioritas permintaan.

Kolom metadata.name resource InferenceObjective menentukan nama Inference Objective, kolom Priority menentukan tingkat kritisnya, dan kolom poolRef menentukan InferencePool tempat model ditayangkan.

apiVersion: inference.networking.k8s.io/v1alpha2
kind: InferenceObjective
metadata:
  name: NAME
spec:
  priority: VALUE
  poolRef:
    name: INFERENCE_POOL_NAME
    group: "inference.networking.k8s.io"

Ganti kode berikut:

  • NAME: nama Inference Objective Anda. Contoh, food-review.
  • VALUE: prioritas untuk Tujuan Inferensi. Ini adalah bilangan bulat dengan nilai yang lebih tinggi menunjukkan permintaan yang lebih penting. Misalnya, 10.
  • INFERENCE_POOL_NAME: nama InferencePool yang Anda buat di langkah sebelumnya. Contohnya, vllm-llama3-8b-instruct.

Untuk membuat InferenceObjective, lakukan langkah-langkah berikut:

  1. Simpan manifes berikut sebagai inference-objectives.yaml. Manifes ini membuat dua resource InferenceObjective. Yang pertama mengonfigurasi Tujuan Inferensi food-review pada InferencePool vllm-llama3-8b-instruct dengan prioritas 10. Konfigurasi kedua mengonfigurasi Tujuan Inferensi llama3-base-model agar ditayangkan dengan prioritas yang lebih tinggi yaitu 20.

    apiVersion: inference.networking.x-k8s.io/v1alpha2
    kind: InferenceObjective
    metadata:
      name: food-review
    spec:
      priority: 10
      poolRef:
        name: vllm-llama3-8b-instruct
        group: "inference.networking.k8s.io"
    ---
    apiVersion: inference.networking.x-k8s.io/v1alpha2
    kind: InferenceObjective
    metadata:
      name: llama3-base-model
    spec:
      priority: 20 # Higher priority
      poolRef:
        name: vllm-llama3-8b-instruct
    
  2. Terapkan manifes contoh ke cluster Anda:

    kubectl apply -f inference-objectives.yaml
    

Buat Gateway

Resource Gateway adalah titik entri untuk traffic eksternal ke dalam cluster Kubernetes Anda. Menentukan pemroses yang menerima koneksi masuk.

Gateway Inferensi GKE kompatibel dengan Class Gateway berikut:

  • gke-l7-rilb: untuk Load Balancer Aplikasi internal regional.
  • gke-l7-regional-external-managed: untuk Load Balancer Aplikasi eksternal regional.

Untuk mengetahui informasi selengkapnya, lihat dokumentasi Gateway Classes.

Untuk membuat Gateway, lakukan langkah-langkah berikut:

  1. Simpan manifes contoh berikut sebagai gateway.yaml:

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: GATEWAY_NAME
    spec:
      gatewayClassName: GATEWAY_CLASS
      listeners:
        - protocol: HTTP
          port: 80
          name: http
    

    Ganti kode berikut:

    • GATEWAY_NAME: nama unik untuk resource Gateway Anda. Contoh, inference-gateway.
    • GATEWAY_CLASS: Gateway Class yang ingin Anda gunakan. Contoh, gke-l7-regional-external-managed.
  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f gateway.yaml
    

Catatan: Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi TLS untuk mengamankan Gateway Anda dengan HTTPS, lihat dokumentasi GKE tentang konfigurasi TLS.

Buat HTTPRoute

Resource HTTPRoute menentukan cara GKE Gateway merutekan permintaan HTTP masuk ke layanan backend, seperti InferencePool Anda. Resource HTTPRoute menentukan aturan pencocokan (misalnya, header atau jalur) dan backend yang akan meneruskan traffic.

  1. Untuk membuat HTTPRoute, simpan contoh manifes berikut sebagai httproute.yaml:

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: HTTPROUTE_NAME
    spec:
      parentRefs:
      - name: GATEWAY_NAME
      rules:
      - matches:
        - path:
            type: PathPrefix
            value: PATH_PREFIX
        backendRefs:
        - name: INFERENCE_POOL_NAME
          group: "inference.networking.k8s.io"
          kind: InferencePool
    

    Ganti kode berikut:

    • HTTPROUTE_NAME: nama unik untuk resource HTTPRoute Anda. Misalnya, my-route.
    • GATEWAY_NAME: nama resource Gateway yang Anda buat. Misalnya, inference-gateway.
    • PATH_PREFIX: awalan jalur yang Anda gunakan untuk mencocokkan permintaan masuk. Misalnya, / untuk mencocokkan semuanya.
    • INFERENCE_POOL_NAME: nama resource InferencePool yang ingin Anda tuju untuk merutekan traffic. Misalnya, vllm-llama3-8b-instruct.
  2. Terapkan manifes ke cluster Anda:

    kubectl apply -f httproute.yaml
    

Mengirim permintaan inferensi

Setelah mengonfigurasi GKE Inference Gateway, Anda dapat mengirim permintaan inferensi ke model yang di-deploy. Dengan demikian, Anda dapat membuat teks berdasarkan perintah input dan parameter yang ditentukan.

Untuk mengirim permintaan inferensi, lakukan langkah-langkah berikut:

  1. Tetapkan variabel lingkungan berikut:

    export GATEWAY_NAME=GATEWAY_NAME
    export PORT_NUMBER=PORT_NUMBER # Use 80 for HTTP
    

    Ganti kode berikut:

    • GATEWAY_NAME: nama resource Gateway Anda.
    • PORT_NUMBER: nomor port yang Anda konfigurasi di Gateway.
  2. Untuk mendapatkan endpoint Gateway, jalankan perintah berikut:

    echo "Waiting for the Gateway IP address..."
    IP=""
    while [ -z "$IP" ]; do
      IP=$(kubectl get gateway/${GATEWAY_NAME} -o jsonpath='{.status.addresses[0].value}' 2>/dev/null)
      if [ -z "$IP" ]; then
        echo "Gateway IP not found, waiting 5 seconds..."
        sleep 5
      fi
    done
    
    echo "Gateway IP address is: $IP"
    PORT=${PORT_NUMBER}
    
  3. Untuk mengirim permintaan ke endpoint /v1/completions menggunakan curl, jalankan perintah berikut:

    curl -i -X POST ${IP}:${PORT}/v1/completions \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer $(gcloud auth application-default print-access-token)' \
    -d '{
        "model": "MODEL_NAME",
        "prompt": "PROMPT_TEXT",
        "max_tokens": MAX_TOKENS,
        "temperature": "TEMPERATURE"
    }'
    

    Ganti kode berikut:

    • MODEL_NAME: nama model atau adaptor LoRA yang akan digunakan.
    • PROMPT_TEXT: perintah input untuk model.
    • MAX_TOKENS: jumlah maksimum token yang akan dibuat dalam respons.
    • TEMPERATURE: mengontrol keacakan output. Gunakan nilai 0 untuk output deterministik, atau angka yang lebih tinggi untuk output yang lebih kreatif.

Contoh berikut menunjukkan cara mengirim contoh permintaan ke GKE Inference Gateway:

curl -i -X POST ${IP}:${PORT}/v1/completions -H 'Content-Type: application/json' -H 'Authorization: Bearer $(gcloud auth print-access-token)' -d '{
    "model": "food-review-1",
    "prompt": "What is the best pizza in the world?",
    "max_tokens": 2048,
    "temperature": "0"
}'

Perhatikan perilaku berikut:

  • Isi permintaan: isi permintaan dapat menyertakan parameter tambahan seperti stop dan top_p. Lihat spesifikasi OpenAI API untuk mengetahui daftar lengkap opsi.
  • Penanganan error: terapkan penanganan error yang tepat dalam kode klien Anda untuk menangani potensi error dalam respons. Misalnya, periksa kode status HTTP dalam respons curl. Kode status non-200 umumnya menunjukkan error.
  • Autentikasi dan otorisasi: untuk deployment produksi, amankan endpoint API Anda dengan mekanisme autentikasi dan otorisasi. Sertakan header yang sesuai (misalnya, Authorization) dalam permintaan Anda.

Langkah berikutnya