返回博客

Ollama 不用 GPU?Linux、Windows 和 WSL 修复指南

2026年9月16日

TL;DR

模型加载着的时候跑 ollama ps:PROCESSOR 列说的是实话。100% GPU 说明 GPU 没问题,你可以关掉这篇文章。40%/60% CPU/GPU 这样的比例说明模型没完全塞进显存——换更小的量化。100% CPU 说明 Ollama 没找到可用的 GPU:通常是驱动过旧、缺少用户组(Linux 上的 AMD)、某个钉死的 OLLAMA_LLM_LIBRARY,或者容器启动时没给 GPU 权限。修日志点名的那个原因;原因总共就五个左右。

怎么确认 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——所有层都已卸载到 GPU。完事。
  • 48%/52% CPU/GPU——部分卸载。GPU 在干活,但模型加上上下文没塞进显存。看下面的显存一节。
  • 100% CPU——推理在 CPU 上。GPU 要么没被检测到,要么被刻意禁用了。

然后读服务端日志,它会写出 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

一行都没有,或者结尾是 CPU-only 回退的提示,问题就找到了。本文剩下的部分就是那五个原因,按可能性从高到低排。

为什么 Ollama 说 “no compatible GPU discovered”?

在 NVIDIA 上,常见的罪魁是驱动,不是 CUDA。Ollama 自带 CUDA 运行时库,所以你不需要装 CUDA toolkit——但捆绑的运行时需要足够新的驱动才能和它对话。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 服务让它重新检测设备——检测只在启动时发生一次,不是每个请求都来一遍:

sudo systemctl restart ollama

如果日志现在带着 library=CUDA 打出了你的 GPU,收工。如果它仍然拒绝,检查 OLLAMA_LLM_LIBRARY 是否在哪儿被设过——见”更新之后”一节。

为什么 Ollama 只把模型的一部分放进 GPU?

部分卸载是算术问题,不是 bug:模型权重加上下文窗口的 KV cache 必须塞进显存。7B 模型的 Q4 大约 4–5 GB;再给它 8K 上下文,cache 还要更多。在 8 GB 的卡上,总得有什么留在 CPU,ollama ps 会把比例亮给你。

三种缩小差距的办法,按代价从低到高:

  1. 更小的量化。从 Q8 降到 Q4,权重体积减半,质量代价温和。取舍细节在 GGUF 量化等级详解
  2. 更短的上下文。num_ctx 主导 cache 大小。8 GB 的卡上开 32K 上下文,意味着大部分层留在 CPU。
  3. 更少的 GPU 层数。num_gpu 选项限制卸载到 GPU 的层数。把它设得低于总层数,就必然出现比例拆分——如果有人在 Modelfile 或 API 调用里设过,取消它。

反过来也有个陷阱:显示 100% GPU 却跑得比预期慢的 GPU,可能正在跟系统内存换页。拿 ollama ps 的 SIZE 对一下你的实际显存。

为什么 Ollama 不用我的 AMD GPU?

Linux 上的 AMD 需要三样东西,而且三样都能检查:

1. 这个构建支持 ROCm。官方 Linux 安装脚本捆绑 ROCm 构建。确认服务端检测到了什么:

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

2. 用户组。ROCm 运行时需要访问 /dev/kfd/dev/dri,也就是 rendervideo 组:

sudo usermod -aG render,video $USER
# 注销并重新登录,然后:
sudo systemctl restart ollama

单单漏掉这个组,就是每个论坛上”Ollama 在 Ubuntu 上不用 GPU”最常见的发帖原因,而且它能在重装驱动后依然存在——因为驱动从来就不是问题。

3. 受支持的 GPU——或者一个 override。不受支持的 RDNA2 消费级卡(gfx1031、gfx1032)即使 ROCm 栈完好也会检测失败。标准解法是冒充一个兼容目标:

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

然后 sudo systemctl restart ollama。这是一个不受官方支持但被广泛使用的 override;如果它行为不端,删掉它就回到官方支持的地盘。如果你宁愿完全掌控后端也不想跟自动检测较劲,那是 llama.cpp vs Ollama 覆盖的核心差异。

Windows 上 AMD 的支持面更窄——先去 Ollama 的受支持 GPU 列表里查你的卡,再断定安装坏了。

为什么 Ollama 更新之后不用 GPU 了?

更新会改变三样东西之一,按可能性排序:

  1. 钉死的后端库。OLLAMA_LLM_LIBRARY 强制指定 runner(cuda_v11rocm,甚至 cpu)。它是为调试准备的,会无声覆盖自动检测,而且在当初的理由被遗忘很久之后,还留在 shell 配置和 service 文件里。找到它,删掉它:
systemctl show ollama --property=Environment | grep -i llm_library
env | grep OLLAMA
  1. 驱动落后于运行时。Ollama 升级捆绑更新的 CUDA 运行时;你的驱动不动,它就不动。修法同上面的驱动一节。
  2. 服务是容器,而参数没了。重建时没带 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 里用吗?

能,前提是正确的驱动装在正确的位置:装 Windows 的 NVIDIA 驱动,千万别在发行版里装 Linux 驱动——WSL 内的驱动会破坏 CUDA 透传,而不是修复它。然后更新 WSL 本体,确认透传设备存在:

wsl --update   # 在 PowerShell 里执行
ls /dev/dxg    # WSL 内部——想用 GPU 它必须存在

/dev/dxg 在、Windows 驱动够新,WSL2 里的 Ollama 就像原生安装一样把层卸到 GPU。如果你想干脆跳过这层间接,Windows 版 Ollama 原生运行,不经过 WSL 也能看到 GPU。

Ollama 到底需不需要 GPU?

不需要——纯 CPU 运行功能完全一致,只是更慢,对小模型配快 CPU 来说完全可以接受。在 Apple Silicon 上这个问题直接消失:Metal 自动使用统一内存,唯一的限制是你愿意分给模型多少内存。

五分钟检查清单

症状可能原因修法
ollama ps 显示 100% CPU,NVIDIA 卡在位驱动对捆绑 CUDA 来说太旧更新驱动、重启机器、重启服务
100% CPU,Linux 上的 AMDrender/videousermod -aG render,video,重新登录
100% CPU,不受支持的 AMD 卡ROCm 拒绝该 gfx 目标HSA_OVERRIDE_GFX_VERSION=10.3.0
40%/60% CPU/GPU 拆分模型 + 上下文超出显存更小的量化或更短的 num_ctx
昨天 GPU,今天 CPU钉死的 OLLAMA_LLM_LIBRARY 或过旧驱动找到并删除该环境变量;更新驱动
原生跑 GPU,Docker 里 CPU容器启动时没带 GPU 参数--gpus=all(或 AMD 设备)重建

按这个顺序查:ollama ps 看状态,服务端日志看检测清单,然后对表。十有八九,日志里那行字早就告诉你该看哪一行了。

— mrsaynothing

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

Git revert vs reset:哪个才能保住你的提交历史?

喜欢这些文章?我的本职工作就是这样的工程。 雇用我