Ollama 不用显卡、只跑 CPU 怎么办:4 步排查,附 ollama ps 和日志实测(2026)
ollama ps 的 PROCESSOR 列写 100% CPU,就说明 Ollama 没用 GPU。4 步排查:确认、看 inference compute 日志、查 CUDA_VISIBLE_DEVICES 等变量、按原因修。CPU 机器上实测,GPU 修法来自官方文档。

先说结论:模型加载着的时候,跑一下 ollama ps,看 PROCESSOR 那一列。如果写的是 100% CPU,说明 Ollama 没找到能用的 GPU,或者你让它别用。接着看服务器日志开头:inference compute 那一行会写出 Ollama 选了哪个设备。常见原因有:显卡或驱动太旧或不支持、容器看不到 GPU、残留的 CUDA_VISIBLE_DEVICES=-1、模型比显存大。我在一台纯 CPU 的 Linux 机器上跑了 Ollama 0.40.15,下面的输出都是真实的。我没有 GPU 可测,所以 GPU 相关的修法来自 Ollama 官方文档,文中都有标明。
第 1 步:确认它真的在用 CPU
加载模型后,在另一个终端运行 ollama ps。官方 FAQ 对 PROCESSOR 列的解释是:
100% GPU:模型完全在显存里。100% CPU:模型完全在系统内存里。48%/52% CPU/GPU(FAQ 里的例子):模型被拆到两边。
我在纯 CPU 机器上用一个很小的测试模型得到的结果:
NAME ID SIZE PROCESSOR CONTEXT RUNNER UNTIL
tiny:latest 8cf91c7109e7 6.3 MB 100% CPU 2048 llamacpp 4 minutes from now
API 看到的也一样:curl localhost:11434/api/ps 对这个模型返回 "size_vram":0。完全在 GPU 上的模型应该返回非零的 size_vram;这一点我在这台机器上没法确认。
第 2 步:看服务器日志里的 “inference compute”
日志在哪取决于你怎么运行 Ollama,官方排错页列了:Mac 是 ~/.ollama/logs/server.log;用 systemd 的 Linux 用 journalctl -u ollama --no-pager --follow --pager-end;容器里用 docker logs <容器名>;手动运行 ollama serve 就看那个终端。
在我的纯 CPU 机器上,日志开头是这样:
msg="discovering available GPUs..."
msg="inference compute" id=cpu library=cpu compute="" name=cpu ... total="15.6 GiB" available="8.4 GiB"
msg="vram-based default context" total_vram="0 B" default_num_ctx=4096
library=cpu 就是线索。在找得到 GPU 的机器上,这一行应该写 GPU 的名字;这点我没法验证,因为这台机器没有 GPU。
想看更详细的信息,用 OLLAMA_DEBUG=1 启动服务。在我的机器上,调试日志显示了 CUDA 为什么被跳过:
load_backend: failed to load .../cuda_v12/libggml-cuda.so: libcuda.so.1: cannot open shared object file: No such file or directory
意思是没找到 NVIDIA 驱动库。在真正有显卡的机器上,同类的行会指向驱动问题。
第 3 步:检查有没有强制走 CPU 的环境变量
文档说,把 CUDA_VISIBLE_DEVICES(NVIDIA)、ROCR_VISIBLE_DEVICES(AMD)或 GGML_VK_VISIBLE_DEVICES(Vulkan)设成无效 ID(比如 -1)会强制使用 CPU。测试时设一次然后忘掉很容易。我实测了:
CUDA_VISIBLE_DEVICES=-1 OLLAMA_DEBUG=1 ollama serve
msg="user overrode visible devices" CUDA_VISIBLE_DEVICES=-1
msg="if GPUs are not correctly discovered, unset and try again"
Ollama 甚至会提示你取消这个变量。在 shell 里运行 env | grep -i -E "visible_devices|OLLAMA"(或者检查 systemd 单元、Docker 命令),看服务器实际拿到了什么。
第 4 步:按原因修(来自官方文档)
下面这些我没能在 GPU 上测试,内容来自硬件支持页和排错页。
NVIDIA
- 显卡需要计算能力 5.0 及以上,驱动版本 550 及以上。计算能力 5.0 到 6.2 的卡需要驱动 570 及以上。
- Linux 上睡眠唤醒之后,Ollama 可能丢失 GPU 并退回 CPU。文档建议重新加载 UVM 驱动:
sudo rmmod nvidia_uvm && sudo modprobe nvidia_uvm。 - 如果日志里出现 3、46、100、999 之类的错误码,文档建议:检查容器运行时、运行
sudo nvidia-modprobe -u、重新加载nvidia_uvm、重启、更新驱动。想要更多细节,设置CUDA_ERROR_LEVEL=50。
AMD
- Linux 上 Ollama 需要 AMD ROCm v7 驱动。旧的 ROCm 6 驱动可能让设备发现卡住直到超时,然后退回 CPU,日志里会出现
failure during GPU discovery。 - 你的用户可能需要加入
video或render组才能打开/dev/kfd。 - 对一些不受支持的显卡,文档介绍了
HSA_OVERRIDE_GFX_VERSION,例如给 RX 5400 设10.3.0。这是实验性做法,不保证有效。
Docker
- 先确认容器运行时正常:
docker run --gpus all ubuntu nvidia-smi。这条都不行的话,Ollama 也看不到 GPU。 - 如果 Ollama 一开始用 GPU、过一阵掉到 CPU,文档说要在
/etc/docker/daemon.json里加"exec-opts": ["native.cgroupdriver=cgroupfs"]。
模型比显存大
比显存大的模型会被拆开,ollama ps 会显示 48%/52% CPU/GPU 这样的混合比例。这是正常行为,不是故障。换个小一点的模型,或者缩小上下文窗口。参见 Ollama 上下文长度和显存计算器。
指定 Ollama 用哪块显卡
有多块 GPU 时,文档给了每个厂商一个变量:CUDA_VISIBLE_DEVICES(建议用 nvidia-smi -L 查到的 UUID,因为编号可能变)、ROCR_VISIBLE_DEVICES(用 rocminfo 查看)、Vulkan 用 GGML_VK_VISIBLE_DEVICES。要关掉 Vulkan,设置 OLLAMA_VULKAN=0。这些变量要设在服务器进程上,不是运行客户端的那个 shell。买卡之前可以先看跑大模型性价比最高的显卡和 RTX 4090 能跑多大的模型。
相关报错
更多 Ollama 和 llama.cpp 报错在报错清单里。如果日志写的是 “model requires more system memory”,看这篇。
常见问题
Ollama 会自动用 GPU 吗?
会,只要找到受支持的 GPU。文档描述了启动时的自动发现。Mac 上用 Metal 驱动苹果 GPU。
为什么小模型在 CPU 上还行,大模型就慢得要命?
CPU 的内存带宽比 GPU 小得多,模型一变大速度就掉得很快。我没在测试机上做基准测试,因为测试模型只有 6 MB。
我能故意强制用 CPU 吗?
能。像 CUDA_VISIBLE_DEVICES=-1 这样的无效 ID 就行,上面已经测过。
来源与测试说明
- Ollama 文档:硬件支持(
docs.ollama.com/gpu)、排错(docs.ollama.com/troubleshooting)、FAQ(docs.ollama.com/faq)。 - 自己实测:纯 CPU 的 Linux 上跑 Ollama 0.40.15,包括
ollama ps、/api/ps、启动日志、OLLAMA_DEBUG=1、CUDA_VISIBLE_DEVICES=-1。 - 没测:任何真实的 NVIDIA、AMD 或苹果 GPU、Docker GPU 直通、驱动修复、
HSA_OVERRIDE_GFX_VERSION。