ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu配置NVIDIA驱动让Ollama跑满GPU:从驱动到显存调度全指南

Ubuntu配置NVIDIA驱动让Ollama跑满GPU:从驱动到显存调度全指南 每次群里有人发同样的截图我都能猜到问题的根源ollama ps里模型状态明明正常但nvidia-smi那边 GPU 利用率纹丝不动CPU 却直接拉满。这个现象在 Ubuntu 上新装 Ollama 的用户里特别常见。说白了不是 Ollama 装错了而是 NVIDIA 驱动这一层根本没打通Ollama 的 CUDA 后端找不到可用设备只能默默切回 CPU 推理。这篇文章要解决的就是这条完整链路Ubuntu 配置 NVIDIA 显卡驱动让 Ollama 把模型真正跑进显存。我会从驱动为什么总装不上讲起到nvidia-smi正常输出再到 Ollama 的显存调度机制、低显存怎么把模型“塞”进去最后是内核更新、Docker 容器、驱动升级这几个最容易让配置失效的场景。无论你是 8GB 入门卡还是 24GB 大显存卡这套流程可以直接照抄。1. 驱动装不上的三个隐藏原因Nouveau、Secure Boot 和版本选择1.1 Nouveau默认开源驱动为什么必须禁用Ubuntu 安装时默认不会加载 NVIDIA 闭源驱动而是先用一个叫 Nouveau 的开源驱动顶着。它对老显卡的支持还算能用但到了 RTX 时代就完全不是性能差那么简单了——很多卡用 Nouveau 连待机功耗都压不住渲染画面也经常出问题。更麻烦的是Nouveau 和 NVIDIA 官方驱动在设备绑定上是冲突的两者都想去驱动同一块 GPU但内核最终只能加载一个。如果你在 Nouveau 没被禁用的系统里强行装了 NVIDIA 驱动重启后大概率出现 NVIDIA 模块加载失败nvidia-smi直接报错。检查当前是否在用 Nouveaulsmod | grep nouveau只要有输出就说明 Nouveau 还活着。禁用方法如下sudo bash -c echo blacklist nouveau /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo bash -c echo options nouveau modeset0 /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo update-initramfs -u然后重启。需要说明的是用ubuntu-drivers或apt安装驱动时安装脚本一般会自动处理 Nouveau 的 blacklist但如果你选择去 NVIDIA 官网下载.run文件手动安装这步漏掉后面就是连环坑。1.2 Secure Boot安装成功了却加载不上的元凶很多人用 APT 装完驱动重启后发现nvidia-smi报错或者干脆提示command not found。这时候最容易被忽略的就是 Secure Boot。Secure Boot 开启时内核只加载有合法签名的内核模块。NVIDIA 的 apt 包在安装时会通过 DKMS 自动编译模块并生成一个签名请求。但签名密钥需要你手动“注册”这个动作发生在重启后的蓝色 MOKMachine Owner Key管理界面里。如果你没注意直接跳过去了模块永远签不了名驱动自然加载不了。先检查状态mokutil --sb-state如果输出SecureBoot enabled那安装完驱动后重启时要留意屏幕上出现的蓝色 MOK 管理界面。选择Enroll key from disk找到/var/lib/shim-signed/mok/下的密钥文件输入安装过程中设置的密码完成注册。很多人以为装完没反应就是驱动坏了重装了三遍还是黑屏实际就是这一步没做完。1.3 版本选择别急着追新先看你的卡属于哪个分支关于驱动版本我一直坚持一个原则稳定优先够用就好。所谓“能够支撑 Ollama 跑起来的驱动版本”其实门槛很低nvidia-driver-470以上的驱动都支持 CUDA 12而 Ollama 自带的 CUDA 后端对驱动版本的要求并不苛刻。选择具体版本时先用这个命令看系统推荐ubuntu-drivers devices看到带recommended标记的驱动分支直接听系统的。如果你是 RTX 30/40/50 系列的新卡驱动分支选 570 或更新的没毛病如果是 GTX 900 系列之前的旧卡要注意系统可能会推荐 legacy 分支比如 470。网上讨论的“616.56”或者更新的版本号刷得快但没必要硬追驱动不是越新越好稳定跑模型才是核心诉求。2. 从驱动安装到 nvidia-smi 正常输出一套可直接照抄的命令路径2.1 安装前确认三件事型号、推荐驱动、Secure Boot 状态动手安装之前把三件事确认清楚能省掉一半的返工时间。第一确认显卡型号lspci | grep -i nvidia第二查看系统推荐驱动ubuntu-drivers devices第三确认 Secure Boot 状态前面已经说了怎么做。如果显卡型号和系统推荐驱动都对得上Secure Boot 也确认了就可以进入安装了。整个过程大约需要 10 分钟取决于网速和内核编译时间。2.2 自动安装和手动指定版本两条路径最简单的自动安装方式sudo ubuntu-drivers autoinstall它会根据检测到的显卡自动选一个 recommended 版本安装完成后自动配置 DKMS同时处理 Nouveau 的禁用和 initramfs 的更新基本是一条龙。如果autoinstall因为网络或仓库原因失败也可以手动指定版本sudo apt update sudo apt install nvidia-driver-570安装完成后建议先不重启先检查一下 DKMS 状态sudo dkms status看到类似nvidia/570.xxxx, 6.8.0-xx-generic, x86_64: installed这样的输出说明内核模块已经编译并安装好了。如果这里显示failed或者缺失不要重启先把内核头文件补上sudo apt install linux-headers-$(uname -r) sudo dkms autoinstall确认没问题后再重启。2.3 重启后两个常见故障的快速定位重启后执行nvidia-smi能看到类似下面的表格就算成功--------------------------------------------------------------------------------------- | NVIDIA-SMI 570.124.06 Driver Version: 570.124.06 CUDA Version: 13.0 | ---------------------------------------------------------------------------------------注意nvidia-smi里显示的 CUDA Version 是驱动支持的最高 CUDA 运行时版本并不代表系统里装了 CUDA Toolkit。Ollama 用的是自己打包的 CUDA 运行时所以只要驱动装好Ollama 就能直接识别 GPU不需要额外安装 CUDA。这个误解坑过不少人以为不装 CUDA 就不能用 GPU白折腾半天。两个常见故障故障一报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver驱动模块没有加载。按顺序排查sudo modprobe nvidia lsmod | grep nvidia dmesg | grep -i nvidia如果模块加载失败优先怀疑 Secure Boot 签名问题其次检查 DKMS 编译日志cat /var/log/dkms/install.log故障二重启后黑屏大多数情况是显示输出接在主板的核显接口上系统却切到了 NVIDIA 卡输出。先把显示器线接到独立显卡接口上试试。如果本身没有核显多半是驱动加载顺序的问题进 recovery 模式卸载驱动后改用ubuntu-drivers devices推荐的版本重装。3. Ollama 的显存调度原理模型是怎么被塞进显存的3.1 模型加载时 Ollama 到底在做什么很多人以为 Ollama 加载模型就是把模型文件完整丢进显存实际流程比这复杂。它做的是三件事启动时枚举 GPU 设备通过 CUDA 检测可用显卡根据模型文件大小和显存总量把模型按层切分决定哪些层放 GPU、哪些层留内存分配 KV Cache这部分大小由上下文长度决定。这就是为什么同一个模型别人 8GB 显存跑得动你的 8GB 显存却提示“insufficient VRAM”——很可能是上下文长度设置不一样。同样一个 7B 模型num_ctx从 2048 拉到 8192KV Cache 占用能翻好几倍直接把显存吃穿。3.2 显存开销不只是模型体量KV Cache 和上下文长度以 7B 模型为例模型权重本身依据量化精度占 4GB 到 14GB 不等KV Cache 则随上下文长度动态变化。公式大致可以理解为KV Cache 占用 ≈ 层数 × 头数 × 头维度 × 上下文长度 × 精度系数 × 2实际我们不需要手动计算只需要记住一个结论上下文越长KV Cache 越大。Ollama 默认的num_ctx对不同模型不完全一样但有经验的用户都会主动设置。另外Ollama 的默认策略是“能塞多少塞多少”也就是把模型尽量完整加载进显存。所以看到nvidia-smi中显存占用接近满载是正常的不必担心显卡是不是坏了。同时跑多个模型时Ollama 会在OLLAMA_MAX_LOADED_MODELS的限制下让多个模型轮流驻留显存。3.3 低显存下的量化选择低显存场景的首要思路是选量化版本。同一个模型用不同精度存储显存占用差距很大模型精度约显存占用Llama 3.1 8BFP16约 16GBLlama 3.1 8BQ8_0约 8.5GBLlama 3.1 8BQ4_K_M约 4.9GBQwen2.5 14BQ4_K_M约 9GBQwen2.5 7BQ4_K_M约 4.4GBOllama 拉取模型时可以用标签指定量化版本ollama pull qwen2.5:7b-instruct-q4_K_M对于 8GB 显存7B 模型的 Q4_K_M 基本够用14B 模型 Q4_K_M 就比较紧张了需要关闭其他占显存的服务。如果实在跑不动不要硬上先换小模型把链路跑起来。4. 实测让模型完整跑在 GPU 上的验证方法和参数调优4.1 三件套验证ollama ps、nvidia-smi 和日志配置完成后怎么确认模型真的在显存里三个地方一起看。第一ollama psollama ps看PROCESSOR列100% GPU模型完全加载到显存这是理想状态75% GPU/25% CPU部分层在显存部分层在内存100% CPU完全没用上 GPU回驱动层排查。第二实时观察显存nvidia-smi -l 2推理时留意ollama serve进程是否出现在 GPU 进程列表里显存占用是否稳定。如果进程出现了占用也稳定说明推理确实走的是 GPU。第三看服务日志ollama serve驱动正常时启动日志会打印检测到的 GPU 信息例如inference compute id: GPU-xxxx on PCIe。如果日志里出现no GPU library found或者 CUDA 加载失败说明驱动层还没通。还有个容易忽略的小坑修改过驱动或者换了内核之后Ollama 守护进程可能还在用旧状态。这时候ollama ps显示 CPU 是假象重启一下服务就好sudo systemctl restart ollama4.2 参数调整从环境变量到 Modelfile给 Ollama 设置 GPU 相关参数常用方法有三种。方式一环境变量# 退出即卸载模型释放显存 export OLLAMA_KEEP_ALIVE0 # 最多同时加载的模型数量 export OLLAMA_MAX_LOADED_MODELS1 # 指定加载到 GPU 的层数99 表示尽量全量加载 export OLLAMA_NUM_GPU99放到~/.bashrc里可以持久化或者写入 systemd service 的Environment字段。方式二交互命令在ollama run的对话界面里/set parameter num_ctx 4096方式三Modelfile 固化成新模型FROM qwen2.5:7b-instruct-q4_K_M PARAMETER num_ctx 4096 PARAMETER num_gpu 99然后创建并运行ollama create mymodel -f Modelfile ollama run mymodelModelfile 的好处是一次配置永久生效下次ollama run直接用不需要每次手动设参数。注意num_gpu 99表示尽量全量加载到 GPU显存不足时 Ollama 会自动做部分 offload但如果你显存实在不够也可以手动指定一个层数比如num_gpu 20把一部分层留在 CPU牺牲推理速度换取可运行性。4.3 一个 8GB 显存的实测案例我自己在一张 8GB 显存的卡上完整跑通过qwen2.5:7b-instruct-q4_K_M。操作如下ollama pull qwen2.5:7b-instruct-q4_K_M ollama run qwen2.5:7b-instruct-q4_K_M进入对话后先设置上下文/set parameter num_ctx 4096然后问几个稍微长一点的问题同时观察nvidia-smi -l 2。显存占用大概稳定在 5.5GB 左右ollama ps显示100% GPU推理速度明显比 CPU 快了一个量级。如果这时把num_ctx拉到 8192KV Cache 增长显存占用会逼近 7GB再往上就顶到天花板了。所以 8GB 卡的合理设置就是Q4_K_M num_ctx 4096。5. 三种高频场景下如何避免 GPU 部署失效内核更新、Docker 与驱动升级5.1 内核升级后 DKMS 重建模块Ubuntu 每次升级内核NVIDIA 驱动模块都要重新编译。大多数时候 DKMS 会自动完成偶尔会失败。典型症状是升级内核重启后nvidia-smi又报错图形界面也进不去。先查 DKMS 状态sudo dkms status如果看到nvidia/570.xxx, 6.8.0-xx-generic, x86_64: failed说明编译失败。八成是缺对应内核的头文件sudo apt install linux-headers-$(uname -r) sudo dkms autoinstall sudo modprobe nvidia如果用ubuntu-drivers安装的驱动更省事的做法是sudo apt install --reinstall nvidia-driver-570这个命令会重新触发 DKMS 编译比手工处理/lib/modules下的模块文件可靠得多。5.2 Docker 容器里跑 GPU 推理宿主机驱动装好只是第一步。直接执行docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi如果报错could not select device driver with capabilities: [[gpu]]说明宿主机还没装nvidia-container-toolkit。安装步骤curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \ | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \ | sed s#deb https://#deb [signed-by/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g \ | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtimedocker sudo systemctl restart docker然后重新验证容器里的nvidia-smi。跑 Ollama 容器时核心参数就是--gpus alldocker run -d --gpus all -v /data/ollama:/root/.ollama -p 11434:11434 ollama/ollama漏了--gpus all容器里就用不上 GPU这也是新手最容易踩的坑。另外建议把/root/.ollama挂载到宿主机目录否则每次重建容器都要重新拉模型。5.3 驱动升级时不该做的釜底抽薪在 apt 体系下升级驱动常规操作就够了sudo apt update sudo apt upgrade或者指定换到新版分支sudo apt install nvidia-driver-580apt 会自动处理旧驱动、DKMS 模块和残留配置。网上一些教程会建议先sudo apt purge nvidia-*再重装这个操作我一般只在驱动状态彻底混乱时才用。它会把nvidia-dkms、nvidia-utils一起删掉如果这时候网络出问题你连图形界面都点不亮只能进恢复模式补救。驱动升级的正确思路是“小步替换”而不是“推倒重来”。升级完记得重启然后确认nvidia-smi、ollama ps两项恢复正常。最后再分享一个排查小技巧装完驱动先别急着跑大模型把nvidia-smi -l 2挂在一边然后ollama run qwen2.5:7b-instruct-q4_K_M随便聊几句眼睛盯住显存占用曲线。如果推理过程中显存占用稳定上升并保持说明模型确实吃上了显存。这个动作 30 秒能过滤掉 80% 的配置问题。等这条链路完全走通了再考虑更大体量的模型也不迟。
返回列表