Hướng dẫn chạy LLM Local với Ollama: Tự host AI không tốn 1 đồng API

Hướng dẫn chạy LLM Local với Ollama: Tự host AI không tốn 1 đồng API

Tại sao mình chuyển sang chạy LLM local?

Hồi trước mình toàn dùng OpenAI API cho các script automation — parse log, viết code nhỏ, tóm tắt tài liệu nội bộ. Đến một ngày nhận hóa đơn $47 cho 1 tuần dùng thử, mình quyết định tìm hướng khác.

Vấn đề không chỉ là tiền. Công ty có quy định không được gửi code nội bộ lên server bên ngoài. Mỗi lần dùng ChatGPT hay Gemini để debug là phải “sanitize” data trước — mất công hơn là làm tay.

Ollama giải quyết cả hai vấn đề đó. Chạy hoàn toàn local, không cần internet, không lo GDPR hay data leak. Và miễn phí hoàn toàn sau khi cài xong.

Cài đặt Ollama

Linux (Ubuntu/Debian)

Một lệnh duy nhất, Ollama tự lo phần còn lại:

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

Script tự detect GPU (NVIDIA/AMD), cài CUDA driver nếu cần, rồi tạo systemd service. Xong xuôi, kiểm tra service chạy chưa:

systemctl status ollama
# Nếu chưa start:
sudo systemctl start ollama
sudo systemctl enable ollama

macOS

Tải file .dmg từ trang chủ hoặc dùng Homebrew:

brew install ollama
ollama serve  # Chạy thủ công, hoặc nó tự chạy như menu bar app

Windows

Tải installer .exe từ trang chủ. Ollama sẽ chạy dưới dạng system tray app và expose API tại localhost:11434.

Chọn model phù hợp — đây mới là phần quan trọng

Mình thấy nhiều người cài xong là pull ngay llama3 8B rồi thắc mắc tại sao máy chậm. Chọn model sai thì dù cài đúng cũng vô nghĩa.

Công thức chọn model theo RAM

  • 8GB RAM: Dùng model 7B với quantization Q4 (khoảng 4-5GB VRAM/RAM). Ví dụ: llama3.2:3b, phi3:mini
  • 16GB RAM: Chạy thoải mái model 7-8B. Thử llama3.1:8b, mistral:7b, qwen2.5:7b
  • 32GB+ RAM: Model 13-14B chạy ổn. llama3.1:14b, qwen2.5:14b
  • Có GPU VRAM 8GB+: Khác hẳn — model chạy trên GPU nhanh gấp 10-20 lần CPU

Pull và chạy model đầu tiên

# Pull model (chỉ cần làm 1 lần)
ollama pull llama3.2:3b

# Chat trực tiếp trong terminal
ollama run llama3.2:3b

# Hoặc pull + run cùng lúc (nếu chưa có model)
ollama run mistral:7b

Sau khi vào chế độ chat, gõ /bye để thoát. Model đã download được lưu tại ~/.ollama/models — không cần pull lại lần sau.

Các model mình hay dùng thực tế

# Model nhỏ, nhanh, dùng cho task đơn giản
ollama pull phi3:mini          # 2.3GB, rất nhanh trên CPU
ollama pull llama3.2:3b        # 2.0GB, cân bằng tốt

# Model 7-8B, dùng cho coding và phân tích
ollama pull codellama:7b       # Tối ưu cho code
ollama pull mistral:7b         # Đa năng, tiếng Anh tốt
ollama pull qwen2.5:7b         # Hỗ trợ tiếng Việt khá tốt

# Xem danh sách model đã cài
ollama list

Cấu hình chi tiết để dùng thực chiến

Expose API cho các ứng dụng khác

Mặc định Ollama chỉ lắng nghe 127.0.0.1:11434. Nếu muốn truy cập từ máy khác trong mạng nội bộ (ví dụ từ laptop vào server):

# Thêm vào /etc/systemd/system/ollama.service
# Dưới section [Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"

# Reload và restart
sudo systemctl daemon-reload
sudo systemctl restart ollama

Lưu ý bảo mật: Nếu expose ra ngoài localhost, nhớ dùng firewall hoặc reverse proxy có auth. Ollama không có authentication mặc định.

Dùng Ollama qua REST API — cách mình tích hợp vào script Python

import requests
import json

def ask_ollama(prompt: str, model: str = "llama3.2:3b") -> str:
    response = requests.post(
        "http://localhost:11434/api/generate",
        json={
            "model": model,
            "prompt": prompt,
            "stream": False  # True nếu muốn streaming response
        }
    )
    return response.json()["response"]

# Dùng như OpenAI-compatible API
def ask_ollama_chat(messages: list, model: str = "mistral:7b") -> str:
    response = requests.post(
        "http://localhost:11434/api/chat",
        json={
            "model": model,
            "messages": messages,
            "stream": False
        }
    )
    return response.json()["message"]["content"]

# Ví dụ dùng
result = ask_ollama("Giải thích Docker volume trong 3 câu")
print(result)

Dùng với thư viện OpenAI Python (drop-in replacement)

Mẹo này mình dùng nhiều nhất — nếu code đang dùng openai library, chỉ cần đổi base_url là xong, không cần đụng vào logic:

from openai import OpenAI

# Trỏ về Ollama thay vì OpenAI
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # Bắt buộc có, nhưng giá trị không quan trọng
)

response = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[
        {"role": "user", "content": "Viết một Dockerfile cho ứng dụng Python Flask"}
    ]
)
print(response.choices[0].message.content)

Tùy chỉnh system prompt và tham số

# Tạo custom model với Modelfile
cat > Modelfile << 'EOF'
FROM llama3.2:3b

# Tùy chỉnh hành vi
SYSTEM """Bạn là trợ lý kỹ thuật cho team DevOps.
Chỉ trả lời bằng tiếng Việt.
Khi giải thích lệnh Linux, luôn kèm ví dụ thực tế."""

# Tăng context window (mặc định 2048)
PARAMETER num_ctx 4096
# Giảm temperature để câu trả lời nhất quán hơn
PARAMETER temperature 0.3
EOF

# Build custom model
ollama create devops-assistant -f Modelfile
ollama run devops-assistant

Kiểm tra hiệu suất và Monitoring

Xem thông tin model và resource usage

# Xem model đang load trong RAM/VRAM
ollama ps

# Xem chi tiết một model
ollama show llama3.2:3b

# Xem log real-time
journalctl -u ollama -f

Benchmark tốc độ thực tế — kỳ vọng gì khi chạy?

Tốc độ inference phụ thuộc nhiều vào phần cứng. Dưới đây là số liệu thực đo, không phải quảng cáo:

  • CPU thuần (laptop tầm trung, không GPU): phi3:mini đạt ~15-20 tok/s, llama3.2:3b ~8-12 tok/s, llama3.1:8b chỉ còn ~2-4 tok/s — dùng được nhưng hơi chậm với task dài
  • GPU RTX 3060 12GB: llama3.2:3b bay lên ~60-80 tok/s, llama3.1:8b đạt ~35-50 tok/s — nhanh ngang GPT-3.5 API

Nếu chỉ có CPU, chọn model ≤3B là hợp lý nhất. Dưới 10 tok/s thì chat real-time sẽ hơi khó chịu.

# Đo tokens/second bằng cách quan sát output
time ollama run llama3.2:3b "Giải thích TCP/IP handshake" --nowordwrap

# Ollama in ra stats ở cuối nếu dùng API với verbose
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.2:3b",
  "prompt": "Hello",
  "stream": false
}' | python3 -m json.tool | grep -E "eval_duration|eval_count"

Script monitor resource khi chạy inference

# Monitor CPU/RAM
watch -n 1 'ps aux | grep ollama | grep -v grep'

# Nếu có NVIDIA GPU
watch -n 1 nvidia-smi

# Kiểm tra Ollama có dùng GPU không (tìm dòng "gpu" trong log)
OLLAMA_DEBUG=1 ollama run llama3.2:3b "test" 2>&1 | grep -i gpu

Tips tối ưu hiệu suất khi RAM hạn chế

Mấy cái này mình học được sau vài lần server bị OOM lúc chạy inference ban đêm:

  • Unload model sau khi dùng: Ollama giữ model trong RAM 5 phút sau request cuối. Điều chỉnh qua OLLAMA_KEEP_ALIVE=0 nếu RAM hạn chế
  • Chạy nhiều request song song: Mặc định Ollama chỉ xử lý 1 request cùng lúc. Tăng qua OLLAMA_NUM_PARALLEL=2
  • Dùng quantization thấp hơn nếu RAM thiếu: ollama pull llama3.1:8b-instruct-q4_0 thay vì llama3.1:8b (mặc định Q4_K_M)
  • SSD làm khác biệt rõ ràng: Lần đầu load model từ SSD NVMe nhanh hơn HDD 5-10 lần

Tích hợp với Open WebUI (giao diện ChatGPT-like)

Không thích terminal? Open WebUI cho giao diện chat đầy đủ, chạy hoàn toàn local:

# Dùng Docker (đơn giản nhất)
docker run -d \
  -p 3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

# Truy cập tại http://localhost:3000

Open WebUI tự detect Ollama đang chạy trên host machine. Tạo account local (không cần internet), chọn model, chat như ChatGPT — nhưng hoàn toàn private.