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 会把比例亮给你。
三种缩小差距的办法,按代价从低到高:
- 更小的量化。从 Q8 降到 Q4,权重体积减半,质量代价温和。取舍细节在 GGUF 量化等级详解。
- 更短的上下文。
num_ctx主导 cache 大小。8 GB 的卡上开 32K 上下文,意味着大部分层留在 CPU。 - 更少的 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,也就是 render 和 video 组:
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 了?
更新会改变三样东西之一,按可能性排序:
- 钉死的后端库。
OLLAMA_LLM_LIBRARY强制指定 runner(cuda_v11、rocm,甚至cpu)。它是为调试准备的,会无声覆盖自动检测,而且在当初的理由被遗忘很久之后,还留在 shell 配置和 service 文件里。找到它,删掉它:
systemctl show ollama --property=Environment | grep -i llm_library
env | grep OLLAMA - 驱动落后于运行时。Ollama 升级捆绑更新的 CUDA 运行时;你的驱动不动,它就不动。修法同上面的驱动一节。
- 服务是容器,而参数没了。重建时没带 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 上的 AMD | 缺 render/video 组 | usermod -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.
what is this?Git revert vs reset:哪个才能保住你的提交历史?
喜欢这些文章?我的本职工作就是这样的工程。 雇用我