异构 GPU 部署的现实困境
本地大模型推理的硬件配置往往面临一个尴尬局面:新一代显卡算力强劲但显存有限,旧款旗舰显存充裕但算力落后。以 RTX 5080(16GB)搭配 RTX 3090(24GB)为例,两者合计 40GB 显存足以承载 27B 参数的 Q8 量化模型,但如何协调不同架构(Blackwell vs Ampere)的 GPU 协同工作,成为性能释放的关键瓶颈。
异构 GPU 的核心挑战在于三点:首先是架构差异导致的指令集不兼容,需要编译时同时指定多组 CUDA Architecture;其次是显存容量不对称带来的负载分配难题;最后是点对点(P2P)通信的拓扑限制 —— 不同代际的消费级显卡无法启用显存直连,数据交换必须经 PCIe 回环,延迟显著增加。
硬件拓扑与 BIOS 配置要点
主板选择是异构部署的第一道门槛。以 Asus Prime X570-Pro 为例,其关键特性在于支持将单条 PCIe x16 拆分为双 x8,这是双卡并行运行的物理基础。搭配 PCIe 4.0 延长线将副卡外置,既解决散热空间问题,又保持足够的带宽吞吐。
BIOS 层面的配置常被忽视,但直接影响多卡识别与内存映射:
- 禁用 CSM(Compatibility Support Module):必须采用 UEFI 模式启动,传统 BIOS/MBR 模式会阻止双卡同时初始化
- 启用 Above 4G Decoding:允许 GPU 访问超过 4GB 的内存地址空间,大模型权重加载的必要条件
- 开启 ReSize BAR:提升 CPU 与 GPU 之间的数据传输效率
- 统一 PCIe 链路速率:将两条插槽均锁定为 Gen 4,避免自动协商导致的速率不匹配
完成配置后,通过 nvidia-smi topo -p2p r 验证通信拓扑。对于异构组合,预期输出为 NS(Not Supported)或 GNS(GPU not supported),这确认了 P2P 直连不可行,后续调度策略需围绕 PCIe 回环优化。
多架构编译与 NCCL 取舍
llama.cpp 的编译参数需要同时照顾两代架构。CMake 配置中关键一行是:
-DCMAKE_CUDA_ARCHITECTURES="86;120"
其中 86 对应 Ampere(RTX 3090),120 对应 Blackwell(RTX 5080)。GGML_NATIVE=ON 需视情况关闭,否则可能只针对主机 CPU 优化而忽略异构 GPU 的指令集差异。
一个反直觉的发现是:显式禁用 NCCL(-DGGML_CUDA_NCCL=OFF)在某些场景下反而提升性能。NCCL 的优化策略假设 GPU 间具备高速互联(如 NVLink),而异构消费级显卡通过 PCIe 交换数据时,NCCL 的同步开销可能超过收益。实测表明,在双卡负载均衡模式下,禁用 NCCL 后 token 生成速率从 60 t/s 提升至 80+ t/s。
负载均衡调度策略详解
llama.cpp 提供两种多 GPU 工作模式:层分割(layer split)与张量并行(tensor split)。对于异构组合,张量并行配合比例调度是更优选择。
启动参数的核心组合:
-sm tensor -ts 2,3
-sm tensor 启用张量分割模式,将模型权重按张量维度分布到多卡;-ts 2,3 指定负载比例为 2:3,即 RTX 5080 承担 40% 计算量,RTX 3090 承担 60%。该比例基于两卡显存容量(16GB vs 24GB)和算力差异综合权衡,确保显存占用均衡的同时最大化吞吐。
进一步结合投机解码(speculative decoding)可突破单卡性能上限:
--spec-type ngram-mod,draft-mtp --spec-draft-n-max 3
MTP(Multi-Token Prediction)模块生成候选 token,主模型并行验证,实测 draft 接受率达 77%,有效掩盖了异构通信延迟。
性能验证与监控要点
运行期间需监控两项关键指标:PCIe 链路状态与显存占用分布。
验证 PCIe 速率命令:
sudo lspci -vvv -s 07:00.0 | grep "LnkSta:"
预期输出应显示 Speed 16GT/s, Width x8,确认双卡均以 PCIe 4.0 x8 满速运行。若显示 downgraded 或更低速率,需检查主板 BIOS 设置或物理连接。
显存占用方面,通过 nvidia-smi 观察两卡负载是否按预期 2:3 分布。若出现严重倾斜,可微调 -ts 参数或检查模型量化格式是否统一为 Q8_0,避免某卡因处理更高精度张量而过载。
实测 Qwen 3.6 27B Q8 量化模型,在 230K 上下文长度下可达 80-90 tokens/s,较单卡 RTX 3090 的 50-60 t/s 提升约 50%,且 5080 的利用率从闲置提升至与 3090 均衡负载。
可落地的配置清单
硬件层
- 主板:支持 PCIe 拆分(如 X570-Pro 的 16x→2x8)
- 连接:副卡使用 PCIe 4.0 延长线,确保信号完整性
- 散热:双卡间距 ≥ 3 槽位,或采用水冷 / 外置方案
BIOS 层
- Boot → CSM:Disabled
- Advanced → PCI Subsystem → Above 4G Decoding:Enabled
- Advanced → PCI Subsystem → ReSize BAR:Enabled
- 两条 PCIe 插槽统一设为 Gen 4
编译层
cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON \
-DGGML_NATIVE=OFF -DGGML_CUDA_FA=ON \
-DCMAKE_CUDA_ARCHITECTURES="86;120" \
-DGGML_CUDA_NCCL=OFF
运行时
llama-server -m model.gguf -c 229376 -ngl 99 \
-sm tensor -ts 2,3 \
--spec-type ngram-mod,draft-mtp --spec-draft-n-max 3 \
-ctk q8_0 -ctv q8_0 --kv-unified
监控指标
- PCIe 速率:
lspci -vvv | grep LnkSta - 显存分布:
nvidia-smi两卡占用比例应接近-ts设定值 - 生成速率:日志中
tg = XX.XX t/s应稳定在 80+
参考来源
- iMil.net: RTX 5080 + RTX 3090 Setup: 80+ Tok/s on Qwen 3.6 27B Q8
- llama.cpp 文档: Multi-GPU support
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。