Ollama 明明装了 NVIDIA 显卡,却一直跑 CPU?一次完整排查记录
最近在 Linux 机器上部署 Ollama,本来机器有一张 NVIDIA RTX 3050 6GB,而且 nvidia-smi 也是正常的,但奇怪的是,运行模型时 ollama ps 一直显示:
PROCESSOR 100% CPU
按理说这台机器应该能跑到 GPU。最后经过一轮完整排查,问题解决了,模型成功切换到 GPU。
这篇文章把整个过程记录下来,尤其是排查中用到的命令,挺值得收藏。
一、问题现象
执行:
ollama ps
输出类似:
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3.5:4b 2a654d98e6fb 5.8 GB 100% CPU 4096 4 minutes from now
说明当前模型完全跑在 CPU 上,没有 offload 到 GPU。
而这台机器明明有 NVIDIA 显卡,理论上应该优先走 GPU。
二、先看最直观的 GPU 状态
第一步先确认系统层面显卡是不是好的:
nvidia-smi
我的输出大致是:
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.126.09 Driver Version: 580.126.09 CUDA Version: 13.0 |
| 0 NVIDIA GeForce RTX 3050 9MiB / 6144MiB |
+-----------------------------------------------------------------------------------------+
| Processes: |
| No running processes found |
+-----------------------------------------------------------------------------------------+
这说明:
- 驱动是正常的
- 系统能识别 GPU
- 当前没有别的进程占用显卡
- 显存6144M目前只用了9M,也说明没有人在用。
所以问题不是“显卡坏了”或者“驱动没装”。
三、怎么查看 Ollama 日志
Linux 下我这是 systemd 方式安装的 Ollama,可以这样看日志:
journalctl -u ollama --no-pager --follow
或者先看最近 200 行:
journalctl -u ollama -n 200 --no-pager
为了更快定位 GPU 相关信息,可以直接 grep:
journalctl -u ollama -n 200 --no-pager | grep -Ei "cuda|nvidia|gpu|offload|memory"
我当时在日志里看到的关键信息是:
system CPU.0.LLAMAFILE=1
offloading 0 repeating layers to GPU
offloaded 0/33 layers to GPU
model weights device=CPU
kv cache device=CPU
compute graph device=CPU
这几行非常关键,基本可以直接判断:
Ollama 当前没有成功启用 GPU backend,而不是“只用了部分 GPU”。
也就是说,它不是“显存不够所以退了一部分到 CPU”,而是从一开始就走了 CPU 路径。
四、先判断是不是显卡被别人占用了
很多人第一反应会怀疑:是不是同事在占 GPU?
这个除了前面的方法外,还有一个监控不断输出的方法:
watch -n 1 nvidia-smi
如果有别人占用,一般会看到:
- 显存被占掉
Processes里出现 PID 和进程名- GPU-Util 不是 0
我这里一直是:
Memory-Usage: 9MiB / 6144MiB
GPU-Util: 0%
Processes: No running processes found
说明不是别人占用 GPU 的问题。
五、确认 Ollama 服务是以谁的身份运行
查看 systemd 服务配置:
systemctl cat ollama
输出:
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
这个信息非常重要。
说明 Ollama 不是用当前登录用户运行,而是用系统用户 ollama 在运行。
所以这里需要注意,权限有可能不一致,我自己的 nvidia-smi 正常,不代表 ollama 这个用户也能正常访问 GPU。
六、检查 ollama 用户是否有权限访问 GPU
先看用户组:
id ollama
groups ollama
然后看 GPU 设备权限:
ls -l /dev/nvidia*
再直接用 ollama 用户测试:
sudo -u ollama nvidia-smi
我这里的结果是:
ollama用户已经在video和render组里/dev/nvidia*设备权限正常sudo -u ollama nvidia-smi也能成功执行
这说明:
不是 ollama 用户权限不够导致的。
如果你这里失败了,可以尝试(一般按本文最后介绍的正常安装会自动加入,无需额外执行):
sudo usermod -aG video ollama
sudo usermod -aG render ollama
sudo systemctl restart ollama
七、怀疑是不是装成了 CPU 版 Ollama
因为日志里一直是 CPU backend,我一度怀疑当前 /usr/local/bin/ollama 是不是 CPU-only 版本。
先看二进制路径和版本:
which ollama
ls -l /usr/local/bin/ollama
/usr/local/bin/ollama --version
再看二进制里是否包含 CUDA 相关符号:
strings /usr/local/bin/ollama | grep -Ei "cuda|cublas|nvidia" | head -n 30
结果里面确实有很多 CUDA 相关字符串,比如:
CUDA_PATH
CUDA_HOME
GGML_CUDA_INIT
cudaMalloc failed
mlx_cuda_is_available
说明这个二进制并不是纯 CPU 版。
所以问题进一步缩小到:
Ollama 二进制带有 CUDA 支持,但运行时没有成功把 CUDA backend 初始化起来。
八、尝试重载 NVIDIA UVM 模块
这一步很有价值,很多时候 NVIDIA 驱动本身没坏,但 UVM 状态有问题,会导致上层程序探测不到 GPU。
操作如下:
sudo systemctl stop ollama
sudo rmmod nvidia_uvm
sudo modprobe nvidia_uvm
sudo systemctl start ollama
然后再测试:
ollama run qwen3.5:4b "hi"
ollama ps
这一步建议一定要记住。
九、重装最新版官方 Ollama
虽然我最初的 Ollama 也是官方安装的,但为了排除旧版本或安装状态问题,还是决定重新安装一遍最新版。
1)停止服务并备份旧二进制
sudo systemctl stop ollama
sudo cp /usr/local/bin/ollama /usr/local/bin/ollama.bak
2)执行官方安装脚本
curl -fsSL https://ollama.com/install.sh | sh
安装过程里,我看到了这些提示:
>>> Cleaning up old version at /usr/local/lib/ollama
>>> Installing ollama to /usr/local
>>> Downloading ollama-linux-amd64.tar.zst
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
>>> NVIDIA GPU installed.
这说明安装脚本已经检测到本机有 NVIDIA GPU。
十、重装完成后如何验证是否真的切到 GPU
这是最关键的验证步骤。
1)看版本
ollama --version
2)运行一个模型
ollama run qwen3.5:4b "hi"
3)看当前 processor
ollama ps
如果成功,你应该能看到类似:
ollama ps
NAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3.5:4b 2a654d98e6fb 6.3 GB 30%/70% CPU/GPU 4096 4 minutes from now
至少不是 100% CPU。
4)同时观察显卡状态
watch -n 1 nvidia-smi
如果成功跑到 GPU,通常会看到:
Processes里出现 Ollama 相关进程- 显存使用量上升
- GPU-Util 有波动
十一、这次排查的关键结论
这次问题最后解决了,模型已经切到 GPU。
回头总结,几个结论特别重要。
1)nvidia-smi 正常,不等于 Ollama 一定能用 GPU
这只能说明系统驱动正常,不能说明 Ollama 运行时已经成功启用 CUDA backend。
2)ollama ps 是最直接的判断依据
ollama ps
这个命令非常实用:
100% CPU:模型完全跑 CPU100% GPU:模型完全跑 GPU- 部分 GPU:说明只 offload 了一部分层
3)日志比猜测更重要
查看日志:
journalctl -u ollama -n 200 --no-pager
如果看到:
offloaded 0/33 layers to GPU
model weights device=CPU
kv cache device=CPU
就说明根本没上 GPU。
4)要区分“没识别到 GPU”和“显存不够”
这两种情况很容易混淆。
如果是显存不够,一般前提是 Ollama 先识别到了 GPU,然后只 offload 一部分层。
如果是完全没识别到 GPU backend,日志会更像我这次这样,直接全走 CPU。
5)sudo -u ollama nvidia-smi 很值得记
因为 systemd 下 Ollama 不是以你当前用户运行,而是以 ollama 用户运行,所以这个命令能快速判断:
sudo -u ollama nvidia-smi
如果这个命令都不通,那问题多半就是权限。
十二、我这次实际用到的排查命令汇总
建议直接收藏。
GPU 基础检查
nvidia-smi
watch -n 1 nvidia-smi
nvidia-smi pmon -s um
查看 Ollama 状态
ollama ps
ollama --version
ollama run qwen3.5:4b "hi"
查看 systemd 服务配置
systemctl cat ollama
systemctl status ollama
查看 Ollama 日志
journalctl -u ollama --no-pager --follow
journalctl -u ollama -n 200 --no-pager
journalctl -u ollama -n 200 --no-pager | grep -Ei "cuda|nvidia|gpu|offload|memory"
查看服务用户权限
id ollama
groups ollama
ls -l /dev/nvidia*
sudo -u ollama nvidia-smi
修复 GPU 模块状态
sudo systemctl stop ollama
sudo rmmod nvidia_uvm
sudo modprobe nvidia_uvm
sudo systemctl start ollama
检查 Ollama 二进制
which ollama
ls -l /usr/local/bin/ollama
/usr/local/bin/ollama --version
strings /usr/local/bin/ollama | grep -Ei "cuda|cublas|nvidia" | head -n 30
重装官方 Ollama
sudo systemctl stop ollama
sudo cp /usr/local/bin/ollama /usr/local/bin/ollama.bak
curl -fsSL https://ollama.com/install.sh | sh
sudo systemctl daemon-reload
sudo systemctl restart ollama
十三、最终总结
这次问题表面上看是:
“明明装了 NVIDIA 显卡,为什么 Ollama 还是跑 CPU?”
实际上排查下来,思路应该是:
- 先确认驱动是否正常
- 再确认
ollama服务用户有没有权限访问 GPU - 然后通过日志判断是“没识别到 GPU backend”还是“显存不够”
- 必要时重载
nvidia_uvm - 最后重装最新版官方 Ollama 排除安装状态问题
最终我的机器已经成功切到了 GPU。
十四、给后来人的建议
如果你也遇到:
nvidia-smi正常ollama ps却是100% CPU
不要上来就怀疑模型太大,也不要只盯着显存容量。
先查日志、查 systemd 用户、查 GPU 设备访问权限。
很多时候,真正的问题不是“GPU 不够”,而是:
Ollama 根本没有成功启用 GPU backend。
需要考虑是不是要重装一下软件,反查之前的安装指令,是一模一样的,至于后来为什么不能用gpu了,还是一个迷。这台linux上qwen3.5:4b的模型是从另一台mac拷贝过来的,参见我另一篇博客,曾经怀疑是不是架构不一样,导致加载时回退,在这次重新安装解决之后,我又重新做了一次拷贝的操作,是没有影响的。
只能说,有时候很难解析,重启重装是一个保底的做法。
更多推荐
所有评论(0)