SSD Nodes Learn 🎉 VPS từ $4.99/tháng
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-07

Ollama hay llama.cpp trên VPS: nên chạy cái nào?

So sánh Ollama và llama.cpp trên VPS CPU-only: lỗi RAM khi chọn quantisation, mức memory theo context size và khi cả hai đều không phù hợp.

Ollama và llama.cpp: bạn muốn vận hành ở lớp nào?

Ollama và llama.cpp không phải là các đối thủ cạnh tranh theo cách câu hỏi này ngụ ý. llama.cpp là inference engine: nó tải model file và chuyển prompt thành token. Ollama là model manager, background daemon và HTTP API chạy trên inference engine đó. README của Ollama vẫn liệt kê llama.cpp là inference backend (được kiểm tra ngày 2 August 2026). Vì vậy, câu hỏi thực tế là bạn muốn vận hành lớp nào trên VPS, không phải lớp nào nhanh hơn.

Chạy Ollama khi bạn muốn một service tự tải model theo tên và tiếp tục hoạt động mà không cần theo dõi thường xuyên. Chạy trực tiếp llama.cpp khi máy có cấu hình nhỏ và bạn cần chọn chính xác model file, context size và thread count, vì trên VPS nhỏ, mỗi thiết lập này đều tiêu tốn lượng memory mà bạn không có.

Bản chất của từng project

llama.cpp là implementation bằng C và C++ để chạy inference cho transformer, được xây dựng trên thư viện ggml. Nó đọc các file GGUF. GGUF (GGML universal file format) là container một file chứa weights, tokeniser và metadata mà engine cần để chạy model. Project cung cấp các binary riêng cho từng tác vụ. llama-server là HTTP server, llama-cli là interactive prompt, còn llama-bench dùng để đo throughput. Các bản release được gắn tag theo build number thay vì semantic version. Tag hiện tại là b10224, được phát hành vào ngày 2 tháng 8 năm 2026, và thường có tag mới vào hầu hết các ngày làm việc.

Ollama là một chương trình Go. Một background daemon được khởi động bằng ollama serve, tải model và xử lý các HTTP request; một command line client giao tiếp với daemon đó. Phía sau cả hai là registry tại ollama.com, nơi lưu các model đã được đóng gói sẵn. Ollama dùng semantic version, và v0.32.5 được phát hành vào ngày 27 tháng 7 năm 2026. ollama pull tải một GGUF cùng prompt template và một bộ parameter mặc định, sau đó lưu model vào /usr/share/ollama/.ollama/models trên Linux.

Cách đóng gói đó tạo ra toàn bộ khác biệt. Ollama tự quyết định quantisation, template và context length cho bạn, đồng thời cung cấp một tên duy nhất để ghi nhớ. llama.cpp không tự quyết định gì và cung cấp cho bạn các flag.

Trục 1: kiểm soát model và quantisation

Quantisation giảm mỗi weight từ 16 hoặc 32 bit xuống 4, 5 hoặc 8 bit. Đây là lý do model có 8 tỷ parameter có thể chạy trong RAM của một VPS thông thường. Cách đặt tên GGUF dễ đọc khi bạn biết quy luật: Q4_K_M nghĩa là K-quant 4-bit, kích thước trung bình. Số cao hơn giữ lại độ chính xác cao hơn và tốn nhiều memory hơn.

ChartMeta-Llama-3.1-8B-Instruct GGUF file size by quantisation (GiB)
The data behind this chart
[
  {
    "label": "Q2_K",
    "file_size_gib": 2.96
  },
  {
    "label": "Q3_K_M",
    "file_size_gib": 3.74
  },
  {
    "label": "Q4_K_M",
    "file_size_gib": 4.58
  },
  {
    "label": "Q5_K_M",
    "file_size_gib": 5.34
  },
  {
    "label": "Q6_K",
    "file_size_gib": 6.14
  },
  {
    "label": "Q8_0",
    "file_size_gib": 7.95
  }
]

Đó là kích thước file được công bố trong repository bartowski/Meta-Llama-3.1-8B-Instruct-GGUF trên Hugging Face, được đọc vào ngày 2 August 2026 và chuyển đổi từ byte sang GiB. Có 6 bản build của cùng một model, bản nhỏ nhất là 2.96 GiB còn bản lớn nhất là 7.95 GiB. Mặc định phổ biến Q4_K_M có kích thước 4.58 GiB. Trên VPS 4 GiB, lựa chọn này quyết định model có load được hay không.

Với llama.cpp, bạn chỉ định tên file, nên tự chọn dòng đó.

llama-server -m ~/models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf \
  -c 4096 -t 4 --host 127.0.0.1 --port 8080

-c là context size tính theo token, -t là số thread, còn -ngl đặt số layer được chuyển sang GPU (0 trên máy chỉ có CPU). Không có giá trị nào được tự động đoán.

Với Ollama, quantisation đi kèm tag bạn pull, còn ollama ls cho biết chính xác những gì đang có trên disk. Khi registry không có bản build bạn cần, hãy tự import GGUF. Tạo một Modelfile:

FROM ./Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf
PARAMETER num_ctx 4096

Sau đó build và kiểm tra kết quả:

ollama create llama31-q4 -f ./Modelfile
ollama ls

Context length là thiết lập dễ gây lỗi nhất. Ollama chọn giá trị mặc định dựa trên VRAM khả dụng, còn máy không có GPU sẽ rơi vào bucket nhỏ nhất: 4096 token. Nếu gửi cho nó một tài liệu 20,000 token, các token vượt quá giới hạn sẽ bị loại bỏ trước khi model nhìn thấy chúng. Vì vậy câu trả lời có thể rất chắc chắn nhưng sai về một file mà model chỉ đọc được một phần. Tăng giá trị này bằng OLLAMA_CONTEXT_LENGTH trên daemon hoặc bằng PARAMETER num_ctx trong Modelfile. llama.cpp cũng không có giá trị mặc định đủ đáng tin cậy. Hãy đặt -c một cách rõ ràng và xác nhận giá trị bạn đã đặt.

Phép tính bộ nhớ mà tài liệu thường không nêu

File model không phải là toàn bộ chi phí. KV cache (key/value cache) lưu một entry cho mỗi layer và mỗi token trong context. Cache này tăng khi cuộc trò chuyện dài hơn.

Hãy tính với Llama 3.1 8B. Model có 32 layer, 8 key/value head và head dimension là 128. Mỗi token lưu cả key và value, mỗi giá trị chiếm 2 byte trong f16, nên 2 x 8 x 128 x 2 = 4096 byte cho mỗi layer. Với 32 layer, con số này là 128 KiB cho mỗi token. Context 4096 token cần 512 MiB, còn context 32,768 token cần 4 GiB.

Vì vậy, model Q4_K_M 8B với context 4k cần khoảng 4.58 GiB cho weights, cộng thêm khoảng 0.5 GiB cho cache và phần runtime. Nó không vừa trong 4 GiB RAM. Với 8 GiB RAM, model chạy được và vẫn còn dư bộ nhớ. Nếu tăng context lên 32k trên cùng máy 8 GiB, cache sẽ chiếm hết phần bộ nhớ còn dư. Dùng free -h để theo dõi trực tiếp khi model đang được load. Không nên tin một ước tính chưa được đo thực tế.

Ollama còn làm mức tiêu thụ tăng thêm. OLLAMA_NUM_PARALLEL mặc định là 1. Bộ nhớ model cần sẽ tăng theo tích của giá trị này và độ dài context. Nếu tăng cả hai cùng lúc, daemon có thể âm thầm yêu cầu lượng RAM lớn gấp nhiều lần dự kiến.

Trục 2: daemon bạn phải vận hành

Script cài đặt Ollama ghi một systemd unit, tạo một system user ollama và enable service. Bạn có cơ chế quản lý vòng đời mà không phải tự viết. Cấu hình được thực hiện qua systemd:

sudo systemctl edit ollama
[Service]
Environment="OLLAMA_CONTEXT_LENGTH=8192"
Environment="OLLAMA_KEEP_ALIVE=30m"
sudo systemctl daemon-reload
sudo systemctl restart ollama
journalctl -e -u ollama

OLLAMA_KEEP_ALIVE quan trọng hơn trên CPU VPS so với các môi trường khác. Theo mặc định, model được giữ trong memory trong 5 phút rồi bị unload. Request tiếp theo phải đọc lại toàn bộ file từ disk trước khi trả lời, nên việc reload 4.58 GiB có thể biến phản hồi 2 giây thành 30 giây trên storage chậm. keep-alive dài sẽ loại bỏ độ trễ này nhưng chiếm RAM liên tục. Cả hai đều có chi phí thực tế. Hãy chọn phương án ít gây ảnh hưởng hơn.

llama.cpp không cung cấp daemon, nên bạn phải tự viết unit dưới dạng /etc/systemd/system/llama-server.service:

[Unit]
Description=llama.cpp server
After=network-online.target

[Service]
ExecStart=/usr/local/bin/llama-server -m /srv/models/model-Q4_K_M.gguf -c 4096 -t 4 --host 127.0.0.1 --port 8080
Restart=always
RestartSec=3
User=llama

[Install]
WantedBy=multi-user.target

Enable unit bằng sudo systemctl enable --now llama-server. Sau đó, process giữ model trong suốt vòng đời của nó. Model không bị unload khi idle, nên sẽ không có bất ngờ do reload và bạn không thể thu hồi memory nếu không stop service. Nếu bạn chưa quen viết unit, đây là cùng một mẫu với chạy service do bạn tự quản lý bằng systemd trên VPS.

Trục 3: API mà app của bạn sẽ gọi

Trục này đã thu hẹp đáng kể. Hiện cả hai project đều sử dụng định dạng OpenAI chat, nên hầu hết client library đều hoạt động với một trong hai project chỉ sau khi đổi base URL.

Ollama lắng nghe trên 127.0.0.1:11434. Route tương thích với OpenAI là http://localhost:11434/v1/chat/completions, đồng thời Ollama vẫn cung cấp native API tại /api/chat. Ollama cũng có tài liệu về route tương thích với Anthropic.

curl -X POST http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "llama31-q4", "messages": [{"role": "user", "content": "Say this is a test"}]}'

llama-server lắng nghe trên 127.0.0.1:8080 và cung cấp /v1/chat/completions, /v1/completions/v1/embeddings, cùng với endpoint riêng /completion và web UI tích hợp sẵn. Nó cũng cung cấp các route vận hành mà Ollama không có: /health để probe kiểm tra readiness, /props để xem thiết lập của model đã load, /slots để xem mỗi request slot đang xử lý gì, và /metrics ở định dạng Prometheus. Nếu bạn định monitor service này, khác biệt đó có thể là yếu tố quyết định.

Không server nào tự bật authentication cho bạn. Cả hai mặc định chỉ bind vào loopback vì lý do an toàn. Hãy truy cập chúng qua SSH tunnel hoặc phía sau reverse proxy, và không bao giờ mở cổng 11434 hoặc 8080 ra Internet.

CPU-only VPS có thể làm được gì trong thực tế

CPU-only VPS chạy được các model nhỏ, nhưng chậm. Đó là tóm tắt thực tế. Điều quan trọng là biết giới hạn nằm ở đâu. Hãy đo trước khi thiết kế hệ thống dựa trên nó:

llama-bench -m ~/models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -p 512 -n 128

Cột pp là tốc độ xử lý prompt, còn cột tg là tốc độ sinh token; cả hai đều tính bằng token mỗi giây. Trên gói dùng chung vCPU, model 8B ở Q4_K_M thường chỉ đạt vài token mỗi giây ở tg. Phần xử lý prompt mới là điểm gây chậm: toàn bộ prompt phải được xử lý trước khi token đầu tiên xuất hiện, nên system prompt dài sẽ thêm thời gian chờ vào từng request.

CPU có thể đáp ứng: model từ 1B đến 4B dùng cho phân loại, trích xuất, tóm tắt ngắn hoặc định tuyến. Phản hồi xuất hiện trong vài giây và bộ nhớ vẫn phù hợp với gói thông thường. CPU không đáp ứng được: chat tương tác ở tốc độ đọc, coding assistant, xử lý tài liệu dài hoặc mọi tác vụ có agent loop thực hiện nhiều call liên tiếp. Một loop thực hiện mười hai call, mỗi call mất bốn giây, sẽ mất một phút trước khi tạo ra kết quả.

Có hai hướng xử lý khi các con số không đáp ứng yêu cầu. Nếu vấn đề là concurrency, tức nhiều người dùng cùng truy cập một model, cần thay đổi engine; phần so sánh Ollama và vLLM khi phục vụ đồng thời trình bày vấn đề này. Nếu vấn đề là tốc độ thuần túy, câu trả lời là VPS có gắn GPU, nơi -ngl bắt đầu có ý nghĩa. Trước cả hai hướng này, hãy lấy baseline cho chính phần cứng, vì băng thông disk và memory ảnh hưởng đến thời gian load không kém CPU. Benchmark VPS có thể lặp lại đáng để dành một giờ thực hiện.

Cài đặt llama.cpp và ghim vào một bản build

Cả hai dự án đều cập nhật hằng tuần, vì vậy hãy ghi lại phiên bản bạn đã triển khai. One-liner của upstream sẽ cài đặt bản build hiện tại:

curl -LsSf https://llama.app/install.sh | sh
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUF

Để ghim vào một bản build cụ thể, hãy lấy tarball đã build sẵn từ trang releases. Build b10224 là tag hiện tại tính đến ngày 2 tháng 8 năm 2026:

curl -LO https://github.com/ggml-org/llama.cpp/releases/download/b10224/llama-b10224-bin-ubuntu-x64.tar.gz
tar xf llama-b10224-bin-ubuntu-x64.tar.gz
find . -type f -name 'llama-server'

Hoặc build chính tag đó từ source:

sudo apt update && sudo apt install -y build-essential cmake git libssl-dev
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
git checkout b10224
cmake -B build
cmake --build build --config Release -j $(nproc)

libssl-dev là dependency được tài liệu hướng dẫn chỉ định cho các tính năng HTTPS. Quá trình biên dịch mất vài phút và cần nhiều RAM hơn các plan nhỏ nhất, vì vậy hãy build trên một máy lớn hơn rồi copy các binary nếu máy nhỏ không đủ tài nguyên.

Cài đặt Ollama và cố định phiên bản

curl -fsSL https://ollama.com/install.sh | OLLAMA_VERSION=0.32.5 sh
ollama -v

Script đọc OLLAMA_VERSION, vì vậy bạn có thể giữ một bản release đã biết là ổn định thay vì cài bất kỳ bản nào vừa được phát hành sáng nay. v0.32.5 được phát hành vào ngày 27 July 2026. Nếu không muốn pipe script vào shell, bạn có thể dùng cách cài đặt thủ công:

sudo rm -rf /usr/lib/ollama
curl -fsSL https://ollama.com/download/ollama-linux-amd64.tar.zst | sudo tar x -C /usr
ollama -v

Cách cài thủ công không tạo systemd unit hoặc service user, nên bạn phải tự tạo các thành phần này. Hướng dẫn đầy đủ về Ollama trên VPS trình bày từng bước cấu hình service đó.

Các tình huống lỗi và chuỗi bạn sẽ thấy

Ollama từ chối tải model. ollama run trả về một dòng có dạng sau:

Error: model requires more system memory (5.6 GiB) than is available (3.2 GiB)

Ollama kiểm tra dung lượng trước khi tải, nên lỗi xảy ra ngay và nêu rõ nguyên nhân. Chuyển xuống một hàng quantisation, giảm context length hoặc chọn model nhỏ hơn.

llama.cpp không lỗi mà chạy rất chậm. Theo mặc định, llama.cpp memory-map GGUF, nên file lớn hơn RAM vẫn có thể bắt đầu chạy. Sau đó kernel phải liên tục đọc weights từ disk vào RAM rồi đẩy ra ở mỗi token. Tốc độ sinh giảm xuống còn vài giây cho mỗi token và disk luôn ở mức 100 phần trăm. Truyền --no-mmap để buộc cấp phát bộ nhớ thực, nhờ đó lệnh lỗi ngay thay vì chạy chậm dần. Khi kernel can thiệp, dmesg hiển thị nguyên nhân:

Out of memory: Killed process 1234 (llama-server)

File model hoàn toàn không tải được. GGUF được build cho model family mới hơn engine của bạn sẽ trả về lỗi có tên architecture mà engine không nhận biết:

error loading model architecture: unknown model architecture: 'qwen3next'

Cách khắc phục là nâng cấp engine, không phải đổi file. Đây là cái giá của việc pin phiên bản, và cũng là lý do bạn phải ghi lại build number. Bạn cần biết mình đang nâng cấp từ phiên bản nào.

API trả lời khi gọi cục bộ nhưng app của bạn không gọi được. Ollama bind vào 127.0.0.1:11434, nên host khác sẽ nhận lỗi connection refused. Chỉ đặt OLLAMA_HOST=0.0.0.0:11434 qua systemctl edit ollama khi cổng nằm sau firewall hoặc trên private network, vì API không có authentication ở phía trước.

Reply đầu tiên sau một khoảng tạm dừng rất chậm. Cơ chế unload khi idle trong 5 phút đã xảy ra và model đang được đọc lại từ disk. Lệnh ollama ps chạy ngay trước request không hiển thị model nào đang được load, xác nhận điều này. Tăng OLLAMA_KEEP_ALIVE.

Vậy nên chạy cái nào?

Chạy Ollama khi bạn muốn hệ thống tự quản lý model và cung cấp endpoint theo chuẩn OpenAI mà không cần cấu hình thêm. Đây là lựa chọn mặc định phù hợp cho lần triển khai đầu tiên và cho mọi trường hợp bạn còn thường xuyên thay đổi model.

Chạy trực tiếp llama.cpp khi bộ nhớ hạn chế đến mức bạn cần tự chọn dòng quantisation, khi muốn dùng /health, /slots/metrics để monitoring, hoặc khi cần một flag mà Ollama không cung cấp. Đây là lựa chọn phù hợp trên VPS vừa đủ chỗ cho model, vì các thiết lập giúp model vừa bộ nhớ chính là những thiết lập Ollama tự chọn thay bạn.

Chạy cả hai là bình thường. Dùng Ollama cho thử nghiệm, còn dùng llama.cpp cho model duy nhất bạn đưa vào production và không muốn model đó tự thay đổi.

FAQ

Ollama có chỉ là wrapper quanh llama.cpp không?

Gần đúng, nhưng wrapper này thực hiện nhiều việc. README của Ollama liệt kê llama.cpp là backend inference của nó (được kiểm tra ngày 2 August 2026). Trên nền đó, Ollama bổ sung model registry, prompt template để chuyển các tin nhắn chat thành prompt, một bộ sampling parameter mặc định, daemon tự unload model khi idle và HTTP API. Khi so sánh số token mỗi giây với cùng các thiết lập, bạn đang so sánh cùng một engine với chính nó. Lựa chọn thực tế của bạn là management layer.

Thành phần nào nhanh hơn trên VPS chỉ dùng CPU?

Hai bên dùng chung engine, nên với cùng model file, quantisation, context size và thread count, kết quả thường rất gần nhau. Những khác biệt được báo cáo thường đến từ các giá trị mặc định khác nhau, phổ biến nhất là context length và thread count, chứ không phải từ engine. Hãy đo bằng llama-bench -m <file> -p 512 -n 128 và so sánh cột tg trên chính máy của bạn trước khi tin bất kỳ số liệu nào được công bố.

Tôi có thể dùng file GGUF của mình với Ollama không?

Có. Đặt file trên server, tạo một Modelfile có dòng đầu tiên là FROM ./your-model.gguf, thêm các dòng PARAMETER cần thiết như num_ctx, rồi chạy ollama create your-name -f ./Modelfile. ollama ls sẽ liệt kê model đó cùng với mọi model bạn đã pull từ registry. Đây là cách dùng một quantisation không có trong registry.

Tôi cần bao nhiêu RAM cho model 8B?

Hãy tính dung lượng file, cộng với KV cache và runtime. Bản build Q4_K_M của Llama 3.1 8B chiếm khoảng 4.58 GiB trên disk, còn context 4096 token thêm khoảng 512 MiB cache. Vì vậy, 8 GiB RAM là đủ thoải mái, còn 4 GiB thì không đủ. Cache tăng theo context: cùng model đó với context 32,768 token cần riêng khoảng 4 GiB cache. Với Ollama, hãy nhớ rằng yêu cầu này cũng tăng theo OLLAMA_NUM_PARALLEL.