Ollama 只使用 CPU 不使用 GPU:分平台排查与恢复步骤

根据 Ollama 官方文档,使用 ollama ps、服务日志、nvidia-smi、Docker GPU 验证和 AMD 设备权限逐层定位 CPU 回退,并给出恢复与验收步骤。

本地跑大模型时,最让人困惑的一类问题就是:机器明明有显卡,Ollama 却还是主要吃 CPU,速度也慢得离谱。

先说结论,这类问题通常不是单一原因。最常见的几类分别是:

  • Ollama 根本没有识别到可用 GPU
  • 驱动、ROCmCUDA 环境没装对
  • Ollama 服务启动时没有继承正确环境变量
  • 模型太大,实际已经退回到 CPUCPU/GPU 混合加载
  • AMD 平台存在额外兼容性问题,比如 ROCm 版本、gfx 代号或设备可见性设置不对

下面按最省时间的顺序排查。

1. 先确认是不是“真的没用 GPU”

最直接的方法是看:

1
ollama ps

重点看 PROCESSOR 列:

  • 100% GPU:当前模型权重全部加载到 GPU;
  • 100% CPU:权重完全在系统内存中;
  • 48%/52% CPU/GPU 一类结果:模型部分 offload 到 GPU,剩余部分留在 CPU 内存。

这个百分比描述的是模型加载位置,不等于瞬时 GPU 利用率。生成间隙里任务管理器可能显示较低利用率,但权重仍然驻留在显存。

如果你看到的是 100% CPU,后面就该重点查环境和服务配置。
如果看到的是混合加载,那不一定是“显卡没生效”,更可能是显存不够。

2. 先排除最常见的误区:模型装不进显存

很多人以为只要装了 GPU,Ollama 就一定会全显卡推理。实际上不是。

如果模型太大、上下文太长,或者机器上已经有别的模型占着显存,Ollama 很可能会退回到:

  • 部分 GPU + 部分 CPU
  • 直接 100% CPU

这时候可以先做两个最简单的验证:

  1. 换一个更小的模型测试
    比如先用 4B7B 这类小模型,而不是一上来就跑更大的参数量。
  2. 卸载其他已加载模型后再试
    先看 ollama ps,确认没有别的模型占着显存。

如果小模型能上 GPU,大模型不行,问题往往就不在驱动,而在显存容量。

3. 检查显卡驱动和底层环境是不是可用

如果连小模型都只能跑 CPU,下一步就该看底层环境。

NVIDIA 方向

先确认驱动正常,系统能看到显卡。常见检查方式包括:

1
nvidia-smi

如果这里都报错,Ollama 基本不可能正常使用 GPU。

AMD / ROCm 方向

如果你是 AMD GPU,尤其是 ROCm 环境,重点先看:

1
2
rocminfo
rocm-smi

如果这些工具都不能正常列出设备,说明问题还在 Ollama 之前,先不要继续折腾应用层。

对 AMD 来说,最常见的问题不是“有没有装驱动”,而是:

  • ROCm 版本和系统版本不匹配
  • 当前 GPU 架构支持不完整
  • 设备虽然存在,但运行环境没有正确暴露给 Ollama

4. 重启 Ollama 服务,不要只重开终端

这是非常高频的坑。

很多人装完驱动、改完环境变量、补完 ROCm 之后,只是重新开了一个终端,然后直接继续 ollama run。但如果 Ollama 是以后台服务方式运行,它很可能还在用旧环境。

所以更稳的做法是:

  • 完整重启 Ollama 服务
  • 必要时直接重启系统

如果你是在 Linux 上以服务方式运行,通常要确认服务进程已经重新拉起,而不是沿用之前的旧进程。

5. 检查服务环境变量有没有真正传进去

这一步在 AMD ROCm 环境尤其重要。

有些机器在终端里手动执行命令没问题,但 Ollama 服务还是只跑 CPU,原因是服务进程没有拿到你在 shell 里设置的变量。

常见需要关注的变量包括:

1
2
ROCR_VISIBLE_DEVICES
HSA_OVERRIDE_GFX_VERSION

其中:

  • ROCR_VISIBLE_DEVICES 用来限制或指定 ROCm 能看到哪些 GPU
  • HSA_OVERRIDE_GFX_VERSION 常见于某些 AMD 平台兼容性处理

如果你只是在当前终端里临时 export 了变量,但 Ollama 是 systemd、桌面后台服务或其他守护进程启动的,这些变量未必会生效。

也就是说,终端里“看起来已经设置好了”,不代表 Ollama 真的拿到了。

6. AMD 平台重点看 ROCm 兼容性

从公开页面信息看,这个问题对应的视频主题本身就落在 AMD Max+ 395strix haloAMD ROCm 这条线上。
这类环境里,Ollama 不走 GPU,往往比 NVIDIA 平台更依赖版本匹配。

可以优先排查下面几项:

  1. ROCm 版本是否适合当前系统和当前显卡
  2. 当前 GPU 是否属于 ROCm 支持较好的架构范围
  3. 是否需要补 HSA_OVERRIDE_GFX_VERSION
  4. 是否是旧版 Ollama 或旧版底层推理库导致兼容问题

如果你已经确认 rocminfo 正常、GPU 也能被系统识别,但 Ollama 仍然只跑 CPU,那大概率要回到版本组合上重新检查,而不是继续盲目调模型参数。

7. Docker、WSL 或远程环境要额外检查设备映射

如果你不是直接在裸机跑,而是在下面这些环境里运行:

  • Docker
  • WSL
  • 远程容器
  • 虚拟化环境

那还要多看一层:GPU 设备有没有真正暴露进去。

典型现象是:

  • 宿主机能看到 GPU
  • 容器里 Ollama 却只能跑 CPU

这时要先确认不是 Ollama 本身的问题,而是容器或子系统根本没拿到 GPU 访问权限。

8. 最后再看日志,而不是一开始就瞎猜

如果前面都查过了,最有效的做法不是继续反复重装,而是直接看 Ollama 启动日志和运行日志。

重点看两类信息:

  • 有没有识别到 GPU
  • 有没有出现驱动、库加载、设备初始化失败之类的报错

只要日志里明确出现类似“未找到兼容 GPU”或“初始化 ROCm/CUDA 失败”,排查方向就会立刻清晰很多。

分平台读取真实日志

Windows

先完全退出托盘中的 Ollama,再以调试模式启动:

1
2
$env:OLLAMA_DEBUG="1"
& "ollama app.exe"

安装版日志通常位于:

1
%LOCALAPPDATA%\Ollama\server.log

可以直接打开目录:

1
explorer $env:LOCALAPPDATA\Ollama

Linux systemd

1
2
sudo systemctl restart ollama
sudo journalctl -u ollama --since "10 minutes ago" --no-pager

NVIDIA 设备发现失败时,再检查:

1
2
3
nvidia-smi
lsmod | grep nvidia_uvm
sudo dmesg | grep -iE 'nvrm|nvidia'

官方排错文档列出的典型 CUDA 错误包括未初始化、设备不可用、没有设备和未知错误。日志出现这些信息时,方向是驱动、UVM 模块或容器运行时,不是模型提示词。

Docker

先证明容器运行时能够看到 GPU:

1
docker run --rm --gpus all ubuntu nvidia-smi

这个命令失败时,Ollama 容器也无法使用 NVIDIA GPU。先修复 NVIDIA Container Toolkit 或 Docker 配置,再重启 Ollama 容器。

Linux AMD

检查 Ollama 服务用户能否访问 /dev/kfd/dev/dri

1
2
ls -lnd /dev/kfd /dev/dri /dev/dri/*
id ollama

需要调试 ROCm 发现过程时:

1
AMD_LOG_LEVEL=3 OLLAMA_DEBUG=1 ollama serve

如果日志出现 GPU discovery 超时,同时系统仍使用 ROCm 6.x 或更早驱动,应按 Ollama 当前硬件文档升级到兼容的 ROCm 7 驱动并重启。不要用 HSA_OVERRIDE_GFX_VERSION 掩盖明确的驱动版本错误。

修复后的验收

修复后至少完成一次冷启动验证:

1
2
3
ollama stop <模型名>
ollama run <模型名> "只回复 READY"
ollama ps

同时观察 nvidia-smirocm-smi 或系统 GPU 监视器。验收结论按 ollama psPROCESSOR 列记录:

  • 100% GPU:模型完整加载到 GPU;
  • 100% CPU:仍完全使用系统内存;
  • CPU/GPU:混合加载,通常需要继续判断是否因为显存容量不足。

最后重新查看服务日志,确认没有新的设备发现失败。仅看到 GPU 利用率瞬时升高,不足以证明模型始终在 GPU 上。

恢复与回滚

如果修改环境变量后 Ollama 无法启动,先撤销本轮新增变量并重启服务。不要一次同时修改驱动、容器映射、ROCm 版本和 Ollama 配置,否则无法判断哪个改动生效。

建议每轮只做一个改动,并保存三项证据:修改前日志、修改命令、修改后的 ollama ps。升级驱动前创建系统还原点或保留可回退的驱动安装包。

排查顺序

如果你只想记最短路径,可以按这个顺序来:

  1. ollama ps 看现在到底是 GPUCPU 还是混合加载
  2. 换一个更小的模型,排除显存不够
  3. nvidia-smirocminforocm-smi 先确认底层环境正常
  4. 完整重启 Ollama 服务
  5. 检查服务环境变量,尤其是 AMD 的 ROCR_VISIBLE_DEVICESHSA_OVERRIDE_GFX_VERSION
  6. 如果是 Docker / WSL,再检查设备映射
  7. 最后看日志定位具体报错

官方资料