Ollama 显卡权限避坑指南:为什么开放了 GPU 权限还是在跑 CPU?
1. 问题复现
在 Ubuntu 环境下通过 Docker 部署 Ollama 后,虽然在 docker-compose.yml 中配置了 deploy.resources.reservations.devices,但在实际使用中发现:
- 显卡占用为 0:通过
nvidia-smi观察到显存几乎没有波动。 - 推理速度极慢:原本应该秒出的回答变成了“逐字蹦床”。
- 日志报错:
- Ollama 日志显示:
ggml_cuda_init: failed to initialize CUDA: no CUDA-capable device is detected。 - 容器内运行
nvidia-smi报错:Failed to initialize NVML: Unknown Error。
- Ollama 日志显示:
2. 核心原因分析
经过深度排查,问题主要集中在以下三个层面:
A. 容器运行时(Runtime)未握手
虽然 Docker 安装了 nvidia-container-toolkit,但如果没有修改 Docker 的全局配置 daemon.json,Docker 默认使用 runc 运行时。这导致容器虽然申请了 GPU 权限,但无法正确挂载宿主机的驱动库。
B. 驱动掉线与休眠(Persistence Mode)
对于像 RTX A400 这样的小型专业卡,如果没有显示器连接或长时间无任务,驱动可能会进入深度休眠或复位状态,导致容器内的通信链路断开。
C. 显存溢出的自动回退
显存容量(如 A400 的 4GB)远小于模型所需显存(如 Gemma 4 约 10GB)。当 Ollama 发现 GPU 塞不下模型时,会触发保护机制,自动将所有模型层(Layers)回退到 CPU 运行。
3. 终极排查与解决方案
第一步:开启显卡持久化模式(解决驱动掉线)
在宿主机执行命令,确保驱动始终保持加载状态:
sudo nvidia-smi -pm 1
建议将其加入 crontab 启动项:@reboot /usr/bin/nvidia-smi -pm 1
第二步:配置 Docker 默认运行时
编辑宿主机的 /etc/docker/daemon.json,确保包含以下关键配置:
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"args": []
}
}
}
注意: 配置完成后必须重启 Docker:sudo systemctl restart docker。
第三步:Docker Compose 配置规范
确保你的 deploy 字段配置准确,以便 Docker 正确分配设备。
services:
ollama:
image: ollama/ollama:latest
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
第四步:量力而行(模型选择)
针对 4GB 显存的显卡,避免运行大参数模型。
- 推荐测试模型:
llama3.2:1b或qwen2.5:1.5b。 - 验证方法:在对话时观察宿主机
nvidia-smi。若GPU-Util波动且Processes出现ollama_llama_server,则说明调用成功。
4. 总结
排查 Ollama GPU 问题时,“重启就好”通常意味着环境配置不稳。通过锁定 Persistence Mode 和固定 Default Runtime,可以解决 90% 以上的“显卡失踪”问题。
- 感谢你赐予我前进的力量

