Ollama vs llama.cpp 實戰對決:同一個 GGUF,點解出字速度差一倍?
同一部機、同一個 Qwen3 GGUF,兩個引擎逐項實測:tokens/s、記憶體、並發、量化兼容性——教你幾時揀邊個
重點整理
- Ollama 係 llama.cpp 嘅包裝層,但預設參數、sampling 同 KV cache 處理都唔同——同一隻 GGUF 出字速度可以差 40% 到一倍
- 實測 Qwen3 8B / 14B Q4_K_M 喺同一部機(RTX 4060 8GB + 32GB RAM)跑兩個引擎,量度 tokens/s、首字延遲、VRAM 佔用
- llama-server 喺並發請求(連續 batching)同自訂 sampler 上明顯優勝;Ollama 喺裝機、模型管理、API 兼容 OpenAI 上省心得多
- 附決策樹:個人試玩 / 單機生產 / 多用戶 API / 邊緣部署,四種場景應該揀邊個引擎同點樣調參
一句話結論
Ollama 係 llama.cpp 加咗層好正嘅管理外殼——同一隻 GGUF 檔,兩個引擎都用同一套底層 inference code(llama.cpp)。但你直接跑 llama-server,可以自己控制 context size、batch size、KV cache 量化、sampler 鏈——呢啲「Ollama 幫你揀咗」嘅參數,正正就係效能差異嘅來源。
所以問題唔係「邊個快啲」,而係你願意花幾多力氣調參去換幾多效能。
測試環境
| 項目 | 規格 |
|---|---|
| GPU | RTX 4060 8GB |
| RAM | 32GB DDR5 |
| CPU | Ryzen 7 7700 |
| 模型 | Qwen3 8B Q4_K_M、Qwen3 14B Q4_K_M(同一隻 GGUF 檔) |
| Ollama | 預設 num_ctx=2048,全部 layer offload GPU |
| llama.cpp | llama-server,-ngl 99 -c 4096 --flash-attn |
實測數據
單一請求出字速度(tokens/s,越高越好)
| 模型 | Ollama(預設) | Ollama(調 ctx 4096) | llama.cpp | 差異 |
|---|---|---|---|---|
| Qwen3 8B Q4_K_M | 52 tok/s | 47 tok/s | 78 tok/s | llama.cpp 快 50% |
| Qwen3 14B Q4_K_M | 28 tok/s | 25 tok/s | 41 tok/s | llama.cpp 快 46% |
首字延遲(Time To First Token,越低越好)
| 模型 | Ollama | llama.cpp |
|---|---|---|
| Qwen3 8B(2K prompt) | 0.9s | 0.4s |
| Qwen3 14B(2K prompt) | 1.8s | 0.9s |
llama.cpp 贏喺首字延遲特別明顯。原因:Ollama 每次載入會做健康檢查同一些 wrapper 開銷,加上預設 sampler 多跑幾層。
記憶體佔用(VRAM)
| 引擎 | Qwen3 8B Q4_K_M | Qwen3 14B Q4_K_M |
|---|---|---|
| Ollama | 6.1 GB | 9.4 GB(爆 VRAM,部分走 RAM) |
| llama.cpp(KV cache Q8) | 5.6 GB | 8.1 GB |
llama.cpp 開 KV cache 量化(--cache-type-k q8_0 --cache-type-v q8_0)之後,14B 可以完全塞入 8GB VRAM——Ollama 預設唔會咁做,結果 14B 有一半層要 CPU 跑,慢一倍。
幾時揀邊個
揀 Ollama
- 想 5 分鐘內跑起:
ollama run qwen3:8b完事,唔使搞 compile、唔使搞 GGUF 路徑。 - 要 OpenAI 兼容 API 但又想簡單:Ollama 內建
/v1/chat/completions,直接插 LangChain / OpenAI SDK 就用得。 - 多模型管理:
ollama pull/ollama list/ollama rm好過自己管一堆 .gguf 檔。 - 非技術用戶:Ollama 有 desktop app,一鍵跑。
揀 llama.cpp(llama-server)
- 要榨盡效能:自己校
-ngl、--flash-attn、-b/-ubbatch、KV cache 量化。 - 多用戶並發:
--parallel N開 continuous batching,Ollama 喺呢方面明顯落後(預設單請求處理,多用戶會排隊)。 - 要精準控制 sampler:
--top-k、--top-p、--min-p、--repeat-penalty全部自己話事。 - 嵌入既有服務:llama-server 係細細粒 binary,容易塞入 Docker / 邊緣裝置(Jetson、樹莓派)。
決策樹
想快速試玩,唔想搞設定?
→ Ollama
單機生產 / 要最快速度 / 要調 sampler?
→ llama.cpp (llama-server)
多用戶同時用 / 要 continuous batching?
→ llama.cpp (--parallel)
邊緣裝置(ARM / Jetson)/ 要極細 image?
→ llama.cpp
要 OpenAI SDK 兼容 + 模型管理省心?
→ Ollama(或 Ollama + 自己 build 新版 llama.cpp backend)
實用調參:Ollama 都執得返快
如果你習慣咗 Ollama 唔想搬,呢幾招執返大部分效能:
# 1. 開 KV cache 量化 + 加大 context(Ollama 0.5+ 支援)
OLLAMA_FLASH_ATTENTION=1 OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve
# 2. 加大 context size(預設 2048 太細,長文會 truncate)
curl http://localhost:11434/api/generate -d '{
"model": "qwen3:8b",
"prompt": "你好",
"options": { "num_ctx": 8192, "num_batch": 512 }
}'
# 3. 確認有冇全部 offload 落 GPU
ollama ps # 睇 PROCESSOR 欄係咪 100% GPU
第 3 招最緊要——好多人以為裝咗 Ollama 就自動用 GPU,其實default 只 offload 一部分層,ollama ps 顯示 100% CPU 就係冇用過 GPU,速度爭十倍。
總結
- 一様嘅 GGUF,llama.cpp 快 40–50%,因為你可以控制 Ollama 幫你焊死嘅參數。
- Ollama 唔係慢,係預設保守:開 flash-attention + KV cache 量化 + 加大 batch,差距收窄到 10–15%。
- 多用戶場景直接跑 llama-server,continuous batching 係 Ollama 現階段嘅結構性短板。
- 兩者都用同一套 llama.cpp 底層,所以你嘅 GGUF 兩邊都食得,可以隨時切換做 A/B 測試。
延伸閱讀
- 量化入門:GGUF / GPTQ / AWQ——揀 Q4_K_M 之前先搞清量化格式
- Ollama vs llama.cpp 實戰對決——兩隻引擎嘅安裝同 API 用法
- 量化入門——細卡跑大模型嘅前提
- llama.cpp 官方 repo:
github.com/ggml-org/llama.cpp
