在 Docker 容器里挂载 GPU 后,nvidia-smi 有输出,但 Ollama 加载模型失败,是一个典型的“设备可用但运行环境不完整”的问题。nvidia-smi 只说明 NVIDIA 驱动和 GPU 设备节点被正确映射到容器中,它不保证容器里有和 Ollama 匹配的 CUDA 运行库。所以接下来不是反复重启容器,而是查日志、对比驱动版本。
nvidia-smi 可见只证明驱动和 GPU 设备已挂载,模型加载失败通常由驱动支持的 CUDA 版本与 Ollama 所需版本不一致导致。应先采集容器日志,再对比宿主机驱动版本、容器内驱动版本和 Ollama 使用的 CUDA 需求,确定方向后再决定升级驱动或调整 Ollama 镜像。
先区分“可见”和“可用”
nvidia-smi 的输出由 NVIDIA Container Toolkit 注入的 libnvidia-ml.so 提供,驱动程序本身来自宿主机,容器内显示的 Driver Version 通常与宿主机一致。Ollama 是独立程序,它有自己的 CUDA runtime 依赖。一个能跑 nvidia-smi 的容器,只表示驱动设备节点和用户态组件已经挂载,不代表 Ollama 依赖的 CUDA 库也能在同一驱动上正常加载。
模型加载时报的错,往往比 nvidia-smi 有无输出更接近根因。例如下面两类常见错误分别指向不同方向:no kernel image is available for execution on the device 指向驱动版本与 CUDA 架构不匹配;libcuda.so not found 指向容器内缺少 CUDA 库文件。所以要先把日志拿出来。
驱动版本对比的观察点
nvidia-smi 输出里的 Driver Version 和 CUDA Version 是两个不同概念。Driver Version 是宿主机内核模块驱动的版本;CUDA Version 是该驱动可以支持的最高 CUDA 运行时版本,不是当前容器实际使用的 CUDA 版本。Ollama 在加载模型时会调用自己编译期指定的 CUDA runtime,如果 runtime 要求的版本超过驱动支持的版本,就会失败。
在宿主机、容器内分别执行 nvidia-smi,并收集 Ollama 启动日志,构成一个三列对比:
# 宿主机
nvidia-smi
# 容器内
docker exec <容器名> nvidia-smi
# Ollama 日志,过滤 CUDA 和错误
docker logs <容器名> 2>&1 | grep -iE "cuda|error"| 检查位置 | 关键字段 | 判断用途 |
|---|---|---|
| 宿主机 nvidia-smi | Driver Version、CUDA Version | 确认驱动分支和驱动支持的上限 |
| 容器内 nvidia-smi | Driver Version | 确认 GPU 挂载是否完整,正常应与宿主机一致 |
| Ollama 启动日志 | error、CUDA | 区分是驱动兼容性还是容器缺库 |
典型失败定位步骤
- 查看宿主机 nvidia-smi 的 Driver Version 和 CUDA Version,记下数值。
- 查看容器内 nvidia-smi 的 Driver Version,确认和宿主机一致。如果不一致,说明挂载方式有问题,见第 5 步先修正挂载。
- 查看 Ollama 日志,定位第一次报错的位置和完整错误码。
- 如果错误是 no kernel image is available,说明驱动版本太旧,不支持 Ollama 二进制中使用的 CUDA 扩展。此时应先检查宿主机驱动是否可以升级。
- 如果错误是 missing libcuda.so 或 libnvidia-ml.so 加载失败,说明容器镜像内缺少对应的 CUDA 运行库,优先换用 Ollama 官方镜像,而不是升级宿主驱动。
可以用一个临时 CUDA 测试容器做交叉验证,把宿主机驱动与容器镜像解耦开来:
docker run `--rm` `--gpus` all nvidia/cuda:<替代为要验证的CUDA版本>-base nvidia-smi这条命令会加载一个指定 CUDA 标签的镜像并运行 nvidia-smi。如果能正常输出,说明宿主机驱动能支撑这个 CUDA 标签;如果输出为空或报错,问题先在驱动层。注意这个测试镜像比较大,按需清理,不要长时间保留。
处理方向与验证
如果判断是宿主驱动版本过低,优先升级宿主机 NVIDIA 驱动。升级前先确认需要支持的 CUDA 版本,以及操作系统内核和 Docker 环境是否满足新驱动的要求。升级完成后需要重启机器或至少重启 NVIDIA 相关服务,再重新安装或重启 NVIDIA Container Toolkit。这个操作可能影响宿主机上其他 GPU 任务,需要安排在维护窗口。
如果不方便升级驱动,可以尝试使用旧版 Ollama。旧版 Ollama 可能由较低版本 CUDA 编译,对宿主驱动要求更低。但这不是保证路径,需要结合当前镜像标签核查。
如果问题是容器镜像缺库,则优先改用官方镜像,并检查启动命令中的 `--gpus` all 是否完整。官方镜像通常已经带齐 CUDA 相关依赖,但仍依赖宿主驱动。
验证最终是否解决,不要只看 nvidia-smi。用一个极小模型跑一次加载和生成,确认日志中没有 CUDA 相关报错。示例:
docker run `--rm` `--gpus` all ollama/ollama run <一个小模型>如果模型成功加载并输出文字,说明驱动版本和 CUDA 库之间的配合已经满足 Ollama 的要求。