LLM API ตัวแรกของคุณบน Kubernetes
การรัน LLM บน Kubernetes นั้นแตกต่างจากการรันเว็บแอปพลิเคชันทั่วไป คุณไม่ได้ขยายระบบ (scale) ตามจำนวน request เท่านั้น แต่คุณต้องขยายตามความจุของ GPU และน้ำหนักของโมเดล (model weights)
ในคู่มือนี้ คุณจะได้ทำการ deploy โมเดลไปยัง GPU node, เปิดใช้งานในรูปแบบ API และเรียกใช้งานด้วย curl request
เราใช้เครื่องมือเหล่านี้:
- Model: Qwen/Qwen2.5-1.5B-Instruct
- Engine: vLLM
- Infrastructure: Kubernetes พร้อมการรองรับ NVIDIA GPU
ขั้นตอนที่ 1: ตรวจสอบความจุ GPU ของคุณ
ก่อนเริ่ม ตรวจสอบให้แน่ใจว่า Kubernetes มองเห็นฮาร์ดแวร์ของคุณ โดยรันคำสั่งนี้:
kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu
หากคอลัมน์ GPU ว่างเปล่า ให้หยุดก่อน คุณต้องแก้ไข NVIDIA device plugin ของคุณให้เรียบร้อยก่อน
ขั้นตอนที่ 2: รักษาความปลอดภัยในการเข้าถึงโมเดล แม้จะเป็นโมเดลสาธารณะ แต่ควรใช้ Hugging Face token เพื่อให้ง่ายต่อการเปลี่ยนไปใช้โมเดลแบบส่วนตัว (private models) ในภายหลัง
- สร้าง namespace:
kubectl create namespace llm-demo - สร้าง Secret สำหรับ token ของคุณ:
kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"
ขั้นตอนที่ 3: Deploy โมเดลเซิร์ฟเวอร์ เราใช้ vLLM เพราะมันช่วยจัดการงานหนักๆ ทั้งหมด ไม่ว่าจะเป็นการจัดการ batching, tokenization และ API ที่รองรับมาตรฐาน OpenAI
สร้างไฟล์ deployment โดยมีข้อกำหนดสำคัญดังนี้:
- ขอใช้งาน 1 GPU:
nvidia.com/gpu: 1 - Mount
/dev/shm: โมเดลเซิร์ฟเวอร์ต้องการ shared memory เพื่อป้องกันการ crash - ใช้ Secrets: ส่งค่า
HF_TOKENของคุณไปยัง container
ใช้การตั้งค่าของคุณ:
kubectl apply -f qwen-vllm.yaml
ขั้นตอนที่ 4: ตรวจสอบ API
อย่าเพิ่งเชื่อสถานะ "Running" เพราะ pod อาจอยู่ในสถานะ "Running" ในขณะที่กำลังดาวน์โหลดไฟล์โมเดลขนาดใหญ่อยู่ ให้คอยดู log ของคุณ:
kubectl logs -n llm-demo -f deployment/qwen-vllm
รอจนกว่าคุณจะเห็นเซิร์ฟเวอร์กำลัง listening บน port 8000
ทดสอบด้วยการทำ port-forwarding:
kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000
รัน curl request ของคุณ:
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 }'
เป้าหมาย: คุณได้เปลี่ยนจากความจุ GPU เปล่าๆ มาเป็น API ที่ใช้งานได้จริงแล้ว และคุณได้พิสูจน์แล้วว่า:
- Kubernetes สามารถจัดตารางงาน (schedule) สำหรับ GPU workload ได้
- Container สามารถเข้าถึงฮาร์ดแวร์ได้
- โมเดลเซิร์ฟเวอร์สามารถโหลด weights เข้าสู่หน่วยความจำได้
- API สามารถตอบสนองต่อ request มาตรฐานได้
หากวงจรนี้ล้มเหลว การทำ scaling และ routing ก็จะไม่ช่วยอะไร ให้แก้ไขที่รากฐานก่อน
Optional learning community: https://t.me/GyaanSetuAi
