Bỏ qua để đến Nội dung

Chạy Gemma 4 trên Ollama — Hướng dẫn Troubleshooting, Quantization và RAG cho lập trình viên

Kinh nghiệm thực tế: từ lỗi GPU trên Kubernetes đến chọn quantization tối ưu cho coding workflow

Bài viết này chia sẻ kinh nghiệm thực tế khi triển khai Gemma 4 26B-A4B trên Ollama — từ việc debug lỗi GPU trên Kubernetes, so sánh các phương pháp quantization, đến hướng dẫn setup RAG để tăng chất lượng code generation cho Go và Flutter.


1. Bối cảnh

Môi trường: Kubernetes pod chạy Ollama v0.20.0, 93GB RAM, 24GB VRAM (single GPU), sử dụng HAMI để chia sẻ GPU giữa các pod.

Mục tiêu: Chạy model Gemma 4 26B-A4B (MoE — 26 tỷ params tổng, chỉ active ~4 tỷ mỗi lần inference) để hỗ trợ coding Go và Flutter.

2. Sự cố và cách xử lý

Triệu chứng

Pull model UD-Q4_K_XL (17GB) thành công nhưng khi chạy thì gặp lỗi 500 Internal Server Error.

Quá trình chẩn đoán

Bước 1 — Kiểm tra RAM: 93GB tổng, 54GB free. RAM không phải vấn đề.

Bước 2 — Kiểm tra GPU (pod cũ): Phát hiện HAMI cấp 0MB VRAM!

CUDA_DEVICE_MEMORY_LIMIT_0=0m    # VRAM = 0!
Failed to initialize NVML: Unknown Error

Pod restart giúp HAMI cấp lại 24GB VRAM bình thường.

Bước 3 — Test model nhỏ: ollama run gemma3:4b chạy OK — GPU hoạt động tốt.

Bước 4 — Test model Unsloth: Cả UD-Q4_K_XLUD-IQ4_XS đều lỗi dù GPU đã fix.

Bước 5 — Test model Ollama library: ollama run gemma3:27b chạy bình thường!

Nguyên nhân gốc

Model từ Unsloth (HuggingFace GGUF) không tương thích với Ollama v0.20.0. Unsloth export GGUF format/metadata khác so với chuẩn Ollama. Gemma 4 mới ra nên Unsloth chưa kịp align format.

Giải pháp: Dùng model từ thư viện chính thức Ollama thay vì HuggingFace/Unsloth.

3. So sánh công cụ chạy LLM local

Bốn công cụ phổ biến — mỗi cái phục vụ mục đích khác nhau:

  • Ollama: Inference/serving — nhanh nhất, nhẹ nhất, CLI + API. Lựa chọn tốt nhất để chạy model.
  • LM Studio: Giống Ollama nhưng có giao diện đồ hoạ đẹp. Phù hợp ai thích GUI.
  • AnythingLLM: RAG / knowledge base — wrap Ollama bên dưới. Dùng khi cần chat với tài liệu.
  • LLaMA Factory: Fine-tuning (LoRA, QLoRA). Hoàn toàn khác category — dùng để training.

4. Chọn Quantization phù hợp cho 24GB VRAM

Gemma 4 26B-A4B gốc là BF16 (~52GB). Cần quantize để fit 24GB VRAM:

  • Q4_K_M (~15GB): 100% GPU, ~25-35 tok/s — sweet spot cho đa số use case
  • Q5_K_M (~18GB): 100% GPU, ~20-28 tok/s — chất lượng cao hơn chút
  • Q6_K (~21GB): Vừa đủ 24GB, ~15-22 tok/s
  • Q8_0 (~27GB): Tràn sang RAM, ~10-18 tok/s — chỉ nên dùng khi có 32GB+ VRAM

Khuyến nghị: UD-Q4_K_XL (17.1GB) — chất lượng cao nhất mà vẫn fit hoàn toàn trong 24GB VRAM.

Q4 vs Q8 cho coding

Với lập trình Go và Flutter, Q4_K_XL nhanh gấp 2-3 lần (25-35 vs 10-18 tok/s) trong khi code accuracy chỉ kém 2-3% (92-95% vs 95-97%). Khi coding, tốc độ iterate quan trọng hơn chút precision — Q4 là lựa chọn đúng.

5. Giải mã tên model Ollama

Ví dụ: gemma4:26b-a4b-it-q4_K_M

  • gemma4: Gemma 4 — thế hệ mới nhất của Google
  • 26b: 26 billion params tổng
  • a4b: Active 4 billion — kiến trúc MoE, chỉ dùng ~4B params mỗi lần inference
  • it: Instruction-tuned — đã fine-tune để follow instructions
  • q4_K_M: Quantization 4-bit, K-quant (nén thông minh — layer quan trọng giữ precision cao hơn), Medium level

6. Tăng chất lượng code: RAG trước, Fine-tune sau

Thay vì fine-tune ngay (tốn 3-5 ngày), nên áp dụng theo thứ tự:

  1. System prompt + few-shot (1 giờ setup, +5-8% improvement)
  2. RAG với code repos (1 ngày setup, +8-12% improvement)
  3. Fine-tune QLoRA (3-5 ngày, +10-15% improvement) — chỉ khi thật cần thiết

Setup RAG với AnythingLLM

Kiến trúc:

Ollama (Gemma 4) <-- ChromaDB (Vector DB) <-- Code Embeddings
                                                 |
                                           AnythingLLM (UI)

Các bước:

  1. Docker run AnythingLLM, trỏ LLM provider về Ollama
  2. Pull model embedding: ollama pull nomic-embed-text
  3. Clone và lọc code repos (chỉ giữ .go, .dart, .md)
  4. Upload vào AnythingLLM workspace, đợi indexing
  5. Chat — model trả lời dựa trên code thật trong repos của bạn

Repos nên index cho Go: gin-gonic/gin, gofiber/fiber, go-chi/chi, uber-go/zap, sqlc-dev/sqlc

Repos nên index cho Flutter: flutter/samples, felangel/bloc, riverpod/riverpod, flutterfire/flutterfire

7. Bài học rút ra

  1. HAMI GPU virtualization có thể cấp 0MB VRAM cho pod — restart pod thường fix được.
  2. Unsloth GGUF khác Ollama native — không phải file GGUF nào cũng chạy được trên Ollama. Ưu tiên model từ thư viện chính thức.
  3. 24GB VRAM + 17GB model weights thì còn ít chỗ cho KV cache. Nên dùng quant nhỏ hơn hoặc model 12B nếu cần context dài.
  4. Luôn test với model nhỏ từ Ollama library trước để phân biệt lỗi GPU vs lỗi model.
  5. Q4 tốt hơn Q8 cho coding workflow — tốc độ iterate quan trọng hơn 2-3% precision.