Yêu cầu phần cứng tối thiểu cho vLLM và VectorDB
Để triển khai Private LLM với vLLM (sử dụng GPU) và VectorDB (sử dụng RAM/Storage) trên Kubernetes, bạn cần đảm bảo hạ tầng vật lý hoặc ảo đáp ứng các thông số sau để tránh tình trạng OOM (Out Of Memory) hoặc hiệu năng kém.
CPU: Tối thiểu 4 nhân, ưu tiên x86_64 hoặc ARM64 (thường dùng cho các cloud provider).
RAM: Tối thiểu 16GB cho toàn bộ cluster. vLLM cần RAM để load model vào VRAM, VectorDB cần RAM để cache embeddings.
GPU: Bắt buộc cho vLLM. Tối thiểu 1 card NVIDIA với VRAM >= 16GB (ví dụ: RTX 3090/4090 hoặc A10). Nếu dùng model Llama-3-8B ở độ chính xác FP16, cần khoảng 16-20GB VRAM. Nếu dùng model 70B, cần tối thiểu 80GB VRAM (nhiều card).
Storage: Tối thiểu 100GB SSD. Cần dung lượng để lưu model weights, container images, và data logs của VectorDB.
Verify: Chạy lệnh kiểm tra tài nguyên trên host trước khi cài Kubernetes.
nvidia-smi
free -h
df -h
Kết quả mong đợi: `nvidia-smi` hiển thị card GPU đang hoạt động, `free` hiển thị tổng RAM >= 16GB, `df` hiển thị trống >= 100GB.
Cài đặt và cấu hình Kubernetes Cluster (K3s)
Chúng ta sẽ sử dụng K3s thay vì Minikube hoặc Kubeadm vì K3s nhẹ hơn, được thiết kế cho edge computing và dễ dàng tích hợp với GPU (NVIDIA Device Plugin) hơn cho môi trường sản xuất hoặc test nghiêm túc.
Bước 1: Cài đặt K3s Server
Trên máy chủ Linux (Ubuntu 22.04+ hoặc CentOS 7+), cài đặt K3s bằng script chính thức. Lệnh dưới đây sẽ cài đặt K3s và tự động khởi động cluster đơn node.
curl -sfL https://get.k3s.io | sh -
Kết quả mong đợi: Xuất hiện dòng `K3s is now installed and running`, cluster đang ở trạng thái `Ready`.
Bước 2: Cấu hình quyền truy cập Kubernetes (kubectl)
Sau khi cài đặt, bạn cần lấy file cấu hình để `kubectl` có thể điều khiển cluster. File này được lưu mặc định ở `/etc/rancher/k3s/k3s.yaml`.
mkdir -p $HOME/.kube
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kết quả mong đợi: Không có lỗi, bạn có thể chạy lệnh `kubectl get nodes` để kiểm tra.
kubectl get nodes
Kết quả mong đợi: Thấy 1 node với trạng thái `Ready`.
Bước 3: Cài đặt NVIDIA Device Plugin
Để vLLM có thể nhìn thấy và sử dụng GPU trong container, bạn cần triển khai NVIDIA Device Plugin. Đây là bước quan trọng nhất để hỗ trợ GPU trên Kubernetes.
Tạo file cấu hình manifest tại đường dẫn: `/tmp/nvidia-device-plugin.yaml`
cat > /tmp/nvidia-device-plugin.yaml
Áp dụng cấu hình này vào cluster:
kubectl apply -f /tmp/nvidia-device-plugin.yaml
Kết quả mong đợi: Pod `nvidia-device-plugin` được tạo trong namespace `kube-system` và trạng thái chuyển sang `Running` sau khoảng 1-2 phút.
Bước 4: Cài đặt Helm (Package Manager)
Helm là công cụ để cài đặt các ứng dụng phức tạp như VectorDB (Milvus/ChromaDB) và vLLM sau này. Chúng ta cần cài đặt client trước.
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Kết quả mong đợi: Lệnh `helm version` chạy thành công.
Giới thiệu kiến trúc hệ thống
Trước khi đi sâu vào triển khai từng component, cần nắm rõ luồng dữ liệu và vai trò của từng phần trong kiến trúc Private LLM trên Kubernetes.
1. Client (User Application)
Đây là điểm đầu vào của người dùng, có thể là Web Frontend, Mobile App, hoặc Script Python. Client gửi yêu cầu (prompt) qua HTTP/HTTPS.
2. API Gateway
Chức năng: Load balancing, Auth (JWT), Rate limiting, và định tuyến request.
Trong series này, chúng ta sẽ dùng NGINX Ingress Controller hoặc Kong đóng vai trò Gateway. Nó nhận request từ Client, kiểm tra quyền, sau đó phân phối về Backend Service.
3. vLLM Server (Inference Engine)
Chức năng: Chạy model LLM (ví dụ: Llama-3, Mistral) để sinh ra câu trả lời (completion).
Đặc điểm kỹ thuật: Sử dụng kỹ thuật PagedAttention để tối ưu VRAM, hỗ trợ Continuous batching để tăng throughput. Trên Kubernetes, vLLM sẽ chạy dưới dạng Deployment với label `gpu: true` để được scheduler đặt vào node có GPU.
4. VectorDB (RAG Engine)
Chức năng: Lưu trữ các embedding vector của dữ liệu doanh nghiệp và thực hiện tìm kiếm tương tự (Similarity Search).
Trong kiến trúc này, khi có request, Backend RAG sẽ query VectorDB để lấy context liên quan, rồi gộp context + prompt gửi về vLLM Server. VectorDB (Milvus/ChromaDB) sẽ chạy dưới dạng StatefulSet để đảm bảo dữ liệu không mất khi restart.
Luồng dữ liệu (Data Flow)
- Client gửi Prompt -> API Gateway.
- API Gateway -> RAG Backend.
- RAG Backend -> VectorDB (Tìm kiếm Context).
- RAG Backend -> vLLM Server (Gửi Prompt + Context để sinh câu trả lời).
- vLLM Server -> RAG Backend (Trả về Completion).
- RAG Backend -> API Gateway -> Client.
Verify kiến trúc và môi trường
Sau khi hoàn thành cài đặt K3s và NVIDIA Plugin, thực hiện các bước kiểm tra cuối cùng để đảm bảo môi trường sẵn sàng cho Phần 2.
Kiểm tra GPU Visibility trong Pod
Chạy một pod test đơn giản yêu cầu 1 GPU để xác nhận Kubernetes đã nhận diện được thiết bị vật lý.
kubectl run gpu-test --image=nvidia/cuda:12.0.0-base-ubuntu22.04 --rm -it --restart=Never -- nvidia-smi
Kết quả mong đợi: Pod chạy thành công, hiển thị bảng thông tin GPU (Driver version, GPU utilization) tương tự như khi chạy `nvidia-smi` trực tiếp trên host. Nếu pod bị Pending, kiểm tra lại bước cài Device Plugin.
Kiểm tra Helm Repository
Đảm bảo có thể thêm repository của các component sắp tới (Milvus, Nginx).
helm repo add milvus https://zilliz.github.io/milvus-helm/
helm repo update
Kết quả mong đợi: Xuất hiện dòng `Hang on...` và `Successfully added...`.
Check Namespace
Tạo namespace riêng cho dự án để cô lập tài nguyên.
kubectl create namespace private-llm
Kết quả mong đợi: Namespace `private-llm` được tạo thành công.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Private LLM với vLLM, RAG và VectorDB trên hạ tầng Kubernetes
Phần 2: Triển khai Vector Database với Milvus hoặc ChromaDB trên Kubernetes »