Skip to main content

Multi Gpus Example

Bài hướng dẫn này trình bày cách triển khai và phục vụ (serve) mô hình ngôn ngữ lớn Gemma 3 (LLM) bằng nhiều GPU trên FPT Kubernetes Engine (FKE GPU) , sử dụng framework vLLM. Trong hướng dẫn này, bạn sẽ:

  • Cấu hình FKE để tải weights Gemma từ Hugging Face
  • Triển khai mô hình LLM trên nhiều GPU

Bài hướng dẫn này dành cho các kỹ sư Machine Learning (ML), quản trị viên và người vận hành nền tảng, cũng như các chuyên gia về Data và AI, những người quan tâm đến việc sử dụng khả năng điều phối container của Kubernetes để phục vụ các mô hình ngôn ngữ lớn (LLM).

Chuẩn bị môi trường

Chuẩn bị cụm FKE GPU

  • Một cụm Kubernetes có GPU
  • GPU Operator đã cài đặt
  • NVIDIA driver và container toolkit
  • Có quota storage

Kiểm tra node GPU:

Copykubectl describe node 

Node sẵn sàng nếu có tài nguyên GPU:

CopyCapacity:
...
nvidia.com/gpu: 8
...
Allocatable:
...
nvidia.com/gpu: 8
...

Chuẩn bị token Hugging Face (optional)

Lên trang chủ Huggingface, tạo token và tạo Secret trên k8s chứa token này:

Copykubectl create secret generic hf-secret \
--from-literal=hf_api_token=${HF_TOKEN} \
--dry-run=client -o yaml | kubectl apply -f -

Deploy vLLM

Trong phần này, bạn triển khai container vLLM để phục vụ mô hình Gemma mà bạn muốn sử dụng. Để triển khai mô hình, bài hướng dẫn này sử dụng Kubernetes Deployment. Deployment là một đối tượng API của Kubernetes cho phép bạn chạy nhiều bản sao (replica) của Pod và các Pod này được phân bổ trên các node trong một cluster.

Deploy vLLM bằng Deployment

CopyapiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-gemma-deployment
spec:
replicas: 1
selector:
matchLabels:
app: gemma-server
template:
metadata:
labels:
app: gemma-server
spec:
containers:
- name: inference-server
image: docker.io/vllm/vllm-openai:v0.10.0
resources:
requests:
cpu: "2"
memory: "10Gi"
ephemeral-storage: "10Gi"
nvidia.com/gpu: "2"
limits:
cpu: "2"
memory: "10Gi"
ephemeral-storage: "10Gi"
nvidia.com/gpu: "2"
command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
args:
- --model=$(MODEL_ID)
- --tensor-parallel-size=2
- --host=0.0.0.0
- --port=8000
env:
- name: MODEL_ID
value: google/gemma-3-1b-it
- name: HUGGING_FACE_HUB_TOKEN
valueFrom:
secretKeyRef:
name: hf-secret
key: hf_api_token
volumeMounts:
- mountPath: /dev/shm
name: dshm
volumes:
- name: dshm
emptyDir:
medium: Memory

Trong đó:

  • nvidia.com/gpu: "2" : container của bạn sẽ sử dụng 2 GPU trên node.
  • --tensor-parallel-size=2: sử dụng tesor parallelism để chạy model trên 2 node
  • MODEL_ID: tên model trên Huggingface
  • HUGGING_FACE_HUB_TOKEN: token Huggingface bạn đã tạo.
  • Volume dshm: volume shared memory, quan trọng với các case distributed inferencing/training.

Expose model

Để expose model, hãy tạo một service trên k8s, nếu type của service là LoadBalancer thay vì ClusterIP, model có thể được truy cập từ internet:

CopyapiVersion: v1
kind: Service
metadata:
name: llm-service
spec:
selector:
app: gemma-server
type: ClusterIP
ports:
- protocol: TCP
port: 8000
targetPort: 8000

Setup persistent storage (optional)

Với cấu hình trên, model weight của model được lưu tại file system của container. Khi container restart, chúng ta cần tải lại bộ weight trên từ đầu. Để tránh tình trạng này, chúng ta có thể lưu sẵn model vào một volume, do đó khi container restart thì model vẫn còn và không cần phải tải lại. Tạo persistent volume claim:

CopyapiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

Serve model

Tại phần này, chúng ta sẽ thực hiện việc kiểm tra kết nối & gửi các request để model xử lý

Set up networking để truy cập model ngoài cụm

Nếu tại mục Expose model, bạn sử dụng service type loadbalancer, hãy sử dụng IP public của loadbalancer đó. Nếu bạn sử dụng service type CusterIP, hãy port forward service này:

Copykubectl port-forward service/llm-service 8000:8000

Giao tiếp với model

Phần này trình bày cách bạn có thể thực hiện một bài kiểm tracơ bản để xác minh các mô hình Gemma 3. Đối với các mô hình khác, hãy thay gemma-3-1b-it bằng tên của mô hình tương ứng. Ví dụ này minh họa cách kiểm tra mô hình Gemma 3 1B với đầu vào chỉ gồm văn bản. Trong một phiên terminal mới, sử dụng curl để chat với mô hình của bạn.

Copycurl http://127.0.0.1:8000/v1/chat/completions \
-X POST \
-H "Content-Type: application/json" \
-d '{
"model": "google/gemma-3-1b-it",
"messages": [
{
"role": "user",
"content": "Hello, how are you?"
}
]
}'