内容提要
vLLM的并行限制源于注意力头数需被TP大小整除,而非固定1/2/4/8卡;llama.cpp采用层切分,通信量小,卡数影响不大,关键在互联类型。TensorSharp引擎同时支持层切分和张量并行,3卡跑744B模型性能超llama.cpp,但TP对互联敏感,2卡仅提升1.4倍。核心结论:层切分对卡数免疫,TP对互联敏感。
延伸解读
vLLM 的“3卡限制”是整除约束,不是硬性规定
vLLM 并非固定只支持 1、2、4、8 卡,真正的限制是注意力头数必须能被 TP size 整除。主流模型头数多为 2 的幂,导致 3 卡无法整除而报错,但若模型头数能被 3 整除,3 卡也能运行。因此,选择并行度时需关注模型结构,而非盲目套用常见卡数。
层切分对卡数不敏感,互联才是关键
llama.cpp 的层切分模式通信量极小,卡数增加不会显著影响性能,因此 3 卡、4 卡甚至更多卡都能流畅运行。真正的瓶颈在于显存容量,而非通信。但互联类型影响显著:2 卡以上就能从高速互联中受益,PCIe 等慢速互联会限制性能,所以“高速互联”的门槛比想象中更早出现。
TensorSharp 的对比:层切分与张量并行的实际表现
TensorSharp 同时支持层切分和张量并行,其测试显示:3 卡层切分跑 744B 模型性能超过 llama.cpp,证明层切分对卡数免疫;而张量并行在 2 卡时仅提升 1.4 倍,远低于理想 2 倍,凸显了通信开销。这量化了 TP 对互联的敏感性,也印证了“互联质量决定 TP 上限”的结论。
Q&A
vLLM 是否硬性规定张量并行只能使用 1、2、4、8 卡?
不是。vLLM 的真实约束是注意力头数(包括 KV 头数)必须能被张量并行大小整除。主流模型头数多为 2 的幂,导致 3 卡等无法整除而报错,但并非框架写死。
为什么 3 卡能跑 llama.cpp 而 vLLM 不行?
llama.cpp 默认采用层切分(Layer Split),通信量小,对卡数没有整除要求,因此 3 卡可以运行。vLLM 采用张量并行,受注意力头数整除限制,主流模型头数无法被 3 整除,所以 3 卡会报错。
llama.cpp 的层切分在 4 卡、6 卡、8 卡时通信量会显著增加吗?
不会。层切分只在层边界传输激活值,通信量很小,卡数增加不会显著增加通信量。真正的瓶颈是显存是否足够,而非通信。
TensorSharp 引擎如何支持多卡推理?
TensorSharp 同时支持层切分和张量并行。默认按层自动切分权重到所有可见 GPU,无整除要求;也提供 Megatron 风格的张量并行,支持单机多卡和跨机 TCP 集群。
TensorSharp 在 3 卡上跑 744B 模型的效果如何?
TensorSharp 在 3 张 RTX PRO 6000 上跑 744B 参数的 GLM-5.2 MoE,采用层切分和 CPU MoE offload,prefill 2048 tokens 达到 918.9 tok/s,超过 llama.cpp 的 763.1 tok/s。
张量并行(TP)对互联的敏感程度如何?
张量并行对互联非常敏感。例如 TensorSharp 的 TP 在 2 卡时理想加速比应为 2 倍,实际只有约 1.4 倍,损失来自 all-reduce 通信和同步开销。跨机 TP 走普通 TCP 网络时性能更差,需要 NVLink 级别的高速互联才能发挥优势。
决定多卡推理能否运行和性能的关键因素是什么?
关键因素是并行方式:层切分对卡数免疫,通信量小,卡数多少影响不大;张量并行对互联敏感,需要高速互联才能获得良好扩展性。因此,不是卡数本身(如 3 卡还是 4 卡)决定成败,而是并行方式和互联质量。