Serving Local LLMs¶
Tổng quan¶
Chạy LLM trên máy local hoặc server riêng mang lại kiểm soát hoàn toàn về privacy, chi phí và latency. Bài này bao gồm landscape open-source hiện nay, kỹ thuật quantization để giảm kích thước model, và cách serve model với Ollama.
1. Open-source LLM Landscape¶
Các dòng model chính¶
| Dòng model | Tổ chức | Điểm mạnh |
|---|---|---|
| Llama 3.x | Meta | Hiệu năng tốt, cộng đồng lớn, permissive license |
| Qwen 2.5 / 3 | Alibaba | Đa ngôn ngữ, code, math xuất sắc |
| Gemma 3 | Nhẹ, chạy tốt trên GPU yếu | |
| Mistral / Mixtral | Mistral AI | MoE architecture, hiệu quả compute |
| Phi-4 | Microsoft | Small model, reasoning mạnh |
| DeepSeek-R1 | DeepSeek | Reasoning, math, code cực mạnh |
Vietnamese LLMs¶
| Model | Base | Ghi chú |
|---|---|---|
| Vistral-7B-Chat | Mistral 7B | Fine-tuned tiếng Việt bởi Viet-Mistral team |
| PhoGPT | GPT-J | Model tiếng Việt từ VinAI Research |
| SeaLLM | Llama 2 | Đa ngôn ngữ Đông Nam Á, bao gồm tiếng Việt |
| Qwen2.5 (multilingual) | Qwen 2.5 | Hỗ trợ tiếng Việt tốt trong các model đa ngôn ngữ |
Lựa chọn model cho tiếng Việt
Năm 2026, các model đa ngôn ngữ lớn như Qwen 2.5 và Llama 3.x thường cho chất lượng tiếng Việt tốt hơn các model tiếng Việt chuyên biệt có kích thước nhỏ hơn, nhờ training data phong phú hơn.
2. Quantization¶
Vấn đề¶
Model full precision (FP32) cực kỳ nặng:
- Llama 3 8B FP32 ≈ 32 GB VRAM
- Llama 3 8B FP16 ≈ 16 GB VRAM
- Llama 3 8B INT4 ≈ 4–5 GB VRAM ✅ (chạy được trên RTX 3060 12GB)
Quantization giảm số bit để biểu diễn mỗi weight → giảm VRAM, tăng tốc inference.
Các loại Precision¶
FP32 (32-bit float) → FP16 (16-bit float) → INT8 (8-bit int) → INT4 (4-bit int)
~32 GB ~16 GB ~8 GB ~4-5 GB
Full precision Training / serving Good balance RAM-constrained
| Precision | VRAM (8B model) | Chất lượng | Dùng khi |
|---|---|---|---|
| FP32 | ~32 GB | Baseline | Training research |
| BF16/FP16 | ~16 GB | ≈ FP32 | Training, serving GPU mạnh |
| INT8 | ~8 GB | -1 đến -2% | Production server |
| INT4 | ~4 GB | -3 đến -5% | Consumer GPU, local |
Các Format Quantization¶
# Quantize on-the-fly khi load model
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
import torch
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat4 - tốt hơn int4
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # Quantize quantization constants
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.2-3B-Instruct",
quantization_config=bnb_config,
device_map="auto",
)
Knowledge Distillation
Distillation (train model nhỏ từ một teacher lớn) là kỹ thuật thu nhỏ model ở giai đoạn training, nên được trình bày cùng quy trình huấn luyện ở Kiến trúc LLM. Quantization bên trên là kỹ thuật áp dụng lúc deploy.
3. Model Serving với Ollama¶
Ollama là gì?¶
Ollama là tool đơn giản nhất để chạy LLM local - tương tự Docker nhưng cho AI models.
# Cài đặt (Linux/Mac)
curl -fsSL https://ollama.ai/install.sh | sh
# Pull và chạy model
ollama pull llama3.2:3b
ollama run llama3.2:3b "Xin chào! Bạn là ai?"
# Serve API (mặc định port 11434)
ollama serve
Ollama REST API¶
import requests
response = requests.post(
"http://localhost:11434/api/chat",
json={
"model": "llama3.2:3b",
"messages": [
{"role": "user", "content": "Giải thích transformer trong 3 câu."}
],
"stream": False,
}
)
print(response.json()["message"]["content"])
Dùng với OpenAI-compatible SDK¶
from openai import OpenAI
# Ollama expose OpenAI-compatible endpoint
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama", # Không cần key thật
)
response = client.chat.completions.create(
model="llama3.2:3b",
messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
4. Custom Modelfile¶
Modelfile cho phép tạo model với system prompt, parameters và template tùy chỉnh - giống Dockerfile cho AI.
Cú pháp Modelfile¶
# Modelfile cho Vietnamese Assistant
FROM llama3.2:3b
# System prompt mặc định
SYSTEM """
Bạn là Minh, trợ lý AI thông minh người Việt Nam. Bạn luôn:
- Trả lời bằng tiếng Việt, tự nhiên và thân thiện
- Dùng xưng hô phù hợp (tôi/bạn cho người lớn)
- Giải thích rõ ràng, có ví dụ cụ thể
- Thừa nhận khi không biết thay vì đoán mò
"""
# Điều chỉnh parameters
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER num_ctx 4096 # Context window size
# Template (dùng cho model không có chat template)
TEMPLATE """{{ if .System }}<|system|>
{{ .System }}<|end|>
{{ end }}{{ if .Prompt }}<|user|>
{{ .Prompt }}<|end|>
<|assistant|>
{{ end }}{{ .Response }}<|end|>"""
# Tạo và test model
ollama create vietnamese-assistant -f Modelfile
ollama run vietnamese-assistant "Hãy giới thiệu bản thân"
Vietnamese Legal Assistant Modelfile¶
FROM llama3.2:3b
SYSTEM """
Bạn là chuyên gia pháp lý Việt Nam với kiến thức về luật doanh nghiệp,
luật lao động và luật dân sự. Khi trả lời:
1. Trích dẫn điều luật cụ thể khi có thể (Điều X, Luật Y năm Z)
2. Phân biệt rõ thông tin chắc chắn vs cần xác minh thêm
3. Khuyến nghị tư vấn luật sư cho các vụ việc phức tạp
4. Dùng ngôn ngữ dễ hiểu, tránh thuật ngữ pháp lý quá chuyên sâu
Lưu ý: Đây là thông tin tham khảo, không phải tư vấn pháp lý chính thức.
"""
PARAMETER temperature 0.3 # Thấp hơn cho factual answers
PARAMETER num_ctx 8192 # Context lớn hơn cho tài liệu pháp lý
Tóm tắt: Chọn Setup Local LLM¶
graph TD
A{"Bạn có GPU không?"} -->|"Có, NVIDIA >= 8GB VRAM"| B["Chạy GPTQ/AWQ trực tiếp hoặc BitsAndBytes 4-bit"]
A -->|"Có, GPU yếu / Apple Silicon"| C["Ollama + GGUF Q4_K_M"]
A -->|"Không / CPU only"| D["Ollama + GGUF Q4_K_M (model <= 7B)"]
B --> E{"Cần tích hợp với code?"}
C --> E
D --> E
E -->|"Đơn giản, local"| F["Ollama API"]
E -->|"Phức tạp, nhiều người dùng"| G["vLLM / TGI"]
| Kịch bản | Recommended setup |
|---|---|
| Laptop cá nhân, thử nghiệm | Ollama + Llama 3.2 3B Q4 |
| Desktop gaming GPU | Ollama + Llama 3.2 8B Q5_K_M |
| Server RTX 4090 24GB | Ollama + Qwen2.5 14B Q8 hoặc 32B Q4 |
| Production multi-user | vLLM + FP16/AWQ |