Mở đầu: Câu chuyện thực tế từ dự án RAG của tôi
Năm 2024, tôi nhận được một dự án xây dựng hệ thống RAG (Retrieval-Augmented Generation) cho một doanh nghiệp thương mại điện tử quy mô vừa tại Việt Nam. Yêu cầu đặt ra là xử lý hàng ngàn tài liệu sản phẩm, hỗ trợ khách hàng 24/7 bằng tiếng Việt, và quan trọng nhất — phải đảm bảo dữ liệu không bao giờ rời khỏi hạ tầng của doanh nghiệp.
Ban đầu, tôi thử nghiệm với các API cloud như GPT-4 và Claude. Kết quả rất ấn tượng về chất lượng, nhưng chi phí khiến khách hàng phải suy nghĩ lại. Với khoảng 50,000 yêu cầu mỗi ngày, chi phí API cloud lên tới hơn $2,000/tháng — gấp 5 lần ngân sách dự kiến.
Đó là lúc tôi quyết định triển khai Ollama để chạy mô hình ngôn ngữ lớn (LLM) ngay trên server nội bộ. Kết quả sau 3 tháng triển khai: chi phí vận hành giảm 85%, độ trễ trung bình chỉ 120ms, và khách hàng hoàn toàn yên tâm vì dữ liệu được xử lý trong trung tâm dữ liệu của họ.
Bài viết này sẽ chia sẻ toàn bộ quy trình từ cài đặt, cấu hình, đến tối ưu hóa và những bài học xương máu tôi đã rút ra trong quá trình triển khai.
Ollama là gì và tại sao nên dùng nó?
Ollama là một công cụ mã nguồn mở cho phép chạy các mô hình ngôn ngữ lớn (LLM) như Llama 2, Mistral, Code Llama trực tiếp trên máy tính cục bộ của bạn. Điểm mạnh của Ollama nằm ở sự đơn giản — bạn không cần phải hiểu sâu về Docker, Kubernetes hay fine-tuning model; chỉ cần vài câu lệnh là có thể khởi chạy một API server hoàn chỉnh.
Với những ai cần sự linh hoạt giữa chạy local và cloud,
đăng ký HolySheheep AI là giải pháp lai ghép tối ưu — có thể chuyển đổi giữa inference local và cloud một cách liền mạch, với chi phí chỉ từ $0.42/MTok cho DeepSeek V3.2.
Yêu cầu hệ thống tối thiểu
Trước khi bắt đầu, hãy đảm bảo hệ thống của bạn đáp ứng các yêu cầu cơ bản:
- RAM: Tối thiểu 8GB cho mô hình 7B tham số, 16GB+ cho mô hình 13B, 32GB+ cho mô hình 70B
- GPU: NVIDIA với VRAM từ 4GB (7B) đến 24GB+ (70B). CUDA 11.8 trở lên
- Ổ cứng: SSD NVMe khuyến nghị, cần từ 10GB đến 60GB tùy mô hình
- Hệ điều hành: macOS, Linux, hoặc Windows (WSL2)
Phần 1: Cài đặt Ollama
Cài đặt trên macOS
Đối với người dùng macOS, quá trình cài đặt đơn giản nhất:
# Tải và cài đặt qua Homebrew
brew install ollama
Hoặc tải trực tiếp từ trang chủ
https://ollama.com/download
Khởi động dịch vụ Ollama
brew services start ollama
Cài đặt trên Linux
# Tải script cài đặt
curl -fsSL https://ollama.com/install.sh | sh
Khởi động daemon
sudo systemctl enable ollama
sudo systemctl start ollama
Kiểm tra phiên bản
ollama --version
Cài đặt trên Windows (WSL2)
# Mở WSL2 terminal và chạy
wsl
Cài đặt trong WSL2
curl -fsSL https://ollama.com/install.sh | sh
Xác minh cài đặt
ollama list
Phần 2: Tải và quản lý mô hình
Danh sách mô hình được hỗ trợ
Ollama hỗ trợ hàng chục mô hình phổ biến. Dưới đây là các mô hình tôi hay sử dụng trong thực tế:
# Llama 2 - Phù hợp cho hầu hết use case, cân bằng giữa chất lượng và tốc độ
ollama pull llama2:7b
Mistral - Mạnh về lập trình và reasoning
ollama pull mistral:7b
Code Llama - Tối ưu cho viết code
ollama pull codellama:7b
Phi (Microsoft) - Nhẹ, nhanh, tiết kiệm tài nguyên
ollama pull phi:2.7b
Llama 3 - Phiên bản mới nhất với hiệu suất cải thiện
ollama pull llama3:8b
Vicuna - Tốt cho chatbot
ollama pull vicuna:13b
Kiểm tra mô hình đã tải
# Liệt kê tất cả mô hình đã tải
ollama list
Xem thông tin chi tiết một mô hình
ollama show llama2:7b
Xóa mô hình không cần thiết
ollama rm llama2:13b
Phần 3: Khởi chạy API Server
Đây là phần quan trọng nhất — biến Ollama thành một API server để tích hợp vào ứng dụng của bạn.
Chạy với cổng mặc định
# Khởi chạy server trên cổng 11434 (mặc định)
ollama serve
Kiểm tra server đang chạy
curl http://localhost:11434/api/tags
Thay đổi cổng và cấu hình nâng cao
# Chạy trên cổng tùy chỉnh
OLLAMA_HOST=0.0.0.0:11435 ollama serve
Cấu hình số GPU sử dụng
OLLAMA_NUM_GPU=2 ollama serve
Giới hạn bộ nhớ sử dụng (GB)
OLLAMA_MAX_VRAM=16 ollama serve
Cho phép CORS (cần thiết cho ứng dụng web)
OLLAMA_ORIGINS="*" ollama serve
Phần 4: Tích hợp API với ứng dụng
Sử dụng Python với thư viện OpenAI-compatible
Ollama cung cấp API tương thích với OpenAI, giúp việc chuyển đổi giữa local và cloud trở nên dễ dàng:
from openai import OpenAI
Kết nối tới Ollama local
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # Ollama không cần API key thực sự
)
response = client.chat.completions.create(
model="llama2:7b",
messages=[
{"role": "system", "content": "Bạn là trợ lý hỗ trợ khách hàng thương mại điện tử tiếng Việt."},
{"role": "user", "content": "Chính sách đổi trả của cửa hàng như thế nào?"}
],
temperature=0.7,
max_tokens=500
)
print(response.choices[0].message.content)
Chuyển đổi linh hoạt giữa Local và Cloud
Trong thực tế, tôi thường kết hợp cả hai: dùng Ollama cho các tác vụ nội bộ, và
HolySheheep AI cho các tác vụ phức tạp hơn cần mô hình mạnh hơn:
import os
class LLMClient:
def __init__(self):
# Ưu tiên local cho tác vụ thông thường
self.local_client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama"
)
# Cloud cho tác vụ phức tạp
self.cloud_client = OpenAI(
base_url="https://api.holysheep.ai/v1",
api_key=os.getenv("HOLYSHEEP_API_KEY") # Key từ HolySheheep AI
)
def chat(self, message, use_cloud=False):
client = self.cloud_client if use_cloud else self.local_client
model = "gpt-4.1" if use_cloud else "llama2:7b"
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": message}]
)
return response.choices[0].message.content
Sử dụng
llm = LLMClient()
Tác vụ đơn giản - dùng local (miễn phí)
result = llm.chat("Địa chỉ cửa hàng ở đâu?")
Tác vụ phức tạp - dùng cloud ($0.42/MTok cho DeepSeek V3.2)
complex_result = llm.chat("Phân tích xu hướng mua sắm Tết 2024", use_cloud=True)
Tích hợp với LangChain
Với các dự án RAG phức tạp, LangChain là lựa chọn phổ biến:
from langchain_community.llms import Ollama
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from langchain.embeddings import OllamaEmbeddings
Khởi tạo LLM
llm = Ollama(model="mistral:7b", base_url="http://localhost:11434")
Khởi tạo embeddings cho RAG
embeddings = OllamaEmbeddings(
model="nomic-embed-text",
base_url="http://localhost:11434"
)
Tạo vector store
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embeddings
)
Tạo chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever()
)
Truy vấn
result = qa_chain.invoke("Sản phẩm nào đang giảm giá?")
print(result["result"])
Phần 5: Tối ưu hóa hiệu suất
Cấu hình GPU cho NVIDIA
# Kiểm tra GPU đang sử dụng
nvidia-smi
Ép buộc sử dụng GPU NVIDIA
CUDA_VISIBLE_DEVICES=0 ollama serve
Hoặc với nhiều GPU
CUDA_VISIBLE_DEVICES=0,1 ollama serve
Tối ưu batch processing
import concurrent.futures
def process_request(prompt):
response = client.chat.completions.create(
model="llama2:7b",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
Xử lý song song nhiều request
prompts = [f"Xử lý yêu cầu {i}" for i in range(10)]
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
results = list(executor.map(process_request, prompts))
Theo dõi tài nguyên sử dụng
# Script giám sát tài nguyên
import psutil
import time
def monitor_resources():
while True:
cpu_percent = psutil.cpu_percent(interval=1)
memory = psutil.virtual_memory()
gpu_memory = psutil.Process().memory_info().rss / 1024 / 1024 / 1024
print(f"CPU: {cpu_percent}% | RAM: {memory.percent}% | "
f"Used: {memory.used / 1024**3:.2f}GB")
time.sleep(5)
if __name__ == "__main__":
monitor_resources()
So sánh chi phí: Local vs Cloud
Dựa trên kinh nghiệm triển khai thực tế, đây là bảng so sánh chi phí cho một hệ thống xử lý 1 triệu token/tháng:
| Phương án | Chi phí/tháng | Ưu điểm | Nhược điểm |
| Ollama Local (Llama 2 7B) | $0 (sau đầu tư hardware) | Không giới hạn request, privacy tuyệt đối | Hardware đầu tư ban đầu, chất lượng thấp hơn |
| GPT-4.1 (HolySheheep AI) | $8/MTok input | Chất lượng cao nhất | Chi phí cao cho volume lớn |
| Claude Sonnet 4.5 (HolySheheep AI) | $15/MTok | Excellent cho reasoning | Đắt hơn GPT-4.1 |
| DeepSeek V3.2 (HolySheheep AI) | $0.42/MTok | Rẻ nhất, chất lượng tốt | Ít nổi tiếng hơn |
| Gemini 2.5 Flash (HolySheheep AI) | $2.50/MTok | Cân bằng giá/hiệu suất | Context window giới hạn |
Chiến lược tối ưu của tôi: Dùng Ollama cho 80% tác vụ thông thường, HolySheheep AI với DeepSeek V3.2 ($0.42/MTok) cho 20% tác vụ phức tạp cần chất lượng cao. Cách này giúp tiết kiệm 85% chi phí so với dùng hoàn toàn GPT-4.
Lỗi thường gặp và cách khắc phục
Lỗi 1: CUDA not found / GPU không được nhận diện
Mô tả: Ollama không sử dụng được GPU, mọi thứ chạy trên CPU rất chậm.
Nguyên nhân: Driver NVIDIA chưa được cài đặt hoặc CUDA Toolkit chưa tương thích.
Khắc phục:
# Bước 1: Kiểm tra NVIDIA Driver
nvidia-smi
Nếu command not found, driver chưa cài
Bước 2: Cài đặt CUDA Toolkit
Tải từ https://developer.nvidia.com/cuda-downloads
Chọn đúng phiên bản cho hệ điều hành của bạn
Bước 3: Kiểm tra biến môi trường
echo $CUDA_HOME
Nếu trống, thêm vào ~/.bashrc hoặc ~/.zshrc
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
Bước 4: Khởi động lại Ollama
sudo systemctl restart ollama
Bước 5: Kiểm tra lại
ollama run llama2:7b
Gõ /show info để xem GPU usage
Lỗi 2: Out of Memory (OOM) khi load model
Mô tả: Server bị crash hoặc báo lỗi memory khi khởi chạy mô hình lớn.
Nguyên nhân: Không đủ RAM/VRAM cho mô hình, hoặc có process khác chiếm dụng bộ nhớ.
Khắc phục:
# Kiểm tra bộ nhớ hiện tại
free -h
nvidia-smi --query-gpu=memory.free,memory.total --format=csv
Giải pháp 1: Dùng mô hình nhẹ hơn
ollama pull llama2:7b # Thay vì 13b hoặc 70b
Giải pháp 2: Giới hạn VRAM sử dụng
OLLAMA_MAX_VRAM=12G ollama serve
Giải pháp 3: Tắt các process không cần thiết
sudo systemctl stop nginx # Nếu không dùng
pkill -f chrome # Đóng
Tài nguyên liên quan
Bài viết liên quan