Cài đặt Ollama và Open WebUI trên Fedora: Tối ưu GPU NVIDIA không lo lỗi SELinux

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Ba hướng tự chạy LLM trên Fedora Workstation

Muốn chạy LLM mượt trên máy cá nhân hoặc workstation Fedora, anh em thường đứng trước 3 lựa chọn kiến trúc:

  • Native toàn bộ (Bare-metal): Kéo binary Ollama về /usr/local/bin và dựng Open WebUI bằng virtualenv hoặc uv. Cách này vắt kiệt hiệu năng phần cứng nhưng dọn dẹp rất mệt.
  • Container hóa 100% (Podman/Docker stack): Bọc cả Ollama lẫn WebUI vào container. Cấu hình CDI (Container Device Interface) để passthrough GPU NVIDIA qua Podman rootless trên Fedora rất dễ vấp quyền truy cập /dev/nvidia*.
  • Mô hình Hybrid (Khuyên dùng): Cài Ollama trực tiếp lên OS để bám thẳng vào driver CUDA. Đẩy riêng Open WebUI vào Podman container để cô lập môi trường web.

Đánh giá thực tế từng phương án

1. Bare-metal toàn phần

Ưu điểm: Tốc độ suy luận đạt đỉnh. Không có bất kỳ độ trễ nào từ namespace hay virtualization. Debug lỗi CUDA driver cực kỳ nhanh.

Điểm nghẽn: Open WebUI kéo theo hàng tá thư viện Python và Node.js. Cài thẳng vào máy rất dễ làm rác môi trường hệ thống. Khi cần nâng cấp hay gỡ bỏ, bạn sẽ mất nhiều thời gian dọn dẹp.

2. Container toàn phần

Ưu điểm: Quản lý vòng đời gọn nhẹ. Muốn xóa sạch chỉ cần hạ compose file xuống là xong.

Điểm nghẽn: Fedora bật SELinux Enforcing theo mặc định. Việc phân quyền cho container rootless truy cập driver NVIDIA thường xuyên dính lỗi permission denied, trừ khi bạn tắt SELinux hoặc viết rule tùy chỉnh.

3. Mô hình Hybrid (Ollama Native + Open WebUI Container)

Phương án này giải quyết triệt để vấn đề. Ollama bắt driver akmod-nvidia trực tiếp từ RPM Fusion, offload trọn vẹn 100% layer lên vRAM. Trong khi đó, phần giao diện WebUI phức tạp được cách ly hoàn toàn trong một container Podman duy nhất.

Tại sao workstation Fedora nên chọn mô hình Hybrid?

Sau hơn 2 năm dùng Fedora làm OS làm việc hàng ngày, mình nhận thấy kernel của bản phân phối này cập nhật rất nhanh. Mỗi lần kernel nhảy version, module NVIDIA lại được akmods build lại.

Chạy Ollama native giúp service tự bắt driver mới mà không làm gãy container runtime. Bạn vừa giữ sạch OS, vừa né được toàn bộ phiền toái khi cấu hình SELinux passthrough thiết bị.

Các bước triển khai thực tế

Bước 1: Cài đặt Driver NVIDIA từ RPM Fusion

Trước hết, kiểm tra xem máy đã nhận diện đúng card rời hay chưa:

nvidia-smi

Nếu máy mới cài hoặc đang chạy driver mã nguồn mở Nouveau, hãy kéo gói driver chính thức qua DNF:

sudo dnf install -y akmod-nvidia xorg-x11-drv-nvidia-cuda
# Chờ akmods build xong module kernel (thường mất 2-3 phút) rồi khởi động lại
sudo akmods --force
sudo reboot

Bước 2: Cài Ollama và tinh chỉnh systemd service

Tải và cài đặt Ollama bằng script chính thức:

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

Mặc định Ollama chỉ mở cổng nội bộ 127.0.0.1:11434. Để tối ưu tốc độ và mở kết nối an toàn cho WebUI, hãy tạo file override cho systemd:

sudo systemctl edit ollama.service

Dán đoạn cấu hình tinh chỉnh sau vào giữa hai dòng chú thích:

[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
Environment="OLLAMA_ORIGINS=*"
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KEEP_ALIVE=24h"

Ý nghĩa thực chiến của các cờ:

  • OLLAMA_FLASH_ATTENTION=1: Tiết kiệm khoảng 15% – 25% vRAM trên kiến trúc RTX 2000 trở lên khi xử lý context dài từ 8k – 32k tokens.
  • OLLAMA_KEEP_ALIVE=24h: Giữ model cố định trên vRAM. Bạn sẽ không phải chờ 4 – 6 giây load lại model từ SSD NVMe sau một khoảng thời gian không chat.

Reload daemon để áp dụng thay đổi:

sudo systemctl daemon-reload
sudo systemctl restart ollama

Bước 3: Tải model và kiểm tra CUDA offloading

Kéo một model thông dụng về test. Ví dụ model qwen2.5:7b (bản Q4_K_M chiếm khoảng 4.7GB vRAM):

ollama run qwen2.5:7b

Bật một cửa sổ terminal khác và chạy lệnh nvidia-smi. Khi thấy tiến trình ollama_llama_server chiếm vRAM và GPU load nhảy lên 90% – 100% trong lúc sinh text, hệ thống đã nhận card thành công. Trên RTX 3060 12GB, tốc độ thường đạt tầm 50-65 tokens/giây.

Bước 4: Khởi chạy Open WebUI qua Podman

Fedora đi kèm Podman nên bạn không cần cài thêm Docker. Tạo một volume để giữ lại lịch sử chat khi cập nhật image:

podman volume create open-webui-data

podman run -d \
  --name open-webui \
  --network host \
  -v open-webui-data:/app/backend/data:Z \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  --restart always \
  ghcr.io/open-webui/open-webui:main

Hai chi tiết kỹ thuật cốt lõi cần nhớ:

  • Flag :Z ở volume: Bắt buộc phải có. Cờ này yêu cầu Podman tự gán nhãn SELinux (container_file_t) cho volume, tránh hoàn toàn lỗi Permission Denied ngầm vào database SQLite.
  • Flag --network host: Giúp container dùng chung network namespace với máy chủ. WebUI gọi thẳng vào 127.0.0.1:11434 của Ollama mà không phải cấu hình bridge network hay mở port trên firewalld.

Bước 5: Thiết lập tài khoản ban đầu

Mở trình duyệt gõ http://localhost:8080. Tài khoản đăng ký đầu tiên sẽ nhận vai trò Admin. Vào mục Settings > Models, bạn sẽ thấy toàn bộ model đã tải về sẵn sàng để sử dụng.

Mẹo thực chiến tinh chỉnh hiệu năng

  • Chạy model vượt mức vRAM: Nếu dùng card 8GB vRAM (như RTX 3070/4060) nhưng muốn chạy model 14B (cần tầm 9GB vRAM), Ollama sẽ tự chia layer: một phần lên GPU, phần còn lại đẩy sang RAM hệ thống. Bạn vẫn chạy được, chấp nhận tốc độ giảm xuống còn 12-18 tokens/giây.
  • Chuyển vị trí lưu model: Mặc định model nằm ở /usr/share/ollama/.ollama/models thuộc phân vùng root. Nếu ổ root sắp đầy, hãy chuyển sang ổ NVMe phụ bằng cách thêm biến vào systemd: Environment="OLLAMA_MODELS=/mnt/nvme-data/ollama_models".
  • Chặn gửi telemetry: Muốn dữ liệu hoàn toàn riêng tư, hãy thêm hai biến sau vào lệnh chạy Podman: -e SCARF_NO_ANALYTICS=true -e DO_NOT_TRACK=true.
Share: