Một đồng nghiệp của chúng tôi vừa kể lại buổi chiều của anh ấy. Máy đã sẵn sàng, model đã tải về, nhưng ba mươi phút đầu tiên không cho ra một câu trả lời nào từ AI. Thay vào đó là một vòng lặp: lệnh cài phàn nàn về phiên bản, địa chỉ máy chủ sai, tên tham số sai, rồi lại quay về lệnh cài.
Đây là hiện tượng phổ biến đến mức chúng tôi đặt cho nó một cái tên trong đội: phần cài đặt. Ba công cụ viết trong tiêu đề bài viết đều chạy được model local, cả ba đều tốt, và cả ba đều có cách khiến bạn mất buổi chiều đầu tiên theo cách riêng.
Với doanh nghiệp nhỏ, câu hỏi thật sự không phải công cụ nào hơn công cụ nào. Câu hỏi là bạn đang nhận lấy bao nhiêu công việc vận hành về phía mình. Bài viết này so sánh ba runtime theo đúng bốn tiêu chí quyết định câu trả lời đó.
Trả lời ngắn:
Ollama, vLLM và llama.cpp là ba cách trả lời cùng một câu hỏi: chạy model này ở đâu. Ollama tối ưu cho tốc độ bắt đầu, vLLM tối ưu cho thông lượng khi nhiều người gọi cùng lúc, llama.cpp tối ưu cho quyền kiểm soát từng tham số. Cả ba đều mở endpoint tương thích OpenAI API, nhưng mỗi bên hỗ trợ một mức độ trọn vẹn khác nhau, và chính chỗ đó là nơi hay hỏng nhất khi bạn chuyển đổi giữa chúng.
TL;DR
- Runtime không phải model. Đổi runtime không đổi chất lượng câu trả lời, nó đổi cách bạn cài đặt, cách bạn bảo trì và mức độ bạn kiểm soát.
- Ba việc cần ba công cụ: phát triển và thử nghiệm thì Ollama, sản xuất nhiều request thì vLLM, nhúng và kiểm soát tối đa thì llama.cpp.
- Cả ba nói cùng ngôn ngữ của OpenAI API nhưng ở ba mức độ đầy đủ khác nhau. Hãy kiểm tra mức độ tương thích trước khi viết code, không phải sau khi nó hỏng.
Bối cảnh trước khi vào việc. Năm 2026, ba lý do khiến nhóm kỹ thuật Việt Nam bàn tới chạy local nhiều hơn: chi phí theo token tăng theo mức sử dụng, dữ liệu khách hàng không muốn rời khỏi hệ thống, và nhu cầu hoạt động khi đường truyền kém hoặc khi không muốn đặt dữ liệu vào tay bên thứ ba. Không lý do nào trong ba lý do đó liên quan tới việc model nào thông minh hơn. Đó là lý do chúng tôi tách hẳn hai câu hỏi này ra.
Nếu bạn chưa chốt model nào sẽ chạy trên phần cứng của mình, hãy đọc trước bài chọn model nào để chạy AI local, DeepSeek V4 Flash hay Ling-3.0-flash. Bài đó trả lời câu hỏi chạy cái gì. Bài này trả lời câu hỏi chạy bằng gì. Hai câu hỏi hay bị trộn vào nhau, và việc nhầm lẫn chúng là lý do phổ biến nhất khiến đội kỹ thuật mua phần cứng rồi để máy nghêu ngao.
Ba runtime, ba triết lý thiết kế khác nhau
Ba công cụ này không phải ba phiên bản của cùng một thứ. Chúng ra đời từ ba câu hỏi khác nhau, và hiểu câu hỏi gốc giúp bạn đoán được hành vi của chúng trong tình huống bất thường.
Ollama: model được xử lý như một gói phần mềm
Cách bắt đầu với Ollama là một lệnh cài, rồi ollama run là xong. Server mở tại http://localhost:11434/api, phần tương thích OpenAI nằm ở nhánh /v1 trên cùng địa chỉ, và Ollama còn cung cấp cả base URL cho client Anthropic (docs.ollama.com/api/introduction, truy cập 27/10/2026). Client OpenAI vẫn đòi một giá trị API key, nhưng khi gọi máy local thì Ollama bỏ qua giá trị đó.
Ollama có engine của riêng mình trên Apple Silicon và từ bản 0.30 thêm compatibility GGUF thông qua llama.cpp (ollama.com/blog, 05/06/2026). Dự án tự công bố con số 8,9 triệu nhà phát triển đang dùng (ollama.com/blog, 09/07/2026). Triết lý thiết kế của họ đặt nhà phát triển lên trước: model được tải về như gói phần mềm, phiên bản gọi bằng tên, và phần lớn tham số cấu hình được giấu sau các mặc định đã cân sẵn.
vLLM: một máy chủ được thiết kế quanh thông lượng
vLLM sinh ra từ Sky Computing Lab tại UC Berkeley với khẩu hiệu ghi ngay trên trang tài liệu: Easy, fast, and cheap LLM serving for everyone (docs.vllm.ai, truy cập 27/10/2026). Hai chữ ký của nó là PagedAttention, cách quản lý bộ nhớ key và value của attention theo từng trang để giảm chỗ trống lãng phí (blog.vllm.ai, 20/06/2023), cùng continuous batching, kỹ thuật gộp các request đang chạy thành lứa liên tục thay vì chờ cả lứa trước hoàn tất.
Đổi lại, việc cài đặt nặng hơn hẳn: hệ điều hành Linux, Python từ 3.11 đến 3.14, cài qua uv hoặc pip, kèm bước tải kernel đã biên dịch sẵn (docs.vllm.ai quickstart, truy cập 27/10/2026). Lệnh vllm serve mở máy chủ tại http://localhost:8000 theo mặc định, đổi bằng --host và --port, và mỗi máy chủ giữ một model tại một thời điểm. Danh sách model được hỗ trợ vượt 200 kiến trúc trên Hugging Face. Triết lý thiết kế: tối đa hóa số request xử lý được trên phần cứng bạn đã mua.
llama.cpp: engine và máy chủ mà bạn tự thao tác
llama.cpp là dự án C và C++ chạy model F16 lẫn model quantized trên cả GPU lẫn CPU. Máy chủ đi kèm, llama-server, được chính README mô tả là máy chủ HTTP thuần C/C++ gọn và nhẹ, với endpoint chat, responses và embeddings tương thích OpenAI, thêm Anthropic Messages, continuous batching, decoding song song cho nhiều người, endpoint giám sát /metrics, JSON theo schema, function calling và web UI (github.com/ggml-org/llama.cpp, truy cập 27/10/2026). Triết lý thiết kế: phụ thuộc tối thiểu, kiểm soát tối đa, mọi tham số đều mở.
Một điểm dễ gây hiểu nhầm: Ollama không phải đối thủ của llama.cpp về mặt gốc rễ. Ollama dùng llama.cpp làm một phần của engine mình, theo chính bài viết của Ollama khi phát hành compatibility GGUF. Giống hai chiếc xe khác nhau đặt trên một khung gầm chung: bạn chọn cách lái và cách bảo dưỡng, còn chất lượng sắt thì không phải thứ bạn đang chọn.
Bảng so sánh bốn tiêu chí hay tách nhau nhất
Bốn hàng dưới đây là bốn chỗ mà ba công cụ tách nhau rõ nhất trong thực tế. Toàn bộ nội dung lấy từ tài liệu chính thức, kiểm tra ngày 27/10/2026.
| Tiêu chí | Ollama | vLLM | llama.cpp |
|---|---|---|---|
| Ma sát cài đặt | Một lệnh script, chạy trên macOS, Windows và Linux | Linux, Python 3.11 đến 3.14, cài qua uv hoặc pip và tải kernel biên dịch sẵn | Build bằng CMake theo README hoặc dùng bản binary đóng sẵn |
| API tương thích OpenAI | Một tập con của OpenAI API tại /v1, thêm API gốc Ollama và base URL Anthropic |
Completions, chat, responses, embeddings, thêm /v1/messages của Anthropic và API Cohere |
Chat, responses, embeddings, thêm Anthropic Messages và endpoint rerank |
| Cổng mặc định | 11434 | 8000, đổi bằng --port |
Cấu hình bằng --port, ví dụ trong README dùng 8080 |
| Quản lý bộ nhớ GPU | Context tự tính theo VRAM; ollama ps cho thấy tỉ lệ GPU và CPU |
PagedAttention, prefix caching, chunked prefill | Bạn tự quyết: --ctx-size, loại KV cache, offload, mlock |
| Quantization | GGUF thông qua llama.cpp, thêm engine MLX trên Apple Silicon | FP8, INT8, INT4, GPTQ, AWQ, GGUF và vài định dạng khác | GGUF với nhiều cấp độ lượng tử hóa, và quantize được cả KV cache |
Bảng trả lời được câu công cụ nào có gì. Nó không trả lời câu quan trọng hơn: cái nào hợp với việc bạn đang làm. Phần sau trả lời câu đó.
Chọn theo việc: phát triển, sản xuất hay nhúng
Phát triển và thử nghiệm: Ollama
Khi bạn đang viết prompt, dựng một bản thử retrieval, hay demo nội bộ cho khách, thứ bạn cần là vòng lặp nhanh. Ollama thắng ở đoạn này vì mỗi lần đổi model chỉ tốn một câu lệnh, và việc của ứng dụng là trỏ base_url về máy địa phương. Model chưa có thì kéo về, model cũ thì xoá, không có gì phải dựng lại.
Giới hạn thật của lựa chọn này nằm ở hai chỗ. Thứ nhất, context được tính theo VRAM của máy, nên cấu hình mặc định trên máy phổ thông ngắn hơn bạn tưởng. Thứ hai, API chỉ là một tập con, nên phần code hiếm dùng là chỗ dễ vỡ nhất. Cả hai giới hạn này đều xử lý được, nhưng phải biết trước.
Sản xuất nhiều request: vLLM
Khi đã có người dùng thật, bottleneck không còn là mỗi câu trả lời mất bao lâu, mà là mỗi giây xử lý được bao nhiêu request. Continuous batching ra đời đúng cho bài toán đó: theo bài viết của Anyscale, kỹ thuật này nâng thông lượng lên tới 23 lần so với cách xếp hàng truyền thống, đồng thời giảm độ trễ ở mức trung vị (anyscale.com/blog, truy cập 27/10/2026).
Đổi lại, bạn nhận về một danh sách việc phải làm: driver GPU đúng phiên bản, một tiến trình cho mỗi model, và một thói quen theo dõi khi tiến trình phình bộ nhớ. Chúng tôi đã ghi lại toàn bộ phần này trong bài recipe deploy DeepSeek V4 Flash trên 2× DGX Spark. Đó là trải nghiệm thật với một cụm hai node, từ image chuẩn, hotfix bắt buộc tới script kiểm tra mọi thứ còn sống trước khi tin tưởng.
Nhúng, máy nhỏ, kiểm soát tối đa: llama.cpp
Khi model phải chạy trong một thiết bị bàn, trên một máy chủ hai nhân, hoặc khi bạn cần quyết định chính xác bao nhiêu bộ nhớ dành cho KV cache, llama.cpp là câu trả lời. Bạn đặt --ctx-size theo nhu cầu thật, chọn loại quantize cho KV cache, chọn cách nạp model bằng mmap hay mlock, và tắt bật offload từng phần. Không có lớp mặc định nào đứng giữa bạn và phần cứng.
Giá của quyền kiểm soát đó là bạn tự chịu trách nhiệm gần như mọi quyết định, và việc nâng cấp là việc của bạn. Với đội có một người kỹ sư, đó là sự đánh đổi đáng giá. Với đội không ai rảnh, đó là một danh sách việc dài.
Chạy thử ngay và bốn cái bẫy chúng tôi gặp thật
Ba khối lệnh dưới đây chạy được trên máy sạch, dùng đúng lệnh có trong tài liệu chính thức của từng dự án.
# Ollama: cài và chạy một model
curl -fsSL https://ollama.com/install.sh | sh
ollama run qwen3:8b
# Gọi qua endpoint tương thích OpenAI
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "qwen3:8b", "messages": [{"role": "user", "content": "Xin chào"}]}'
# vLLM: môi trường Python rồi mở máy chủ
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto
vllm download-kernels
vllm serve Qwen/Qwen2.5-1.5B-Instruct
# Kiểm tra máy chủ đang sống
curl http://localhost:8000/v1/models
# llama.cpp: máy chủ với context và KV cache tự chọn
./llama-server -m model.gguf -c 8192 -ctk q8_0 -ctv q8_0
Bốn cái bẫy sau là thứ khiến phần lớn người mới mất thêm một buổi nữa.
Bẫy một: context bị cắt mà không báo trước
Ollama đặt context mặc định theo VRAM của máy: dưới 24 GiB thì 4k token, từ 24 đến 48 GiB là 32k, từ 48 GiB trở lên là 256k (docs.ollama.com/context-length, truy cập 27/10/2026). Nghĩa là trên máy phổ thông, agent của bạn hết bộ nhớ hội thoại rất sớm, và dấu hiệu đầu tiên thường là một câu trả lời lạc đề chứ không phải một thông báo lỗi.
Tài liệu Ollama khuyên đặt tối thiểu 64.000 token cho tác vụ tìm kiếm trên web, agent và công cụ viết code. Sửa bằng cách chạy OLLAMA_CONTEXT_LENGTH=64000 ollama serve, rồi kiểm tra bằng ollama ps để xem model nằm ở đâu: toàn bộ trên GPU, toàn bộ trên bộ nhớ hệ thống, hay chia đôi. Ollama cũng khuyên tránh việc đẩy model về CPU vì hiệu năng sẽ tụt âm thầm.
Bẫy hai: tương thích OpenAI không có nghĩa là giống hệt
Tài liệu Ollama ghi rõ họ hỗ trợ một tập con của OpenAI API (docs.ollama.com/api/openai-compatibility, truy cập 27/10/2026). Code viết trên giả định về trạng thái của endpoint responses, hoặc dùng vài tham số ít gặp, có thể chạy y hệt nơi khác và thất bại ở đây. Trang compatibility đó đọc mất nửa giờ, và nó tiết kiệm một ngày.
Bẫy ba: vLLM yêu cầu chat template và giữ đúng một model
Chat completions của vLLM chỉ áp cho các model có chat template, theo trang online serving của họ (docs.vllm.ai, truy cập 27/10/2026). Máy chủ dùng template có sẵn trong tokenizer theo mặc định, nhưng model thiếu template thì đầu ra không đi theo định dạng bạn mong đợi, và tham số user bị bỏ qua. Cộng thêm quy tắc mỗi máy chủ giữ một model, bạn sẽ cần tách tiến trình thay vì đổi model qua lại trong cùng một tiến trình.
Bẫy bốn: llama.cpp mặc định theo model card, không theo máy bạn
Tham số --ctx-size mặc định là giá trị zero, nghĩa là lấy theo model card. Model khai context lớn hơn phần cứng bạn có thì kết thúc bằng một lỗi bộ nhớ ngay lúc khởi động. KV cache cũng mặc định ở dạng f16, nên khi bạn dựng context lớn, hãy cân nhắc quantize cache bằng -ctk và -ctv để đổi lấy phần VRAM còn lại (README của máy chủ llama.cpp, truy cập 27/10/2026).
Phần cứng: chỗ nào tự chọn, chỗ nào cần đọc thêm
Runtime không quyết định phần cứng bạn mua, nhưng nó quyết định bạn dùng phần cứng đến đâu. Cả ba công cụ đều chạy trên cùng một card đồ họa, điểm khác nằm ở cách chúng giữ bộ nhớ và cách chúng phản ứng khi bộ nhớ cạn.
Chúng tôi đã viết riêng một bài về thang phần cứng, từ card tiêu dùng tới hạ tầng đặt trong văn phòng: Local AI 2026: từ chiếc RTX 3090 đến hạ tầng on-prem cho doanh nghiệp. Bài đó trả lời câu hỏi mua gì. Ở đây hãy giữ một điều: hãy chốt runtime trước khi mua, vì yêu cầu bộ nhớ của chúng khác nhau, và nâng cấp phần cứng để chạy một runtime bạn không định dùng là cách đắt nhất để học một bài học.
Quan điểm 5ac: chọn runtime là chọn cam kết vận hành
Đây là chỗ chúng tôi khác với hầu hết bảng so sánh trên mạng. Bảng khác xếp công cụ theo tốc độ, theo số sao, theo độ mới của bản phát hành. Với doanh nghiệp nhỏ, chi phí thật không nằm ở benchmark, nó nằm ở thời gian của người trong đội.
Chọn runtime không phải chọn cái nhanh nhất trong bảng đo. Bạn đang chọn mức cam kết vận hành cho năm tới: bao nhiêu giờ mỗi tuần cho bảo trì, ai là người xử lý khi endpoint đổi, và bạn đổi ý bao nhiêu lần mà không phải viết lại phần còn lại của hệ thống.
Nhìn theo cách đó, ba lựa chọn gọn lại nhiều. Ollama là mức cam kết thấp nhất, bạn gỡ và thay trong một buổi chiều. vLLM là mức cam kết cao nhất, và nó trả lại đúng thứ bạn cần khi sản phẩm đã có người dùng thật. llama.cpp là lựa chọn của người không muốn một mặc định nào quyết định thay mình.
Một nguyên tắc chúng tôi tự đặt cho mình: đừng chọn runtime vĩnh viễn. Chọn cái hợp với tuần này, và giữ ứng dụng nói chuyện với một endpoint chuẩn để việc đổi sau này chỉ là đổi một dòng cấu hình. Đây là quan điểm của chúng tôi, dựa trên những gì chúng tôi thấy khi triển khai cho khách hàng quy mô nhỏ, không phải một bảng xếp hạng.
Takeaway: quy tắc ba dòng
Đủ dùng cho hầu hết quyết định, và bạn có thể đọc lại nó sau mỗi lần quy mô thay đổi:
- Đang viết, thử, demo trên máy cá nhân: Ollama.
- Sản phẩm đã có người dùng và GPU đã nằm sẵn trong máy: vLLM.
- Model phải chạy trong thiết bị nhúng, máy nhỏ, hoặc bạn cần kiểm soát từng byte: llama.cpp.
Bước tiếp theo cụ thể cho tuần này: chọn một model nhỏ bạn đã quen, chạy thử bằng Ollama và llama.cpp trên cùng một máy, rồi trỏ code của bạn vào endpoint tương thích OpenAI. Buổi thí nghiệm đó mất một buổi, và nó cho dữ liệu thật của chính máy bạn, thứ không bảng so sánh nào thay thế được.
Muốn một đội AI vận hành thay vì tự mày mò từng runtime? G-Company OS đi kèm hạ tầng và quy trình đã chạy thật, bắt đầu từ việc chọn đúng công cụ cho đúng việc. Xem bảng giá G-Company OS.
Câu hỏi thường gặp
Chưa có GPU thì vẫn chạy được model local không?
Được. Ollama và llama.cpp đều chạy được trên CPU, và llama.cpp được thiết kế từ đầu để chạy cả model F16 lẫn model quantized trên GPU lẫn CPU (README của dự án, truy cập 27/10/2026). Cái bạn đánh đổi là thông lượng và độ trễ. Chạy CPU hợp lý cho thử nghiệm và cho tác vụ chạy nền không vội, nhưng không hợp khi nhiều người gọi cùng lúc. vLLM thì thiên về môi trường Linux có GPU hơn, nên với máy không card đồ họa đó không phải lựa chọn đầu tiên.
Chuyển từ Ollama sang vLLM thì có phải viết lại phần lớn code không?
Về mặt địa chỉ thì không, vì cả hai đều mở endpoint tương thích OpenAI API và phần lớn ứng dụng chỉ đổi một dòng cấu hình. Về mặt hành vi thì có thể phải sửa. Ollama tự ghi là hỗ trợ một tập con của OpenAI API (docs.ollama.com, truy cập 27/10/2026), còn vLLM đi kèm những quy ước riêng như chat template của model và tùy chọn bật kiểm tra API key. Thời điểm an toàn để đổi là khi ứng dụng chỉ dùng vài endpoint phổ biến, không phụ thuộc tham số đặc thù.
Ollama đã dùng llama.cpp làm nền thì sao còn phải chọn?
Vì chúng trả lời hai câu hỏi khác nhau. llama.cpp là engine và máy chủ để bạn tự cấu hình từng tham số, từ kích thước context đến cách nạp model vào bộ nhớ. Ollama là sản phẩm hoàn chỉnh đặt trên phần engine đó, với kho model, lệnh dòng lệnh và các mặc định đã cân cho người dùng phổ thông. Giống chọn giữa việc tự lắp máy và mua máy đã dựng: cùng một lớp linh kiện, khác hẳn lượng công việc bạn nhận lấy.
Khi nào gọi API của nhà cung cấp bên ngoài vẫn hợp lý hơn?
Khi khối lượng gọi còn thấp, khi dữ liệu không nhạy cảm, hoặc khi bạn cần một model vừa ra mắt ngay trong tuần. Chạy local có chi phí cố định và có công việc vận hành đi kèm, nên nó chỉ đáng kể khi bạn dùng đủ nhiều hoặc khi việc giữ dữ liệu trong hệ thống là yêu cầu thật. Ranh giới giữa hai hướng đi này thuộc về bài so sánh model của cụm nội dung, bài này không lặp lại.
Nguồn tham khảo: toàn bộ liên kết dưới đây được kiểm tra vào 27/10/2026.
- Ollama Documentation — API Introduction, base URL và cổng local: docs.ollama.com/api/introduction
- Ollama Documentation — OpenAI compatibility, mức độ hỗ trợ tập con: docs.ollama.com/api/openai-compatibility
- Ollama Documentation — Context length theo VRAM và biến môi trường: docs.ollama.com/context-length
- Ollama Documentation — FAQ, lệnh cài và cách kiểm tra GPU: docs.ollama.com/faq
- Ollama Blog — compatibility GGUF qua llama.cpp và công bố người dùng: ollama.com/blog
- vLLM Documentation — trang chính, tính năng PagedAttention, continuous batching, quantization: docs.vllm.ai
- vLLM Documentation — Quickstart, yêu cầu Linux và Python, cổng mặc định: docs.vllm.ai/en/latest/getting_started/quickstart
- vLLM Documentation — Online Serving, danh sách endpoint tương thích: docs.vllm.ai/en/latest/serving/openai_compatible_server
- vLLM Blog — bài giới thiệu PagedAttention: blog.vllm.ai
- arXiv — paper vLLM, SOSP 2023: arxiv.org/abs/2309.06180
- Anyscale Blog — continuous batching và thông lượng: anyscale.com/blog
- llama.cpp — kho mã nguồn và tài liệu build: github.com/ggml-org/llama.cpp
- llama.cpp — README của máy chủ HTTP, endpoint và tham số: github.com/ggml-org/llama.cpp/tools/server
— James Marcus, Content Lead 5ac.vn, tháng 10/2026. Bài viết thuộc hệ thống nội dung G-Company OS, powered by Hermes Agent.