Ollama 不用 GPU——五种原因,以及点名它们的日志
模型加载期间,ollama ps 会打出 PROCESSOR 一列——这一列就是全部诊断。服务器日志会点名实际找到的硬件;原因只有五种左右,修法表格在下面。
100% GPU —— GPU 没问题,不必往下读.
40%/60% CPU/GPU split——没挤进显存,换更小的量化。
100% CPU — 没找到可用的 GPU:驱动过旧、缺 render/video 组(AMD)、被钉死的 OLLAMA_LLM_LIBRARY,或没有 GPU 参数的容器。
两条命令
# in one terminal: load a model
ollama run llama3.2 "hello"
# in another: see where it runs
ollama ps
NAME ID SIZE PROCESSOR UNTIL
llama3.2:latest a80c4de17cd9 3.3 GB 100% GPU 4 minutes from now
然后读服务器日志,它 点名 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 兜底的信息收尾——问题找到了。检测 只在启动时发生一次,不随每次请求——任何修法之后都要 sudo systemctl restart ollama 再复查。
修法表
按顺序查原因——十有八九,日志行已经告诉你在哪一行了:
| 症状 | 可能的原因 | 修法 |
|---|---|---|
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 split | 模型 + 上下文超出显存 | 更小的量化或更短的 num_ctx |
| 昨天 GPU 干活,今天 CPU | 钉死了 OLLAMA_LLM_LIBRARY 或驱动过时 | 找到并删掉该环境变量;更新驱动 |
| 本机 GPU,Docker 里却是 CPU | 容器启动时没带 GPU 参数 | 用 --gpus=all(或 AMD 的 devices)重建 |
NVIDIA:是驱动,不是 CUDA
常见的元凶是 驱动,不是 CUDA。Ollama 自带 CUDA 运行库,不需要 CUDA toolkit——但自带的运行库需要一个够新的驱动跟它对话。跑得起来的 nvidia-smi并不算 证明:只能证明存在一个驱动,不能证明它够新。
nvidia-smi --query-gpu=driver_version --format=csv,noheader
# Debian/Ubuntu family
sudo apt install nvidia-driver-570
# Arch family
sudo pacman -S nvidia
# then re-detect:
sudo systemctl restart ollama
verify: journalctl -u ollama --no-pager | grep -i "inference compute" → library=CUDA
SPLIT:部分卸载是算术题,不是 bug
模型权重 加 KV 缓存必须同时挤进显存。同一个模型,上下文更长——缓存长过卡面,剩下的溢到 CPU:
三种收官差距的办法,最便宜的先来:更小的量化(Q8 → Q4 把权重砍半,质量代价不大);更短的上下文 (num_ctx 主导缓存大小——8 GB 卡上跑 32K 意味着大部分层留在 CPU);以及 更少的 GPU 层 —— num_gpu 选项封住卸载上限,把它设到层数以下就必然 split。若有人把它写进了 Modelfile 或 API 调用,解掉它。还有一个陷阱:100% GPU 但依然慢——模型可能在系统内存里换进换出;把 ollama ps SIZE 和你的真实显存对一对。
Linux 上的 AMD:三件可核对的事
1. 二进制里有 ROCm ——官方安装脚本自带。确认服务器检测到了什么:journalctl -u ollama --no-pager | grep -iE "rocm|inference compute".
2. 组员身份 ——运行库要求 /dev/kfd + /dev/dri,也就是这些组:render/video:
sudo usermod -aG render,video $USER
# log out and back in, then:
sudo systemctl restart ollama
缺组是「Ollama 在 Ubuntu 上不用 GPU」这类帖子在各论坛上最常见的原因——驱动从来不是问题.
3. 受支持的 GPU——或者一个绕道。 不受支持的 RDNA2 消费卡(gfx1031, gfx1032)即使 ROCm 全家健在也过不了检测。标准绕道是伪装成受支持的卡:sudo systemctl edit ollama,然后:
[Service]
Environment="HSA_OVERRIDE_GFX_VERSION=10.3.0"
再重启。不受支持但是被广泛用着——若表现不对劲,撤掉它。Windows 上 AMD 支持更窄;先看 Ollama 的支持 GPU 清单,再断定安装坏了。
verify: journalctl -u ollama --no-pager | grep -iE "rocm|inference compute" → 你的 gfx 目标被列出
「昨天还能跑」
升级改动的是以下三件事之一,按概率排序:
- 被钉死的后端运行库。
OLLAMA_LLM_LIBRARY强制指定一个 runner(cuda_v11,rocm,甚至cpu),而它 无声地压过自动检测。这是调试开关,会在 shell 配置和服务文件里长期驻留,久到把当初设它的原因都忘了。找到它:systemctl show ollama --property=Environment | grep -i llm_library和env | grep OLLAMA——然后删掉。 - 驱动落后于运行库。 Ollama 升级自带更新的 CUDA 运行库;你的驱动不动它就不动。修法与驱动一节相同。
- 服务被装进了容器,参数丢了。 没带 GPU 参数重建的 Docker 容器就是 CPU-only 容器——带上
--gpus=all(或 AMD 的 device 参数)重建。
五种原因到此为止 · 未取任何远程内容 · 全程本地