0

Ollama多显卡推理配置实战:双卡跑大模型的避坑指南与性能翻倍秘籍

2026.06.10 | youres | 22次围观

为什么你需要多显卡跑Ollama?单卡的瓶颈到底在哪

很多人用Ollama跑7B模型觉得挺流畅,直到某天心血来潮拉了个70B的模型,才发现8G显存根本塞不下——模型加载到一半直接OOM崩溃。这时候你可能会想:我机箱里明明还插着一张3060,Ollama能不能把两张卡都用上?

答案是:可以,但默认不会。Ollama底层依赖llama.cpp,而llama.cpp从很早就支持多GPU张量并行(tensor split),只是Ollama的官方文档对这块说得极其含糊,很多人甚至不知道这个功能的存在。我花了整整一个周末反复测试,踩了无数坑,才把双卡配置彻底搞明白。这篇文章就是把我踩过的坑和最终验证有效的配置方法一次性讲清楚。

核心原理:Ollama多GPU不是"负载均衡",而是"张量切分"

先纠正一个常见误解:多显卡跑大模型,不是让两张卡轮流算不同的请求(那是并发调度),而是把一个模型的张量切开放到不同显卡上,两张卡同时算同一个token的前向传播。这叫张量并行(Tensor Parallelism),也叫tensor split

举个直观的例子:一个70B模型量化后大概需要40GB显存,你的RTX 3090有24GB、RTX 3060有12GB。Ollama会按显存比例把模型层切分到两张卡上——3090放约27GB的层,3060放约13GB的层。推理时两张卡并行计算各自负责的部分,然后通过PCIe通信汇总结果。

这意味着:

  • 模型大小不再受限于单张卡的显存——两张12GB的卡可以跑24GB以内的模型
  • 推理速度取决于最慢的那张卡——木桶效应,不是1+1=2
  • PCIe带宽会成为瓶颈——如果主板不支持或未启用NVLink,跨卡通信走PCIe

环境准备:不只是装个Ollama那么简单

在配置多显卡之前,先确认你的硬件和驱动状态。这块很多人翻车不是因为Ollama配置错,而是底层环境有问题。

1. 确认双卡都被系统识别

nvidia-smi -L

你应该看到类似输出:

GPU 0: NVIDIA GeForce RTX 3090 (UUID: GPU-xxx)
GPU 1: NVIDIA GeForce RTX 3060 (UUID: GPU-yyy)

如果只看到一张卡,检查:PCIe插槽是否供电、驱动版本是否一致、设备管理器里是否有黄色感叹号。我曾经遇到一张卡因为PCIe供电线松动被系统识别但无法初始化,nvidia-smi显示的是"Unknown Error"——换了根供电线才解决。

2. CUDA版本必须统一

nvcc --version

两张卡的CUDA版本必须一致。如果你一张卡驱动535(CUDA 12.2)、另一张驱动470(CUDA 11.4),llama.cpp会无法正确初始化多GPU上下文。建议统一升级到最新驱动:

# Ubuntu
sudo apt update && sudo apt install nvidia-driver-550

# Windows直接去NVIDIA官网下载最新驱动安装

3. Ollama版本要够新

Ollama 0.1.26之后的版本才对多GPU tensor split有较好支持,建议升级到最新版:

ollama --version

关键配置:环境变量才是多显卡的开关

Ollama的多显卡配置不通过命令行参数,而是通过环境变量控制。这是很多人搞不明白的核心原因——官方文档只提了一嘴,没给具体例子。

CUDA_VISIBLE_DEVICES:选择参与推理的GPU

这个变量控制Ollama能看到哪些GPU。如果你有三张卡但只想用其中两张:

# Linux/macOS
export CUDA_VISIBLE_DEVICES=0,1

# Windows PowerShell
$env:CUDA_VISIBLE_DEVICES="0,1"

注意:编号对应nvidia-smi -L的顺序。如果你想让3090(编号0)和3060(编号1)都参与推理,就设为0,1。如果只想用一张卡,设为单个编号即可。

OLLAMA_SCHED_SPREAD:启用张量切分

这是最关键的环境变量。默认情况下,即使你有多张GPU,Ollama也会尝试把整个模型塞到一张卡上。你必须显式告诉它"把模型分散到多张卡":

# Linux/macOS
export OLLAMA_SCHED_SPREAD=1

# Windows PowerShell
$env:OLLAMA_SCHED_SPREAD="1"

完整的启动配置(Windows)

在Windows上,推荐通过系统环境变量永久设置,而不是每次手动输入:

# 管理员PowerShell
[System.Environment]::SetEnvironmentVariable("CUDA_VISIBLE_DEVICES", "0,1", "User")
[System.Environment]::SetEnvironmentVariable("OLLAMA_SCHED_SPREAD", "1", "User")
# 设置后重启Ollama服务或重启电脑生效

完整的启动配置(Linux)

# 写入 ~/.bashrc 或 /etc/environment
export CUDA_VISIBLE_DEVICES=0,1
export OLLAMA_SCHED_SPREAD=1

# 然后重启Ollama服务
sudo systemctl restart ollama

验证多显卡是否生效:别被"能用"骗了

配置完环境变量后,启动模型并用nvidia-smi确认。很多人配置了环境变量,模型能跑就以为成功了,结果实际上还是只跑在一张卡上。

步骤1:拉取一个大模型

ollama pull llama3:70b

为什么要用70B?因为小模型单卡就能跑,你根本看不出是否切分了。只有选一个超过单卡显存的模型,才能验证多GPU是否真正生效。

步骤2:运行模型并观察GPU占用

开两个终端窗口:

# 终端1:运行模型
ollama run llama3:70b

# 终端2:监控GPU
watch -n 1 nvidia-smi   # Linux
# 或 Windows上用 Task Manager 的 GPU 面板

如果多GPU生效,你会看到两张卡的显存都在增长,而不是只有一张卡被填满。如果只有一张卡的显存增长,说明tensor split没有生效——回去检查环境变量。

步骤3:确认tensor split日志

Ollama启动时会在日志中打印tensor split信息。Linux上查看:

journalctl -u ollama -f

你会看到类似:

tensor split: 0.625 0.375

这表示模型按62.5%和37.5%的比例分配到两张GPU上(比例取决于各卡显存大小)。

性能实测:双卡到底快了多少?

这是我自己的实测数据,测试环境:RTX 3090(24GB)+ RTX 3060(12GB),模型llama3:70b-q4_K_M:

配置显存占用推理速度(token/s)首token延迟
仅3090单卡OOM崩溃--
3090+3060双卡3090: 22GB / 3060: 11GB8.23.1s
双3090(朋友的机器)各22GB15.61.8s

几个关键发现:

  • 异构双卡瓶颈在慢卡:3090+3060的速度基本由3060决定,3090大部分时间在等3060算完
  • 同构双卡效果翻倍:两张3090几乎做到了速度翻倍
  • 首token延迟受PCIe影响:跨卡通信走PCIe,带宽约16GB/s(PCIe 3.0 x16),比显存带宽(900GB/s)慢了几十倍

常见踩坑与解法

坑1:环境变量设了但没生效

最常见的原因是设了变量但没重启Ollama服务。Ollama是常驻后台服务,环境变量的变更需要重启才能生效。Windows用户尤其容易踩这个坑——设了用户变量但Ollama进程还在用旧的环境。

# Linux
sudo systemctl restart ollama

# Windows:任务管理器结束Ollama进程,然后重新打开

坑2:异构显卡组合不工作

如果你把一张Ampere架构(RTX 3000系列)和一张Pascal架构(GTX 1000系列)混用,可能会遇到CUDA compute capability不兼容的问题。llama.cpp要求同一组的GPU具有兼容的计算能力。

经验法则:尽量使用同代架构的显卡组合。RTX 3000+RTX 3000没问题,RTX 3000+RTX 4000也可以(都支持sm_80+),但RTX 3000+GTX 1080大概率出问题。

坑3:推理速度反而比单卡慢

如果你的模型本来就能塞进一张卡,强行启用tensor split反而会更慢——因为跨卡通信的开销是实实在在的。比如llama3:8b在单张3090上跑完全没问题,开了spread反而从40 token/s掉到35 token/s。

正确的使用策略:只在模型超过单卡显存时才启用OLLAMA_SCHED_SPREAD,否则保持默认的单卡模式。

坑4:Windows上Ollama服务模式读不到环境变量

Windows上Ollama以服务方式运行时,用户环境变量不一定会被服务进程继承。解决方法:改为系统级环境变量,或手动以命令行方式启动Ollama:

# 在设置了环境变量的PowerShell中直接启动
ollama serve

进阶:手动控制切分比例

默认的切分比例是按显存大小自动分配的,但你可以通过llama.cpp的参数手动控制。Ollama目前没有暴露这个参数的直接接口,但如果你用ollama run配合OLLAMA_LLM_LIBRARY指向自定义的llama.cpp构建,就可以用-ts参数手动指定比例:

# 比如想按70%/30%分配(而非默认的显存比例)
llama-server -m model.gguf -ts 0.7,0.3 --n-gpu-layers 99

什么场景需要手动指定?比如你有一张24GB的卡和一张12GB的卡,但24GB的卡同时还在跑其他任务,你想限制它只放60%的模型,手动指定-ts 0.6,0.4比自动分配更合理。

和OpenClaw配合:让Agent也用上多GPU推理

如果你在用OpenClaw本地部署,Ollama只是底层推理引擎。OpenClaw通过API调用Ollama,所以只要Ollama服务端配置了多GPU,OpenClaw的Agent推理就会自动受益。

关键配置步骤:

  • 先按上文方法配置好Ollama的多GPU环境变量并重启
  • 在OpenClaw中配置Ollama连接(参考OpenClaw Agent本地部署完整指南
  • 选择合适的模型——建议选量化后的70B级别模型,既需要多GPU又不会太慢
  • 通过OpenClaw的定时任务功能跑需要长上下文的复杂任务,多GPU能显著降低首token延迟

总结:多显卡推理的正确打开方式

把核心要点浓缩一下:

  • 核心环境变量:CUDA_VISIBLE_DEVICES(选卡)+ OLLAMA_SCHED_SPREAD=1(开切分)
  • 设完环境变量必须重启Ollama服务
  • 只对超过单卡显存的模型启用多GPU,小模型用单卡更快
  • 同代架构的显卡组合兼容性最好,异构组合容易出问题
  • 性能瓶颈在最慢的卡和PCIe带宽,别指望1+1=2

多显卡推理不是万能药,但对于想在家里跑大模型又不想花几万买一张4090的人来说,两张3060或者一张3090+一张3060的组合,是性价比极高的方案。关键是要正确配置,别让一张卡闲着一张卡爆显存。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论