API LLM Pertama Anda di Kubernetes
Menjalankan LLM di Kubernetes berbeda dengan menjalankan aplikasi web standar. Anda tidak hanya melakukan scaling berdasarkan jumlah request. Anda melakukan scaling berdasarkan kapasitas GPU dan bobot model (model weights).
Dalam panduan ini, Anda akan men-deploy sebuah model ke node GPU, mengeksposnya sebagai API, dan memanggilnya dengan request curl.
Kami menggunakan alat-alat berikut:
- Model: Qwen/Qwen2.5-1.5B-Instruct
- Engine: vLLM
- Infrastruktur: Kubernetes dengan dukungan NVIDIA GPU
Langkah 1: Periksa kapasitas GPU Anda
Sebelum memulai, pastikan Kubernetes dapat mendeteksi hardware Anda. Jalankan perintah ini:
kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu
Jika kolom GPU kosong, berhenti. Anda harus memperbaiki NVIDIA device plugin Anda terlebih dahulu.
Langkah 2: Amankan akses model Anda Bahkan untuk model publik, gunakan token Hugging Face. Ini akan memudahkan Anda untuk beralih ke model privat nantinya.
- Buat namespace:
kubectl create namespace llm-demo - Buat Secret untuk token Anda:
kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"
Langkah 3: Deploy model server Kami menggunakan vLLM karena ia menangani tugas-tugas berat. vLLM mengelola batching, tokenization, dan API yang kompatibel dengan OpenAI.
Buat file deployment dengan persyaratan utama berikut:
- Request 1 GPU:
nvidia.com/gpu: 1 - Mount
/dev/shm: Model server membutuhkan shared memory untuk menghindari crash. - Gunakan Secrets: Teruskan
HF_TOKENAnda ke dalam container.
Terapkan konfigurasi Anda:
kubectl apply -f qwen-vllm.yaml
Langkah 4: Verifikasi API
Jangan percaya begitu saja pada status "Running". Sebuah pod bisa berstatus "Running" padahal ia masih mengunduh file model yang sangat besar. Pantau log Anda:
kubectl logs -n llm-demo -f deployment/qwen-vllm
Tunggu sampai Anda melihat server mendengarkan (listening) pada port 8000.
Uji dengan port-forwarding:
kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000
Jalankan request curl Anda:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-1.5B-Instruct",
"messages": [{"role": "user", "content": "Explain Kubernetes in two sentences."}],
"max_tokens": 120
}'
Tujuannya: Anda telah beralih dari kapasitas GPU mentah ke API yang berfungsi. Anda telah membuktikan bahwa:
- Kubernetes menjadwalkan beban kerja (workload) GPU.
- Container dapat mengakses hardware.
- Model server memuat bobot (weights) ke dalam memori.
- API merespons request standar.
Jika loop ini gagal, scaling dan routing tidak akan bisa menyelamatkan Anda. Perbaiki fondasinya terlebih dahulu.
Optional learning community: https://t.me/GyaanSetuAi
