AI Automation

Hướng dẫn cài đặt Ollama trên VPS Ubuntu chạy LLM cục bộ

Mình vừa dựng lại một VPS để chạy Ollama sau lần đầu cài xong bị OOM ngay khi kéo model 8B. Bài này là quy trình mình dùng lại bây giờ: cài Ollama trên VPS Ubuntu 24.04, chạy dưới systemd, mở API đúng cách và chọn model vừa với RAM. Bạn làm theo hết trong khoảng 20-30 phút, kết quả là một endpoint LLM cục bộ gọi được từ máy khác qua API.

  • Ollama chạy ổn trên VPS từ 4GB RAM với model 1B-3B; từ 8GB mới thoải mái model 7B-8B ở mức Q4.
  • Mặc định Ollama bind vào 127.0.0.1:11434, muốn gọi từ ngoài phải sửa qua systemd và mở firewall.
  • Model càng lớn càng ăn RAM: quy tắc nhanh là 7B Q4 cần khoảng 5-6GB RAM khả dụng, 13B Q4 cần khoảng 9-10GB.

Yêu cầu trước khi bắt đầu

  • VPS Linux, bài này dùng Ubuntu 24.04 LTS (Debian 12 dùng cú pháp tương tự, chỉ khác bước repo).
  • User thường có quyền sudo, SSH vào được. Không nên chạy mọi thứ bằng root trực tiếp.
  • Tối thiểu 2 vCPU; CPU nhiều vCPU sẽ tăng tốc sinh token rõ rệt vì Ollama chạy trên CPU.
  • RAM: 2GB đủ cho model tiny (>=1B), 4-8GB cho 7B-8B, 16GB nếu muốn 13B-14B.
  • Dung lượng đĩa NVMe trống khoảng 10-20GB cho vài model. Model lưu ở /usr/share/ollama/.ollama/models theo mặc định.
  • Đã biết dùng systemctl, ss, curl. Nếu chưa quen thì đọc trước bài VPS cho người mới bắt đầu học Linux.

Vì sao nên tự host Ollama trên VPS

Ollama đóng gói sẵn runtime llama.cpp, model manager và một HTTP API, nên bạn không phải tự build. Cài lên VPS được lợi rõ: dữ liệu prompt không ra khỏi hạ tầng của bạn, không phụ thuộc rate limit của dịch vụ ngoài, và không tốn phí theo token.

Cái giá phải trả là bạn tự lo phần cứng. LLM chạy trên CPU chủ yếu ăn RAM và băng thông bộ nhớ, vCPU chỉ giúp rút ngắn thời gian sinh token. Vì vậy chọn VPS chạy LLM nên ưu tiên RAM và NVMe hơn là đếm nhân CPU. Nếu dự án cần orchestrate nhiều workflow quanh LLM, bạn có thể tách phần đó ra VPS chạy automation riêng thay vì nhồi hết một máy.

Một lưu ý về định vị: VPS Việt Nam phù hợp khi bạn cần dữ liệu, người dùng và hệ thống nội địa; còn gọi model từ nước ngoài về sẽ đi qua chặng transit quốc tế, độ trễ còn phụ thuộc cả đầu bên kia. Với Ollama, phần lớn thời gian chờ là model sinh token trên CPU, nên hạ tầng local vẫn đủ dùng cho hầu hết use case nội bộ.

Bước 1 - Chuẩn bị VPS và kiểm tra tài nguyên

Trước khi cài, xác nhận máy còn đủ RAM và đĩa. Bỏ qua bước này là lý do phổ biến nhất khiến Ollama bị kill giữa lúc kéo model.

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl ca-certificates
free -h
df -h /
nproc

free -h cho bạn số RAM trống thật. Cột available mới là con số quan trọng, không phải free. Nếu available dưới 3GB, đừng cố kéo model 8B. df -h / để chắc ổ còn trống cho model.

Kiểm tra kết quả mong đợi: nproc trả về số vCPU, dòng / trong df -h phải còn vài GB trở lên. Nếu ổ đầy, dọn trước bằng bài cách xử lý VPS bị full disk.

Bước 2 - Cài Ollama trên VPS Ubuntu

Ollama có script cài chính thức, tự nhận diện kiến trúc CPU và tạo sẵn systemd service. Đây là cách nhanh và ít lỗi nhất trên Ubuntu 24.04.

curl -fsSL https://ollama.com/install.sh | sh

Script sẽ tải binary, tạo user hệ thống ollama và bật service. Sau khi chạy xong, kiểm tra phiên bản và trạng thái service:

ollama --version
systemctl status ollama --no-pager

Kết quả mong đợi: lệnh đầu in ra số phiên bản Ollama, lệnh sau hiện active (running). Service lắng nghe mặc định ở cổng 11434 trên localhost. Kiểm tra nhanh:

ss -tlnp | grep 11434

Nếu bạn không muốn pipe script vào shell (nhiều sysadmin kỹ tính chuyện này), có thể tải binary thủ công từ trang release của Ollama rồi tự tạo unit file systemd. Cách đó dài hơn nhưng cho bạn kiểm soát từng bước. Với môi trường lab hoặc VPS nội bộ, script cài chính thức là lựa chọn hợp lý.

Một điểm hay gặp: VPS cấu hình thấp (dưới 4GB RAM) đôi khi cần thêm swap trước khi chạy model, xem cách bật swap trên VPS ít RAM để tránh bị kill khi model nạp vào bộ nhớ.

Bước 3 - Kéo model đầu tiên vừa với RAM

Chọn model theo RAM, đừng chọn theo độ "ngầu". Bảng dưới là cỡ mình đã thử và thấy ổn định trên các mức RAM khác nhau, dùng mức lượng tử hoá Q4 làm chuẩn.

RAM khả dụngModel gợi ýGhi chú
2GBllama3.2:1b, qwen2.5:0.5bChạy được, chất lượng hạn chế
4GBllama3.2:3b, gemma2:2bĐiểm cân bằng cho VPS nhỏ
8GBllama3.1:8b, qwen2.5:7bCần ~5-6GB RAM lúc chạy
16GBqwen2.5:14b, phi3:mediumThời gian sinh token lâu hơn nếu CPU yếu
ollama pull llama3.2:3b
ollama list

ollama pull tải model về đĩa và cache lại, các lần sau không tải lại. ollama list xác nhận model đã nằm trong máy. Chạy thử một câu để chắc model load được:

ollama run llama3.2:3b "Giải thích ngắn gọn VPS là gì"

Kết quả mong đợi: model nạp mất vài giây rồi trả lời. Nếu bị treo hoặc process chết giữa chừng, xem dmesg | grep -i oom để biết có bị kernel kill vì hết RAM không. Gặp OOM thì quay lại chọn model nhỏ hơn, đừng cố nới swap quá tay vì swap sẽ kéo tốc độ xuống rất mạnh.

Bước 4 - Chạy Ollama dưới systemd và bật khởi động cùng máy

Script cài đã tạo sẵn service. Bạn chỉ cần đảm bảo nó tự chạy khi VPS reboot và có giới hạn RAM nếu máy nhỏ.

sudo systemctl enable ollama
sudo systemctl start ollama

Muốn tùy chỉnh, dùng lệnh systemctl edit ollama để thêm biến môi trường thay vì sửa thẳng file gốc (sẽ bị ghi đè khi nâng cấp). Ví dụ giữ model trong RAM lâu hơn và chặn nạp nhiều model song song:

sudo systemctl edit ollama

Trong editor mở ra, thêm:

[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_MAX_LOADED_MODELS=1"
Environment="OLLAMA_NUM_PARALLEL=1"

OLLAMA_KEEP_ALIVE=30m giữ model trong RAM 30 phút sau request cuối, đổi lấy việc tốn RAM thường trực. Với VPS nhỏ mình để OLLAMA_MAX_LOADED_MODELS=1 để tránh 2 model cùng nạp và OOM. Sau khi thêm, nạp lại cấu hình:

sudo systemctl daemon-reload
sudo systemctl restart ollama
systemctl show ollama -p Environment

Kết quả mong đợi: dòng Environment hiện đúng các biến bạn vừa set. Nếu service không lên lại, xem log bằng journalctl -u ollama -n 50 --no-pager.

Bước 5 - Mở API Ollama cho máy khác gọi

Mặc định Ollama chỉ nghe trên localhost, đây là lựa chọn an toàn. Muốn gọi từ máy khác hoặc từ một app khác trên cùng VPS, bạn cần đổi địa chỉ bind và mở firewall, nhưng đừng mở thẳng ra Internet.

sudo systemctl edit ollama

Thêm dòng cấu hình host:

[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"

Nếu bắt buộc phải nghe trên mọi interface (ví dụ sau reverse proxy), dùng 0.0.0.0:11434 nhưng phải chặn ở firewall. Cách mình ưu tiên: để Ollama sau Nginx làm reverse proxy, thêm SSL, rồi giới hạn truy cập. Bạn có thể dựng nginx theo bài cài đặt Nginx làm reverse proxy và gắn chứng chỉ qua bài cách gắn chứng chỉ SSL vào Nginx.

Kiểm tra API từ chính máy chủ:

curl http://127.0.0.1:11434/api/tags
curl http://127.0.0.1:11434/api/generate -d '{"model":"llama3.2:3b","prompt":"Xin chào","stream":false}'

Kết quả mong đợi: lệnh đầu trả JSON danh sách model, lệnh sau trả JSON có trường response. Nếu mở ra ngoài, chỉ allow IP cụ thể ở firewall, đừng để cổng 11434 mở công khai cho cả Internet. Xem thêm cách siết dịch vụ trong 10 cách tăng cường bảo mật VPS Linux.

Bước 6 - Tối ưu để chạy LLM cục bộ ổn định

Sau khi chạy được, vài tinh chỉnh dưới đây giúp Ollama bớt chết giữa chừng và trả lời nhanh hơn trên cùng phần cứng.

  • Giới hạn số model nạp song song: đặt OLLAMA_MAX_LOADED_MODELS=1 trên VPS RAM nhỏ, vì mỗi model nạp là một cục RAM riêng.
  • Chỉnh context: model mặc định có thể dùng context lớn ăn thêm RAM. Nếu thấy RAM căng, hạ context qua tham số khi gọi API thay vì để mặc định.
  • Theo dõi RAM thật khi chạy: dùng free -h hoặc htop trong lúc gọi model để biết mức đỉnh là bao nhiêu.
  • Để model trên NVMe: lần nạp đầu đọc model từ đĩa, ổ NVMe rút ngắn thời gian khởi động model rõ rệt.
htop
docker stats 2>/dev/null || echo "khong dung docker"
free -h

Nếu định chạy thêm app quanh LLM (web UI, workflow, chatbot), cân nhắc tách tải. Một VPS riêng cho LLM và một VPS riêng cho automation sẽ dễ debug hơn là nhồi cả hai lên một máy 4GB. Với các dự án cần chạy lâu dài, chọn VPS Linux có NVMe và nhiều RAM sẽ tránh được cảnh OOM lặp lại.

Xử lý lỗi thường gặp

Ba lỗi mình gặp nhiều nhất khi cài Ollama trên VPS và cách chẩn đoán.

1. Model bị kill giữa chừng (OOM). Triệu chứng là ollama run dừng đột ngột. Kiểm tra:

dmesg | grep -i "killed process"
journalctl -u ollama -n 50 --no-pager

Cách xử lý: chọn model nhỏ hơn, giảm context, hoặc nâng RAM. Đừng cố tăng swap vô hạn vì model sẽ chạy cực chậm.

2. Service không khởi động sau khi sửa cấu hình. Thường do sai cú pháp trong file systemctl edit. Kiểm tra bằng:

sudo systemctl status ollama --no-pager
journalctl -xe | tail -n 30

Sửa lại file, rồi sudo systemctl daemon-reload && sudo systemctl restart ollama.

3. Không gọi được API từ máy khác. Kiểm tra theo thứ tự: ss -tlnp | grep 11434 xem đang bind vào đâu, sau đó kiểm firewall (ufw hoặc nftables) và chắc chắn bạn không bind nhầm chỉ 127.0.0.1 khi cần nghe ngoài.

Câu hỏi thường gặp

VPS Ubuntu cần bao nhiêu RAM để chạy Ollama?

Tối thiểu khoảng 2GB cho model 1B, 4-8GB cho model 7B-8B ở mức Q4, và 16GB nếu muốn chạy model 13B-14B. RAM là yếu tố quyết định vì LLM chạy trên CPU ăn bộ nhớ rất mạnh khi model nạp vào.

Ollama chạy được trên VPS không có GPU không?

Được. Ollama tự chạy trên CPU khi không có GPU. Tốc độ sinh token sẽ chậm hơn máy có GPU rời, nhưng với model 3B-8B trên VPS nhiều vCPU vẫn dùng được cho chatbot nội bộ hoặc xử lý batch.

Cổng mặc định của Ollama là gì và có nên mở ra Internet?

Mặc định là 11434 và chỉ nghe trên 127.0.0.1. Không nên mở thẳng cổng này ra Internet. Nếu cần truy cập từ ngoài, hãy đặt sau reverse proxy có SSL và giới hạn IP ở firewall.

Model của Ollama lưu ở đâu trên VPS?

Theo mặc định, model nằm ở /usr/share/ollama/.ollama/models. Bạn có thể đổi vị trí bằng biến môi trường trong file systemctl edit ollama nếu muốn để model trên ổ dữ liệu riêng.

Có nên chạy Ollama bằng Docker không?

Được, nhưng với VPS cấu hình thấp thì cài trực tiếp qua script chính thức gọn hơn và ít lớp overhead. Docker hợp lý khi bạn cần cô lập hoặc triển khai đồng loạt nhiều máy, tham khảo cách cài Docker trên VPS Ubuntu.

Làm sao biết Ollama đang chạy đúng?

Chạy systemctl status ollama thấy active (running), và curl http://127.0.0.1:11434/api/tags trả về JSON danh sách model. Đó là hai dấu hiệu đủ để xác nhận endpoint hoạt động.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.