ubuntu下让ollama强制使用cpu推理

Ollama 默认会优先使用系统里可用的 GPU 来做推理。

如果你的 Ubuntu 机器装了 NVIDIA 显卡,并且 Ollama 已经能正常调用 CUDA,那么直接执行 ollama run 时,通常会优先走 GPU。

但有些场景下,我们反而希望它强制只用 CPU,比如:

  • GPU 驱动不稳定,跑模型时容易报错
  • 想把 GPU 留给别的任务
  • 只是做功能测试,不关心推理速度
  • 服务器上的 GPU 显存比较紧张

这篇文章记录一下,在 Ubuntu 下如何让 Ollama 强制使用 CPU 推理,而不是继续使用默认 GPU。

一、先说结论

如果你只是想让某个模型在 Ubuntu + NVIDIA 的环境里临时改成 CPU 推理,不一定要去改服务环境变量。

更直接的方式是把该模型的 num_gpu 设为 0,也就是不往 GPU 分配任何层。

这篇文章保留两类方式:

  • 通过 API 调用时传 num_gpu: 0
  • ollama run 交互界面里执行 /set parameter num_gpu 0
  • 通过 systemd 配置,让 Ollama 长期默认走 CPU

二、临时强制使用 CPU

1. 在 API 调用里指定 num_gpu: 0

如果你是通过 Ollama 的 HTTP API 来加载模型,可以直接在请求里加上:

curl localhost:11434/api/generate -d '{"model":"llama3:latest","options":{"num_gpu":0}}'

如果模型只是被加载进内存,常见返回会类似这样:

{"model":"llama3:latest","created_at":"2024-09-25T10:06:21.362308925Z","response":"","done":true,"done_reason":"load"}

这表示模型已经按这次参数要求被加载好了。

接着可以用:

ollama ps

查看当前处理器分配情况,例如:

NAME                             ID              SIZE    PROCESSOR  UNTIL
llama3:latest 365c0bd3c000 4.3 GB 100% CPU Forever
qwen2:7b-instruct-q4_K_M f10f702d139e 5.4 GB 100% GPU Forever

这里最关键的是 PROCESSOR 一列。如果显示 100% CPU,说明当前这个模型实例没有使用 GPU 层。

2. 在 CLI 里设置 num_gpu 0

如果你平时更常用 ollama run,也可以直接在交互界面里设置参数。

先启动模型:

ollama run llama3:latest

进入交互界面后执行:

>>> /set parameter num_gpu 0
Set parameter 'num_gpu' to '0'

然后再正常提问:

>>> hello
Hello! It's nice to meet you. Is there something I can help you with, or would you like to chat?

退出后同样可以检查:

ollama ps

如果输出类似这样:

NAME                             ID              SIZE    PROCESSOR  UNTIL
llama3:latest 365c0bd3c000 4.3 GB 100% CPU Forever
qwen2:7b-instruct-q4_K_M f10f702d139e 5.4 GB 100% GPU Forever

那就说明 llama3:latest 这一份实例已经切到了 CPU,而其他模型仍然可以继续走 GPU。

三、通过 systemd 长期固定走 CPU

如果你的目标不是“只让某个模型临时走 CPU”,而是希望这台 Ubuntu 机器上的 Ollama 服务长期默认不用 NVIDIA GPU,那么还是应该改 systemd 配置。

这种方式和前面的 num_gpu 0 不一样,它影响的是整个 ollama 服务的默认行为。

1. 编辑 Ollama 服务 override

执行:

sudo systemctl edit ollama

然后写入:

[Service]
Environment="CUDA_VISIBLE_DEVICES=-1"
Environment="OLLAMA_LLM_LIBRARY=cpu_avx2"

这里的含义是:

  • CUDA_VISIBLE_DEVICES=-1:让 Ollama 看不到 NVIDIA GPU
  • OLLAMA_LLM_LIBRARY=cpu_avx2:明确优先使用 CPU 的 AVX2 LLM 库

如果你的 CPU 不支持 AVX2,也可以把它改成:

Environment="OLLAMA_LLM_LIBRARY=cpu_avx"

再不行就退到:

Environment="OLLAMA_LLM_LIBRARY=cpu"

2. 重载并重启服务

sudo systemctl daemon-reload
sudo systemctl restart ollama
sudo systemctl status ollama

这样之后,后续由这个 ollama 服务加载的模型,默认都会优先走 CPU。

四、怎么确认现在真的没有走 GPU

1. 用 ollama psPROCESSOR

这篇文章里最推荐的确认方式就是:

ollama ps

只要看到对应模型是:

100% CPU

基本就能确认它这次没有走 GPU。

2. 推理时再结合 nvidia-smi 观察

如果你的机器本来有 NVIDIA GPU,也可以在模型运行时另开一个终端观察:

nvidia-smi

如果没有看到 ollama 相关进程占用显存,通常就说明这次推理没有走 NVIDIA GPU。

五、几个容易踩坑的地方

1. num_gpu 0 只对当前加载方式生效

不管你是 API 里传:

"options":{"num_gpu":0}

还是在 CLI 里执行:

/set parameter num_gpu 0

它们本质上都是针对当前这次模型加载参数生效,不是把整个 Ollama 服务永久改成 CPU-only。

2. 其他模型还是可以继续走 GPU

这也是前面两种 num_gpu 0 方式的一个优点。

比如你让 llama3:latest 走 CPU,并不代表另外一个已经加载的 qwen2:7b-instruct-q4_K_M 也会自动切到 CPU。

所以 ollama ps 里可能会同时出现:

  • 一个模型显示 100% CPU
  • 另一个模型显示 100% GPU

3. 如果改的是 systemd,它影响的是整个服务

如果你用的是:

sudo systemctl edit ollama

那它就不是“只影响某个模型实例”了,而是会影响这个 ollama 服务后续加载出来的模型。

所以这两类方案要分清:

  • num_gpu 0:适合临时、按模型控制
  • systemd override:适合长期、按服务控制

4. CPU 推理速度明显变慢

这属于正常现象。

GPU 本来就是 Ollama 在 Linux 上更常见的高性能推理方式,强制切到 CPU 后,速度通常会明显下降,尤其是大模型。

如果你只是临时排查问题,可以先用小一点的模型测试,例如:

ollama run qwen3:0.6b

或者:

ollama run gemma3:1b

六、小结

在 Ubuntu 下,如果你的场景是 NVIDIA 显卡环境下强制让 Ollama 走 CPU,可以分成两类:

  1. 临时按模型控制:API 传 options.num_gpu = 0,或者 CLI 执行 /set parameter num_gpu 0
  2. 长期按服务控制:用 systemd override 配置 CUDA_VISIBLE_DEVICES=-1

前者更细粒度,适合临时测试;
后者更彻底,适合把整台机器上的 Ollama 默认固定成 CPU 推理。

参考文章