先看现象。在 8 卡 A100 的机器上用 SGLang 0.4.3 加 --tp 2 部署 Qwen2.5-72B,吞吐只比单卡高 30%,日志里每一步都有 all_reduce,GPU 利用率长期在 40% 上下。

原因不止一个,得分开看。TP 通信走 PCIe 没走 NVLink,all_reduce 成了瓶颈。另一种情况是模型层数不能被 tp 整除,尾部几层退化成单卡计算。

还有一种情况,批次太小,通信开销摊不平。

另外,启动时 tp 和 dp 同时打开,显存与通信都翻倍。

先确认卡间互联类型

nvidia-smi topo -m

然后把 tp 调成能整除层数的值再启动

python -m sglang.launch_server --model-path Qwen/Qwen2.5-72B-Instruct --tp 4

再往下用固定并发压一轮吞吐

python -m sglang.bench_serving --backend sglang --num-prompts 200 --request-rate 8

末了对比单卡的基线数据

python -m sglang.bench_serving --backend sglang --num-prompts 200 --request-rate 8 --tp 1

中途换过一次思路,把范围缩到最小的那一层,反而快了。

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。tp 4 的 tokens/s 至少是单卡的 2.5 倍,nvidia-smi 里各卡利用率接近,all_reduce 不再占据主要耗时。

72B 在 8 卡机器上优先 tp 8 而不是 tp 4 加副本,多一次通信比多跑一份权重更划算。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189