惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
Jina AI
Jina AI
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
MyScale Blog
MyScale Blog
I
InfoQ
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
T
Tailwind CSS Blog
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
The Blog of Author Tim Ferriss
B
Blog
阮一峰的网络日志
阮一峰的网络日志
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
雷峰网
雷峰网
Recent Announcements
Recent Announcements
量子位
B
Blog RSS Feed

博客园 - 张善友

纯 .NET 手写 CUDA kernel,GLM-5.3-Flash decode 跑出 llama.cpp 的 2 倍 AI 编程时代,.NET 的机会在哪里? Vibe Coding 月提交量 29 亿次之后:GitHub 的危机、Azure 迁移,以及 .NET 的机会 从 PostgreSQL 到 Kubernetes:开源的护城河,从来不写在代码里 人工智能最先替代的,是人工智能学院自己 企业架构的六种场景:从"四大流派"到数字原生与 AI 原生 TensorSharp 最新进展研究报告:从 DeepSeek V4 Flash 到 GLM-5.2,以及等待中的 GLM-5.3 Google 官方下场安利:Go 是 AI 时代的"理想语言"?其实 C# 更有资格坐这个位置 当"入门第一课"的作者开始 Vibe Coding:廖雪峰 2026 上半年 AI 编程实践深度探索 两种 Harness 哲学:从 DeepSeek Harness 的"过度抽象"争议,看 OpenClaw.NET 的另一种答案 JVMGuard 来了,.NET 开发者别慌:你的 dotnet-monitor 早就准备好了 .NET 11 Preview 7 发布:一大波硬核更新来袭,离正式版又近了一步! Agent 系统的不确定性治理:当软件工程遭遇"梯度下降" WorkBuddy 专家团的下一步:用 MetaSkill 把「提示词约定」升级为「运行时硬约束」 改变世界的17个方程,如何重塑 GoodCrew 的架构哲学 修 Bug 的手艺与架构的艺术:从熵增到熵减 "从"前锋"到"中场":为什么 Agent 基础设施的建设者必须是系统思考者" 纯 C# 追平 llama.cpp?.NET 本地推理三国杀 MCP 第五版 × OpenClaw.NET:从协议升级到生态编排 把 284B 的 DeepSeek V4 Flash 装进纯 .NET:TensorSharp 用一天改写了 .NET 推理栈的位置 从DDD到Ontology:当数字员工不再认"限界上下文"这堵墙 从 Harness 引擎到 MetaSkill DAG 的确定性架构 25家巨头联名的那封公开信,为什么数字员工架构师应该逐字读一遍 AI + C# NativeAOT:破解应用开发的"最后一公里" 本体:AI落地的"企业翻译官" C# MCP SDK 2.0 即将发布:去会话化、去握手、去运维噩梦 数字员工的成本账:OpenClaw.NET 如何用工程化实现"成功任务的单位经济学"(下) AI 成本战的隐性成本与降本五层:从"成功率悖论"到"系统复杂度"(中) 从 Token 价格战到成功任务单位经济学:AI 成本战的真正主线(上) MCP + A2A 融合:协议层已就绪,信任层才是硬仗
3 张卡到底能不能跑大模型推理?从 vLLM、llama.cpp 到 Tenso...
张善友 · 2026-08-28 · via 博客园 - 张善友

1

一个常见说法:3 卡跑不了 vLLM,只能跑 llama.cpp;3 卡通信损失可接受,4 卡就不行了,除非有高速互联。这话大方向没错,但魔鬼都在细节里。今天把这件事彻底讲清楚,最后再看一个把两种并行路线同时实现的实战案例——纯 .NET 推理引擎 TensorSharp。


一、vLLM 为什么"歧视"3 卡?

很多人觉得 vLLM 硬性规定张量并行(Tensor Parallelism)只能是 1、2、4、8 卡——这个理解其实不准确

vLLM 的真实约束只有一条:

Attention Head 数量(以及 KV Head 数量)必须能被 TP size 整除。

那为什么实践中就变成了"只能 1/2/4/8"?因为主流模型的头数几乎都是 2 的幂:

模型 Attention Heads KV Heads TP=3 可行?
Llama-3-70B 64 8 ❌ 直接报错
Qwen2.5-72B 64 8 ❌ 直接报错
Mistral-7B 32 8 ❌ 直接报错

64、32 这些数字除以 3 除不尽,--tensor-parallel-size 3 会直接抛 ValueError,于是 6 卡也不行,实际效果就退化成了"只能 1/2/4/8"。

结论:这是整除约束,不是框架写死的限制。 如果哪天遇到头数能被 3 整除的模型,vLLM 跑 3 卡完全没问题。


二、llama.cpp 为什么对卡数无所谓?

关键在于切分方式完全不同

llama.cpp 默认采用 Layer Split(按层切分)

  • 每张卡拿连续的若干层;
  • 层与层之间只传一次隐状态激活值,量级只有几百 KB 到几 MB;
  • 对互联带宽几乎没要求,普通 PCIe 绰绰有余。

这才是"3 卡能跑 llama.cpp"的真正原因——不是"3 卡通信损失可接受",而是 layer split 模式下通信量本来就小到可以忽略


三、"3 卡行、4 卡不行"?这个阈值其实不成立

这是流传最广、也最容易误导人的一个说法。拆开看:

对 llama.cpp(layer split)

4 卡和 3 卡的通信量几乎一样低——仍然只在层边界传激活值。4 卡没问题,6 卡、8 卡也一样没问题。唯一的瓶颈是显存够不够分,而不是通信。

对 vLLM(tensor parallel)

真正的悬崖不在 3→4,而在互联类型

  • TP 模式每一层都要做 all-reduce,通信频繁且量大;
  • 在 PCIe 下,2 卡就开始明显掉速
  • 4 卡以上基本必须 NVLink / NVSwitch 才有意义。

所以"除非高速互联"这个判断是对的,只是门槛比想象中来得更早——不是 4 卡才需要,而是 2 卡以上就明显受益。


四、一张图总结

卡数本身不是关键变量

  Layer Split(llama.cpp)
    └─ 对卡数免疫:3/4/6/8 卡都行,瓶颈在显存

  Tensor Parallel(vLLM)
    ├─ 对整除性敏感:头数必须能被 TP size 整除
    └─ 对互联敏感:PCIe 下 ≥2 卡掉速,4+ 卡需要 NVLink

五、实战案例:TensorSharp——同一个引擎里的两种切分

前面讲的还是"两个引擎两种路线",有没有一个引擎把两条路都实现了,可以直接对比?有——TensorSharp,一个纯 .NET 实现的 GGUF 推理引擎,性能上和 C++ 手写优化的 llama.cpp 互有胜负(CUDA prefill 最高快 1.28×,Vulkan decode 最高快 1.21×)[1]

它对多卡的处理方式,简直就是本文论点的活体演示:

默认:Layer Split,卡数随意

权重默认按层自动切分到所有可见 GPU——3 卡、5 卡、7 卡都行,没有任何整除要求。官方的一个标志性测试就是在 3 张 RTX PRO 6000 上跑 744B 参数的 GLM-5.2 MoE:layer split + CPU MoE offload(把 92% 的专家权重放内存),prefill 2048 tokens 跑出 918.9 tok/s,反超 llama.cpp 的 763.1 tok/s[1:1]

3 卡、PCIe 时代的常识告诉我们这"不该"跑得动——但 layer split 下卡数本来就不是变量,这就是最直接的证据。

可选:--tp N,但要面对真实代价

TensorSharp 也提供 Megatron 风格的张量并行(列/行并行 + 分层 AllReduce),支持单机多卡和跨机 TCP 集群[1:2]。但它的官方基准数据恰恰暴露了 TP 的软肋:

场景 TP=2 相对单卡加速
Gemma 4 E4B decode 1.39×
Muse-Glimmer 30B decode 1.57×
Muse-Glimmer 30B prefill 1.34×

理想情况下 2 卡应该是 2×,实际只有 1.4× 左右——消失的那 0.6× 就是 all-reduce 通信和同步开销。这正是"TP 对互联敏感"的量化体现。

更有意思的是它的跨机方案:多节点 TP 走普通 TCP 网络,在没有 CUDA P2P 时还会自动回退到主机内存中转[1:3]。工程上能跑,但性能显然要靠真正的硬件互联(NVLink 级别)来救——互联质量决定 TP 上限,这和前面 vLLM 一节的结论完全一致。


六、实操建议

  1. 卡数是 3 的倍数或奇数卡 → 优先 layer split 路线的引擎(llama.cpp,或 .NET 技术栈下的 TensorSharp),别跟 vLLM 的整除约束较劲;
  2. 卡数是 2/4/8 且模型头数匹配 → vLLM / --tp N 可以上,但注意互联:PCIe 环境控制卡数,有 NVLink 再放开;
  3. layer split 多卡部署时,重点调的是显存分布和 prompt processing 阶段瓶颈(TensorSharp 这类引擎还可以叠加 CPU MoE offload 进一步省显存),而不是纠结 3 卡还是 4 卡。

一句话总结:layer split 对卡数免疫,tensor parallel 对互联敏感——决定你能不能跑、跑得快的,从来不是"3 还是 4"这个数字本身。


  1. zhongkaifu/TensorSharp — A native .NET LLM inference engine for GGUF models ↩︎ ↩︎ ↩︎ ↩︎