
前几日,偶然在柜底寻得两张蒙尘已久的旧显卡。拂去岁月的浮灰,它们静默地躺在那里,仿佛两位退隐江湖的老将,等待着重新披挂上阵的号角。今日突发奇想,何不唤它们出山,让它们在这大模型风起云涌的时代,再展一番拳脚?
以下,便是这套"双显卡跑大模型"的修炼功法。
一、筑基:环境的筹备与确认
一切修炼,皆从筑基开始。在正式召唤大模型之前,需先确保你的"修炼场"------硬件与软件环境------已准备妥当。
1. 硬件确认
首先,请确保两张显卡已稳稳地安插在主板之上,且电源功率充沛(建议 850W 以上),如同为两位战将备足粮草。
随后,在命令行中运行以下咒语,确认系统已能识别到这两张显卡:
bash
nvidia-smi
若一切顺利,你将看到类似这样的输出:
+-----------------------------------------------------------------------------+
| GPU Name | Memory-Usage | GPU-Util |
+-------------------+---------------+------------+
| 0 RTX 3060 | 12288 MiB | |
| 1 RTX 2060 | 6144 MiB | |
+-----------------------------------------------------------------------------+
请记下两张卡的编号(GPU 0 和 GPU 1),它们将在后续的配置中扮演关键角色。
2. 下载 llama.cpp(推荐预编译版,免编译)
前往 GitHub Releases 页面:https://github.com/ggerganov/llama.cpp/releases
下载带有 CUDA 标识的 Windows 版本,例如:llama-bxxxx-bin-win-cuda-cu12.x.x-x64.zip
将其解压至一个路径中不含中文和空格的目录,例如 C:\llama。
解压后,请确认目录中存在 ggml-cuda.dll 文件(大小应大于 200MB),这标志着 CUDA 后端已准备就绪。
3. 下载模型文件
推荐使用 GGUF 格式的量化模型,可从 HuggingFace 或 ModelScope 下载。
根据你的双卡总显存(18GB),以下模型值得一试:
- Qwen3.5-14B(Q4_K_M 量化,约 9GB)→ 双卡轻松驾驭
- Qwen3.5-27B(Q4_K_M 量化,约 17GB)→ 双卡刚好能跑,略有挑战
- DeepSeek-R1-7B(Q4_K_M 量化,约 5GB)→ 单卡即可,双卡加速更畅快
二、心法:核心参数的哲学
在深入配置之前,先理解几个关键参数的含义。它们如同调音师手中的旋钮,决定了算力交响乐的走向。
| 参数 | 全称 | 作用 |
|---|---|---|
| -ngl | --n-gpu-layers | 指定卸载到 GPU 的模型层数,设为 99 或 999 表示尽可能全部上 GPU |
| --tensor-split | -ts | 指定各 GPU 的显存分配权重比例,用逗号分隔 |
| --split-mode | -sm | 拆分模式:layer(层并行)或 tensor(张量并行) |
| --main-gpu | -mg | 指定主 GPU 编号,默认 0 |
| CUDA_VISIBLE_DEVICES | 环境变量 | 限制哪些 GPU 参与推理 |
三、抉择:3060 12G + 2060 6G 的适配之道
关键判断:异构显卡,必须用 layer 模式
3060(Ampere 架构)与 2060(Turing 架构)属于不同代架构 的异构组合。它们如同两位出身不同门派的武者,不能使用 tensor(张量并行)模式强行协同,否则可能因架构不兼容而导致启动失败。
正确做法:使用 --split-mode layer(层并行模式),将模型的不同层分别托付给两张显卡,让它们各展所长。
显存分配比例计算
两张卡的显存分别为 12GB 和 6GB,比例为 2:1。因此 --tensor-split 应设为 2,1 或等价的 0.67,0.33。
原理:--tensor-split 的值并非百分比,而是权重比例。2,1 表示 GPU 0 承担 2/3 的负载,GPU 1 承担 1/3。
四、出招:具体启动命令
方案 A:命令行直接启动(推荐先测试)
打开 CMD 或 PowerShell,进入 llama.cpp 目录,运行:
bash
.\llama-cli.exe ^
-m models\qwen3.5-14b-q4_k_m.gguf ^
-ngl 99 ^
--split-mode layer ^
--tensor-split 2,1 ^
--main-gpu 0 ^
-c 4096 ^
-t 8 ^
-i --color
参数解读:
- -m:模型文件路径(替换为你实际下载的模型)
- -ngl 99:尽可能将所有层卸载到 GPU
- --split-mode layer:层并行模式(异构卡必选)
- --tensor-split 2,1:3060 承担 2/3,2060 承担 1/3
- --main-gpu 0:指定 3060 为主 GPU
- -c 4096:上下文长度 4096(可根据显存调整)
- -t 8:CPU 线程数(根据你的 CPU 物理核心数调整)
- -i --color:交互模式,带颜色区分用户和模型输出
方案 B:启动 API 服务(供其他程序调用)
bash
.\llama-server.exe ^
-m models\qwen3.5-14b-q4_k_m.gguf ^
-ngl 99 ^
--split-mode layer ^
--tensor-split 2,1 ^
--main-gpu 0 ^
-c 8192 ^
--port 8080 ^
--host 0.0.0.0
启动后:
- 浏览器访问 http://localhost:8080 可直接与模型对话
- API 地址:http://localhost:8080/v1/chat/completions(兼容 OpenAI 接口)
方案 C:使用环境变量限制 GPU(可选)
若你只想让特定 GPU 参与推理,可在启动前设置环境变量:
Windows CMD:
bash
set CUDA_VISIBLE_DEVICES=0,1
.\llama-cli.exe -m models\qwen3.5-14b-q4_k_m.gguf -ngl 99 --split-mode layer --tensor-split 2,1
Windows PowerShell:
powershell
$env:CUDA_VISIBLE_DEVICES="0,1"
.\llama-cli.exe -m models\qwen3.5-14b-q4_k_m.gguf -ngl 99 --split-mode layer --tensor-split 2,1
Linux:
bash
CUDA_VISIBLE_DEVICES=0,1 ./llama-cli -m models/qwen3.5-14b-q4_k_m.gguf -ngl 99 --split-mode layer --tensor-split 2,1
若只想用单张卡测试对比,可设 CUDA_VISIBLE_DEVICES=0 仅用 3060,或 CUDA_VISIBLE_DEVICES=1 仅用 2060。
五、验功:验证双卡是否生效
启动后,不要只看模型是否输出正常,务必检查以下两点,倾听它们协同工作的声音:
1. 查看启动日志
成功的日志应包含类似以下内容:
llm_load_tensors: offloading 48 repeating layers to GPU
llm_load_tensors: offloaded 48/48 layers to GPU
llm_load_tensors: CUDA0 buffer size = 8192.00 MiB
llm_load_tensors: CUDA1 buffer size = 4096.00 MiB
关键信号:
- 看到 CUDA0 和 CUDA1 都有 buffer size → 双卡皆在发力
- offloaded X/X layers to GPU → 层数已全部卸载到 GPU
2. 实时监控显存占用
另开一个 CMD 窗口,运行:
bash
nvidia-smi -l 1
每秒刷新一次,观察两张卡的显存占用是否同时增长。若只有 GPU 0 显存增加而 GPU 1 几乎纹丝不动,说明配置有误,需重新审视。
六、精进:性能优化技巧
1. 调整 -ngl 避免爆显存
若启动时报 CUDA out of memory,说明显存告急,需减少 GPU 层数:
bash
# 从 99 逐步降低,直到不报错
-ngl 60
-ngl 40
-ngl 20
2. 量化 KV Cache 节省显存
对于长上下文场景,KV Cache 可能比模型本身还占显存。使用以下参数将其量化到 4-bit:
bash
--cache-type-k q4_0 --cache-type-v q4_0
显存占用可减少约 66%,而精度损失微乎其微。
3. 开启 Flash Attention 加速
30 系及以上显卡支持 Flash Attention,可提升 15%~20% 的速度:
bash
--flash-attn on
注意:2060 属于 20 系,可能不支持 Flash Attention。若启动报错,去掉此参数即可。
4. 并行加载缩短启动时间
bash
--parallel-load
利用多 GPU 并行加载模型权重,可大幅缩短启动等待时间(不影响推理速度)。
5. 调整上下文长度
上下文长度与显存占用呈平方关系。若显存紧张,可适当降低 -c 值:
bash
# 日常聊天
-c 4096
# 长文档处理
-c 8192
# 极限测试(可能爆显存)
-c 16384
七、大成:完整推荐配置(一键复制)
以下是针对 Qwen3.5-14B Q4_K_M 模型的完整推荐配置:
bash
.\llama-server.exe ^
-m models\qwen3.5-14b-q4_k_m.gguf ^
-ngl 99 ^
--split-mode layer ^
--tensor-split 2,1 ^
--main-gpu 0 ^
-c 8192 ^
-b 512 ^
-t 8 ^
--cache-type-k q4_0 ^
--cache-type-v q4_0 ^
--parallel-load ^
--port 8080 ^
--host 0.0.0.0
若是 Qwen3.5-27B Q4_K_M(显存更紧张),建议降低上下文并减少线程:
bash
.\llama-server.exe ^
-m models\qwen3.5-27b-q4_k_m.gguf ^
-ngl 99 ^
--split-mode layer ^
--tensor-split 2,1 ^
--main-gpu 0 ^
-c 4096 ^
-b 256 ^
-t 6 ^
--cache-type-k q4_0 ^
--cache-type-v q4_0 ^
--parallel-load ^
--port 8080 ^
--host 0.0.0.0
八、解惑:常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 启动报 CUDA not found | 未下载 CUDA 版本或 DLL 缺失 | 确认解压目录中有 ggml-cuda.dll,重新下载带 CUDA 标识的版本 |
| 只有单卡在跑 | 未设置 --tensor-split 或模式错误 | 确认使用 --split-mode layer 和 --tensor-split 2,1 |
| 爆显存 OOM | 模型太大或上下文太长 | 降低 -ngl、减小 -c、或换更低量化版本 |
| 速度比单卡还慢 | PCIe 带宽瓶颈或参数不当 | 异构卡本身加速有限,主要收益是"能跑更大模型"而非速度翻倍 |
| 中文输出乱码 | 终端编码问题 | 运行 chcp 65001 切换为 UTF-8 编码 |
九、广谱:万物双卡的通用之道
至此,关于 3060 12G + 2060 6G 这一对特定组合的配置之法,已讲解殆尽。然而,江湖辽阔,显卡万千,你的手中握着的,未必是这一对组合。莫慌------这套功法的核心心法,本就是通用的。无论手中是哪两张卡,只需把握两个要诀,便可融会贯通。
1. 判断同构还是异构
这是第一步,也是最重要的一步。
若两张显卡型号相同、架构相同(例如双 4090、双 3090),它们便是同门师兄弟,可以使用 --split-mode tensor(张量并行)模式。此模式下,生成速度比 layer 模式快 20%~40%,如同双剑合璧,威力倍增。
若两张显卡型号不同、架构不同(例如 4080 + 3060、4070 + 2060),它们便是出身不同门派的武者,必须使用 --split-mode layer(层并行)模式。强行使用 tensor 模式,可能因架构不兼容而启动失败。
2. 计算显存比例
无论同构还是异构,--tensor-split的值都应按两张卡的显存容量比例来设置。例如 16G + 12G 的组合,比例为 16:12 = 4:3,便设为 4,3。
计算技巧:--tensor-split 的值是权重比例,不是百分比。将两张卡的显存容量写成最简整数比即可。
3. 常见双卡组合速查
为免你逐一计算,以下列出一些常见组合的配置要点:
| 显卡组合 | 总显存 | 拆分模式 | --tensor-split | 推荐模型 |
|---|---|---|---|---|
| 3060 12G + 2060 6G | 18GB | layer | 2,1 | 14B Q4 |
| 4090 24G + 4090 24G | 48GB | tensor | 1,1 | 70B Q4 |
| 4080 16G + 3060 12G | 28GB | layer | 4,3 | 27B Q4 |
| 3090 24G + 3090 24G | 48GB | tensor | 1,1 | 70B Q4 |
| 4070 Ti 12G + 4060 Ti 16G | 28GB | layer | 3,4 | 27B Q4 |
| 2080 Ti 22G + 4070 Ti 16G | 38GB | layer | 11,8 | 32B Q4 |
| A100 80G + A100 80G | 160GB | tensor | 1,1 | 125B Q4 |
| RTX 4060 8G + RTX 3060 12G | 20GB | layer | 2,3 | 14B Q4 |
4. 不同组合的江湖规矩
同构双卡(如双 4090、双 3090):
- 优势在于可用 tensor 模式,速度更快
- 配置:--split-mode tensor --tensor-split 1,1
- 注意:Windows 下消费级显卡默认 WDDM 模式,张量并行的稳定性不如 Linux。若遇崩溃,退回到 layer 模式即可
异构双卡(如 4080+3060、4070+2060):
- 必须用 layer 模式,否则可能因架构不兼容导致启动失败
- 需注意"木桶效应":最终速度受限于较慢的那张卡。例如 4090+3060 组合中,3060 便是那根短板,4090 大部分时间需在旁等候
- 建议尽量选择算力架构相近的组合(如同为 Ada Lovelace 或同代 Ampere)
大小显存组合(如 4060 Ti 16G + 3060 12G):
- 显存不对称并非不可逾越的鸿沟:layer 模式会根据每张卡的可用显存自动分配层数
- 按显存比例设置 --tensor-split 即可,例如 16:12 → 4,3
跨品牌组合(如 NVIDIA + AMD):
- 必须用 layer 模式,且编译时需同时启用 CUDA 和 ROCm 后端
- 跨品牌通信效率较低,加速比通常只有 1.2~1.4 倍,需有此心理准备
5. Ollama 多卡配置(另一种法门)
若你偏好使用 Ollama 而非 llama.cpp 命令行,只需设置一个环境变量即可启用多卡切分:
Windows:
bash
set OLLAMA_SCHED_SPREAD=1
ollama serve
Linux:
bash
export OLLAMA_SCHED_SPREAD=1
ollama serve
修改后需重启 Ollama 服务方能生效。
6. 不同组合的性能预期
| 组合类型 | 加速比 | 核心价值 |
|---|---|---|
| 同构双卡(tensor 模式) | 1.6~1.9 倍 | 速度提升 + 显存翻倍 |
| 异构双卡(layer 模式) | 1.3~1.6 倍 | 显存翻倍(核心收益) |
| 跨品牌双卡 | 1.2~1.4 倍 | 显存翻倍 |
关键结论 :无论何种组合,双卡部署的核心价值始终是突破单卡显存瓶颈,运行更大的模型,而非速度的线性飞跃。只要总显存够用,更大的模型便触手可及。
尾声
对于 3060 12G + 2060 6G 这一组合,核心配置口诀可凝练为:
异构双卡用 layer,显存比例 2:1,-ngl 99 全上卡,--main-gpu 0 定主卡。
若你手中的组合有所不同,只需记住两条通则:判断同构还是异构,决定用 tensor 还是 layer 模式;计算显存比例,决定 --tensor-split 的值。 其余参数-------ngl 99、--main-gpu 0、CUDA_VISIBLE_DEVICES------万变不离其宗。
双卡协同的最大价值,并非在于速度的线性飞跃,而在于突破单卡显存的桎梏,让更大的模型得以驰骋。预期速度提升在 1.3~1.6 倍左右,但能跑的模型规模却可从 7B 跃升至 14B 甚至 27B------这才是真正的质变。
愿这两张老将,在你的手中重焕新生,在大模型的江湖中,再续一段传奇。