最近在 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                                                             |
+-----------------------------------------------------------------------------------------+

这说明:

  1. 驱动是正常的
  2. 系统能识别 GPU
  3. 当前没有别的进程占用显卡
  4. 显存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 用户已经在 videorender 组里
  • /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:模型完全跑 CPU
  • 100% 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?”

实际上排查下来,思路应该是:

  1. 先确认驱动是否正常
  2. 再确认 ollama 服务用户有没有权限访问 GPU
  3. 然后通过日志判断是“没识别到 GPU backend”还是“显存不够”
  4. 必要时重载 nvidia_uvm
  5. 最后重装最新版官方 Ollama 排除安装状态问题

最终我的机器已经成功切到了 GPU。


十四、给后来人的建议

如果你也遇到:

  • nvidia-smi 正常
  • ollama ps 却是 100% CPU

不要上来就怀疑模型太大,也不要只盯着显存容量。
先查日志、查 systemd 用户、查 GPU 设备访问权限。

很多时候,真正的问题不是“GPU 不够”,而是:

Ollama 根本没有成功启用 GPU backend。

需要考虑是不是要重装一下软件,反查之前的安装指令,是一模一样的,至于后来为什么不能用gpu了,还是一个迷。这台linux上qwen3.5:4b的模型是从另一台mac拷贝过来的,参见我另一篇博客,曾经怀疑是不是架构不一样,导致加载时回退,在这次重新安装解决之后,我又重新做了一次拷贝的操作,是没有影响的。
只能说,有时候很难解析,重启重装是一个保底的做法。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐