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 |
这里最关键的是 PROCESSOR 一列。如果显示 100% CPU,说明当前这个模型实例没有使用 GPU 层。
2. 在 CLI 里设置 num_gpu 0
如果你平时更常用 ollama run,也可以直接在交互界面里设置参数。
先启动模型:
ollama run llama3:latest |
进入交互界面后执行:
>>> /set parameter num_gpu 0 |
然后再正常提问:
>>> hello |
退出后同样可以检查:
ollama ps |
如果输出类似这样:
NAME ID SIZE PROCESSOR UNTIL |
那就说明 llama3:latest 这一份实例已经切到了 CPU,而其他模型仍然可以继续走 GPU。
三、通过 systemd 长期固定走 CPU
如果你的目标不是“只让某个模型临时走 CPU”,而是希望这台 Ubuntu 机器上的 Ollama 服务长期默认不用 NVIDIA GPU,那么还是应该改 systemd 配置。
这种方式和前面的 num_gpu 0 不一样,它影响的是整个 ollama 服务的默认行为。
1. 编辑 Ollama 服务 override
执行:
sudo systemctl edit ollama |
然后写入:
[Service] |
这里的含义是:
CUDA_VISIBLE_DEVICES=-1:让 Ollama 看不到 NVIDIA GPUOLLAMA_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 |
这样之后,后续由这个 ollama 服务加载的模型,默认都会优先走 CPU。
四、怎么确认现在真的没有走 GPU
1. 用 ollama ps 看 PROCESSOR
这篇文章里最推荐的确认方式就是:
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:适合临时、按模型控制systemdoverride:适合长期、按服务控制
4. CPU 推理速度明显变慢
这属于正常现象。
GPU 本来就是 Ollama 在 Linux 上更常见的高性能推理方式,强制切到 CPU 后,速度通常会明显下降,尤其是大模型。
如果你只是临时排查问题,可以先用小一点的模型测试,例如:
ollama run qwen3:0.6b |
或者:
ollama run gemma3:1b |
六、小结
在 Ubuntu 下,如果你的场景是 NVIDIA 显卡环境下强制让 Ollama 走 CPU,可以分成两类:
- 临时按模型控制:API 传
options.num_gpu = 0,或者 CLI 执行/set parameter num_gpu 0 - 长期按服务控制:用
systemdoverride 配置CUDA_VISIBLE_DEVICES=-1
前者更细粒度,适合临时测试;
后者更彻底,适合把整台机器上的 Ollama 默认固定成 CPU 推理。
参考文章