序:一个必须先撕开的词
「基于 C++ 的 LLM 库」这句话,其实是一句歧义句。若不先拆开,后面所有讨论都是鸡同鸭讲。
试看三物:
- llama.cpp——从张量到调度器到 HTTP server,几乎全是 C/C++,Python 只用来做格式转换。
- PyTorch——C++ 写成,但你日常摸到的是 Python 那层皮;它的 C++ 前端(libtorch)完整存在,却少人问津。
- vLLM——Python 占了 84.2%,C++ 只有 3.4%,可这 3.4% 恰恰是它全部性能的来源。
三者皆可称「C++ 库」,然其义迥异。故本报告立三层分类法,一切论述皆在此框架下展开:
| 层级 | 定义 | 判据 | 代表 |
|---|---|---|---|
| 第一层 | 纯 C/C++ 实现 | 不装 Python 亦能编译、能跑 | llama.cpp、ggml、llm.c、FastLLM、bitnet.cpp、gemma.cpp |
| 第二层 | C++ 核心 + Python 壳 | C++ 是产品界面(稳定 ABI + 独立发版 + 纯 C++ 路径) | ONNX Runtime、OpenVINO、IREE、TensorRT-LLM、libtorch、Paddle |
| 第三层 | Python 框架 + C++/CUDA 算子 | C++ 是内部实现,用户摸不到 | vLLM、SGLang、LightLLM、KTransformers |
一条极重要的判据:「用什么语言写成」与「能否被该语言的开发者使用」,是两件独立的事。
TensorFlow 的 C++ 占 60%,却把tensorflow/cc明列于「不在兼容性保证之内」;XLA 更甚——无 GitHub release、compile options 得从 Python 里导出成字节数组,JAX 维护者自承 "it's not a smooth path"。
此二者用 C++ 写成,交付界面却在 Python。反之,ONNX Runtime 与 OpenVINO 之所以是真 C++ 栈,非因语言,而因它们把 C++ 当作对外交付的产品。
第一层:纯 C/C++ 实现——推理为王,训练为丐
1.1 全景表
| 项目 | 仓库 | 许可 | Star | 末次提交 | 训练能力 | 状态 |
|---|---|---|---|---|---|---|
| llama.cpp | ggml-org/llama.cpp | MIT | ~126k | 2026-08-31(日更) | 实验性 llama-finetune |
极活跃 |
| ggml | ggml-org/ggml | MIT | 15,267 | 2026-08-30 | ggml-opt(autograd 雏形) |
活跃 |
| llm.c | karpathy/llm.c | MIT | 30,898 | 2025-06-26 | 能预训练(GPT-2/3 系) | 停滞 ~14 个月 |
| llama2.c | karpathy/llama2.c | MIT | 20,038 | 2024-08-06 | 推理纯 C,训练靠 PyTorch | 停更 ~2 年 |
| FastLLM | ztxz16/fastllm | Apache-2.0 | 4,948 | 2026-08-31 | 纯推理 | 日更 |
| PowerInfer | Tiiny-AI/PowerInfer | MIT | 9,759 | 2026-05-11 | 纯推理 | 半活跃 |
| bitnet.cpp | microsoft/BitNet | MIT | 40,217 | 2026-07-27 | 纯推理(1-bit) | 活跃 |
| gemma.cpp | google/gemma.cpp | Apache-2.0 | 7,032 | 2026-08-28 | 含 VJP 反向 + Adam | 活跃 |
| llamafile | mozilla-ai/llamafile | NOASSERTION | 25,802 | 2026-08-26 | 无 | 活跃 |
| MNN | alibaba/MNN | Apache-2.0 | 15,999 | 2026-08-28 | 推理为主 | 活跃 |
| ik_llama.cpp | ikawrakow/ik_llama.cpp | MIT | 3,154 | 2026-08-28 | 纯推理 | 活跃 |
| mllm | UbiquitousLearning/mllm | MIT | 1,600 | 2026-08-19 | 纯推理 | 活跃(V2 重构中) |
| chatglm.cpp | li-plus/chatglm.cpp | MIT | 2,962 | 2024-07-31 | 仅加载已微调权重 | 停更 |
| qwen.cpp | QwenLM/qwen.cpp | NOASSERTION | 628 | 2024-12-06 | 无 | 已归档 |
| gpt4all | nomic-ai/gpt4all | MIT | 77,389 | 2025-05-27 | 无 | 事实停更,未归档 |
| ctransformers | marella/ctransformers | MIT | 1,885 | 2024-01-28 | 无 | 停更 |
| rwkv.cpp | RWKV/rwkv.cpp | MIT | 1,579 | 2025-03-23 | 无 | 半停滞 |
| TinyChatEngine | mit-han-lab | MIT | 961 | 2024-07-04 | 无 | 停更 |
1.2 llama.cpp:跨平台之王,靠的不是自己写后端
llama.cpp 现有 17–18 个计算后端:CUDA / Metal / Vulkan / SYCL / HIP / CANN / MUSA / OpenCL(Adreno) / BLAS / BLIS / ZenDNN / zDNN(IBM Z) / RPC / Hexagon / WebGPU / OpenVINO / ET(Esperanto)。
然其奥妙不在工程量,在治理结构。
ggml 用四层 C 函数指针 vtable 解耦硬件:ggml_backend_reg_i(注册)→ ggml_backend_device_i(能力查询)→ ggml_backend_i(执行)→ ggml_backend_buffer_i(内存)。C 无虚函数,故手工填表。调度器向每个设备问一句 supports_op,答曰不能,便沿优先级顺延,末了CPU 兜底。
于是:
- 新增后端的最小成本,从「改核心 + 过 review」降为「填四个结构体」。
- 华为(CANN)、摩尔线程(MUSA)、IBM(zDNN)、高通(Hexagon)、AMD(ZenDNN)、Esperanto(ET)自己来贴 PR。
- ggml 只维护一个
ggml_backend_i接口。
十八个后端,是治理结构的产物,不是工程量的产物。
这条路走了约 20 个月:2023-03 首发时是单文件 ggml.c;2023-10 引入 backend 抽象;2024-11 后端拆为独立库并支持动态加载。
但真相还有另一半:真正的成本不在接口,在内存契约。GGML 只建两个静态池(权重 + 中间缓冲),无临时分配 API,且要求 buffer 可返回主机可寻址的
get_base()。FOSDEM 2025 上有人记录了为 TTNN 写后端时遭遇的四重违约(非行主序、无法映射设备内存、typed allocation、自有量化类型),最后靠「虚拟指针 0x1000 + tensor extra 存真地址」的技巧绕过。
跨平台的债,不在首次接入,在永远还不清的回归测试与算子补齐——这正是 CANN 后端至今仍标 Experimental 的原因。
1.3 训练侧:一场安静的溃败
这是本报告最令人唏嘘的一节。
llm.c(Karpathy):~1000 行 C + CUDA 复现 GPT-2/GPT-3,多卡走 MPI + NCCL,技术上完全成立。然末次提交停在 2025-06-26,已 14 个月无更新;只支持 GPT-2/GPT-3 架构,不支持 Llama 系;作者重心已转向 nanochat(PyTorch)与 microgpt。
llama.cpp 的 finetune:老模块 2024 年被 PR #8669 直接删掉;现存的 llama-finetune 禁用 mmap、强制 F32 KV cache。维护者 2026-02 原话:
"I can promise you that the python pile will be better than the finetune experiment… only good for finetuning extremely small models."
唯一的反例是 gemma.cpp——罕见地自带 VJP 反向传播与 Adam。然官方定位写明 "for Gemma research",生产推荐 JAX/PyTorch。作者自己划的边界,比外人划的更窄。
为何如此?答曰:收益不对称。
推理侧的「零依赖」能换来千万级设备覆盖——这是实打实的地盘。训练侧却要重写 autograd + 优化器状态 + 分布式编排 + 数据管线,去和 PyTorch/Unsloth 抢一个本来就有 GPU、本来就有 Python 的场景。而 LLM 训练的真正门槛不在 forward/backward(那部分 C++ 早就写得很好),在 DDP / FSDP / TP / PP / ZeRO 这套策略性编排——它组合爆炸、每周在变、需要用户随时插手。
机制沉底,策略上浮。中间那层,C++ 让出去了。
1.4 「单模型 .cpp」这条路的集体灭绝
chatglm.cpp、qwen.cpp(已 archived)、baichuan.cpp、ctransformers、TinyChatEngine——全部停更或归档。退场理由高度一致:"in favor of llama.cpp"。
chatglm.cpp v0.4.0 的 release note 写得直白:Drop Baichuan/InternLM support in favor of llama.cpp。
GGUF 作为格式收敛点出现之后,为单一模型族维护一套 C++ 实现的边际收益归零。
幸存者偏差要反过来读:活下来的那个,是最不像框架的那个。
而 2024 年后新出现且活得好的纯 C++ 项目,全部是换维度竞争:
| 项目 | 换的什么维度 |
|---|---|
| bitnet.cpp | 换数值格式(1-bit) |
| gemma.cpp | 换可读性(~2K LoC 核心) |
| llamafile | 换分发形态(Cosmopolitan 单文件跨 6 OS) |
| FastLLM | 换内存层级(MoE 专家层放 CUDA / CPU / NUMA / 磁盘) |
第二层:C++ 核心 + Python 壳——被低估的真 C++ 栈
2.1 ONNX Runtime:名字害了它
它叫「ONNX Runtime」,于是被当成格式转换工具。实则:
- C/C++ 才是它的原生 API 层,C# / Java / ObjC / JS / Rust 全绑定在 C API 之上。
- 21,684 star,Execution Provider 覆盖 CUDA / TensorRT / TensorRT-RTX / OpenVINO / oneDNN / DirectML / QNN / NNAPI / CoreML / XNNPACK / MIGraphX / Vitis-AI / WebGPU —— 覆盖面无人能及。
- 它是 Windows ML 与 Foundry Local 的底座——即每台新 Windows 机器上的一方 LLM 运行时。
这是本报告认定的「唯一一套 C++ 代码打通 Windows / Linux / macOS / Android / iOS / Web + NVIDIA / AMD / Intel / Apple / Qualcomm」的组合。
短板须诚实标注:GenAI 的 C API 仍标 "in preview and subject to change";KV cache 不对外暴露(由 OgaGenerator 内部托管),想自定义分页/前缀共享则无从下手;continuous batching 尚在 dev 分支。
2.2 通用框架:C++ 占比高 ≠ C++ 可用性高
| 框架 | Star | 语言构成 | C++ 一等公民程度 | 判词 |
|---|---|---|---|---|
| PyTorch / libtorch | 102,699 | Py 65% / C++ 28% / CUDA 2.6% | 完整 torch::nn/optim/data/autograd,有官方 C++ MNIST 训练示例 |
有完整 C++ 训练 API,但无 DDP C++ API |
| PaddlePaddle | 24,063 | C++ 46% / Python 45% | 推理一等,训练 C++ API 官方自述「追求稳定则不建议使用」 | 本层 C++ 占比最高的活框架,Windows + 9 家国产芯片双覆盖 |
| MindSpore | 4,701 | C++ 主语言 | 仅到自定义算子级 | 正收缩为昇腾专用栈,GPU wheel 在发布物中消失 |
| TensorFlow | 198,083 | C++ 60% / Python 27% | 低——tensorflow/cc 明列于「不覆盖」 |
用 C++ 写成,交付界面在 Python |
| MXNet | 20,811 | C++ | — | 已进 Apache Attic |
| MegEngine | 4,810 | C++ | — | 停滞 22 个月 |
| OneFlow | 9,429 | C++ 57% / Python 29% | C++ 核心,用户面 Python | 末次 release 停在 2024-03-11,团队已散 |
libtorch 的真实处境:从「部署运行时」降级为「嵌入式张量库」。
TorchScript 自 PyTorch 2.10 起弃用,官方转向 torch.export + AOTInductor / ExecuTorch。Python 定义图,C++ 只执行图——官方亲手拆掉了 C++ 的最后一层策略界面。libtorch 未来的稳定用户,是需要在 C++ 宿主进程里做张量计算的场景(游戏、机器人、仿真、交易系统),而非 LLM 训练。
2.3 编译栈:TVM、IREE 与 XLA 的三种命运
| 项目 | Star | 纯 C++ 可用 | 编译期需 Python | 判词 |
|---|---|---|---|---|
| Apache TVM | 13,707 | 运行时是(libtvm_runtime) |
是(Python-first 是官方设计原则) | 正从「自动调优编译器」转向「专家 kernel 基础设施」(TIRx) |
| IREE | 3,907 | 是(bare-metal 无依赖) | 否(iree-compile 是独立 CLI) |
C++ 一等公民程度全场最高,然 LLM 生态薄弱且强绑 AMD |
| OpenXLA | 4,511 | 部分(PJRT C API) | 实践中是 | 反面教材:无 release、需 Bazel 或加载 JAX 的 PJRT 插件 |
| ONNX Runtime | 21,684 | 是 | 否 | 本层最强 |
| OpenVINO GenAI | 10,772 / 582 | 是 | 否 | LLM 特性密度最高:EAGLE-3 投机解码、MoE 落盘(Qwen3-30B-A3B 跑 16GB 设备) |
TVM vs IREE 的「路线之争」在 2026 年已不成立——两者跑向了不同赛道。TVM 用 TIRx 主动放弃「编译器自动搞定一切」的假设,官方定位是比 Triton 更低、更显式的专家 kernel DSL;IREE 则守住「确定性流水线 + 可裁剪 C runtime + bare-metal」。
真正的对立,从「搜索 vs 确定性」变成了**「帮专家写 kernel」vs「把图可靠地编出来」**。
第三层:Python 框架 + C++/CUDA 算子——「3.4% 的 C++ 是全部性能来源」
3.1 全景表
| 项目 | Star | 语言构成 | C++ 血统判定 | 备注 |
|---|---|---|---|---|
| vLLM | 90,567 | Py 84.2 / Rust 6.3 / CUDA 4.5 / C++ 3.4 | C++/CUDA 算子集中在 csrc/,经 torch_bindings.cpp 暴露,不能脱离 Python |
硬件覆盖最广 |
| SGLang | 32,968 | Py 85.0 / Rust 6.7 / CUDA 4.7 / C++ 2.3 | 同 vLLM,且 kernel 已外置 | RadixAttention |
| TensorRT-LLM | 14,511 | Py 58.7 / C++ 32.9 / CUDA 7.1 | 真 C++ 运行时,有 --cpp_only 构建开关 |
硬绑 NVIDIA;Windows 无多卡 |
| LMDeploy | 8,035 | Py 69.5 / C++ 19.6 / CUDA 10.1 | 双引擎:turbomind 为真 C++ | FasterTransformer 直系分支 |
| KTransformers | 19,354 | Py 57.9 / C++ 33.8 | 独立 C++ kernel 库 kt-kernel,非 llama.cpp 分支 |
CPU/GPU 异构,AMX/AVX512 |
| LightLLM | 4,255 | Py 98.6 | 零 C++ | 纯 Triton kernel,学术界最爱 fork |
| TGI | 10,890 | Py 78.7 / Rust 16.3 / CUDA 2.9 | 不是 C++,且已归档 | 官方推荐迁往 vLLM / SGLang |
| Ollama | 179,817 | Go 70.8 / C 21.4 | Go 主体,C/C++ 是内联的 llama.cpp | 「Ollama 是 C++ 写的」是错的 |
3.2 一条必须加的注脚:语言占比严重低估真实 C++ 含量
SGLang 把 kernel 拆成独立仓库 sgl-kernel-npu(C++ 81.9%)、sgl-kernel-xpu;KTransformers 主体重构为 kt-kernel;vLLM-Ascend 这个插件里 C++ 52% > Python 43%。
分母被切走了,分子却在隔壁仓库。
所以「vLLM 是 Python 项目」这句话,描述的不是技术事实,而是仓库拓扑的副产品。准确说法应是:vLLM 的调度编排层是 Python,而它的性能瓶颈层(PagedAttention、量化 kernel、MoE、通信)几乎全是 C++/CUDA。
用编排层的语言给整个系统命名,等于用仪表盘材质定义一辆车。
3.3 LMDeploy turbomind:一个被高估又被低估的项目
- 被高估的是「跨平台」:turbomind 只支持 NVIDIA CUDA;昇腾 / ROCm / 寒武纪 / 沐曦全部走纯 Python 的 PyTorchEngine + dlinfer。
- 被低估的是「血统纯度」:它是 FasterTransformer 的 C++/CUDA 直系分支,是目前唯一一个在国产项目中还活着的、有生产级吞吐的 C++ 服务端引擎。
端侧与边缘:C++ 唯一无可替代的战场
| 项目 | Star | 平台 | 真跑 LLM? | 关键判据 |
|---|---|---|---|---|
| MLC-LLM | ~23k | Linux/Win/macOS/Web/iOS/Android | ✅ | 唯一「编译到一切」路线;WebGPU + WASM |
| ExecuTorch | 4,970 | iOS/Android/嵌入式 | ✅ | 13,417 commits、日更、50KB 基线运行时,已落地 Instagram / WhatsApp / Quest 3 |
| MNN | 15,999 | Android/iOS/服务端 | ✅ | 3.6.1 新增 Hexagon;Android 核心 so ~800KB |
| ncnn | 23.7k | 10+ 平台(含 RISC-V、龙芯、鸿蒙、QNX) | ⚠️ 半支持 | 平台覆盖最宽,但 LLM 靠社区 ncnn_llm,且 int8 尚在 roadmap |
| LiteRT-LM | 5,891 | Android/Chrome/Pixel Watch | ✅ | 已落地 Chrome、Chromebook Plus |
| MediaPipe LLM | — | Android/iOS/Web | ✅ | Gemma 生态最优路径,模型格式封闭(.task) |
| OpenVINO GenAI | 10,772 | Intel CPU/GPU/NPU + ARM CPU | ✅ | MoE 可落盘 |
| TNN | 4.6k | — | ❌ | 已死(末次真实提交 2023-09),且无 archived 标记 |
端侧的真瓶颈:内存带宽,不是算力
iPhone A18 约 68 GB/s,RTX 4090 约 1008 GB/s——15 倍差距。这一条直接解释了手机 4 tok/s vs 桌面 150 tok/s 的落差。
而「NPU 更快」这个叙事要打折:NPU 的价值主要在每瓦性能(功耗降 40–60%)而非峰值吞吐。骁龙 8 Gen3 上 QNN NPU 约 32 tok/s vs llama.cpp CPU 8 线程约 18 tok/s,只有 ~1.8 倍。
更要命的是 NPU 路径普遍残缺:mllm 的 QNN 后端 decode 阶段仍回落到 CPU;MNN 官方自己把 QNN 标为 B 级(支持但有 bug);ExecuTorch 的 Qualcomm GenAI Pipeline 到 PR6 还没合完。
「NPU 跑 LLM」目前是 prefill 加速 + decode 兜底的混合态,不是全程卸载。
一条硬判据:如何筛掉一半候选
判断一个端侧库能否真跑 LLM,看三样东西:
- 有没有 KV-cache 分配器
- 有没有自回归 decode benchmark
- 有没有分块量化 GEMM
ncnn 主干 2026 年才补上 kvcache allocator 与 benchncnn_llm;MNN 和 MLC 则是从设计上就为 decoder 服务。先问这一条,能筛掉一半候选。
地基层:算子、量化、后端抽象与国产芯片
6.1 后端插件化——2026 年最重要的结构性变化
四个项目在同一年做了同一件事:把硬件后端从「编译进核心」改成「运行时 / 树外装载」。
| 项目 | 机制 |
|---|---|
| ONNX Runtime | Plugin EP Libraries(plugin-ep-cuda v0.1.0 于 08-17、plugin-ep-webgpu v0.3.0 于 08-24 独立发版) |
| IREE | IREE_EXTERNAL_HAL_DRIVERS 树外接入自研加速器 |
| PyTorch | PrivateUse1 dispatch key(维护者 albanD 原话:"PrivateUse key and device is the long term plan. yes all the vendors can use that same key") |
| TVM | 重构出 src/backend/* 与独立 apache/tvm-ffi |
| GGML | GGML_BACKEND_API_VERSION(当前为 2)+ 动态加载 |
权力结构变了:接入不再需要进主干、不需要求 PR 合并,只要实现 ABI。
这对国产芯片是决定性的。反向推论是——「某芯片支持 PyTorch / ORT」这类宣称的技术门槛已大幅降低,含金量必须靠算子覆盖率和真实性能数据判断,而非「是否支持」。
6.2 算子库:护城河已上移
| 项目 | Star | 硬件 | 判词 |
|---|---|---|---|
| CUTLASS | 10,353 | NVIDIA only | 仍是 GEMM 事实标准,但重心移向 CuTe DSL(Python) |
| FlashAttention | 24,811 | NVIDIA + AMD | FA2 稳定;FA3 仍 Beta 且仅 Hopper;FA4 用 CuTe DSL 重写 |
| FlashInfer | 6,296 | NVIDIA only | 「kernel generator」,JIT 生成 CUDA 代码;已被 SGLang / vLLM / TRT-LLM / MLC-LLM 采纳 |
| FBGEMM | 1,584 | x86 CPU + NVIDIA | PyTorch x86 量化算子后端 |
| NCCL | 5,040 | NVIDIA only | 并非闭源(Apache-2.0 + 部分 BSD) |
NVIDIA 的护城河已从「CUDA 语言」上移到「CuTe / CUTLASS 这一层抽象」。
三个信号同时出现:CUTLASS 主力转向 CuTe DSL(4.8 已在做 Rubin)、FlashAttention-4 直接用 CuTe DSL 重写、FlashInfer 用 JIT 代码生成。护城河不再是「你不会写 CUDA」,而是**「你的新指令集要能被 CuTe layout 代数描述」**。
实证:Marlin 用手写 mma,在 Hopper 上损失约 37% 峰值算力;Machete 必须用 CUTLASS 重写才能吃下 wgmma。
6.3 FP4:格式的开放 ≠ 性能的可获得
MXFP4 有 OCP 标准背书(AMD/Intel/Qualcomm 皆签名),NVFP4 是 NVIDIA 私有变体。二者元素位宽相同(E2M1),块大小与 scale 编码不同。
但真正决定性能的是有没有原生 FP4 指令:
- Blackwell sm_120:NVFP4 原生 MMQ,prefill 涨 43~68%,decode 几乎无变化(73.7 → 73.6 t/s)
- RDNA4 gfx1201:无 fp4 WMMA 指令,只能反量化回 FP16 跑
v_wmma_f32_16x16x16_f16——FP4 只有带宽收益,没有算力收益
同一份 GGUF 文件,一边是算力提升,一边只有显存收益。
6.4 国产芯片:接入了,但只接了一半
| 厂商 | 栈 | 接入方式 | 开源度 |
|---|---|---|---|
| 华为昇腾 | CANN / Ascend C / HCCL | torch_npu(PrivateUse1)、vllm-ascend、triton-ascend、llama.cpp CANN 后端(Experimental) |
2025-08 宣布全面开源,2026-03 宣布全量开源完成 |
| 寒武纪 | NeuWare / BANG C / CNNL | torch_mlu、vLLM-MLU |
部分开源 |
| 昆仑芯 | XRE / XDNN | PrivateUse1、vLLM-Kunlun Plugin | 相对封闭 |
| 摩尔线程 | MUSA / muDNN | torch_musa;llama.cpp MUSA 后端为 Stable 级 |
工具链闭源 |
| 沐曦 | MACA / mcDNN | PyTorch 扩展 | 驱动/runtime 仍闭源 |
最后一公里卡在三处:
- 分发层:PrivateUse1 只解决算子注册,PyTorch 官方教程明示集合通信与 benchmark timer 的扩展方式尚未提供。
- 通信层:各家自建 HCCL / ENCCL / CNCL / MCCL,无统一 ABI。
- 最尖锐的一条:llama.cpp 里只有 MUSA 与 CANN 两家有后端——国产芯片几乎全部押注 PyTorch,一旦脱离 Python 生态(端侧、嵌入式、浏览器),它们等于不存在。
圆桌:C++ 到底是在退化,还是在扩张?
正方(架构史家):退化不可逆
判据在于:谁能定义用户写什么语言。
- 单机 C++ 训练循环每个框架都有(libtorch 有官方 C++ MNIST 示例),但 DDP 的 C++ 前端不存在——PyTorch 分布式维护者 2025-05 原话 "there is no C++ frontend for DDP"。
- 这不是「忘了写」,是「不值得写」。机制给足了,策略不给。
- 四个框架、四家公司口径一致:TensorFlow 把
tensorflow/cc列进「不覆盖」,XLA 无 release,Paddle 官方劝退,MindSpore 只到算子级。C++ 只保证到算子这一层,这是收敛,不是巧合。 - llama.cpp 的成功恰恰因为它放弃了训练、放弃了通用性——老 finetune 被 PR #8669 删除,作者亲口劝你别用。
正方自承弱点:算子层不可替代;端侧与嵌入式是 C++ 的稳固阵地;gemma.cpp 是我的反例(但作者自己划的边界更窄)。
收一句:C++ 从「你用它写模型」退到了「你用它写别人调用的东西」。这叫退化,不叫消亡。
反方(系统工程师):正在换路扩张
判据在于:谁掌握「硬件到人」的最后一公里。
- 2026 年四个项目同时把后端从「编译进核心」改成「运行时装载」,接入权被民主化了。对昇腾、摩尔线程这类玩家,这是从求人进门到自己开锁。
- linguist 系统性地看不见 C++:SGLang 的
sgl-kernel-npu是 C++ 81.9%,vLLM-Ascend 是 C++ 52% > Python 43%。vLLM 的 3.4% C++,统计的是被剥离后的残骸。 - 训练侧我认输,但训练是一次性资本支出,推理是永续运营支出。在服务化部署、端侧、嵌入式、浏览器、国产化信创这五个战场,C++ 不但活着而且是唯一选项。
反方自承弱点:训练侧 C++ 是全面溃败,不是暂时落后;llama.cpp 的 finetune 是玩具,谁拿它对标 Megatron 我第一个反对;编译地狱是真实成本,把「零依赖」说成设计优越性就是撒谎。
收一句:C++ 输掉了「怎么写模型」,却正在赢下「怎么把模型交到人手上」。
吾之拍板
正方说的是「权力」,反方说的是「地盘」。二者非但不矛盾,且互为因果。
正因为 C++ 放弃了上层的策略之争,它才有余力把下层的机制做到极致。
三条总纲,可作本报告结论:
- 训练编排层已彻底 Python 化,且不可逆。 无 DDP C++ API、llm.c 停更 14 个月、gemma.cpp 自标 research——这不是技术不可行,是收益不对称。想在 2026 年用纯 C++ 训大模型,等于徒手爬珠峰:能爬,但没理由爬。
- 推理部署层 C++ 不但活着,且在 2026 年通过「后端插件化」获得了新的扩张动能。 关键不是后端数量,而是接入成本从「求 PR 合并」降到「实现 ABI」——这改变了生态的权力结构。
- 判断一个库的价值,看它的 C++ 是不是「产品界面」,而非它是不是用 C++ 写的。 有稳定 ABI、有独立发版、有不装 Python 的完整路径——ONNX Runtime、OpenVINO、IREE 之所以是真 C++ 栈,全在于此。TVM 与 XLA 用 C++ 写,交付界面却在 Python。
场景化选型:十个真实场景的裁决
| # | 场景 | 首选 | 备选 | 明确不要 |
|---|---|---|---|---|
| 1 | PC 本地跑开源模型 | llama.cpp(前端用 LM Studio / Ollama) | llamafile(mozilla-ai) | 老 ggml 分支 fork;FP16 大模型硬塞 8GB |
| 2 | Windows 桌面内嵌 · DirectML | ONNX Runtime + DirectML EP(入口用 onnxruntime-genai) | llama.cpp + Vulkan | 任何 CUDA-only 方案 |
| 3 | macOS 原生 · Metal · 上架 | llama.cpp(xcframework,纯 C API) | MLC-LLM | 要打进 Python 解释器的方案 |
| 4 | Android 端侧 · 包体积敏感 | llama.cpp(CPU NEON 兜底 + Adreno/QNN 可选) | MNN | TNN(已死但无 archived 标记) |
| 5 | iOS · CoreML / Metal | llama.cpp(Metal) | MLC-LLM / ExecuTorch+XNNPACK | CoreML 做 >3B 大模型 |
| 6 | 浏览器 · WebGPU | WebLLM / MLC-LLM(TVM 系) | transformers.js | WebGL 回退方案 |
| 7 | GPU 集群高吞吐 | vLLM | SGLang;NVIDIA-only 用 TRT-LLM;LMDeploy | llama.cpp server 撑在线并发 |
| 8 | 消费卡跑 MoE 混合卸载 | llama.cpp | ktransformers(CPU+GPU 异构) | vLLM 当「低显存单用户」方案 |
| 9 | 信创(昇腾/寒武纪/昆仑芯/摩尔线程) | 厂商官方栈(昇腾 CANN + vLLM-Ascend) | FastDeploy 统一后端 | llama.cpp 直上国产卡 |
| 10 | 嵌入式 / 边缘 / 裸机 | llama.cpp(纯 C/C++、交叉编译成熟) | MNN / ncnn(小模型) | 任何需要 Python 运行时的 |
逐场景的坑
1 · PC 本地(RTX 4060 8GB / Mac M):8GB 是硬边界。7–8B Q4 可全量上 GPU,14B 以上必须分层卸载,吞吐会数量级下降。llama.cpp 已迁至 ggml-org,旧路径与旧文档大面积失效。
2 · Windows 桌面内嵌:ORT 是唯一「大厂维护 + C/C++ DLL + DirectML 覆盖 N 卡/A 卡/I 卡」的组合。坑:模型得先转 ONNX,新架构(MLA、新 RoPE 变体)算子支持滞后于 llama.cpp,转不通就退备选。另 ORT 1.23 已移除 ROCm EP——不影响 Windows,但说明「EP 生命周期不稳定」。
3 · macOS 原生:llama.cpp 静态链接成 framework,无 Python、无 JIT 下载代码,审核路径最短。坑:内存峰值触发 jetsam,必须 mmap 加载 + 上下文上限控制。ExecuTorch 的 MPS 后端 2026-08 已删除,若你的选型理由是「Apple GPU 加速」,此路已断。
4 · Android:「一次编译、全机型 NPU 加速」不存在。现实打法是 CPU NEON 兜底 + 按 SoC 接厂商 SDK。坑:NPU 驱动与系统版本强耦合,Android 大版本升级经常直接断,务必留 CPU 回退路径。
5 · iOS:CoreML 的价值在 ≤3B 或 embedding/分类模型;大模型走 CoreML 会被 KV cache 动态 shape 与大权重分段折磨。坑:热节流严重,长时间生成必须限流。
6 · 浏览器:WebLLM 需要预编译的模型库,不是丢个 GGUF 就能跑。坑:首屏 shader 编译卡顿 + 浏览器 buffer 上限;iOS Safari 的 WebGPU 支持度波动,需真机回归。
7 · 集群高吞吐:continuous batching、prefix cache、PD 分离、结构化输出是 vLLM/SGLang 的核心价值,自研必输。坑:vLLM 迭代极快,跨版本 API/行为会变,锁定版本并自建回归集。
8 · 消费卡 MoE:MoE 的 expert 卸载换来的可用性与吞吐不成正比,磁盘卸载基本只用于「能跑起来」而非「能用」。坑:Q2_K/Q3_K 级量化质量损失显著,需自建业务评测集定阈值。
9 · 信创:优先级顺序是合规白名单 > 厂商 SLA > 性能 > 生态通用性。坑:CANN/驱动与框架版本是强绑定矩阵,装机即锁版本,升级需整机回归;Windows 支持普遍薄弱。
10 · 边缘/裸机:内存是唯一硬指标,4GB 设备现实上限是 1–3B Q4。坑:交叉编译 toolchain 与 -march 决定成败,无 NEON/RVV 的目标不建议立项。
什么时候不该用 C++ 栈
- 服务端在线推理——调度、批处理、观测、扩缩容生态全在 Python 侧,C++ 省下的冷启动时间远抵不上丢掉的生态。
- 研究与实验期——模型结构周周变,Python 改一行 vs C++ 改 kernel,迭代速度就是胜负本身。
- 模型转换 / 量化 / 评测 / 数据管线——工具链几乎全在 Python。
- 需要紧跟新模型架构——C++ 库支持新架构通常滞后数周至数月。
- 团队无 C++ 工程能力——没有 ASan/TSan、没有交叉编译 CI,内存与构建成本会吃掉全部收益。
一句话判据:C++ 的收益来自部署形态(无运行时、进程内嵌、冷启动、内存可控),不来自推理速度。 速度由 kernel 与硬件决定,生态在 Python。
尽职调查清单:十项,逐项打勾
| # | 检查项 | 反面案例 |
|---|---|---|
| 1 | 看 commits,不看 star | gpt4all 77k star 却 15 个月无提交 |
| 2 | 维护者 bus factor | 核心提交者是否 ≤2 人,是否已被厂商收编 |
| 3 | 组织迁移状态 | llama.cpp→ggml-org、PowerInfer→Tiiny-AI、llamafile→mozilla-ai |
| 4 | 死亡信号(无 archived 标记) | TNN 已死但无归档标记,易被误选 |
| 5 | 后端以当前 release 为准,不以文档为准 | ExecuTorch MPS 后端 2026-08 已删;ORT ROCm EP 在 1.23 移除 |
| 6 | roadmap ≠ 能力 | ncnn 的 LLM int8 仍在 roadmap,等于现在没有 |
| 7 | 许可证逐个 SPDX 登记 | 权重/量化脚本的许可与代码分开看 |
| 8 | ABI / API 稳定性 | 是否有版本化的纯 C ABI、是否每月破坏接口 |
| 9 | 构建可复现性 | 能否纯 CMake 全静态构建、是否强制 Python 参与构建 |
| 10 | 逃生舱(最重要) | 权重格式能否迁出(GGUF / ONNX / SafeTensors),换库成本多高 |
墓志铭:一张退场表
这是全景图里信息量最大的一页——它证明了「C++ 原生 DL 框架」作为一个物种,在 LLM 时代完整灭绝。
| 项目 | 末次真实提交 | 死法 |
|---|---|---|
| MXNet | 2023-10-25 | Apache Attic。2022-09 毕业,2023-09 退役——从毕业到退役仅 12 个月 |
| CNTK | 2023-03-11 | 已归档 |
| Caffe | 2024-07-31 | 未归档,事实停更;Caffe2 已并入 PyTorch |
| MegEngine | 2024-10-24 | 停滞 22 个月,整个 org 55 个仓库全部冷却 |
| OneFlow | 2025-12-04(末 release 2024-03-11) | 团队被收购拆散:一流科技→光年之外→美团;创始人袁进辉另创硅基流动,2026-06 递表港交所,全部投入推理服务而非训练框架 |
| TNN | 2023-09-27 | 未归档但等同废弃,OpenSSF Scorecard Maintained 0/10 |
| Glow | 2024-05-11 | 已归档 |
| Tensor Comprehensions | 2023-04-28 | 已归档 |
| TGI | 2026-03-21 | 已归档,官方推荐迁往 vLLM / SGLang / llama.cpp |
| qwen.cpp | 2024-12-06 | 已归档 |
| chatglm.cpp | 2024-07-31 | 停更,release note 明写 in favor of llama.cpp |
框架的生死由算力生态位决定,不由代码质量决定。
OneFlow 的分布式设计公认领先、C++ 占 57%,团队却在 2023 年被收购拆散;MindSpore 靠昇腾活着(代价是从通用框架收缩为昇腾专用栈);Paddle 靠文心 + 9 家国产芯片 + 完整 Inference 产品线活着。纯技术优秀但无绑定的,全死了。
若从零起:2026 年做跨平台 C++ LLM 项目的正确底座
- 标准:C++17(保守)或 C++20;不上 C++23。
- 张量层:直接用 ggml(MIT)或 MNN 的算子库。绝对不要自研算子库——这是最大的坑。
- 权重格式:以 GGUF 为默认,SafeTensors / ONNX 只作导入格式。
- 后端分层:
- CPU(NEON / AVX2 / AVX-512,走 ggml 的 SIMD 抽象)+ Vulkan —— 两条通用主线
- Metal(Apple 必需,优于 MoltenVK 转译)与 CUDA(服务器必需)—— 平台特化插件
- QNN / CANN 等厂商 SDK —— 一律做成可选插件,不做主路径
- 构建:CMake + vendored 子模块,全静态链接,运行时不得动态查找 Python;对外只暴露纯 C ABI,Swift/Kotlin/Rust 自行绑定。
- 不要自己做:量化算法、tokenizer、batching 调度器——这三件复用生态。
- 形态:先做库,server 能力做成可选组件;进程与并发策略交给上层语言。
- 合规前置:依赖许可证清单与国产环境白名单,在写第一行代码前定稿。
附录:未核实清单(不敢臆造,如实标注)
以下条目未找到可靠一手来源,读者若欲引用,请自行复核:
- PowerInfer-2 未见开源仓库(只有论文 arXiv:2406.06282 与项目站)。
- SGLang 与 vLLM 合并的传闻——官方无任何合并声明,属社区传闻。
- SiliconLLM、FastServe、MindIE 的仓库与语言构成。
- TACO-LLM(腾讯)无公开 GitHub 仓库,系腾讯云商业产品,应归入闭源商业引擎。
- TensorRT-LLM 的许可证细节(GitHub API 返回 NOASSERTION 而非常见的 Apache-2.0)。
- Marlin 与 Machete 的当前活跃仓库地址与 Star 数(Machete 仅以 vLLM
csrc/quantization/machete子目录形式存在)。 - bitsandbytes 各后端(ROCm / Intel XPU / CPU)的成熟度分级——官方未给出统一矩阵。
- 壁仞、天数智芯、燧原的开源仓库地址。
- 部分中文资料称「昇腾 Triton/PyTorch 接口 100% 兼容、600+ Triton 算子全适配」「MUSA SDK 5.1.0 兼容 CUDA 12.8、3194 个 PyTorch 算子全支持」——均来自厂商大会转述的二手博客,无一手仓库或官方文档可交叉验证。
- 「WebLLM 达到原生 GPU 80% 性能」——二手测评,未找到官方一手 benchmark。
- MNN 官方自测「prefill 比 llama.cpp 快 8.6×、decode 快 2.3×」——厂商自测,且大概率是 CPU 路径对比,需独立复现。
- InfiniLM / InfiniCore 的 Star 数(第一路与第三路报告数字不一致,未取得一致值)。
凡厂商自测的加速倍数,皆应视为营销数据,需独立复现。
数据说明
- 全部 Star 数、提交日期、归档状态取自 GitHub REST API 实时返回,查询日期 2026-08-31。不同探马在不同时点抓取,故个别数字存在微小出入(如 llama.cpp 记为 121,695 ~ 126,470),已在正文中以「~」标注。
- 语言占比按 GitHub
languages接口的字节数统计,非行数。 - 凡引用他人论断(如 PyTorch 维护者关于 DDP 的答复、llama.cpp 维护者关于 finetune 的表态),皆注明来源与日期。
- 本报告不做任何性能实测,所有性能数字均标注来源;无一手来源者一概列入「未核实」。
报告终。共六路侦察、三方圆桌、十场景裁决。
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。