Tuần trước tôi cắm lại Quadro K620 vào homelab Xeon E5, build llama.cpp với CUDA flag, kỳ vọng ít ra cũng kéo Llama 8B lên 10-15 tok/s. Sau hai giờ đánh vật với driver và kernel mismatch, nvidia-smi không nhận card, Ollama log trả về inference compute id=cpu. Practically zero. Bài học rút ra: GPU cũ hơn Pascal là zero giá trị cho LLM 2026, đừng phí thời gian.

Đó là một trong nhiều phép thử tôi đã chạy để viết bài này. Bài 1 chốt được model nào đáng tự host. Câu hỏi tiếp theo: trên máy bạn chạy được con nào, nhanh tới đâu. Tôi sẽ đi qua ba category hardware đại diện ba pattern phổ biến nhất 2026. Apple Silicon (M3 Max là sample chính), CUDA discrete (RTX 4090 đỉnh consumer, Quadro K620 đại diện edge case), và CPU-only (Xeon E5-2686 v4 trên homelab của tôi). Mỗi pattern có ngưỡng practical riêng. Đọc xong bạn sẽ biết với budget hoặc hardware sẵn có, bạn chạy được model size nào ở tốc độ chấp nhận được.

Số liệu là snapshot tháng 5, 2026 dựa trên benchmark public mới nhất kèm dữ liệu thật tôi đo trên homelab. Tooling cập nhật liên tục, các con số có thể di chuyển vài chục phần trăm theo từng release patch. Khi đọc, tập trung vào tier khác biệt (1B vs 7B vs 70B), không bám chi tiết tiểu số.

Methodology: đo cái gì, đo thế nào

Benchmark LLM thường lẫn lộn ba metric khác nhau. Generation tok/s (output throughput) là tốc độ model sinh token mới sau khi đã nhận prompt, là số quan trọng nhất với chat và agent loop vì user cảm nhận trực tiếp. Prompt eval tok/s (prefill throughput) là tốc độ model nuốt prompt vào để chuẩn bị generate, quan trọng với long context (RAG, codebase QA) hơn là chat ngắn. Time to first token (TTFT) là độ trễ từ lúc gửi prompt đến token đầu tiên hiện ra, bằng prefill_tokens / prompt_eval_speed cộng overhead, quan trọng cho UX interactive.

Bài này tôi tập trung generation tok/s với context vừa phải (512 prompt, 512 output), pattern gần workload chat thực tế nhất. Prompt eval nhắc đến khi có chênh lệch đáng kể (Apple Silicon prefill thường yếu hơn so với generation, CUDA thì cân bằng).

Quantization quy về Q4_K_M cho baseline: sweet spot chất lượng gần FP16 (loss perplexity vài phần trăm), size giảm 4 lần. Khi cần so chất lượng tôi sẽ chú thêm Q8 hoặc FP16 riêng. Runner mặc định llama.cpp với backend tương ứng (Metal trên Mac, CUDA trên NVIDIA, OpenBLAS trên CPU). vLLM nhắc đến khi nói throughput batch. Lý do chọn llama.cpp baseline: cùng codebase, cùng quantization format (GGUF), so sánh fair giữa các hardware.

Ngưỡng “chấp nhận được” tôi dùng quy ước sau, lấy reference từ tốc độ đọc của con người (~5-10 từ Việt một giây):

Tốc độCảm nhậnUse case
> 50 tok/sTức thì, output chạy nhanh hơn mắt đọcProduction, agent loop, batch
20-50 tok/sMượt, đọc theo đượcChat, code assistant
10-20 tok/sChậm nhưng dùng đượcOne-shot query, không real-time
5-10 tok/sKhó chịu nhưng OK cho task ngắnQuick test, không demo
< 5 tok/sRất khó dùngCuối tuần thử nghiệm

Giờ đi qua từng category.

Apple Silicon: unified memory thay đổi luật chơi

Apple Silicon M-series có một thứ NVIDIA không có dễ dàng: unified memory bandwidth lớn dùng chung CPU và GPU. M3 Max 64GB có 400 GB/s memory bandwidth, M4 Max nâng lên 546 GB/s. Để so sánh, RTX 4090 có 1008 GB/s VRAM bandwidth, nhanh hơn 2.5 lần, nhưng VRAM giới hạn 24GB. M3 Max 128GB chứa được model 70B ở Q4 trong khi RTX 4090 nghẽn ở 32B.

Số liệu tổng hợp từ benchmark public 2026 và thread llama.cpp Apple Silicon (M3 Max 64GB, llama.cpp Metal backend):

ModelQuantGeneration tok/sMemory dùng
Llama 3.1 8BQ4_K_M66~5 GB
Gemma 3 4BQ4_K_M90+~3 GB
gpt-oss 20B (MoE)MXFP430-40~12 GB
Qwen 3 32B (dense)Q4_K_M12-15~20 GB
Llama 3.3 70BQ4_K_M5~40 GB

Số 5 tok/s trên 70B của M3 Max 64GB là điểm đáng chú ý. Model fit trong RAM nhưng tốc độ chạm đáy vì memory bandwidth bị share với KV cache lớn. M3 Max 128GB hoặc M4 Max nhúc nhích lên 8-12 tok/s, M2 Ultra (800 GB/s) đạt khoảng 12-15 tok/s.

Cá nhân tôi thấy Apple Silicon là tier đẹp nhất cho dev cá nhân năm 2026. Mac mini M4 Max 64GB giá khoảng 2500 USD, ngang nửa giá một RTX 5090, mà chạy được model 70B với chất lượng acceptable. Tooling đã chín: llama.cpp Metal backend cải thiện 2 lần throughput từ giữa 2024 đến đầu 2026, gần như xoá khoảng cách phần mềm so với CUDA cho small model. Tiêu thụ điện thấp (60-80W full load so với 350-450W của RTX 4090), portable, laptop chạy được 13B-32B model mọi lúc mọi nơi.

Đổi lại, prefill chậm hơn generation đáng kể, với long context (5K+ token) TTFT có thể vài giây. Không có TensorRT-LLM hoặc vLLM PagedAttention, batch inference yếu, không phù hợp serving nhiều user. PyTorch trên Metal vẫn nhiều rough edge so với CUDA. Pattern phù hợp là dev cá nhân, code assistant, agent một user, một concurrent request. Production multi-user thì kiếm tier khác.

Một quirk tôi gặp khi đo M3 Max: số tok/s phụ thuộc mạnh vào nhiệt độ. Sau khi chạy liên tục 10 phút, throttling kích hoạt và throughput tụt 15-20%. Nếu bạn benchmark, warm up 1-2 phút rồi đo trên cửa sổ 30 giây, lặp 3 lần lấy trung bình. Đóng các app nặng (Docker Desktop, Chrome nhiều tab) vì chúng share GPU memory. Đây là điểm Mac yếu so với rig CUDA dedicated cooling.

CUDA discrete: RTX 4090 thước đo, RTX 3090 sweet spot value

NVIDIA tier consumer (4090, 3090, 4080, 4070) là hardware dominate self-host hiện nay. Lý do: VRAM bandwidth cao (1008 GB/s trên 4090), CUDA ecosystem đầy đủ, vLLM/TensorRT-LLM support native, quantization format tối ưu nhất nằm ở đây.

Tổng hợp benchmark từ Home GPU LLM Leaderboard và bài đo của community (Q4_K_M, llama.cpp CUDA backend, context ngắn):

ModelRTX 5090 32GBRTX 4090 24GBRTX 3090 24GBRTX 4060 Ti 16GBRTX 3060 12GB
Llama 3.1 8B190113-135955545
Gemma 3 12B~12080-907035OOM
gpt-oss 20B (MoE)70-9045-5535-45OOMOOM
Qwen 3 32B (dense)5830-4525-35OOMOOM
Llama 3.3 70B Q4OOM (cần 2 GPU)OOMOOMOOMOOM
Llama 3.3 70B Q23518-2010OOMOOM

Quan sát quan trọng nhất từ bảng này: RTX 4090 24GB nghẽn ở 32B dense. Qwen 3 32B Q4 weights chiếm khoảng 18-20GB, fit weight nhưng KV cache cộng dồn đẩy tổng RAM vượt 24GB ở context dài. Workaround là dùng context 4K thay vì 32K, hoặc move sang model MoE active params nhỏ (gpt-oss 20B chỉ 3.6B active).

Quan điểm tôi không che giấu: RTX 3090 vẫn cực value năm 2026. Cùng VRAM 24GB như 4090, bandwidth 936 GB/s vs 1008 của 4090, throughput chỉ kém 20-30%. Giá secondhand chỉ bằng 1/3 4090. Nếu bạn đang build rig mới, 2x RTX 3090 cho 48GB VRAM tổng với giá rẻ hơn một RTX 4090 mới là pick rõ ràng.

70B model cần multi-GPU. Llama 3.3 70B Q4 không nhét vừa 24GB. Phải dùng Q2 (chất lượng tụt rõ), hoặc 2x 24GB GPU tensor parallel, hoặc nhảy lên A100 80GB. Đừng cố ép 70B vào single 24GB ở Q2 chỉ vì muốn tick checkbox “tôi chạy 70B local”; chất lượng thua xa 32B Q4.

Một điểm khá quan trọng cho ai serving multi-user: vLLM ăn đứt llama.cpp khi batch. Bench Qwen 3.6 27B trên 4090 cho thấy llama.cpp ở 80-90 tok/s single request, vLLM với PagedAttention đạt 154 tok/s single và nhân 3-4 lần khi concurrent 8 user. Nếu workload là serving nhiều user, đừng tốn thời gian với llama.cpp, đi thẳng vLLM.

Khi đổi sang FP8 hoặc NVFP4 trên Blackwell (RTX 5090, B200), throughput nhảy thêm 30-60% so với Q4_K_M cùng model. Cần driver mới và CUDA 12.4+. Nếu bạn vừa upgrade GPU, kiểm tra version tooling trước khi đo, đừng đổ lỗi cho hardware khi vấn đề là driver.

Điểm yếu CUDA thì không tránh được: trần VRAM cứng, 24GB không lên thẳng 70B phải nhân tiền cho multi-GPU. Tiêu thụ điện 350-450W full load, idle vẫn 30-50W. Setup phức tạp hơn Mac, driver, CUDA version, kernel version phải match.

CUDA legacy: Quadro K620 và edge case GPU cũ

Tôi muốn nhắc trường hợp này vì chính tôi đã đốt thời gian với nó. Homelab gắn Quadro K620 (Maxwell 2014, 2GB VRAM). Đây là edge case “có GPU nhưng coi như không có”.

K620 zero giá trị cho LLM 2026 vì ba lý do. VRAM 2GB: Llama 8B Q4 cần 5GB, Gemma 3 1B Q4 cần khoảng 800MB fit nhưng KV cache cộng dồn dễ tràn. Compute capability 5.0 Maxwell: nhiều CUDA kernel mới của llama.cpp và vLLM yêu cầu CC 6.0+, một số quant format (NVFP4, FP8) yêu cầu Hopper (CC 9.0+). Bandwidth 29 GB/s, bằng 3% của RTX 4090.

Trên homelab tôi, nvidia-smi không nhận K620 vì driver cũ không cài sạch trên kernel 6.8. Sau hai buổi tối build driver từ source bằng đủ patch tìm được trên forum, kết quả: Ollama log report inference compute id=cpu library=cpu, total_vram="0 B". Practically đây là CPU-only inference với một GPU không hoạt động cắm hờ trong slot.

Bài học không thể rõ ràng hơn: nếu bạn có GPU cũ hơn Pascal (1000-series) hoặc dưới 6GB VRAM, đừng phí thời gian. Stick với CPU-only path hoặc nâng cấp lên RTX 3060 12GB (sweet spot value tier). RTX 3060 secondhand 2026 dưới 250 USD, kéo Llama 8B Q4 lên 45 tok/s, không có lý do gì giữ K620 trừ khi bạn build retro rig.

CPU-only: tier thực dụng nhưng có giới hạn

CPU-only inference realistic hơn nhiều người nghĩ, miễn là model đủ nhỏ. Modern Xeon hoặc Threadripper với DDR5 RAM 8 channel có thể đạt 6-10 tok/s cho 7B Q4.

Trường hợp tôi đo trực tiếp: homelab Xeon E5-2686 v4 (18 core, 36 thread, AVX2 không AVX-512, DDR4-2400) với llama.cpp CPU backend. Đây là CPU 2016, đại diện tier “second-hand server cheap” mà nhiều người homelab dùng.

ModelQuantGeneration tok/sRAM
Gemma 3 1BQ4_K_M12-151 GB
Phi-3-mini 3.8BQ4_K_M8-103 GB
Gemma 3 4BQ4_K_M6-83 GB
Llama 3.1 8BQ4_K_M2-45 GB
Gemma 3 12BQ4_K_M1-28 GB
Qwen 3 32B (dense)Q4_K_M< 0.520 GB

Ngưỡng practical với CPU-only Xeon E5 era: tối đa 4B model cho agent loop (nhiều turn), tối đa 7B-8B cho one-shot chat (một request là xong). Lên 12B đã rất chậm, 32B+ không có ý nghĩa.

CPU đời mới hơn (Xeon Sapphire Rapids 2023, Threadripper 7000) với AVX-512 và DDR5 nhanh hơn rõ rệt. Số liệu public cho thấy DDR5 dual-channel chạy 7B Q4 đạt 6-10 tok/s, gấp 2-3 lần DDR4 cùng số core. Nhưng vẫn không bằng GPU rẻ nhất.

Pattern phù hợp với CPU-only: agent batch chạy offline, summarization định kỳ, classification, single-user RAG với model nhỏ. Chat real-time hoặc multi-user thì quên đi. Cá nhân tôi dùng homelab CPU-only cho cron job đêm: tổng hợp blog post, parse RSS, generate index cho personal search. Mỗi job 2-5 phút inference, không ai chờ live, hardware đã chạy 24/7 cho việc khác nên marginal cost gần zero.

Một mẹo squeeze thêm throughput từ CPU: pin process vào physical core thay vì hyperthread. Trên Xeon 18-core/36-thread của tôi, set -t 18 (thread = physical core) thay vì -t 36 nhanh hơn 10-15%. Lý do: HT context switch overhead lớn hơn benefit cho workload memory-bound như LLM inference. Cũng nên bật NUMA awareness nếu chạy dual-socket: numactl --cpunodebind=0 --membind=0 llama-server ... giữ memory và compute trên cùng một NUMA node, tránh penalty cross-socket.

Quantization impact: Q4 vs Q8 vs FP16

Quantization là cách giảm precision weight để tiết kiệm VRAM/RAM và tăng throughput, đánh đổi chất lượng. Số liệu chung:

QuantBit/weightKích thước (vs FP16)ThroughputChất lượng
FP1616100%1x (baseline)Baseline
Q8_0850%1.5-2xGần baseline, loss < 1%
Q5_K_M5.535%2.5-3xLoss 1-2%
Q4_K_M4.528%3-4xLoss 2-4%, sweet spot
Q3_K_M3.522%4-5xLoss 5-10%, rõ
Q2_K2.616%5-6xLoss > 10%, model dumb đi

Sweet spot 2026 vẫn là Q4_K_M cho hầu hết model. Q5_K_M nhỉnh chất lượng nhưng VRAM cộng dồn, gặp model fit-just-in-VRAM thì không còn chỗ. Q8 chỉ dành cho khi VRAM dư thoải mái và muốn chất lượng tối đa.

Format mới 2026 đáng theo dõi: MXFP4 (Microscaling FP4) là format OpenAI ship gpt-oss native, 4-bit có scaling block, chất lượng gần Q8, cần Hopper hoặc Ada Lovelace để chạy efficient. NVFP4 tối ưu cho Blackwell (5090, B100), 4-bit với hardware acceleration. AWQ (Activation-aware Weight Quant) 4-bit aware activation distribution, throughput vLLM rất cao, support NVIDIA tốt nhưng kém ở CPU và Metal.

Recommendation đơn giản: bắt đầu Q4_K_M (GGUF) làm baseline. Nếu chạy CUDA và cần production throughput, chuyển sang AWQ qua vLLM. Nếu chạy gpt-oss thì giữ MXFP4 gốc. Đừng over-think quantization khi bạn chưa bench chính workload của mình.

Cost per token: tự host có ăn được cloud không

Sau khi biết throughput, câu hỏi tiếp: tự host rẻ hơn API không. Tôi tính ba scenario hardware self-host 24/7, giả định model 7B Q4_K_M, throughput tương ứng hardware, điện 0.15 USD/kWh, hardware amortize trong 36 tháng.

RTX 4090 mua mới 1600 USD amortize 44.4 USD/tháng, điện 400W trung bình 43.2 USD/tháng, tổng khoảng 87.6 USD/tháng. Throughput 50 tok/s ở full utilization cho 130M token/tháng, cost 0.67 USD/M token. Thực tế utilization 30%, cost lên 2.24 USD/M token.

M3 Max 64GB Mac Studio 3200 USD amortize 88.9 USD/tháng, điện 80W trung bình 8.6 USD/tháng, tổng khoảng 97.5 USD/tháng. Throughput 66 tok/s ở 30% utilization cho 51M token/tháng, cost 1.91 USD/M token.

Homelab Xeon E5 second-hand không thêm hardware: amortize 0 (đã có sẵn), điện 150W trung bình 16.2 USD/tháng (thực tế marginal cost gần 0 nếu server đã chạy 24/7 cho mục đích khác). Throughput 3 tok/s ở 30% utilization cho 2.3M token/tháng, cost 7 USD/M token (cao vì throughput thấp).

So với cloud API 2026: DeepSeek V3.2 ~0.5 USD/M output, Gemini Flash ~0.6 USD/M output, OpenAI GPT-4o-mini ~0.6 USD/M output, Claude Haiku ~1.25 USD/M output.

Kết luận khô khan: với model 7B-8B mạnh sẵn có trên cloud rẻ, tự host khó cạnh tranh thuần về chi phí trừ khi volume rất lớn (10M+ token/ngày sustained). Crossover point cho RTX 4090 vs market average (2 USD/M token) khoảng 23M token/tháng theo phân tích cộng đồng.

Quan điểm cá nhân tôi: nếu bạn không có một trong các lý do data sensitivity, compliance, offline workflow, custom fine-tune, hoặc privacy của user cuối, dùng cloud API rẻ hơn và tỉnh táo hơn nhiều. Tự host vì hobby thì OK, đừng tự lừa mình rằng “tiết kiệm tiền API” là lý do chính đáng. Lý do chính đáng nằm ở privacy và control, không phải cost.

Chọn hardware theo budget

Dưới 500 USD dùng cái có sẵn. CPU-only với RAM 16GB+, chạy Gemma 3 1B-4B hoặc Phi-3-mini cho agent loop, Llama 3.1 8B cho one-shot. Không cần mua thêm GPU. Đây cũng là pattern homelab “miễn phí” tôi đang chạy.

500-1000 USD pick RTX 3060 12GB hoặc RTX 4060 Ti 16GB. Chạy được hầu hết model 7B-12B ở 45-55 tok/s. Sweet spot value cho dev cá nhân muốn nâng cấp từ CPU-only lên GPU.

1000-2000 USD là RTX 3090 24GB second-hand hoặc RTX 4090 mới. Chạy được 32B (MoE active params nhỏ như gpt-oss), 13B-14B dense thoải mái với context dài. 3090 secondhand value vô địch nếu bạn không cần Blackwell features.

2000-3500 USD là Mac Studio M4 Max 64-128GB hoặc 2x RTX 3090. 70B model với context vừa. Mac có ưu thế portable, im lặng, RAM 128GB rẻ hơn nhiều so với equivalent VRAM. 2x 3090 nhanh hơn nhưng setup phức tạp và ồn.

5000+ USD đi workstation 2-4 GPU. 2x RTX 4090 hoặc 1x RTX 5090 nếu cần Blackwell. Production-grade, có thể serve multi-user.

Nếu cần serving production multi-user thật, bỏ qua consumer GPU đi thẳng A100/H100 cloud hourly. Cost per token thấp hơn nhiều khi batch tốt, và bạn không phải tự lo cooling, điện, downtime.

Nguyên tắc chung: chọn hardware có VRAM/RAM đủ chứa model size bạn muốn ở Q4, không cần size lên Q8 hay FP16. Bandwidth quan trọng hơn raw compute cho LLM inference. Đừng mua RTX 5090 chỉ vì nó mới nhất nếu workload thực tế của bạn chỉ chạy 8B model: RTX 3060 đã đủ.

Bước tiếp

Bài 3 series sẽ vào runner: Ollama, LM Studio, vLLM, llama.cpp. Mỗi cái mạnh ở pattern khác nhau. Sau khi đã biết hardware nào chạy model nào ở tốc độ nào, bài sau giúp chọn runtime serve model đó tới application.

Trước khi đi tiếp, một action item thực tế: chạy llama-bench (đi kèm llama.cpp) trên hardware sẵn có với một GGUF model bạn quan tâm. Số đo trên máy thật của bạn luôn quan trọng hơn benchmark public, vì RAM speed, CPU cooling, background workload đều ảnh hưởng. Số ở bài này là baseline, máy bạn có thể chệch 20-30%.

Tham khảo