Cả team dùng LLM thoải mái qua Internet. 0 đồng subscription mỗi tháng.
Mình vừa tự build xong một API server chạy LLM local trên máy bàn RTX 3060. Bài này chia sẻ chi tiết quá trình setup và lý do đằng sau từng quyết định kỹ thuật.
Phần cứng
RTX 3060 12GB VRAM, 32GB RAM. Cấu hình tối thiểu để chạy AI local ổn định.
12GB VRAM là con số quan trọng nhất — VRAM quyết định model nào chạy được, model nào không.
So sánh các lựa chọn:
- RTX 4060 (8GB): nhanh hơn khi chơi game nhưng 8GB không đủ chạy model 9B thoải mái với nhiều người cùng lúc
- RTX 3090 (24GB): lý tưởng hơn nhưng ~22-25 triệu — gấp 3 lần giá, không hợp lý với team nhỏ
- RTX 3060 (12GB, 7-8 triệu): tỉ lệ giá/VRAM tốt nhất cho mục đích này
RAM 32GB để hệ điều hành và FastAPI không tranh tài nguyên GPU.
Chọn Model — Quyết Định Quan Trọng Nhất
Gemma 4 26B (Google)
Thông minh, đa ngôn ngữ tốt, hỗ trợ vision. Nhưng nặng 17GB, chiếm gần hết 12GB VRAM. Hai người dùng cùng lúc là giật lag nặng. Context lớn là treo máy.
Phải disable.
Gemma 4 e4b (8B)
Nhẹ hơn, ổn định, hỗ trợ phân tích ảnh. 15-22 tokens/giây. Giữ lại cho tác vụ vision.
Qwen 3.5 9B (Alibaba)
Bất ngờ lớn nhất. Nhanh hơn Gemma e4b ~45% dù có nhiều tham số hơn. Đạt 30-50 tokens/giây. Tiếng Việt tự nhiên, logic tốt, viết sáng tạo ổn.
Tại sao nhanh hơn? Kiến trúc Hybrid Gated DeltaNet — 75% các layer dùng linear attention (tỉ lệ 3:1 so với standard attention), kết hợp GQA, SwiGLU và RoPE. Linear attention tối ưu đặc biệt cho GPU consumer.
| Model | Tokens/giây | Thời gian 256 tokens | |
|---|---|---|---|
| Qwen 3.5 9B | 30-50 tok/s | 5-9 giây | Model chính |
| Gemma 4 e4b | 15-22 tok/s | 12-17 giây | Vision |
| Gemma 4 26B | 8-12 tok/s | 21-32 giây | ĐÃ TẮT |
Bài học số 1: Model vừa vặn với hardware luôn thắng model mạnh nhất trên giấy.
Tại Sao Chọn Ollama?
- Cài đặt đơn giản: một lệnh pull, một lệnh chạy, không cần compile hay config CUDA thủ công
- API chuẩn OpenAI: Cursor, Continue, mọi IDE extension hỗ trợ OpenAI đều trỏ thẳng vào được
- Linh hoạt: switch model chỉ cần đổi tên trong request, không cần restart server
Ollama vs vLLM thực tế:
| Chỉ tiêu | Ollama | vLLM |
|---|---|---|
| Tốc độ 1 request | ~62 tok/s | ~71 tok/s |
| 10 request đồng thời | ~41 TPS | ~485 TPS |
| P99 latency | 673ms | 80ms |
| Độ khó setup | 1 lệnh | Phức tạp |
| Phù hợp | Team nhỏ | Datacenter |
Cập nhật 2026: Ollama 0.19 tích hợp MLX backend, nhanh gấp 2x trên Apple Silicon. Trên CUDA vẫn dùng llama.cpp.
FastAPI Làm Gateway
Không gọi thẳng Ollama từ Internet. Ollama không có xác thực, rate limit, hay logging.
Không phải lo xa: tháng 1/2026 có hơn 175,000 Ollama server bị expose trên 130 quốc gia mà không có xác thực. Chiến dịch “Operation Bizarre Bazaar” khai thác bán compute, thiệt hại hàng chục ngàn USD. CVE-2024-37032 cho phép RCE trên Ollama không được bảo vệ.
FastAPI thay vì Flask/Express: async native, StreamingResponse built-in, validation payload tự động.
Cloudflare Tunnel
| Vấn đề | Truyền thống | Cloudflare Tunnel |
|---|---|---|
| Port forwarding | Mở port router | Không cần |
| SSL | Mua cert | Tự động |
| IP động | DDNS | Tự động |
| DDoS | Tự xử lý | Cloudflare |
| Chi phí | Domain + cert | MIỄN PHÍ |
Chỉ thêm 15-45ms latency — không đáng kể khi LLM request mất 5-11 giây.
Bảo Mật 6 Lớp
- API Key + Secret Key — header
Authorization: Bearer, mỗi client một cặp riêng - Fail2Ban tự build — ban IP sau X lần sai auth, state lưu file để không mất khi restart,
asyncio.Lock()chống race condition - Rate Limit — 50 req/phút per user với
slowapi - Context Bomb Protection — chặn payload quá 50,000 từ / 4 ảnh / 20MB
- Model Blacklist — disable Gemma 26B ở tầng gateway
- Hot-reload Keys — thêm/thu hồi key không cần restart
Semaphore Và Streaming
RTX 3060 chỉ handle tốt 2 request LLM song song. Dùng asyncio.Semaphore(2).
Vấn đề thiết kế: giữ semaphore suốt khi stream về client thì kẻ tấn công chỉ cần mở 2 connection đọc chậm là khóa hết GPU 300 giây.
Giải pháp — tách 2 giai đoạn:
Giai đoạn 1 (semaphore đang giữ): đọc toàn bộ response từ Ollama với timeout 180 giây.
Giai đoạn 2 (semaphore đã giải phóng): stream về client — GPU tự do nhận request mới.
Mac Mini M4 24GB — Chạy Được Model Nào?
| Model | Tốc độ | Ghi chú |
|---|---|---|
| Qwen 3.5 9B | 40-60 tok/s | Lựa chọn chính |
| Gemma 4 e4b | 24-57 tok/s | Vision + text |
| Qwen 3 14B | 35-50 tok/s | Chất lượng cao nhất |
| Gemma 4 26B MoE | 20-30 tok/s | 3.8B active params/token |
| Gemma 2 27B dense | ~2 tok/s | Không khuyến dùng |
M4 24GB thắng: model lớn hơn, tiết kiệm điện gấp 3-4x, im lặng. RTX 3060 thắng: nhanh hơn model nhỏ, giá rẻ.
Setup tối ưu cho M4: Ollama 0.19+, OLLAMA_FLASH_ATTENTION=1, OLLAMA_NUM_GPU=99, OLLAMA_MAX_LOADED_MODELS=1
Chi Phí Thật
| Hạng mục | Chi phí |
|---|---|
| RTX 3060 | ~7-8 triệu |
| RAM 32GB | ~5 triệu |
| Chip, main, nguồn, ổ cứng | ~6 triệu |
| Tiền điện (tháng) | ~500-600k |
| Tổng | ~18-19 triệu |
RTX 3060 khi inference chỉ 100-120W (không phải 170W TDP gaming) vì inference bị giới hạn bởi memory bandwidth.
| Dịch vụ | Input / 1M tokens | Output / 1M tokens |
|---|---|---|
| GPT-4o-mini | $0.15 | $0.60 |
| Gemini Flash | $0.10 | $0.40 |
| Claude Haiku | $0.80 | $4.00 |
| Self-hosted | $0 | ~200-300k/tháng điện |
Self-host có lợi khi volume trên 10 triệu tokens/ngày. Giá trị chính: data sovereignty.
Tóm Lại
Tự build khó. Mua private model nếu có điều kiện là tốt nhất.
Mình build server này chỉ để backup cho hệ thống lõi, không có ý định thay thế flow hiện tại. Còn nếu bạn muốn thử, tech stack trên là best option.
Quan điểm cá nhân từ kinh nghiệm thực tế.