Tutorial ini menunjukkan cara menayangkan model bahasa besar (LLM) dengan GPU di Google Kubernetes Engine (GKE) menggunakan beberapa GPU untuk inferensi yang efisien dan skalabel. Tutorial ini membuat cluster GKE yang menggunakan beberapa GPU L4 dan menyiapkan infrastruktur GKE untuk menayangkan salah satu model berikut:
Bergantung pada format data model, jumlah GPU bervariasi. Dalam tutorial ini, setiap model menggunakan dua GPU L4. Untuk mempelajari lebih lanjut, lihat Menghitung jumlah GPU.
Sebelum menyelesaikan tutorial ini di GKE, sebaiknya pelajari Tentang GPU di GKE.
Tujuan
Tutorial ini ditujukan untuk engineer MLOps atau DevOps atau administrator platform yang ingin menggunakan kemampuan orkestrasi GKE untuk menayangkan LLM.
Tutorial ini membahas langkah-langkah berikut:
- Buat cluster dan node pool.
- Siapkan workload Anda.
- Men-deploy workload Anda.
- Berinteraksi dengan antarmuka LLM.
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
.
Beberapa model memiliki persyaratan tambahan. Pastikan Anda memenuhi persyaratan berikut:
- Untuk mengakses model dari Hugging Face, gunakan token HuggingFace.
- Untuk model Mixtral 8x7b - setujui kondisi untuk model Mistral Mixtral.
- Untuk model Llama 3 70b - pastikan Anda memiliki lisensi aktif untuk model Meta Llama.
Menyiapkan lingkungan Anda
Di konsol Google Cloud, mulai instance Cloud Shell:
Buka Cloud ShellTetapkan variabel lingkungan default:
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export REGION=us-central1
Ganti PROJECT_ID dengan project ID Google Cloud Anda.
Membuat cluster dan node pool GKE
Anda dapat menayangkan LLM di GPU dalam cluster GKE Autopilot atau Standard. Sebaiknya gunakan cluster Autopilot untuk pengalaman Kubernetes yang dikelola sepenuhnya. Untuk memilih mode operasi GKE yang paling sesuai untuk workload Anda, lihat Memilih mode operasi GKE.
Autopilot
Jalankan perintah berikut di Cloud Shell:
gcloud container clusters create-auto l4-demo \ --project=${PROJECT_ID} \ --region=${REGION} \ --release-channel=rapid
GKE membuat cluster Autopilot dengan node CPU dan GPU seperti yang diminta oleh beban kerja yang di-deploy.
Konfigurasi
kubectl
untuk berkomunikasi dengan cluster Anda:gcloud container clusters get-credentials l4-demo --region=${REGION}
Standard
Di Cloud Shell, jalankan perintah berikut untuk membuat cluster Standard yang menggunakan Workload Identity Federation untuk GKE:
gcloud container clusters create l4-demo --location ${REGION} \ --workload-pool ${PROJECT_ID}.svc.id.goog \ --enable-image-streaming \ --node-locations=$REGION-a \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type n2d-standard-4 \ --num-nodes 1 --min-nodes 1 --max-nodes 5 \ --release-channel=rapid
Pembuatan cluster mungkin memerlukan waktu beberapa menit.
Jalankan perintah berikut untuk membuat node pool untuk cluster Anda:
gcloud container node-pools create g2-standard-24 --cluster l4-demo \ --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest \ --machine-type g2-standard-24 \ --enable-autoscaling --enable-image-streaming \ --num-nodes=0 --min-nodes=0 --max-nodes=3 \ --node-locations $REGION-a,$REGION-c --region $REGION --spot
GKE membuat resource berikut untuk LLM:
- Cluster edisi Standard Google Kubernetes Engine (GKE) publik.
- Node pool dengan jenis mesin
g2-standard-24
yang diskalakan ke 0 node. Anda tidak akan dikenai biaya untuk GPU apa pun hingga meluncurkan Pod yang meminta GPU. Node pool ini menyediakan Spot VM, yang harganya lebih rendah daripada VM Compute Engine standar default dan tidak memberikan jaminan ketersediaan. Anda dapat menghapus tanda--spot
dari perintah ini, dan pemilih nodecloud.google.com/gke-spot
di konfigurasitext-generation-inference.yaml
untuk menggunakan VM on-demand.
Konfigurasi
kubectl
untuk berkomunikasi dengan cluster Anda:gcloud container clusters get-credentials l4-demo --region=${REGION}
Menyiapkan workload
Bagian berikut menunjukkan cara menyiapkan beban kerja, bergantung pada model yang ingin Anda gunakan:
Llama 3 70b
Tetapkan variabel lingkungan default:
export HF_TOKEN=HUGGING_FACE_TOKEN
Ganti
HUGGING_FACE_TOKEN
dengan token HuggingFace Anda.Buat secret Kubernetes untuk token HuggingFace:
kubectl create secret generic l4-demo \ --from-literal=HUGGING_FACE_TOKEN=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -
Buat manifes
text-generation-inference.yaml
berikut:Dalam manifes ini:
NUM_SHARD
harus2
karena model memerlukan dua GPU NVIDIA L4.QUANTIZE
ditetapkan kebitsandbytes-nf4
yang berarti model dimuat dalam 4 bit, bukan 32 bit. Hal ini memungkinkan GKE untuk mengurangi jumlah memori GPU yang diperlukan dan meningkatkan kecepatan inferensi. Namun, akurasi model dapat menurun. Untuk mempelajari cara menghitung GPU yang akan diminta, lihat Menghitung jumlah GPU.
Terapkan manifes:
kubectl apply -f text-generation-inference.yaml
Outputnya mirip dengan hal berikut ini:
deployment.apps/llm created
Verifikasi status model:
kubectl get deploy
Outputnya mirip dengan hal berikut ini:
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 20m
Lihat log dari deployment yang berjalan:
kubectl logs -l app=llm
Outputnya mirip dengan hal berikut ini:
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Mixtral 8x7b
Tetapkan variabel lingkungan default:
export HF_TOKEN=HUGGING_FACE_TOKEN
Ganti
HUGGING_FACE_TOKEN
dengan token HuggingFace Anda.Buat secret Kubernetes untuk token HuggingFace:
kubectl create secret generic l4-demo \ --from-literal=HUGGING_FACE_TOKEN=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -
Buat manifes
text-generation-inference.yaml
berikut:Dalam manifes ini:
NUM_SHARD
harus2
karena model memerlukan dua GPU NVIDIA L4.QUANTIZE
ditetapkan kebitsandbytes-nf4
yang berarti model dimuat dalam 4 bit, bukan 32 bit. Hal ini memungkinkan GKE untuk mengurangi jumlah memori GPU yang diperlukan dan meningkatkan kecepatan inferensi. Namun, hal ini dapat mengurangi akurasi model. Untuk mempelajari cara menghitung GPU yang akan diminta, lihat Menghitung jumlah GPU.
Terapkan manifes:
kubectl apply -f text-generation-inference.yaml
Outputnya mirip dengan hal berikut ini:
deployment.apps/llm created
Verifikasi status model:
watch kubectl get deploy
Output-nya mirip dengan yang berikut ini saat deployment siap. Untuk keluar dari smartwatch, ketik
CTRL + C
:NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 10m
Lihat log dari deployment yang berjalan:
kubectl logs -l app=llm
Outputnya mirip dengan hal berikut ini:
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Falcon 40b
Buat manifes
text-generation-inference.yaml
berikut:Dalam manifes ini:
NUM_SHARD
harus2
karena model memerlukan dua GPU NVIDIA L4.QUANTIZE
ditetapkan kebitsandbytes-nf4
yang berarti model dimuat dalam 4 bit, bukan 32 bit. Hal ini memungkinkan GKE untuk mengurangi jumlah memori GPU yang diperlukan dan meningkatkan kecepatan inferensi. Namun, akurasi model dapat menurun. Untuk mempelajari cara menghitung GPU yang akan diminta, lihat Menghitung jumlah GPU.
Terapkan manifes:
kubectl apply -f text-generation-inference.yaml
Outputnya mirip dengan hal berikut ini:
deployment.apps/llm created
Verifikasi status model:
watch kubectl get deploy
Output-nya mirip dengan yang berikut ini saat deployment siap. Untuk keluar dari smartwatch, ketik
CTRL + C
:NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 10m
Lihat log dari deployment yang berjalan:
kubectl logs -l app=llm
Outputnya mirip dengan hal berikut ini:
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Membuat Service jenis ClusterIP
Buat manifes
llm-service.yaml
berikut:apiVersion: v1 kind: Service metadata: name: llm-service spec: selector: app: llm type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 8080
Terapkan manifes:
kubectl apply -f llm-service.yaml
Men-deploy antarmuka chat
Gunakan Gradio untuk mem-build aplikasi web yang memungkinkan Anda berinteraksi dengan model. Gradio adalah library Python yang memiliki wrapper ChatInterface yang membuat antarmuka pengguna untuk chatbot.
Llama 3 70b
Buat file bernama
gradio.yaml
:Terapkan manifes:
kubectl apply -f gradio.yaml
Temukan alamat IP eksternal Layanan:
kubectl get svc
Outputnya mirip dengan hal berikut ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125m
Salin alamat IP eksternal dari kolom
EXTERNAL-IP
.Lihat antarmuka model dari browser web dengan menggunakan alamat IP eksternal dengan port yang diekspos:
http://EXTERNAL_IP
Mixtral 8x7b
Buat file bernama
gradio.yaml
:Terapkan manifes:
kubectl apply -f gradio.yaml
Temukan alamat IP eksternal Layanan:
kubectl get svc
Outputnya mirip dengan hal berikut ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125m
Salin alamat IP eksternal dari kolom
EXTERNAL-IP
.Lihat antarmuka model dari browser web Anda menggunakan alamat IP eksternal dengan port yang diekspos:
http://EXTERNAL_IP
Falcon 40b
Buat file bernama
gradio.yaml
:Terapkan manifes:
kubectl apply -f gradio.yaml
Temukan alamat IP eksternal Layanan:
kubectl get svc
Outputnya mirip dengan hal berikut ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125m
Salin alamat IP eksternal dari kolom
EXTERNAL-IP
.Lihat antarmuka model dari browser web menggunakan alamat IP eksternal dengan port yang diekspos:
http://EXTERNAL_IP
Menghitung jumlah GPU
Jumlah GPU bergantung pada nilai flag QUANTIZE
. Dalam
tutorial ini, QUANTIZE
disetel ke bitsandbytes-nf4
, yang berarti model
dimuat dalam 4 bit.
Model parameter 70 miliar akan memerlukan memori GPU minimal 40 GB yang setara dengan 70 miliar kali 4 bit (70 miliar x 4 bit= 35 GB) dan mempertimbangkan overhead 5 GB. Dalam hal ini, satu GPU L4 tidak akan memiliki memori yang cukup. Oleh karena itu, contoh dalam tutorial ini menggunakan dua memori GPU L4 (2 x 24 = 48 GB). Konfigurasi ini sudah memadai untuk menjalankan Falcon 40b atau Llama 3 70b di GPU L4.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus cluster
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang dibuat dalam panduan ini, hapus cluster GKE:
gcloud container clusters delete l4-demo --region ${REGION}