1. 问题复现

在 Ubuntu 环境下通过 Docker 部署 Ollama 后,虽然在 docker-compose.yml 中配置了 deploy.resources.reservations.devices,但在实际使用中发现:

  1. 显卡占用为 0:通过 nvidia-smi 观察到显存几乎没有波动。
  2. 推理速度极慢:原本应该秒出的回答变成了“逐字蹦床”。
  3. 日志报错
    • Ollama 日志显示:ggml_cuda_init: failed to initialize CUDA: no CUDA-capable device is detected
    • 容器内运行 nvidia-smi 报错:Failed to initialize NVML: Unknown Error

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:1bqwen2.5:1.5b
  • 验证方法:在对话时观察宿主机 nvidia-smi。若 GPU-Util 波动且 Processes 出现 ollama_llama_server,则说明调用成功。

4. 总结

排查 Ollama GPU 问题时,“重启就好”通常意味着环境配置不稳。通过锁定 Persistence Mode 和固定 Default Runtime,可以解决 90% 以上的“显卡失踪”问题。