Ubuntu下Ollama无法使用GPU?从驱动到服务的完整排查与重装指南

发布时间:2026/10/16 3:32:51
Ubuntu下Ollama无法使用GPU?从驱动到服务的完整排查与重装指南
如果你在 Ubuntu 服务器上捣鼓过 Ollama大概率遇到过这种让人血压升高的场景nvidia-smi里清清楚楚能看到显卡、驱动版本和显存容量Ollama 也正常启动了结果一ollama run拉起大模型CPU 直接飙到 100%显存占用纹丝不动显卡风扇安静得像没下班一样。我最初还以为是拉取的模型没有 GPU 版本后来才发现根本不是模型的问题而是本机 Ollama 版本太旧加上之前安装时留下的文件和 systemd 服务互相打架让新版进程一直在偷偷用 CPU 推理。这篇文章我就按自己实际排查的顺序来写先把 Ubuntu 下 Ollama 无法使用 GPU 的常见原因拆开再给出一套完整的旧版本卸载、新版本下载安装步骤最后带你跑通一个大模型并用命令验证 GPU 确实在干活。无论你是刚开始接触本地大模型的小白还是已经折腾了一段时间没搞定老手照着这套流程走一遍基本能省下大把试错时间。1. GPU不生效的逐层排查不急着重装先把症状看透很多人一遇到 GPU 不生效就直接卸载重装但装完之后问题依旧。原因很简单没搞清楚到底是哪一层出了问题。Ollama 要用上 GPU至少要满足三层条件硬件层、驱动层、服务层。任何一层断链表现都是“GPU 没用上”但处理方式完全不同。1.1 硬件层显卡驱动到底有没有正常工作第一步永远是执行nvidia-smi看驱动是否正常响应。如果输出正常能看到类似这样的表格----------------------------------------------------------------------------- | NVIDIA-SMI 470.129.06 Driver Version: 470.129.06 CUDA Version: 11.4 | ---------------------------------------------------------------------------这说明驱动已经装载GPU 能被系统识别。如果命令报了Failed to initialize the NVML或者提示找不到显卡那问题就不在 Ollama而在 NVIDIA 驱动本身。这时候需要先解决驱动常见做法是sudo ubuntu-drivers autoinstall sudo reboot或者用 apt 手动安装对应版本的nvidia-driver-xxx包装完重启后再次确认nvidia-smi能正常输出。这里踩过一个坑有些云服务器或者迷你主机用的是 NVIDIA 的 Grace Hopper 或者低速独显ubuntu-drivers不一定能识别到需要去硬件厂商提供的驱动源里装别硬套通用方案。1.2 运行库与驱动版本的匹配关系nvidia-smi顶部显示的CUDA Version: 11.4只是当前驱动所支持的最高 CUDA 运行版本并不代表你系统里装了 CUDA Toolkit。很多人在这里被误导以为要手动安装对应 CUDA 才能让 Ollama 用上 GPU。Ollama 的 GPU 加速机制不太一样它把 CUDA runtime 直接打包进了发布构件里只要本机驱动版本不是太老通常能直接利用显卡。真正的问题往往出在“旧版 Ollama 内置的 CUDA 绑定过旧和新驱动不匹配”或者“系统里同时存在多个 CUDA 版本导致动态链接器找错了库”。这也是为什么很多人驱动没问题、模型也能跑但 GPU 始终不生效——Ollama 本体太旧了。经验值如果你发现nvidia-smi显示驱动版本是 470.x 或更早却非要跑最近几个月的 Ollama 版本基本都能跑但个别型号的旧卡比如计算能力 5.x 的老卡在新版里可能反而被放弃支持。这块需要结合实际硬件来判断不能一概而论。1.3 Ollama服务日志里的关键行在硬件和驱动都正常的前提下接下来要看的不是ollama run窗口而是系统服务日志。Ollama 通过 systemd 托管时日志里会直接写明推理设备。执行journalctl -u ollama -f正常加载 GPU 时会看到类似msginference compute idGPU_0 librarycuda如果一直显示msginference compute idCPU librarycpu那基本可以确定 Ollama 确实没识别到显卡。到这里问题就聚焦在两个方向上一是 Ollama 版本太旧导致 GPU 探测逻辑有 bug二是安装残留让服务加载了错误的运行文件。我在实际排查中超过一半的情况是第一种而且重装新版后立竿见影。2. 卸载旧版本最容易踩的四个残留角落如果你确定要重装新版最忌讳的就是简单apt remove ollama或者直接删一个二进制文件。Ollama 在 Ubuntu 上的安装文件分散在多个目录systemd 服务、库文件、模型缓存、环境变量各占一块任何一个角落没清理干净新版装完可能还是在调用旧的库文件。2.1 systemd服务文件与守护进程残留旧版卸载后会留下/etc/systemd/system/ollama.service这类服务文件。你重装新版时安装脚本检测到服务文件已存在可能会跳过覆盖导致 systemd 启动的还是旧版定义的那套进程参数。更麻烦的是systemctl daemon-reload如果没有执行系统里会残留一堆无效的 unit 文件引用。我建议在卸载阶段就顺手把这些服务文件全删掉sudo systemctl stop ollama sudo systemctl disable ollama sudo rm -f /etc/systemd/system/ollama.service sudo rm -f /usr/lib/systemd/system/ollama.service sudo rm -f /lib/systemd/system/ollama.service sudo systemctl daemon-reload有些机器上曾经手动启动过ollama serve进程还在后台跑着卸载后重装时端口 11434 被占用新服务起不来。这时候用ps aux | grep ollama查一遍把残留进程也 kill 掉。2.2 各种路径下的二进制与库文件Ubuntu 下 Ollama 的安装位置比较分散。官方安装脚本默认会把主程序放到/usr/local/bin/ollama而部分 apt 源版本会放到/usr/bin/ollama库文件则可能出现在/usr/local/lib/ollama或者/usr/lib/ollama。如果旧版本是从不同渠道装的这几个目录里可能同时存在多个二进制。shell 的PATH搜索顺序决定了哪个版本先被调用如果你一直用/usr/local/bin下的新版但 systemd 服务引用的却是/usr/lib/ollama下的旧库那么一切表现都会像“旧版在运行”。清理时可以执行一遍which -a ollama ls -l /usr/local/bin/ollama /usr/bin/ollama 2/dev/null ls -ld /usr/local/lib/ollama /usr/lib/ollama 2/dev/null把能看到的二进制和库目录全部删除。只保留一个版本的安装路径避免后续混淆。2.3 模型缓存和配置目录模型缓存默认在~/.ollama下用 root 跑服务时则在/root/.ollama。这个目录里存了已经拉取的模型分片、manifest 文件和一些配置不删除也不影响新版安装但会占用磁盘空间。更重要的是如果你之前改过OLLAMA_MODELS之类的环境变量并且写进了某个配置文件残留的配置可能会覆盖新版的默认路径。我的习惯是如果不是有必须保留的模型直接删掉一了百了。sudo rm -rf /root/.ollama rm -rf ~/.ollama如果你的模型文件放在专门的磁盘目录记得先确认路径再删别把数据卷也一起清掉。2.4 shell配置里的残留项与顽固进程还有一个容易忽略的地方是.bashrc、.zshrc或/etc/profile.d/里可能有人以前手动加过export OLLAMA_HOST...或者export PATH/usr/local/ollama/bin:$PATH之类的环境变量。这些残留项不会导致 GPU 失效但会影响你对新版本的判断比如明明已经删掉了旧版却仍然能找到ollama命令查了半天才发现来自 shell 别名或环境变量。顺手把这些也清掉避免重装后出现“版本对不上”的错觉。2.5 一套可以照抄的卸载命令序列把上面几个步骤汇总成可复制的命令串适合 Ubuntu 20.04/22.04/24.04 这类用 systemd 的发行版sudo systemctl stop ollama sudo systemctl disable ollama sudo rm -f /etc/systemd/system/ollama.service /usr/lib/systemd/system/ollama.service /lib/systemd/system/ollama.service sudo rm -f /usr/local/bin/ollama /usr/bin/ollama sudo rm -rf /usr/local/lib/ollama /usr/lib/ollama sudo rm -rf /root/.ollama sudo rm -rf ~/.ollama sudo systemctl daemon-reload pkill -f ollama执行完这些命令后建议执行which ollama如果还能找到输出继续检查是不是 shell 缓存或者 PATH 残留。确保这一步返回 nothing才算真正清干净。3. 下载安装新版Ollama安装方式和验证清单清理完成之后安装新版就清爽很多了。Ollama 官方提供了自动安装脚本绝大多数人直接跑脚本就够用。3.1 为什么选官方安装脚本而不是手动装如果你只是为了解决 GPU 不生效的问题我没有理由劝你手动去解压 tar 包。官方脚本的核心价值在于它会自动处理 systemd 服务单元、用户组、路径规范和依赖检测把前面提到的“装不干净”问题通过一个标准流程解决掉。脚本执行方式很简单curl -fsSL https://ollama.com/install.sh | sh要注意的是这种“curl 管道 sh”的安装方式只适合你信任官方源的场景。如果在内网环境或者公司服务器上建议先下载 install.sh 审查一遍再执行。安装脚本跑完会看到类似这样的输出 Installing ollama to /usr/local Adding ollama user to video group... Creating ollama user... Adding current user to ollama group... Creating systemd service file /etc/systemd/system/ollama.service Enabling and starting ollama service...这里面两行值得注意把 ollama 用户加到video组是为了让进程有权访问 GPU 设备节点创建 systemd service 文件后脚本会自动systemctl enable和systemctl start。3.2 安装过程的完整输出怎么看如果你看到服务已经Active: active (running)说明安装过程正常。接下来先验证版本ollama --version新版版本号通常会是一个类似0.5.x的数字早晚版本差异很大但不要只以版本号判断新旧重点看下一次运行模型时日志里的推理设备。再检查一次 systemd 服务状态systemctl status ollama正常输出里应该包含Loaded: loaded (/etc/systemd/system/ollama.service; enabled; preset: enabled) Active: active (running)如果状态是failed大概率是端口被占或者权限问题。sudo journalctl -u ollama -n 50可以直接看到失败原因。3.3 安装后的服务自检与权限确认新版安装完成后建议顺手确认一下/dev/nvidia*设备节点的权限。Ollama 的 systemd 服务默认以Userollama运行如果ollama用户不在video组里即使驱动正常进程也可能因为访问不了设备节点而退回 CPU 模式。groups ollama ls -l /dev/nvidia0如果用户缺少权限可以手动补上sudo usermod -aG video ollama sudo systemctl restart ollama这也是很多“新版本还是用 CPU 跑”问题的隐藏原因表面上装好了实际权限没到位。4. 让大模型真正跑在GPU上运行、验证与调优安装完成后接下来就是拉模型、跑模型然后通过各种命令确认 GPU 确实在干活。4.1 拉取模型并启动对话Ollama 的模型仓库里有很多现成模型这里以我经常用的qwen2.5:7b为例ollama pull qwen2.5:7b ollama run qwen2.5:7b首次 pull 会下载几个 GB 的分片文件具体大小取决于模型参数量和量化格式。7B 模型通常用 4-bit 量化后体积在 4-5 GB 左右。下载完成后会直接进入交互式对话界面直接输入一句话测试 你好用一句话介绍你自己。如果模型开始正常回复说明基础链路已经通了。4.2 用ollama ps和nvidia-smi双重确认GPU生效真正要确认 GPU 是否在做推理光看对话速度是不够的。在模型对话保持打开的另一个终端里执行ollama ps输出里有一个PROCESSOR列如果显示GPU说明当前模型已经加载到显存NAME ID SIZE PROCESSOR UNTIL qwen2.5:7b a1b2c3d4 4.2 GB GPU 5 minutes同一时刻再跑一遍nvidia-smi你应该能看到类似----------------------------------------------------------------------------- | Processes: | | GPU GI CI PID Type Process name GPU Memory | || | 0 N/A N/A 12345 C ollama 4210MiB | -----------------------------------------------------------------------------如果ollama ps显示CPU而nvidia-smi的进程列表里也没有 ollama那就说明新版安装后依然没有走 GPU需要回到第 3 节的权限和服务日志去排查。如果nvidia-smi有进程但显存占用很小可能是模型部分层被卸载、或者 KV cache 使用量不高通常不用太担心。4.3 CPU与GPU跑同一个模型的体感差异同样是 7B 参数规模模型在普通桌面级 CPU 上生成一个 token 大概要几百毫秒到一两秒而在中端显卡上可以降到几十毫秒甚至更低。如果你之前一直用 CPU 跑切换到 GPU 后最明显的感觉是“输出速度像换了个模型”而且在对话过程中 CPU 占用率会明显下降因为计算主体转移到了显卡上。如果切到 GPU 后依然卡顿先别急着怪设备。可以看看是不是模型被重组 KVCache 时显存不够或者同时加载了太多模型。这里可以临时调低上下文长度试试比如ollama run qwen2.5:7b --num-ctx 2048看看生成速度是否改善。4.4 多GPU选择与内存限制如果你机器上有两张以上显卡Ollama 默认会尝试把模型分配到所有可用设备上。可以通过设置CUDA_VISIBLE_DEVICES环境变量来指定只使用某一张卡sudo systemctl edit ollama在打开的编辑窗口里写入[Service] EnvironmentCUDA_VISIBLE_DEVICES0保存后重启服务sudo systemctl daemon-reload sudo systemctl restart ollama对于显存较小的卡比如 8GB 左右的显卡跑 7B 模型通常没问题但如果同时开多个模型或者把上下文长度调得非常大就可能出现out of memory。这时候可以把OLLAMA_MAX_LOADED_MODELS环境变量设为 1限制同一时刻只保留一个加载模型减少显存压力。5. 模型日常使用的几条实战经验模型能跑在 GPU 上只是第一步真正用得顺手还需要了解模型管理、服务参数和性能调优。这几条是我平时用得最多的经验整理出来供参考。5.1 通过Modelfile定制专属模型Ollama 支持用 Modelfile 构建自定义模型。你可以在基础模型之上指定系统提示词、温度、上下文长度等参数生成一个专属入口。比如创建一个ModelfileFROM qwen2.5:7b PARAMETER temperature 0.7 PARAMETER num_ctx 4096 SYSTEM 你是一个熟悉 Linux 运维的中文助手回答尽量简洁直接。然后执行ollama create my-helper -f Modelfile ollama run my-helper这样做的好处是不用每次对话都重复输入提示词也方便团队里统一模型行为。多个自定义模型之间互不干扰删除也很简单。5.2 服务端环境变量对并发行为的影响Ollama 服务默认会保持模型在内存/显存中一段时间避免每次请求都重新加载。相关环境变量有三个比较关键OLLAMA_KEEP_ALIVE模型保持加载的时间默认 5 分钟。如果你频繁调用同一模型可以调大到30m或1h减少冷启动次数。OLLAMA_NUM_PARALLEL同一个模型并行处理请求的数量。默认值是 1调大会增加吞吐但也会增加显存占用。OLLAMA_MAX_LOADED_MODELS同时加载模型数量上限。小显存机器建议设为 1否则频繁换入换出会导致首字延迟很高。修改方式同上systemctl edit ollama写入环境变量后重启服务即可。5.3 模型镜像的磁盘管理与杂项拉取的模型都存放在~/.ollama/models目录日积月累会占用大量磁盘空间。常用的管理命令ollama list # 查看本地模型列表 ollama rm 模型名 # 删除某个模型 ollama cp 模型名 新名称 # 复制模型 ollama pull 模型名:tag # 拉取指定标签建议定期用ollama list检查本地模型用完就删保持磁盘空间充足。另外模型下载过程中如果中断重新执行ollama pull一般会从断点继续不用删掉重下。如果你们团队有多台机器考虑共享一个模型存储目录通过 NFS 挂载到多台机器上可以省去每台机器分别拉取模型的重复流量。Ollama 的服务模型路径由OLLAMA_MODELS控制挂载时保证权限一致即可。最后再分享一个小技巧如果你在journalctl -u ollama里看到大量inference compute idCPU的日志不要急躁先按第 1 节的三层排查走一遍再执行第 2 节的完整清理最后用第 4 节的ollama ps做最终确认。这套流程我前前后后给好几个同事解决过问题基本都能一次搞定。GPU 跑大模型这条路说难不难但细节一个都不能漏。