我意外地用一条隐藏的PCIe 2.0 x4插槽削弱了4x RTX 3090 LLM设备的性能,修复后使Mistral 128B的性能翻倍。
摘要
用户发现,Threadripper 工作站主板上一处隐藏的 PCIe 2.0 x4 电气限制导致四块 RTX 3090 中的一块性能受限,从而影响了多 GPU 大语言模型推理性能。通过调整插槽布局并切换至张量分裂模式,Mistral 128B 的吞吐量从约 11 tok/s 翻倍至约 24.7 tok/s。
我发布这篇文章作为警告,提醒所有使用老旧工作站/HEDT主板搭建多GPU本地LLM机器的人。我的配置(Node #04):
* Gigabyte X399 Designare EX
* Threadripper 1950X
* 128GB DDR4
* 4x RTX 3090
* 10GbE TP-Link/Aquantia 网卡
* NCCL版 llama.cpp
* 用于 safetensors 模型的 vLLM
之前我的多GPU结果出奇地令人失望。机器能工作,所有4块GPU都能检测到,显存可用,模型也能加载,但某些工作负载表现平平。例如:Mistral Medium 3.5 128B Q4_K GGUF 只有约11 tok/s,且GPU利用率很低,只有30%左右。我以为是后端/模型/拆分/NCCL的问题。结果发现,有一块3090插在物理x16插槽上,但该插槽电气上仅是PCIe 2.0 x4。更糟的是,在修复BIOS/设置/位置之前,Linux显示那块GPU协商速率低至Gen2 x1 / Gen1 x4。关键证据:
```bash
nvidia-smi --query-gpu=index,name,pci.bus_id,pcie.link.gen.current,pcie.link.width.current,pcie.link.gen.max,pcie.link.width.max --format=csv
```
错误布局导致一块GPU实际上被严重拖累。重新插拔显卡后,GPU现在显示为:
```text
GPU0: Gen3 max, x8
GPU1: Gen3 max, x16
GPU2: Gen3 max, x8
GPU3: Gen3 max, x16
```
隐藏的错误在于,这块主板有多个物理x16长度的插槽,但并非所有插槽电气上都相同。那个PCIe 2.0 x4插槽原本是给网卡用的,不是给3090的。修正插槽布局后,结果大幅改善。
Qwen3.6 27B BF16 配合 vLLM TP=4 + MTP,上下文长度260K:
```text
~78-80 tok/s 生成速度
~80% 草稿接受率
```
Qwen3.6 27B BF16 GGUF 配合 NCCL版 llama.cpp,`--split-mode tensor`,启用MTP:
```text
~66.5 tok/s
~85% 草稿接受率
```
Mistral Medium 3.5 128B Q4_K GGUF 配合 llama.cpp:
之前,使用 `--split-mode layer`:
```text
~11 tok/s
GPU利用率低
```
修正PCIe布局后,改用:
```bash
--split-mode tensor --tensor-split 25,25,25,25
```
结果:
```text
~24.7 tok/s
```
所以得出的教训:
1. 不要相信物理插槽长度。查看主板手册中的电气通道布局。
2. 始终在Linux下验证实际的协商PCIe宽度/速度。
3. `nvidia-smi` 和 `lspci -vv` 是你的好朋友。
4. 在llama.cpp中,`--split-mode layer` 对于某些大型GGUF模型可能严重浪费GPU。
5. 对于我的Mistral 128B GGUF测试,`--split-mode tensor` 带来了巨大改善。
6. 如果某块GPU意外插在错误的PCIe路径上,整个多GPU推理系统可能看起来像是后端问题,但实际上只是插槽布局问题。
有用的命令:
```bash
nvidia-smi topo -m
```
```bash
nvidia-smi --query-gpu=index,name,pci.bus_id,pcie.link.gen.current,pcie.link.width.current,pcie.link.gen.max,pcie.link.width.max --format=csv
```
```bash
for B in 09:00.0 0a:00.0 41:00.0 42:00.0; do echo "===== $B ====="; sudo lspci -vv -s "$B" | grep -E "LnkCap|LnkSta"; done
```
如果你正在用二手3090搭建“廉价显存怪兽”,请先检查这一点,不要急着指责NCCL、llama.cpp、vLLM、量化或模型本身。在我的案例中,修正PCIe插槽位置将这台机器从“为什么这么弱?”变成了“好吧,这玩意确实是怪兽”。
相似文章
探寻4x 3090的甜点
一位用户分享了在运行Qwen3.6-27B与vLLM的4x RTX 3090平台上进行的功耗限制测试,发现220W是在最小化吞吐量损失下实现峰值效率的甜点。
为最大化StrixHalo性能而折腾(+NVLink双eGPU 3090改造)
用户详细介绍了对配备双RTX 3090 eGPU和NVLink的AMD Strix Halo系统进行改造和基准测试的过程,发现对密集模型的LLM推理速度有所提升,尤其是使用vLLM时,并讨论了能效权衡。
@Snixtp: 针对单张 RTX 3090 的更多能效测试 长文速读:- 我在单张 RTX 3090 上测试了 8 个本地大语言模型(LLM),功率限制从 100W 到 45…
本文展示了 8 个本地大语言模型在 RTX 3090 上的基准测试结果,显示功率能效在约 225W 时达到峰值,而在满功率下收益递减。
在 2x3090 NVLINK 上对 Qwen 3.6 27B MTP 进行基准测试
对 Qwen 3.6 27B MTP 在 4 张 RTX 3090 GPU 上的基准分析表明,基于 NVLink 的张量并行相较于 PCIe 配置可实现显著的吞吐量提升(最高达 +53%)。
两块旧款RTX 2080 Ti,每块22GB显存,运行Qwen3.6 27B,使用f16 KV缓存达到38 token/s
一位用户分享其配置:使用两块改装版RTX 2080 Ti GPU(每块22GB显存)通过llama.cpp以38 token/s运行Qwen 3.6 27B,并包含关于功耗限制、张量分割模式和KV缓存设置的技巧。