กลับไปที่บล็อก

Ollama ไม่ใช้ GPU? วิธีแก้บน Linux, Windows และ WSL

16 กันยายน 2569

TL;DR

รัน ollama ps ขณะโหลดโมเดลไว้: คอลัมน์ PROCESSOR บอกความจริง 100% GPU แปลว่า GPU ปกติดี อ่านต่อก็ได้ไม่จำเป็น สัดส่วนแบบ 40%/60% CPU/GPU แปลว่าโมเดลไม่ลง VRAM — ใช้ quant ที่เล็กลง 100% CPU แปลว่า Ollama หา GPU ที่ใช้ได้ไม่เจอ: มักเป็นไดรเวอร์เก่า การไม่ได้อยู่ในกลุ่มที่ถูกต้อง (AMD บน Linux) OLLAMA_LLM_LIBRARY ที่ถูกตรึง หรือคอนเทนเนอร์ที่สตาร์ตโดยไม่มีสิทธิ์เข้าถึง GPU แก้ตามสาเหตุที่ log ระบุ มันมีแค่ประมาณห้าข้อเท่านั้น

เช็กอย่างไรว่า Ollama ใช้ GPU จริงหรือไม่?

สองคำสั่ง ไม่ต้องเดา

# ที่เทอร์มินัลหนึ่ง: โหลดโมเดล
ollama run llama3.2 "hello"

# ที่อีกเทอร์มินัล: ดูว่ามันรันที่ไหน
ollama ps
NAME            ID          SIZE     PROCESSOR        UNTIL
llama3.2:latest a80c4de17cd9 3.3 GB   100% GPU         4 minutes from now

คอลัมน์ PROCESSOR มีสามสถานะ:

  • 100% GPU — ทุก layer ถูกย้ายขึ้นแล้ว จบ
  • 48%/52% CPU/GPU — ย้ายบางส่วน GPU ทำงานอยู่ แต่โมเดลบวก context ไม่พอดี VRAM ดูหัวข้อ VRAM ด้านล่าง
  • 100% CPU — inference รันบน CPU GPU หรือไม่ถูกตรวจพบ หรือถูกปิดเป็นการตั้งใจ

จากนั้นอ่าน log ของเซิร์ฟเวอร์ ซึ่งระบุฮาร์ดแวร์ที่ Ollama เจอจริงตอนเริ่มทำงาน:

journalctl -u ollama --no-pager | grep -i "inference compute"

บนเครื่อง NVIDIA ที่ปกติดี คุณต้องการบรรทัดลักษณะนี้:

inference compute id=GPU-xxxx library=CUDA compute=8.9 driver=12.4 name=NVIDIA GeForce RTX 4070

ไม่มีบรรทัดเลย หรือบรรทัดนั้นจบด้วยข้อความ fallback ไป CPU อย่างเดียว คุณก็เจอปัญหาแล้ว ที่เหลือของบทความคือห้าสาเหตุ เรียงจากที่น่าจะเป็นที่สุด

ทำไม Ollama ถึงบอกว่า “no compatible GPU discovered”?

กับ NVIDIA ผู้ร้ายประจำคือไดรเวอร์ ไม่ใช่ CUDA Ollama แถม CUDA runtime libraries มาเอง จึงไม่จำเป็นต้องติดตั้ง CUDA toolkit — แต่ runtime ที่แถมมาต้องมีไดรเวอร์ใหม่พอที่จะคุยกับมันได้ nvidia-smi ทำงานได้ยังไม่ใช่หลักฐาน มันพิสูจน์แค่ว่ามีไดรเวอร์ ไม่ได้พิสูจน์ว่าใหม่พอ

nvidia-smi --query-gpu=driver_version --format=csv,noheader

ถ้าเวอร์ชันเก่ากว่าหลายปี อัปเดตแล้วรีบูต:

# ตระกูล Debian/Ubuntu
sudo apt install nvidia-driver-570
# ตระกูล Arch
sudo pacman -S nvidia

หลังอัปเดตไดรเวอร์ รีสตาร์ตเซอร์วิส Ollama เพื่อให้สแกนอุปกรณ์ใหม่ — การตรวจจับเกิดครั้งเดียวตอนเริ่มทำงาน ไม่ใช่ต่อหนึ่ง request:

sudo systemctl restart ollama

ถ้า log พิมพ์ GPU ของคุณพร้อม library=CUDA ก็จบ ถ้ายังดื้อ ให้เช็กว่า OLLAMA_LLM_LIBRARY ไม่ได้ถูกตั้งไว้ที่ไหน — ดูหัวข้อ “หลังอัปเดต”

ทำไม Ollama ใช้ GPU กับโมเดลแค่บางส่วน?

การย้ายบางส่วนคือเรื่องคณิตศาสตร์ ไม่ใช่บั๊ก: น้ำหนักโมเดลบวก KV cache ของหน้าต่าง context ต้องลงตัวใน VRAM โมเดล 7B ที่ Q4 ใช้ราว 4–5 GB ให้ context 8K แล้วแคชกินเพิ่มอีก บนการ์ด 8 GB บางส่วนต้องอยู่บน CPU เป็นธรรมดา และ ollama ps โชว์สัดส่วนนั้น

สามทางปิดช่องว่าง เริ่มจากถูกที่สุด:

  1. Quant เล็กลง ลงจาก Q8 ไป Q4 ลดขนาดน้ำหนักครึ่งหนึ่งด้วยค่าคุณภาพที่ถอยไปไม่มาก การแลกเปลี่ยนอธิบายไว้ในอธิบายระดับ quantization ของ GGUF
  2. Context สั้นลง num_ctx ครองขนาดแคช context 32K บนการ์ด 8 GB หมายความว่า layer ส่วนใหญ่ต้องอยู่ CPU
  3. GPU layer น้อยลง ตัวเลือก num_gpu จำกัดจำนวน layer ที่ย้ายขึ้น ตั้งต่ำกว่าจำนวน layer รวมคือการกำหนดให้แบ่งกันแน่นอน — ถ้ามีคนตั้งไว้ใน Modelfile หรือการเรียก API ให้เอาออก

จำกับดักกลับทางด้วย: GPU ที่โชว์ 100% GPU แต่รันช้ากว่าที่คิด อาจสลับข้อมูลไปยัง RAM ของระบบอยู่ เทียบคอลัมน์ SIZE ของ ollama ps กับ VRAM จริงของคุณ

ทำไม Ollama ไม่ใช้ GPU ของ AMD ผม?

AMD บน Linux ต้องการสามอย่าง และทั้งสามเช็กได้:

1. รองรับ ROCm ในบิลด์ สคริปต์ติดตั้งอย่างเป็นทางการบน Linux แถมบิลด์ ROCm มาให้ ยืนยันว่าเซิร์ฟเวอร์ตรวจพบอะไร:

journalctl -u ollama --no-pager | grep -iE "rocm|inference compute"

2. การเป็นสมาชิกกลุ่ม ROCm runtime ต้องเข้าถึง /dev/kfd และ /dev/dri แปลว่าคุณต้องอยู่ในกลุ่ม render และ video:

sudo usermod -aG render,video $USER
# ออกจากระบบแล้วเข้าใหม่ แล้ว:
sudo systemctl restart ollama

กลุ่มที่ขาดหายตัวเดียวนี้คือกระทู้ “Ollama not using GPU on Ubuntu” ที่ครองทุกฟอรัม และมันรอดผ่านการติดตั้งไดรเวอร์ใหม่ทุกรอบ เพราะไดรเวอร์ไม่เคยเป็นปัญหาตั้งแต่แรก

3. GPU ที่รองรับ — หรือ override การ์ด RDNA2 ระดับผู้บริโภคที่ไม่รองรับ (gfx1031, gfx1032) จะตกในขั้นตรวจจับทั้งที่ ROCm stack ทำงานได้ วิธีแก้มาตรฐานคืออ้างว่าเป็นเป้าหมายที่เข้ากันได้:

sudo systemctl edit ollama
[Service]
Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0"

แล้ว sudo systemctl restart ollama นี่คือ override ที่ไม่เป็นทางการแต่ใช้กันแพร่หลาย ถ้ามันแสดงอาการเพี้ยน ถอดออกก็กลับมาอยู่โซนการรองรับอย่างเป็นทางการ ถ้าคุณอยากคุม backend เต็มมือแทนการปะทะกับ autodetect นั่นคือความต่างแกนกลางที่พูดไว้ในllama.cpp vs Ollama

บน Windows การรองรับ AMD แคบกว่า — เช็กรายชื่อ GPU ที่ Ollama รองรับสำหรับการ์ดของคุณก่อนสรุปว่าตัวติดตั้งพัง

ทำไม Ollama เลิกใช้ GPU หลังอัปเดต?

การอัปเดตเปลี่ยนหนึ่งในสามเรื่อง ตามลำดับความน่าจะเป็น:

  1. Backend ที่ถูกตรึง OLLAMA_LLM_LIBRARY บังคับใช้ runner ตัวเฉพาะ (cuda_v11, rocm หรือแม้แต่ cpu) มันเกิดมาเพื่อ debug บดบัง autodetect แบบเงียบ ๆ และฝังอยู่ใน shell profile กับไฟล์เซอร์วิสนานหลังจากที่เหตุผลเดิมถูกลืม หามันแล้วเอาออก:
systemctl show ollama --property=Environment | grep -i llm_library
env | grep OLLAMA
  1. ไดรเวอร์ตกหลัง runtime การอัปเกรด Ollama แถม CUDA runtime ใหม่กว่า ไดรเวอร์ของคุณไม่ขยับจนกว่าคุณจะขยับมัน วิธีแก้เหมือนหัวข้อไดรเวอร์ด้านบน
  2. เซอร์วิสคือคอนเทนเนอร์ และ flag หายไป คอนเทนเนอร์ที่ถูกสร้างใหม่โดยไม่มี flag GPU คือคอนเทนเนอร์ CPU เท่านั้น คำสั่งฝั่ง NVIDIA:
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 ollama/ollama

ฝั่งคอนเทนเนอร์ AMD เทียบเท่าด้วยการส่งผ่านอุปกรณ์บวกการเพิ่มกลุ่ม:

docker run -d --device=/dev/kfd --device=/dev/dri 
  --group-add video --group-add render 
  -v ollama:/root/.ollama -p 11434:11434 ollama/ollama

ไม่มี --gpus=all ก็ไม่มี GPU — Docker ไม่มีเหตุผลจะใจดี

Ollama ทำงานใน WSL2 ได้ไหม?

ได้ ด้วยไดรเวอร์ที่ถูกต้องอยู่ในที่ที่ถูกต้อง: ติดตั้งไดรเวอร์ NVIDIA ฝั่งWindows ห้ามติดตั้งไดรเวอร์ Linux ภายใน distro เด็ดขาด — ไดรเวอร์ใน WSL ทำให้ CUDA passthrough พัง ไม่ใช่แก้ จากนั้นอัปเดตตัว WSL และยืนยันว่าอุปกรณ์ passthrough มีตัวตน:

wsl --update   # รันจาก PowerShell
ls /dev/dxg    # ภายใน WSL — ต้องมีอยู่ถ้าจะใช้ GPU

เมื่อ /dev/dxg อยู่ครบและไดรเวอร์ Windows เป็นเวอร์ชันใหม่ Ollama ใน WSL2 ย้ายงานขึ้น GPU เหมือนการติดตั้งแบบ native ถ้าอยากตัดชั้นกลางออกให้หมด ตัว Ollama เวอร์ชัน Windows รันแบบ native และมองเห็น GPU โดยไม่ต้องมี WSL

Ollama ต้องมี GPU เลยไหม?

ไม่ — การรัน CPU เท่านั้นได้ผลเหมือนกันทางฟังก์ชัน เพียงแต่ช้าลง และกับโมเดลเล็กบน CPU ที่ไวก็ใช้งานได้จริง บน Apple Silicon คำถามนี้ละลายหาย: Metal ใช้ unified memory อัตโนมัติ ข้อจำกัดเดียวคือคุณยินดีแบ่ง RAM เท่าไรให้โมเดล

เช็กลิสต์ห้านาที

อาการสาเหตุที่น่าจะเป็นวิธีแก้
100% CPU ใน ollama ps มีการ์ด NVIDIAไดรเวอร์เก่ากว่า CUDA ที่แถมมาอัปเดตไดรเวอร์ รีบูต รีสตาร์ตเซอร์วิส
100% CPU, AMD บน Linuxขาดกลุ่ม render/videousermod -aG render,video เข้าสู่ระบบใหม่
100% CPU, การ์ด AMD ไม่รองรับROCm ปฏิเสธเป้า gfxHSA_OVERRIDE_GFX_VERSION=10.3.0
สัดส่วน 40%/60% CPU/GPUโมเดล + context เกิน VRAMquant เล็กลงหรือ num_ctx สั้นลง
เมื่อวาน GPU วันนี้ CPUOLLAMA_LLM_LIBRARY ถูกตรึงหรือไดรเวอร์เก่าหาตัวแปรแล้วลบ อัปเดตไดรเวอร์
GPU ตอนรัน native แต่ CPU ใน Dockerคอนเทนเนอร์สตาร์ตโดยไม่มี flag GPUสร้างใหม่ด้วย --gpus=all (หรืออุปกรณ์ AMD)

เช็กตามลำดับนี้: ollama ps เพื่อดูสถานะ log เซิร์ฟเวอร์เพื่อดูรายการตรวจจับ แล้วค่อยถึงตาราง เก้าจากสิบครั้ง บรรทัด log บอกแถวที่คุณอยู่ไปแล้วตั้งแต่ต้น

— mrsaynothing

— mrsaynothing

บันทึกหน้างานเรื่อง AI, Linux และ self-hosted

คุยต่อโพสต์นี้บน dev.to dev.to ↗

รับวิธีแก้ฉบับถัดไปทางอีเมล

อีเมลหนึ่งฉบับต่อหนึ่งโพสต์ แก้เสร็จแล้วไปต่อ

self-hosted · ไม่มีบุคคลที่สาม · ยกเลิกได้ในคลิกเดียว

นี่คืออะไร?

Git revert vs reset: ตัวไหนช่วยประวัติคุณไว้ได้

ถ้าอ่านแล้วชอบ — ผมสร้างงานแบบนี้เป็นอาชีพ จ้างผม