Một dev hỏi tôi tuần trước: “Tôi vừa pull Qwen 30B về Ollama, chạy thử trên RTX 4090, được khoảng 70 tok/s. Sao Reddit nói vLLM nhanh 200 tok/s trên cùng hardware?” Câu trả lời ngắn là: cả hai đều đúng, vì hai metric khác nhau. Ollama nhanh nhất khi single-user. vLLM nhanh nhất khi serving nhiều user đồng thời. Pick sai mục đích sẽ tốn vài ngày trước khi bạn nhận ra.
Bài 1 chốt model, bài 2 chốt hardware. Câu hỏi tiếp: chạy bằng cái gì.
Năm 2024 lựa chọn còn đơn giản. llama.cpp nếu bạn quen CLI, text-generation-webui nếu thích GUI, vLLM nếu ở team enterprise. Đến giữa 2026 sân chơi chia nhánh rõ. Bốn cái tên dominate: Ollama, LM Studio, vLLM, llama.cpp. Mỗi cái optimize cho một use case, và chọn sai sẽ tốn 2-3 ngày trước khi bạn nhận ra mình đã chọn nhầm.
Bài này tôi đi qua từng runner, nói rõ nó mạnh ở đâu, dở ở đâu, kèm bảng so sánh và recommend cụ thể theo profile use case. Cố ý có quan điểm, không “neutral expert”.
Bốn runner, bốn triết lý
Đặt cả bốn cạnh nhau theo triết lý thiết kế thì ranh giới khá rõ. llama.cpp là engine inference C++ thuần, foundation của toàn bộ stack local LLM consumer 2026, không phải UX layer. Bạn build từ source, chạy ./llama-server, expose HTTP API, xong. Không daemon, không model registry, không GUI. Mục tiêu là tối đa hoá performance trên mọi loại phần cứng từ Raspberry Pi đến H100.
Ollama wrap llama.cpp trong một daemon, một CLI, một HTTP API kiểu Docker. ollama pull llama3.2 rồi ollama run llama3.2 là xong. Ollama là về DX, không phải về raw speed. Nó thêm một lớp model registry, một lớp daemon quản lý lifecycle, và một format manifest gọi là Modelfile.
LM Studio là desktop app GUI. Bạn click model trong catalog, click download, chat trực tiếp trong app. Phía dưới nó chạy cả llama.cpp lẫn MLX (trên Apple Silicon). Đối tượng là user không quen terminal: PM, domain expert, researcher cần thử nhanh model mà không setup môi trường dev.
vLLM là engine inference focus vào production serving. PagedAttention, continuous batching, prefix caching, tensor parallelism. Khi bạn cần phục vụ nhiều user đồng thời với throughput cao, vLLM là cái duy nhất trong nhóm này thực sự design cho việc đó. Single user thì overkill.
Cách dễ nhớ: llama.cpp là engine, Ollama là DX wrapper cho dev, LM Studio là wrapper cho người không code, vLLM là load balancer cho fleet.
Ollama: zero-friction cho dev
Ollama là cái tôi cài đầu tiên trên mọi máy mới. Lý do đơn giản: 4-5 phút từ download đến first inference, và một HTTP API stable mà mọi tool downstream đều biết cách gọi.
Cài qua installer trên macOS, qua script trên Linux, qua MSI trên Windows. Service chạy nền, expose http://localhost:11434. Pull model bằng tên ngắn (ollama pull qwen2.5-coder:14b), không phải đào URL Hugging Face. Run interactive bằng ollama run, hoặc gọi API trực tiếp.
ollama pull qwen2.5-coder:14b
ollama run qwen2.5-coder:14b
# Hoặc gọi API từ code
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5-coder:14b",
"prompt": "Viết hàm tính fibonacci bằng Python"
}'
Mạnh nhất của Ollama nằm ở DX. Model registry ollama.com/library có gần như mọi open-weight model phổ biến đã quantize sẵn nhiều tier (Q4_K_M, Q5_K_M, Q8_0), không phải đào GGUF. Modelfile cho bạn custom system prompt, temperature, context length, lưu thành model mới, giống Dockerfile nhưng cho LLM. HTTP API stable với schema OpenAI-compatible (qua /v1/chat/completions) và Ollama-native (qua /api/generate), tool downstream như Open WebUI, Continue, Aider đều support sẵn. Load nhiều model một lúc, hot-swap trong vài giây nếu RAM đủ. Cross-platform đầy đủ: macOS Metal, Linux CUDA/ROCm, Windows CUDA, CPU-only cũng chạy được chậm thôi.
Điểm phải biết là Ollama không phù hợp khi bạn serve nhiều user. Throughput single-user only, dưới concurrent load không có continuous batching: bench thực tế 2026 cho thấy Ollama peak ~41 tok/s vs vLLM ~793 tok/s trên cùng hardware khi serving nhiều request song song. Quantization tier giới hạn chủ yếu Q4_K_M default; nếu bạn muốn AWQ, GPTQ, hoặc fine-tune custom phải qua llama.cpp trực tiếp. Chậm hơn llama.cpp raw 15-25% vì thêm lớp daemon và serialization. Không expose mọi flag của llama.cpp như --n-gpu-layers chi tiết, --cache-type-k, custom RoPE.
Quan điểm của tôi: nếu bạn vừa bắt đầu local LLM, đừng đắn đo, pick Ollama. 90% use case nó cover được, và khi bạn growth out, switch sang vLLM (production) hoặc llama.cpp (advanced) không quá khó vì API cùng schema. Dev workflow cá nhân, homelab single-user, làm endpoint backend cho IDE assistant (Continue, Aider, Cursor local), prototype agent loop, đây là default.
LM Studio: GUI cho người không terminal
LM Studio là desktop app (Windows, macOS, Linux) với UX kiểu app store. Bạn mở app, browse model, click Download, chat trực tiếp. Không CLI, không config file, không quan tâm GGUF là gì.
Phía dưới nó chạy hai engine song song. llama.cpp engine cho GGUF model hoạt động trên mọi platform. MLX engine trên Apple Silicon dùng framework native của Apple cho ML, throughput ~30-50% cao hơn llama.cpp trên Metal cho nhiều model, vision input cũng nhanh hơn. App tự chọn backend phù hợp với hardware. Trên M3 Max bạn có thể load một MLX model và một GGUF model cùng lúc, so output side-by-side.
Một số tính năng đáng chú ý 2026: local API server bật một switch trong app cho endpoint OpenAI-compatible giống Ollama (code của bạn không cần đổi gì để switch backend). Token probability visualizer hiển thị xác suất từng token được sample, tool học cách model “suy nghĩ” rất tốt. Continuous batching từ v0.4.0 (1, 2026) ở llama.cpp engine support parallel request, v0.4.2 mở rộng sang MLX, nghĩa là LM Studio không còn pure single-user nữa, dù vẫn không sánh được vLLM. Llmster từ 0.4.0 có option deploy không GUI cho server, hữu ích nếu team có user thử model trên laptop rồi muốn push lên server share. Model catalog có Hugging Face card, parameter count, recommended quant, RAM requirement hiển thị inline.
Điểm yếu phải biết: GUI là điểm mạnh và cũng là điểm yếu, không headless friendly, có llmster nhưng cảm giác bolt-on. Engine (llama.cpp, MLX) open source nhưng UI và packaging là closed source, một số team enterprise có policy chặn. Model catalog phụ thuộc app update, đôi khi model mới ra Hugging Face nhưng catalog chưa có, phải sideload thủ công.
Tôi recommend LM Studio cho hai case rõ ràng. Team có PM hoặc domain expert muốn thử model mà không học CLI. Researcher so sánh nhiều model side-by-side với token probability viz. Cá nhân tôi không dùng LM Studio thường xuyên vì terminal-first, nhưng đưa nó cho một colleague phi tech thì đây là cách nhanh nhất để họ tự chơi với local LLM mà không cần tôi setup.
vLLM: production throughput thật sự
vLLM là engine khác hẳn. Nó không design cho laptop, không design cho single-user. Mục tiêu là serve API LLM cho nhiều user đồng thời với throughput cao và latency thấp.
Hai kỹ thuật làm nên tên tuổi vLLM. PagedAttention: KV cache của attention thường lãng phí memory vì pre-allocate cho max sequence length; PagedAttention chia KV cache thành block không liền kề kiểu virtual memory của OS, lãng phí dưới 4%, batch size có thể tăng đáng kể, GPU utilization cao hơn nhiều. Báo cáo 2026 cho thấy vLLM throughput 14-24x cao hơn naive serving nhờ riêng PagedAttention. Continuous batching: request mới slot vào batch ngay khi có token slot trống, không phải đợi full batch hoàn thành, khác static batching kiểu cũ ở chỗ tận dụng GPU tối đa kể cả khi request có độ dài khác nhau.
Cộng thêm prefix caching (cache attention KV cho prompt prefix chung), chunked prefill (tách prompt dài thành chunk), tensor parallelism (split model qua nhiều GPU), AWQ và GPTQ quantization, vLLM trở thành lựa chọn default cho self-hosted LLM API trong 2026.
pip install vllm
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--gpu-memory-utilization 0.90 \
--max-model-len 32768 \
--enable-prefix-caching
Endpoint OpenAI-compatible mở ở http://localhost:8000/v1. Client SDK OpenAI gọi thẳng được.
Bench so sánh 2026 cho thấy gap rõ rệt. Trên RTX 4090 với 24B model, peak throughput Ollama ~41 tok/s, vLLM ~793 tok/s (gấp ~19 lần). P99 latency peak load Ollama ~673ms, vLLM ~80ms. Gap mở rộng theo concurrent user. Nếu bạn serve 5+ user cùng lúc, vLLM justify được learning curve dốc của nó.
Đổi lại setup không phải plug-and-play. vLLM GPU only, không CPU-only, cần CUDA hoặc ROCm (ROCm support còn beta cho một số model). Linux first: native chỉ Linux, macOS không support, Windows phải WSL2. Setup phức tạp với GPU memory utilization, KV cache type, max model length, tensor parallel size, đều phải tune. Single-user thì overkill: vLLM không nhanh hơn llama.cpp khi một mình bạn dùng, toàn bộ ưu thế nằm ở concurrent serving. Model support hẹp hơn llama.cpp, kiến trúc exotic hoặc fine-tune custom đôi khi phải đợi vLLM ship support.
Quan điểm cá nhân: nếu bạn solo dev đang đọc bài này, gần như chắc bạn không cần vLLM. vLLM justify được khi bạn có 5+ user concurrent hoặc batch inference offline (process 100k document). Cài vLLM cho “tôi muốn nhanh hơn Ollama 20%” là pick sai. Ở 20% bạn không cảm nhận được; ở 19x bạn sẽ.
llama.cpp: foundation, không phải UX
llama.cpp là code C++ chạy LLM trên gần như mọi phần cứng. Tác giả ggerganov bắt đầu project đầu 2023 để chạy Llama 1 trên MacBook, 3 năm sau nó vẫn là foundation của toàn bộ stack local LLM consumer. Ollama wrap nó, LM Studio dùng nó, LocalAI dùng nó, Jan.ai dùng nó.
Tại sao vẫn dùng llama.cpp trực tiếp khi đã có wrapper? Bốn lý do thực dụng. Raw performance: không có lớp daemon hay GUI, throughput single-user nhanh nhất trong nhóm, llama-server nhanh hơn Ollama ~15-25% trên cùng hardware. GPU backend đa dạng: 2026 support CUDA, Metal, Vulkan, ROCm (HIP), SYCL; Vulkan đặc biệt hữu ích nếu bạn có Intel Arc hoặc card AMD cũ. Quantization full control: bạn quyết định Q2_K, Q3_K_S, Q3_K_M, Q4_0, Q4_K_S, Q4_K_M, Q5_K_S, Q5_K_M, Q6_K, Q8_0, F16, wrapper thường khoá vào một-hai tier. GGUF format là một file binary chứa weights, tokenizer, metadata, config, load nhanh, ship dễ, không phụ thuộc framework.
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j
./build/bin/llama-server \
-m models/qwen2.5-coder-14b-q4_k_m.gguf \
--port 8080 \
-ngl 99 \
--ctx-size 32768
Endpoint OpenAI-compatible mặc định, frontend HTML built-in để chat ngay.
Trước 2026 phải build từ source cho Windows nếu muốn CUDA. Bản b9196 trở đi (5, 2026) có prebuilt cho Windows hỗ trợ CUDA 13.1, Vulkan, HIP, SYCL: unzip là chạy. Nếu bạn ngại build, đây là điểm thay đổi đáng kể.
Điểm yếu của llama.cpp là DX raw. Không model registry phải tự download GGUF từ Hugging Face, không daemon phải tự quản lý process. Flag overload với hàng trăm flag tinh chỉnh là sức mạnh nhưng cũng khó cho beginner. Không continuous batching kiểu vLLM, parallel slot có nhưng không bằng. Server modest, tốt cho single-user và small team, không scale như vLLM cho fleet production.
Tôi recommend llama.cpp trực tiếp ở bốn case. Bạn muốn raw performance trên single GPU. Bạn cần custom quantization sâu (ví dụ test Q3 vs Q4 trên chính workload). Bạn deploy edge (Raspberry Pi, Jetson) nơi mỗi MB RAM quý. Bạn ship app desktop tự đóng gói engine (như LM Studio làm, như Jan.ai làm). Còn nếu mục đích là “tôi muốn local LLM chạy nhanh”, Ollama đã đủ và không phải build từ source.
Bảng so sánh
| Tiêu chí | Ollama | LM Studio | vLLM | llama.cpp |
|---|---|---|---|---|
| Mục tiêu chính | Dev DX | GUI người không code | Production multi-user | Foundation engine |
| Setup time first inference | 3-5 phút | 5-10 phút | 30+ phút | 15-25 phút (build) |
| Platform | mac, Linux, Win | mac, Linux, Win | Linux (Win WSL2) | mọi nơi |
| GPU backend | CUDA, Metal, ROCm | CUDA, Metal, MLX, Vulkan | CUDA, ROCm (beta) | CUDA, Metal, Vulkan, ROCm, SYCL |
| CPU-only | Có | Có | Không | Có |
| Throughput single-user | 35-40 tok/s | 35-40 tok/s (Metal MLX 50+) | 30 tok/s | 40-50 tok/s |
| Throughput multi-user (peak) | ~41 tok/s | ~50 tok/s (v0.4+) | ~793 tok/s | ~100 tok/s |
| P99 latency peak load | ~673ms | ~500ms | ~80ms | ~300ms |
| Model registry | ollama.com | catalog trong app | Hugging Face | Hugging Face |
| Quantization tier | Q4_K_M default, vài tier | GGUF full range, MLX | AWQ, GPTQ, FP8, FP16 | Full Q2-Q8, F16 |
| OpenAI-compatible API | Có (/v1) | Có (toggle) | Có (/v1) | Có |
| GUI | Không | Có | Không | HTML server cơ bản |
| Open source | Có (MIT) | Engine open, shell closed | Có (Apache 2.0) | Có (MIT) |
| Production multi-tenant | Không | Không | Có | Hạn chế |
Số throughput là approximation từ bench public 2026 trên hardware mid-tier (RTX 4090 / M3 Max). Workload thực tế có thể khác.
Recommend theo use case
Vừa bắt đầu local LLM, một mình dùng, không biết chọn gì: dùng Ollama. 5 phút lên, mọi tool downstream support, đủ tốt cho coding, agent, RAG cá nhân. Đây là default tôi recommend mà không cần thêm điều kiện.
Team có PM hoặc domain expert muốn thử model trên laptop của họ: dùng LM Studio. GUI quen thuộc, catalog thân thiện, không cần dạy CLI.
Deploy LLM API nội bộ phục vụ nhiều dev hoặc nhiều user cùng lúc: dùng vLLM. Throughput multi-user là lý do tồn tại của nó. Đặt sau reverse proxy, expose endpoint OpenAI-compatible, mọi client SDK gọi vào.
Cần raw performance trên single GPU, hoặc deploy edge device, hoặc fine-tune custom quantization: dùng llama.cpp trực tiếp. Tốc độ tối đa, control tối đa, không lớp wrapper. Đây cũng là pick khi bạn ship product đóng gói engine vào app.
Combo phổ biến mà tôi đang chạy: Ollama như always-on endpoint trên homelab box, mọi tool dev (IDE assistant, agent CLI, n8n flow) gọi vào endpoint đó. Khi cần serve nhiều user hoặc test load, spin vLLM container riêng. Hai endpoint song song không xung đột vì port khác nhau. Code agent dùng OpenAI SDK trỏ vào endpoint compatible, dev local trỏ http://localhost:11434/v1, staging và production trỏ vào vLLM cluster. Schema giống nhau, không sửa code.
Hai trend đáng để mắt
MLX trên Apple Silicon đã mature trong 2026. Engine 2026 nhanh hơn llama.cpp Metal 30-50% cho nhiều model, vision input đặc biệt mượt. Nếu bạn dev trên Mac và muốn squeeze max throughput, LM Studio (dùng MLX) hoặc mlx-lm trực tiếp đáng cân nhắc thay vì Ollama (vẫn dùng llama.cpp Metal). Tôi chưa switch hẳn vì tooling downstream của Ollama quá tiện, nhưng nếu bạn build product Mac-only, MLX là direction đáng đầu tư.
TurboQuant đáng theo dõi. Google công bố tháng 3, 2026 thuật toán quantization training-free đạt 3 bits/value cho KV cache, giảm 6x memory cache và tăng 8x speed attention trên H100, không giảm accuracy đo được. llama.cpp đang implement theo paper AISTATS 2026, native dự kiến Q3 2026, Ollama theo sau. Hôm nay Q4_K_M cộng flash attention vẫn là sweet spot, nhưng nếu bạn đang plan production setup nửa cuối 2026, để mắt TurboQuant.
Bước tiếp
Bài 4 vào MCP cho local agent. Khi đã có Ollama hoặc vLLM endpoint, làm sao wire agent đọc file, gọi tool, search code, mà không phải viết integration cho từng tool. MCP là USB-C cho agent, và local LLM 2026 đã đủ tốt để chạy agent loop nghiêm túc, ít nhất ở tier 14B+ trên GPU consumer.
Tham khảo
- Ollama docs: API reference, Modelfile syntax.
- vLLM PagedAttention paper: kỹ thuật làm nên gap multi-user.
- llama.cpp README: build instruction, GPU backend matrix.
- LM Studio release notes v0.4: continuous batching và MLX engine update.