先看现象。在 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 加副本,多一次通信比多跑一份权重更划算。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
